using Autodesk.Revit.DB; using Autodesk.Revit.DB.Mechanical; using Autodesk.Revit.DB.Plumbing; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Nice3point.Revit.Toolkit.External.Handlers; namespace Sai.RvKits.RvMEP { public partial class AddInsulationViewModel : ObservableObject { private readonly ActionEventHandler addInsulationHandler = new(); [ObservableProperty] [NotifyCanExecuteChangedFor(nameof(AddInsulationCommand))] private bool addToDuct; [ObservableProperty] [NotifyCanExecuteChangedFor(nameof(AddInsulationCommand))] private bool addToPipe; /// /// 定义的风管保温层 /// [ObservableProperty] private InsulationItem ductInsulationItem; /// /// 定义的管道保温层 /// [ObservableProperty] private List pipeInsulationItems; /// /// 选中的风管系统类型 /// [ObservableProperty] [NotifyCanExecuteChangedFor(nameof(AddInsulationCommand))] private MechanicalSystemType selectedDuctSystem; /// /// 选中的管道系统类型 /// [ObservableProperty] [NotifyCanExecuteChangedFor(nameof(AddInsulationCommand))] private PipingSystemType selectedPipingSystemType; public AddInsulationViewModel(Document doc) { PipingSystemTypes = doc.OfClass().Cast().ToList(); DuctSystemTypes = doc.OfClass().Cast().ToList(); DuctInsulationTypes = doc.OfClass().Cast().ToList(); PipeInsulationTypes = doc.OfClass().Cast().ToList(); PipeInsulationItems = [ new InsulationItem(){MinDiameter=15,MaxDiameter=25, Thickness=25,PipeInsulationType=PipeInsulationTypes.FirstOrDefault()}, new InsulationItem(){MinDiameter=32,MaxDiameter=80, Thickness=30,PipeInsulationType=PipeInsulationTypes.FirstOrDefault()}, new InsulationItem(){MinDiameter=100,MaxDiameter=1000, Thickness=35,PipeInsulationType=PipeInsulationTypes.FirstOrDefault()}, ]; DuctInsulationItem = new() { Thickness = 50, DuctInsulationType = DuctInsulationTypes.FirstOrDefault() }; } [RelayCommand(CanExecute = nameof(CanAdd))] private void AddInsulation() { addInsulationHandler.Raise( uiapp => { var uidoc = uiapp.ActiveUIDocument; var doc = uidoc.Document; doc.Invoke( ts => { if (AddToDuct) { var systems = doc.OfClass().Cast(); foreach (var system in systems) { var elems = system.DuctNetwork; foreach (Element elem in elems) { var id = InsulationLiningBase.GetInsulationIds(doc, elem.Id).FirstOrDefault(); if (id == null) { //风管或风管管件 if (elem is Duct duct || (elem is FamilyInstance instance && instance.Category.Id.IntegerValue == -2008010)) { Autodesk.Revit.DB.Mechanical.DuctInsulation .Create( doc, elem.Id, DuctInsulationItem.DuctInsulationType.Id, DuctInsulationItem.Thickness / 304.8); } } else { var insulation = doc.GetElement(id) as DuctInsulation; insulation.ChangeTypeId(DuctInsulationItem.DuctInsulationType.Id); insulation.Thickness = DuctInsulationItem.Thickness / 304.8; } } } } if (AddToPipe) { var systems = doc.OfClass().Cast(); foreach (var system in systems) { var elems = system.PipingNetwork; foreach (Element elem in elems) { //水管或水管管件 if (elem is Pipe pipe || (elem is FamilyInstance instance && instance.Category.Id.IntegerValue == -2008049)) { InsulationItem pipeInsulation = default; foreach (var item in PipeInsulationItems) { //直径 var str = elem.get_Parameter(BuiltInParameter.RBS_CALCULATED_SIZE) .AsString() .Split(' ') .FirstOrDefault(); if (double.TryParse(str, out var d)) { if (d >= item.MinDiameter && d <= item.MaxDiameter) { pipeInsulation = item; break; } } } var id = InsulationLiningBase.GetInsulationIds(doc, elem.Id).FirstOrDefault(); if (id == null) { if (pipeInsulation != null) { Autodesk.Revit.DB.Plumbing.PipeInsulation .Create( doc, elem.Id, pipeInsulation.PipeInsulationType.Id, pipeInsulation.Thickness / 304.8); } } else { var insulation = doc.GetElement(id) as PipeInsulation; insulation.ChangeTypeId(pipeInsulation.PipeInsulationType.Id); insulation.Thickness = pipeInsulation.Thickness / 304.8; } } } } } }, "添加保温层"); }); } //private bool CanAdd() //{ // return (AddToDuct && SelectedDuctSystem != null) || (AddToPipe && SelectedPipingSystemType != null); //} private bool CanAdd => (AddToDuct && SelectedDuctSystem != null) || (AddToPipe && SelectedPipingSystemType != null); /// /// 所有风管保温层类型 /// public List DuctInsulationTypes { get; set; } /// /// 所有风管系统类型 /// public List DuctSystemTypes { get; set; } /// /// 所有管道保温层类型 /// public List PipeInsulationTypes { get; set; } /// /// 所有管道系统类型 /// public List PipingSystemTypes { get; set; } } }