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;
});
}
}