Files
SzmediTools/Szmedi.RvKits/Display/CategoryDisplayWin.xaml.cs
2025-09-16 16:06:41 +08:00

169 lines
6.1 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Windows;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Nice3point.Revit.Toolkit.External.Handlers;
namespace Szmedi.RvKits.DisplayTools;
/// <summary>
/// CategoryDisplayWin.xaml 的交互逻辑
/// </summary>
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);
}
}
/// <summary>
/// true为可见false为不可见
/// </summary>
/// <param name="doc"></param>
/// <param name="builtInCategories"></param>
/// <returns></returns>
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;
});
}
}