using System.Windows; using System.Windows.Controls; using Autodesk.Revit.DB; using Autodesk.Revit.UI; using Autodesk.Revit.UI.Selection; using Nice3point.Revit.Toolkit.External.Handlers; namespace Sai.RvKits.RvView; public partial class ElementsControlDock : Page, 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 = (Wpf.Ui.Controls.Button)sender; ElementClassFilter instanceFilter = new(typeof(FamilyInstance)); ElementClassFilter hostFilter = new(typeof(HostObject)); LogicalOrFilter orFilter = new(instanceFilter, hostFilter); if (HideElements == btn) { ActionEventHandler.Raise(app => { var uidoc = app.ActiveUIDocument; var doc = uidoc.Document; var selectedIds = uidoc.Selection.GetElementIds(); doc.Invoke(_ => uidoc.Document.ActiveView.HideElements(selectedIds), "隐藏对象"); }); } else if (IsolateElements == btn) { ActionEventHandler.Raise(app => { var uidoc = app.ActiveUIDocument; var doc = app.ActiveUIDocument.Document; var selection = uidoc.Selection; var selectedIds = selection.GetElementIds(); var collector = new FilteredElementCollector(doc, uidoc.ActiveView.Id) .WherePasses(orFilter) .Excluding(selectedIds) .ToElementIds(); doc.Invoke(_ => uidoc.ActiveView.HideElements(collector), "隔离对象"); }); } else if (RevealHiddenElements == btn) { ActionEventHandler.Raise(app => { var doc = app.ActiveUIDocument.Document; var uidoc = app.ActiveUIDocument; var view = uidoc.Document.ActiveView; if (doc.IsFamilyDocument) { ElementClassFilter formFilter = new(typeof(GenericForm)); ElementClassFilter combineFilter = new(typeof(GeomCombination)); orFilter = new( [instanceFilter, formFilter, combineFilter]); } var hiddenElemsIds = new FilteredElementCollector(doc) .WherePasses(orFilter) .Where(e => e.IsHidden(view)) .Select(e => e.Id).ToList(); doc.Invoke(_ => view.UnhideElements(hiddenElemsIds), "显示隐藏"); }); } else if (PinElements == btn) { ActionEventHandler.Raise(app => { var uidoc = app.ActiveUIDocument; var doc = app.ActiveUIDocument.Document; var selectedIds = uidoc.Selection.GetElementIds(); doc.Invoke(_ => { foreach (var eleId in selectedIds) { var ele = doc.GetElement(eleId); if (!ele.Pinned) { ele.Pinned = true; } } }, "锁定对象"); }); } else if (PinCategories == btn) { ActionEventHandler.Raise(app => { var uidoc = app.ActiveUIDocument; var doc = app.ActiveUIDocument.Document; var selectedIds = uidoc.Selection.GetElementIds(); var groups = selectedIds.GroupBy(id => doc.GetElement(id).Category.Id); doc.Invoke(_ => { foreach (var group in groups) { new FilteredElementCollector(doc) .OfCategoryId(group.Key) .Where(elem => !elem.Pinned) .ToList() .ForEach(elem => elem.Pinned = true); } }, "锁定类别"); }); } else if (HideCategories == btn) { ActionEventHandler.Raise(app => { //RevitCommandId cmdId = RevitCommandId.LookupPostableCommandId(PostableCommand.HideCategory); //app.PostCommand(cmdId); var uidoc = app.ActiveUIDocument; var doc = app.ActiveUIDocument.Document; //得到选择对象的ID var selectedIds = uidoc.Selection.GetElementIds(); var groups = selectedIds.GroupBy(id => doc.GetElement(id).Category.Id); doc.Invoke(_ => { foreach (var group in groups) { var collector = new FilteredElementCollector(doc, uidoc.ActiveView.Id).OfCategoryId(group.Key).ToElementIds(); uidoc.ActiveView.HideElements(collector); //相当于在VV菜单中关闭类别显示 //if (!UiDocument.ActiveView.GetCategoryHidden(category.Id)) //{ // UiDocument.Document.ActiveView.SetCategoryHidden(category.Id, true); //} } }, "隐藏类别"); }); } else if (IsolateCategories == btn) { ActionEventHandler.Raise(app => { var uidoc = app.ActiveUIDocument; var doc = app.ActiveUIDocument.Document; //得到选择对象的ID var selectedIds = uidoc.Selection.GetElementIds(); var collector = new FilteredElementCollector(doc, uidoc.ActiveView.Id) .WherePasses(orFilter) .ToElementIds(); doc.Invoke(_ => { uidoc.ActiveView.HideElements(collector); var groups = selectedIds.GroupBy(id => doc.GetElement(id).Category.Id); foreach (var group in groups) { var collection = new FilteredElementCollector(doc, uidoc.ActiveView.Id).OfCategoryId(group.Key).ToElementIds(); uidoc.Document.ActiveView.UnhideElements(collection); } }, "隔离类别"); }); } else if (UnpinAllElements == btn) { ActionEventHandler.Raise(app => { var doc = app.ActiveUIDocument.Document; doc.Invoke(_ => { new FilteredElementCollector(doc) .WherePasses(orFilter) .Where(elem => elem.Pinned) .ToList() .ForEach(elem => elem.Pinned = false); }, "解锁全部"); }); } else if (UnpinCategories == btn) { ActionEventHandler.Raise(app => { var uidoc = app.ActiveUIDocument; var doc = app.ActiveUIDocument.Document; //得到选择对象的ID var selectedIds = uidoc.Selection.GetElementIds(); doc.Invoke(_ => { var groups = selectedIds.GroupBy(id => doc.GetElement(id).Category.Id); foreach (var group in groups) { new FilteredElementCollector(doc) .OfCategoryId(group.Key) .Where(elem => elem.Pinned) .ToList() .ForEach(e => e.Pinned = false); } }, "解锁类别"); }); } } }