using System.Windows; using System.Windows.Controls; using Autodesk.Revit.DB; using Autodesk.Revit.UI; 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( ts => { //隐藏元素 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}"); } //锁定元素 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}"); }); } }