Files
Shrlalgo.RvKits/ShrlAlgoToolkit.RevitAddins/RvView/VisibilityViewModel.cs
2025-04-24 20:56:10 +08:00

333 lines
11 KiB
C#
Raw 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.Windows;
using System.Windows.Controls.Primitives;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Nice3point.Revit.Toolkit.External.Handlers;
namespace ShrlAlgo.RvKits.RvView;
public partial class VisibilityViewModel : ObservableObject
{
public ActionEventHandler VisibilityHandler { get; } = new();
[ObservableProperty]
private bool wallChecked;
[ObservableProperty]
private bool floorChecked;
[ObservableProperty]
private bool beamChecked;
[ObservableProperty]
private bool mechanicalChecked;
[ObservableProperty]
private bool columnChecked;
[ObservableProperty]
private bool plumbingChecked;
[ObservableProperty]
private bool cableTrayChecked;
[ObservableProperty]
private bool conduitChecked;
partial void OnBeamCheckedChanged(bool value)
{
VisibilityHandler.Raise(uiapp =>
{
UIDocument uidoc = uiapp.ActiveUIDocument;
var doc = uidoc.Document;
if (doc.ActiveView.ViewTemplateId != ElementId.InvalidElementId)
{
MessageBox.Show("当前视图已应用视图样板,无法修改其可见性", "提示");
return;
}
doc.Invoke(
_ =>
{
foreach (var builtInCategory in beamCategory)
{
var categoryId = Category.GetCategory(doc, builtInCategory).Id;
uidoc.ActiveView.SetCategoryHidden(categoryId, value == false);
}
},
"梁显隐"
);
});
}
partial void OnCableTrayCheckedChanged(bool value)
{
VisibilityHandler.Raise(uiapp =>
{
UIDocument uidoc = uiapp.ActiveUIDocument;
var doc = uidoc.Document;
if (doc.ActiveView.ViewTemplateId != ElementId.InvalidElementId)
{
MessageBox.Show("当前视图已应用视图样板,无法修改其可见性", "提示");
return;
}
doc.Invoke(
_ =>
{
foreach (var builtInCategory in cabletrayCategory)
{
var categoryId = Category.GetCategory(doc, builtInCategory).Id;
uidoc.ActiveView.SetCategoryHidden(categoryId, value == false);
}
},
"桥架显隐"
);
});
}
partial void OnColumnCheckedChanged(bool value)
{
VisibilityHandler.Raise(uiapp =>
{
UIDocument uidoc = uiapp.ActiveUIDocument;
var doc = uidoc.Document;
if (doc.ActiveView.ViewTemplateId != ElementId.InvalidElementId)
{
MessageBox.Show("当前视图已应用视图样板,无法修改其可见性", "提示");
return;
}
doc.Invoke(
_ =>
{
foreach (var builtInCategory in columnsCategory)
{
var categoryId = Category.GetCategory(doc, builtInCategory).Id;
uidoc.ActiveView.SetCategoryHidden(categoryId, value == false);
}
},
"柱显隐"
);
});
}
partial void OnWallCheckedChanged(bool value)
{
VisibilityHandler.Raise(uiapp =>
{
UIDocument uidoc = uiapp.ActiveUIDocument;
var doc = uidoc.Document;
if (doc.ActiveView.ViewTemplateId != ElementId.InvalidElementId)
{
MessageBox.Show("当前视图已应用视图样板,无法修改其可见性", "提示");
return;
}
doc.Invoke(
_ =>
{
foreach (var builtInCategory in wallCategory)
{
var categoryId = Category.GetCategory(doc, builtInCategory).Id;
uidoc.ActiveView.SetCategoryHidden(categoryId, value == false);
}
},
"墙显隐"
);
});
}
partial void OnFloorCheckedChanged(bool value)
{
VisibilityHandler.Raise(uiapp =>
{
UIDocument uidoc = uiapp.ActiveUIDocument;
var doc = uidoc.Document;
if (doc.ActiveView.ViewTemplateId != ElementId.InvalidElementId)
{
MessageBox.Show("当前视图已应用视图样板,无法修改其可见性", "提示");
return;
}
doc.Invoke(
_ =>
{
foreach (var builtInCategory in floorCategory)
{
var categoryId = Category.GetCategory(doc, builtInCategory).Id;
uidoc.ActiveView.SetCategoryHidden(categoryId, value == false);
}
},
"楼板显隐"
);
});
}
partial void OnConduitCheckedChanged(bool value)
{
VisibilityHandler.Raise(uiapp =>
{
UIDocument uidoc = uiapp.ActiveUIDocument;
var doc = uidoc.Document;
if (doc.ActiveView.ViewTemplateId != ElementId.InvalidElementId)
{
MessageBox.Show("当前视图已应用视图样板,无法修改其可见性", "提示");
return;
}
doc.Invoke(
_ =>
{
foreach (var builtInCategory in conduitCategory)
{
var categoryId = Category.GetCategory(doc, builtInCategory).Id;
uidoc.ActiveView.SetCategoryHidden(categoryId, value == false);
}
},
"线管显隐"
);
});
}
partial void OnMechanicalCheckedChanged(bool value)
{
VisibilityHandler.Raise(uiapp =>
{
UIDocument uidoc = uiapp.ActiveUIDocument;
var doc = uidoc.Document;
if (doc.ActiveView.ViewTemplateId != ElementId.InvalidElementId)
{
MessageBox.Show("当前视图已应用视图样板,无法修改其可见性", "提示");
return;
}
doc.Invoke(
_ =>
{
foreach (var builtInCategory in mechanicalCategory)
{
var categoryId = Category.GetCategory(doc, builtInCategory).Id;
uidoc.ActiveView.SetCategoryHidden(categoryId, value == false);
}
},
"暖通显隐"
);
});
}
partial void OnPlumbingCheckedChanged(bool value)
{
VisibilityHandler.Raise(uiapp =>
{
UIDocument uidoc = uiapp.ActiveUIDocument;
var doc = uidoc.Document;
if (doc.ActiveView.ViewTemplateId != ElementId.InvalidElementId)
{
MessageBox.Show("当前视图已应用视图样板,无法修改其可见性", "提示");
return;
}
doc.Invoke(
_ =>
{
foreach (var builtInCategory in pipingCategory)
{
var categoryId = Category.GetCategory(doc, builtInCategory).Id;
uidoc.ActiveView.SetCategoryHidden(categoryId, value == false);
}
},
"给排水显隐"
);
});
}
public VisibilityViewModel(UIApplication uiapp)
{
UpdateCheckedState(uiapp.ActiveUIDocument.Document);
uiapp.ViewActivated -= Uiapp_ViewActivated;
uiapp.ViewActivated += Uiapp_ViewActivated;
}
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>
private static bool GetCheckedStatue(Document doc, params BuiltInCategory[] builtInCategories)
{
foreach (var cate in builtInCategories)
{
var category = Category.GetCategory(doc, cate);
return !doc.ActiveView.GetCategoryHidden(category.Id);
}
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)
{
return;
}
WallChecked = GetCheckedStatue(doc, wallCategory);
BeamChecked = GetCheckedStatue(doc, beamCategory);
FloorChecked = GetCheckedStatue(doc, floorCategory);
ColumnChecked = GetCheckedStatue(doc, columnsCategory);
MechanicalChecked = GetCheckedStatue(doc, mechanicalCategory);
PlumbingChecked = GetCheckedStatue(doc, pipingCategory);
CableTrayChecked = GetCheckedStatue(doc, cabletrayCategory);
ConduitChecked = GetCheckedStatue(doc, conduitCategory);
}
[RelayCommand]
private void Closing()
{
VisibilityHandler.Raise(uiapp => uiapp.ViewActivated -= Uiapp_ViewActivated);
}
}