using Autodesk.Revit.DB; using Autodesk.Revit.UI; using System; using System.Collections; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using Szmedi.RvKits.Assists.ProgressWrapper; using Szmedi.RvKits.Models; namespace Szmedi.RvKits.MassSaveFamily { /// /// MassSaveFamiliesWin.xaml 的交互逻辑 /// public partial class MassSaveFamiliesWin { private readonly IList familyNodes = []; private readonly List docsFromListWpf = []; private readonly UIApplication uiapp; private Document docFrom; private string docFromName; public MassSaveFamiliesWin(UIApplication uiapp) { //this.uidoc = uidoc; this.uiapp = uiapp; InitializeComponent(); } /// /// 将族列表绑定到树状结构 /// private void AddFamilyToTreeView() { try { foreach (Document selectedDoc in uiapp.Application.Documents) { if (!selectedDoc.IsLinked) { if (cbbFrom.SelectedValue.ToString() == selectedDoc.Title) { List familiesTree = []; #region 族 var categories = selectedDoc.Settings.Categories; var familiesCollector = new FilteredElementCollector(selectedDoc).OfClass(typeof(Family)).OfType().Where(f => !f.IsInPlace && f.IsEditable); var familiesSymbolCollector = new FilteredElementCollector(selectedDoc).OfClass(typeof(FamilySymbol)); //List dimensionTypeId = (from Element i in new FilteredElementCollector(selectedDoc).QueryElementsByType(typeof(DimensionType)) select i.Id).ToList(); //var elementTypes = new FilteredElementCollector(selectedDoc).QueryElementsByType(typeof(TypeName)); //ElementClassFilter familysymbolfilter = new ElementClassFilter(typeof(FamilySymbol)); //ElementClassFilter hostsymbolFilter = new ElementClassFilter(typeof(HostObjAttributes)); //LogicalOrFilter andfilter = new LogicalOrFilter(familysymbolfilter, hostsymbolFilter); //var familiesSymbolCollector = new FilteredElementCollector(selectedDoc).WherePasses(andfilter); foreach (Category category in categories) { TreeModel familyCategoryNode = new() { //familyCategory.Id = category.Name; Name = category.Name, IsExpanded = false }; foreach (var family in familiesCollector) { if (family.FamilyCategory.Name == category.Name) { TreeModel familyNode = new() { //familyNode.Id = family.Name; Name = family.Name, IsExpanded = false, Parent = familyCategoryNode }; familyCategoryNode.Children.Add(familyNode); familyNodes.Add(familyNode); } } if (familyCategoryNode.Children.Count != 0) { familiesTree.Add(familyCategoryNode); } } #endregion 族 familiesTree.Sort(); FamilyTreeView.ItemsSourceData = familiesTree; //FamilyTreeView.UpdateLayout(); } } } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } private void btnPathChoose_Click(object sender, RoutedEventArgs e) { FolderBrowserDialog dialog = new(); //dialog.DetailDescription = "请选择文件路径"; //dialog.SeletcedPath = @"C:\Users\ZGG\Documents"; if (dialog.ShowDialog()) { var savePath = dialog.SelectedPath; tbPathChoose.Text = savePath; } if (cbbFrom.SelectedItem != null && tbPathChoose.Text != string.Empty) { btnSave.IsEnabled = true; } } private void btnSave_Click(object sender, RoutedEventArgs e) { var selectedItems = FamilyTreeView.CheckedItemsIgnoreRelation(); var existPath = tbPathChoose.Text; if (selectedItems.Count == 0) { MessageBox.Show("请选择要保存的族!"); } else if (!Directory.Exists(existPath)) { var dr = MessageBox.Show("路径不存在,是否创建该路径", "提示", MessageBoxButton.OKCancel); if (dr == MessageBoxResult.OK) { try { Directory.CreateDirectory(existPath); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } else { var app = uiapp.Application; List familyLs = []; foreach (Document doc in app.Documents) { if (!doc.IsLinked && !doc.IsFamilyDocument) { if (doc.Title == docFromName) { docFrom = doc; } } } var familyCollector = new FilteredElementCollector(docFrom).OfClass(typeof(Family)).OfType().ToList(); foreach (var familyNode in familyNodes) { if (familyNode.IsChecked == true) { foreach (var family in familyCollector) { if (family.Name == familyNode.Name) { familyLs.Add(family); } } } } var sb = new StringBuilder(); #region 调用进度条处理批量保存 ProgressBarManager manager = new( uiapp.ActiveUIDocument, familyLs, (uidoc, family, obj) => { var path = tbPathChoose.Text; var familyFileInfo = family.Name; //string categoryInfo = family.Category.Name; var categoryInfo = family.FamilyCategory.Name; var directory = path; if (cbToFolder.IsChecked == true) { directory = Path.Combine(path, categoryInfo); if (!Directory.Exists(directory)) { Directory.CreateDirectory(directory); } } if (cbAddCate.IsChecked == true) { familyFileInfo = $"({categoryInfo}){familyFileInfo}"; } var completeDir = Path.Combine(directory, $"{familyFileInfo}.rfa"); try { FileInfo fileInfo = new(completeDir); if (fileInfo.Exists && rbIgnore.IsChecked == true) { } else { if (fileInfo.Exists) { fileInfo.Delete(); } var famdoc = docFrom.EditFamily(family); if (cbSet3D.IsChecked == true) { Set3DView(famdoc); } famdoc.SaveAs(completeDir); famdoc.Close(false); } } catch (Exception ex) { sb.AppendLine(family.Name + ": " + ex.Message); LogAssists.WriteLog(ex.Message); } }, "批量保存族", false, null); manager.ProgressModal(); #endregion //foreach (var family in familyLs) //{ // var path = tbPathChoose.Text; // var familyFileInfo = family.Name; // //string categoryInfo = family.Category.Name; // var categoryInfo = family.FamilyCategory.Name; // var directory = path; // if (cbToFolder.IsChecked == true) // { // directory = Path.Combine(path, categoryInfo); // if (!Directory.Exists(directory)) // { // Directory.CreateDirectory(directory); // } // } // if (cbAddCate.IsChecked == true) // { // familyFileInfo = $"({categoryInfo}){familyFileInfo}"; // } // var completeDir = Path.Combine(directory, $"{familyFileInfo}.rfa"); // try // { // FileInfo fileInfo = new(completeDir); // if (fileInfo.Exists && rbIgnore.IsChecked == true) { } // else // { // if (fileInfo.Exists) // { // fileInfo.Delete(); // } // var famdoc = docFrom.EditFamily(family); // if (cbSet3D.IsChecked == true) // { // Set3DView(famdoc); // } // famdoc.SaveAs(completeDir); // famdoc.Close(false); // } // } // catch (Exception ex) // { // sb.AppendLine(family.Name + ": " + ex.Message); // LogAssists.WriteLog(ex.Message); // } //} _ = sb.Length > 0 ? MessageBox.Show(sb.ToString(), "导出结束") : MessageBox.Show("导出完成", "导出结束"); } } private void cbbFrom_DropDownClosed(object sender, EventArgs e) { try { if (cbbFrom.SelectedItem != null) { AddFamilyToTreeView(); FamilyTreeView.IsEnabled = true; docFromName = cbbFrom.SelectedValue.ToString(); if (tbPathChoose.Text != string.Empty) { btnSave.IsEnabled = true; } } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } private void cbbFrom_DropDownOpened(object sender, EventArgs e) { ListOfOpenedDocument(); } /// /// 获取当前所有文档 /// private void ListOfOpenedDocument() { docsFromListWpf.Clear(); cbbFrom.ItemsSource = null; foreach (Document document in uiapp.Application.Documents) { if (!document.IsLinked && !document.IsFamilyDocument) { DocumentItem docItem = new(document.Title, document.Title); //docItem.Name = doc.Title; //docItem.Value = doc.Title; docsFromListWpf.Add(docItem); } } cbbFrom.ItemsSource = docsFromListWpf; } /// /// 设置为三维视图 /// /// private void Set3DView(Document docf) { try { Transaction transaction = new(docf); transaction.Start(); docf.Regenerate(); docf.GetDocumentPreviewSettings(); SaveAsOptions saveAsOptions = new(); if (docf.GetDocumentPreviewSettings().PreviewViewId.Equals(ElementId.InvalidElementId)) { var startingViewSettings = StartingViewSettings.GetStartingViewSettings(docf); if (!startingViewSettings.ViewId.Equals(ElementId.InvalidElementId)) { saveAsOptions.PreviewViewId = startingViewSettings.ViewId; } else { var viewCollector = new FilteredElementCollector(docf).OfClass(typeof(View)); var viewEnum = viewCollector .Cast() .Where( delegate (View view) { return view.ViewType == ViewType.ThreeD && !view.IsTemplate; } ); var flag = true; foreach (View view in (IEnumerable)viewEnum) { if (!view.IsTemplate) { saveAsOptions.PreviewViewId = view.Id; flag = false; break; } } if (flag) { foreach ( View view in (IEnumerable) viewCollector .Cast() .Where( delegate (View viewNot3D) { return viewNot3D.ViewType is ViewType.FloorPlan or ViewType.EngineeringPlan or ViewType.Elevation || (viewNot3D.ViewType == ViewType.Section && !viewNot3D.IsTemplate); } ) ) { if (!view.IsTemplate) { saveAsOptions.PreviewViewId = view.Id; break; } } } } } transaction.Commit(); } catch { } } private void tbPathChoose_TextChanged(object sender, TextChangedEventArgs e) { if (cbbFrom.SelectedItem != null && tbPathChoose.Text != string.Empty) { btnSave.IsEnabled = true; } } private void Window_Loaded(object sender, RoutedEventArgs e) { FamilyTreeView.IsEnabled = false; btnSave.IsEnabled = false; ListOfOpenedDocument(); } /// /// 绑定文档条目类 /// public class DocumentItem { public string Name { get; set; } public string Value { get; set; } public DocumentItem(string _Name, string _Value) { Name = _Name; Value = _Value; } //public override string ToString() //{ // return Name; //} } } }