using Autodesk.Revit.DB; using Autodesk.Revit.UI.Selection; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Nice3point.Revit.Toolkit.External.Handlers; namespace ShrlAlgoToolkit.RevitAddins.RvMEP; public partial class MoveMEPCurveViewModel : ObservableValidator { [ObservableProperty] public partial bool IsSingle { get; set; } = true; [ObservableProperty] public partial bool ByDistance { get; set; } = true; private readonly ActionEventHandler moveHandler = new(); [Common.Attributes.IsNumeric] [ObservableProperty] [NotifyDataErrorInfo] public partial double Distance { get; set; } //public double Distance //{ // get => distance; // set => SetProperty(ref distance, value, true); //} /// /// 正在执行命令 /// [ObservableProperty] [NotifyCanExecuteChangedFor(nameof(MoveCommand))] public partial bool CanRunning { get; set; } = true; [RelayCommand] private void Closing() { #region 关闭窗口退出选择 if (!CanRunning) { KeyIntPtrHelper.RaiseEscTwice(); } #endregion } [RelayCommand] private void Select() { moveHandler.Raise(uiapp => { var uiDocument = uiapp.ActiveUIDocument; var doc = uiDocument.Document; try { var reference = uiDocument.Selection.PickObject(ObjectType.Element, new GenericFilter(), "请选择移动管线"); var mepCurve = doc.GetElement(reference) as MEPCurve; var ids = new List(); mepCurve.GetAllConnectedElements(ids); uiDocument.Selection.SetElementIds(ids); } catch (Exception) { return; } CanRunning = true; }); } [RelayCommand] private void Move() { CanRunning = false; moveHandler.Raise(uiapp => { var uiDocument = uiapp.ActiveUIDocument; var doc = uiDocument.Document; doc.Invoke( _ => { double z; MEPCurve mepCurve; try { var reference = uiDocument.Selection.PickObject(ObjectType.Element, new GenericFilter(), "请选择移动管线"); mepCurve = doc.GetElement(reference) as MEPCurve; } catch (Exception) { CanRunning = true; return; } if (ByDistance) { z = Distance / 304.8; } else { Reference reference = null; ElementInLinkOrCurrentDocument linkOrCurrentDocument = new(doc); try { reference = uiDocument.Selection.PickObject(ObjectType.PointOnElement, linkOrCurrentDocument, "请选择基准元素"); } catch (Exception) { // ignored } if (reference == null) { CanRunning = true; return; } var referenceElem = linkOrCurrentDocument.LastCheckedWasFromLink ? linkOrCurrentDocument.LinkedDocument.GetElement(reference.LinkedElementId) : doc.GetElement(reference); var referMaxZ = referenceElem.get_BoundingBox(doc.ActiveView).Max.Z; var referMinZ = referenceElem.get_BoundingBox(doc.ActiveView).Min.Z; var maxZ = mepCurve.get_BoundingBox(doc.ActiveView).Max.Z; var minZ = mepCurve.get_BoundingBox(doc.ActiveView).Min.Z; //参考底部大于原管线顶部 if (referMinZ > maxZ) { z = (referMinZ - Math.Abs((double)Distance) / 304.8) - maxZ; } //参考顶部大于原管线底部 else if (referMaxZ < minZ) { z = (referMaxZ + Math.Abs((double)Distance) / 304.8) - minZ; } else { CanRunning = true; return; } } if (IsSingle) { ElementTransformUtils.MoveElement(doc, mepCurve.Id, XYZ.BasisZ * z); } else { var ids = new List(); mepCurve.GetAllConnectedElements(ids); ElementTransformUtils.MoveElements(doc, ids, XYZ.BasisZ * z); } }, "移动管线" ); CanRunning = true; }); } }