调整代码
This commit is contained in:
164
ShrlAlgoToolkit.RevitAddins/Mep/MoveMEPCurveViewModel.cs
Normal file
164
ShrlAlgoToolkit.RevitAddins/Mep/MoveMEPCurveViewModel.cs
Normal file
@@ -0,0 +1,164 @@
|
||||
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);
|
||||
//}
|
||||
|
||||
/// <summary>
|
||||
/// 正在执行命令
|
||||
/// </summary>
|
||||
[ObservableProperty]
|
||||
[NotifyCanExecuteChangedFor(nameof(RevitAddins.RvMEP.MoveMEPCurveViewModel.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<MEPCurve>(), "请选择移动管线");
|
||||
var mepCurve = doc.GetElement(reference) as MEPCurve;
|
||||
var ids = new List<ElementId>();
|
||||
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>(), "请选择移动管线");
|
||||
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<ElementId>();
|
||||
mepCurve.GetAllConnectedElements(ids);
|
||||
ElementTransformUtils.MoveElements(doc, ids, XYZ.BasisZ * z);
|
||||
}
|
||||
},
|
||||
"移动管线"
|
||||
);
|
||||
CanRunning = true;
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user