using System; using System.Windows; using Autodesk.Revit.DB; using Autodesk.Revit.UI; using Nice3point.Revit.Toolkit.External.Handlers; namespace Szmedi.RvKits.DisplayTools; /// /// CategoryDisplayWin.xaml 的交互逻辑 /// public partial class CategoryDisplayWin { public bool IsChecked { get; set; } private readonly ActionEventHandler visibleHandler; public CategoryDisplayWin(UIApplication uiapp) { InitializeComponent(); visibleHandler = new ActionEventHandler(); UpdateCheckedState(uiapp.ActiveUIDocument.Document); uiapp.ViewActivated -= Uiapp_ViewActivated; uiapp.ViewActivated += Uiapp_ViewActivated; DataContext = this; } private void Uiapp_ViewActivated(object sender, Autodesk.Revit.UI.Events.ViewActivatedEventArgs e) { if (!e.Document.IsFamilyDocument) { UpdateCheckedState(e.Document); } } /// /// true为可见,false为不可见 /// /// /// /// public bool GetCheckedStatue(Document doc, params BuiltInCategory[] builtInCategories) { foreach (var builtInCategory in builtInCategories) { var category = Category.GetCategory(doc, builtInCategory); if (doc.ActiveView.GetCategoryHidden(category.Id)) { return false; } } return true; } readonly BuiltInCategory[] wallCategory = [BuiltInCategory.OST_Walls]; readonly BuiltInCategory[] beamCategory = [BuiltInCategory.OST_StructuralFraming]; readonly BuiltInCategory[] floorCategory = [BuiltInCategory.OST_Floors]; readonly BuiltInCategory[] columnsCategory = [ BuiltInCategory.OST_StructuralColumns, BuiltInCategory.OST_Columns]; readonly BuiltInCategory[] mechanicalCategory = [ BuiltInCategory.OST_DuctCurves, BuiltInCategory.OST_DuctAccessory, BuiltInCategory.OST_DuctFitting, BuiltInCategory.OST_DuctInsulations, BuiltInCategory.OST_DuctTerminal, BuiltInCategory.OST_FlexDuctCurves, BuiltInCategory.OST_PlaceHolderDucts,BuiltInCategory.OST_MechanicalEquipment]; readonly BuiltInCategory[] pipingCategory = [ BuiltInCategory.OST_PipeCurves, BuiltInCategory.OST_PipeFitting, BuiltInCategory.OST_PipeAccessory, BuiltInCategory.OST_PipeInsulations, BuiltInCategory.OST_Sprinklers, BuiltInCategory.OST_FlexPipeCurves, BuiltInCategory.OST_PlaceHolderPipes, BuiltInCategory.OST_PlumbingFixtures]; readonly BuiltInCategory[] cabletrayCategory = [ BuiltInCategory.OST_CableTray, BuiltInCategory.OST_CableTrayFitting,]; readonly BuiltInCategory[] conduitCategory = [ BuiltInCategory.OST_Conduit, BuiltInCategory.OST_ConduitFitting,]; private void UpdateCheckedState(Document doc) { if (doc.ActiveView.ViewTemplateId != ElementId.InvalidElementId) { MessageBox.Show("当前视图已应用视图样板,无法修改其可见性", "提示"); return; } WallBtn.IsChecked = GetCheckedStatue(doc, wallCategory); BeamBtn.IsChecked = GetCheckedStatue(doc, beamCategory); FloorBtn.IsChecked = GetCheckedStatue(doc, floorCategory); ColumnBtn.IsChecked = GetCheckedStatue(doc, columnsCategory); MechanicalBtn.IsChecked = GetCheckedStatue(doc, mechanicalCategory); PlumbingBtn.IsChecked = GetCheckedStatue(doc, pipingCategory); CableTrayBtn.IsChecked = GetCheckedStatue(doc, cabletrayCategory); ConduitBtn.IsChecked = GetCheckedStatue(doc, conduitCategory); } private void ToggleButton_OnClicked(object sender, RoutedEventArgs e) { if (sender is not System.Windows.Controls.Primitives.ToggleButton toggleButton) { return; } BuiltInCategory[] builtInCategories = []; switch (toggleButton.Content) { case "墙": builtInCategories = wallCategory; break; case "梁": builtInCategories = beamCategory; break; case "板": builtInCategories = floorCategory; break; case "柱": builtInCategories = columnsCategory; break; case "风": builtInCategories = mechanicalCategory; break; case "水": builtInCategories = pipingCategory; break; case "桥架": builtInCategories = cabletrayCategory; break; case "线管": builtInCategories = conduitCategory; break; } visibleHandler.Raise( (uiapp) => { var uidoc = uiapp.ActiveUIDocument; var doc = uidoc.Document; if (doc.ActiveView.ViewTemplateId != ElementId.InvalidElementId) { MessageBox.Show("当前视图已应用视图样板,无法修改其可见性", "提示"); return; } using Transaction trans = new(doc, "显示控制"); trans.Start(); foreach (var builtInCategory in builtInCategories) { var categoryId = Category.GetCategory(doc, builtInCategory).Id; uidoc.ActiveView.SetCategoryHidden(categoryId, toggleButton.IsChecked == false); } trans.Commit(); } ); } private void Win_OnClosing(object sender, System.ComponentModel.CancelEventArgs e) { visibleHandler.Raise(uiapp => { uiapp.ViewActivated -= Uiapp_ViewActivated; }); } }