using System.Windows; using System.Windows.Controls; using Autodesk.Revit.DB; using Nice3point.Revit.Toolkit.External.Handlers; namespace ShrlAlgoToolkit.RevitAddins.RvView; public partial class ElementsControlDock : IDockablePaneProvider { public ElementsControlDock() { InitializeComponent(); } private ActionEventHandler ActionEventHandler { get; } = new(); //将外部事件定义为属性 //初始化可停靠窗口 public void SetupDockablePane(DockablePaneProviderData data) { data.FrameworkElement = this; data.InitialState = new DockablePaneState { DockPosition = DockPosition.Tabbed }; } private void Btn_Click(object sender, RoutedEventArgs e) { var btn = (Button)sender; ElementClassFilter instanceFilter = new(typeof(FamilyInstance)); ElementClassFilter hostFilter = new(typeof(HostObject)); LogicalOrFilter orFilter = new(instanceFilter, hostFilter); ActionEventHandler.Raise(app => { var uidoc = app.ActiveUIDocument; var doc = uidoc.Document; //得到选择对象的ID var selectedIds = uidoc.Selection.GetElementIds(); var view = uidoc.ActiveView; doc.Invoke( _ => { //隐藏元素 if (HideElements == btn) { view.HideElements(selectedIds); } //所有视图隐藏元素 else if (HideElementsAll == btn) { var col = doc.OfClass() .WhereElementIsNotElementType() .Cast() .Where(v => !v.IsTemplate); foreach (var v in col) { v.HideElements(uidoc.Selection.GetElementIds()); } } //隔离元素 else if (IsolateElements == btn) { var collector = view.OfCollector() .WherePasses(orFilter) .Excluding(selectedIds) .ToElementIds(); doc.Invoke(_ => view.HideElements(collector), $"{btn.Content}"); } //显示隐藏 else if (RevealHiddenElements == btn) { //if (doc.IsFamilyDocument) //{ // ElementClassFilter formFilter = new(typeof(GenericForm)); // ElementClassFilter combineFilter = new(typeof(GeomCombination)); // orFilter = new( // [instanceFilter, formFilter, combineFilter]); //} //var hiddenElemsIds = doc.OfCollector() // .WherePasses(orFilter) // .Where(e => e.IsHidden(view)) // .Select(e => e.Id).ToList(); //doc.Invoke(_ => view.UnhideElements(hiddenElemsIds), $"{btn.Content}"); if (doc.IsFamilyDocument) { var col = new FilteredElementCollector(doc).WhereElementIsNotElementType(); var views = new FilteredElementCollector(doc).OfClass(typeof(View)).WhereElementIsNotElementType().Cast().ToList(); Transaction transaction = new Transaction(doc, $"{btn.Content}"); transaction.Start(); foreach (var v in views) { foreach (Element item in col) { if (item.IsHidden(v)) { v.UnhideElements([item.Id]); } } } transaction.Commit(); } else { var col = new FilteredElementCollector(doc).WhereElementIsNotElementType(); Transaction transaction = new Transaction(doc, $"{btn.Content}"); transaction.Start(); foreach (Element item in col) { if (item.IsHidden(doc.ActiveView)) { doc.ActiveView.UnhideElements([item.Id]); } } transaction.Commit(); } return; } //锁定元素 else if (PinElements == btn) { foreach (var eleId in selectedIds) { var ele = doc.GetElement(eleId); if (!ele.Pinned) { ele.Pinned = true; } } } //锁定类别 else if (PinCategories == btn) { var groups = selectedIds.GroupBy(id => doc.GetElement(id).Category.Id); doc.Invoke(_ => { foreach (var group in groups) { doc.OfCollector() .OfCategoryId(group.Key) .Where(elem => !elem.Pinned) .ToList() .ForEach(elem => elem.Pinned = true); } }, $"{btn.Content}"); } //隐藏类别 else if (HideCategories == btn) { var groups = selectedIds.GroupBy(id => doc.GetElement(id).Category.Id); doc.Invoke(_ => { foreach (var group in groups) { var collector = view.OfCollector().OfCategoryId(group.Key).ToElementIds(); view.HideElements(collector); //相当于在VV菜单中关闭类别显示 //if (!UiDocument.ActiveView.GetCategoryHidden(category.Id)) //{ // UiDocument.Document.ActiveView.SetCategoryHidden(category.Id, true); //} } }, $"{btn.Content}"); } //隔离类别 else if (IsolateCategories == btn) { var collector = view.OfCollector() .WherePasses(orFilter) .ToElementIds(); view.HideElements(collector); var groups = selectedIds.GroupBy(id => doc.GetElement(id).Category.Id); foreach (var group in groups) { var collection = view.OfCollector().OfCategoryId(group.Key).ToElementIds(); view.UnhideElements(collection); } } //解锁全部 else if (UnpinAllElements == btn) { doc.OfCollector() .WherePasses(orFilter) .Where(elem => elem.Pinned) .ToList() .ForEach(elem => elem.Pinned = false); } //解锁类别 else if (UnpinCategories == btn) { var groups = selectedIds.GroupBy(id => doc.GetElement(id).Category.Id); foreach (var group in groups) { doc.OfCollector() .OfCategoryId(group.Key) .Where(elem => elem.Pinned) .ToList() .ForEach(e => e.Pinned = false); } } }, $"{btn.Content}"); }); } }