增加保温层和整理管线的功能,修复自动保存功能等修复多个bug
This commit is contained in:
@@ -62,108 +62,121 @@ public partial class ClashResolveViewModel : ObservableObject
|
||||
doc.Invoke(
|
||||
ts =>
|
||||
{
|
||||
switch (LocationType)
|
||||
try
|
||||
{
|
||||
case LocationType.Manual:
|
||||
switch (LocationType)
|
||||
{
|
||||
case LocationType.Manual:
|
||||
|
||||
{
|
||||
var reference1 = uidoc.Selection.PickObject(
|
||||
ObjectType.PointOnElement,
|
||||
new FuncFilter(
|
||||
e =>
|
||||
e is MEPCurve mepCurve and not InsulationLiningBase
|
||||
&& mepCurve.GetLocCurve() is Line line
|
||||
&& !line.Direction.CrossProduct(XYZ.BasisZ).IsAlmostEqualTo(XYZ.Zero)
|
||||
),
|
||||
"请选择翻弯的管线上的点"
|
||||
);
|
||||
mepCurveToBend = doc.GetElement(reference1) as MEPCurve;
|
||||
|
||||
var reference2 = uidoc.Selection.PickObject(
|
||||
ObjectType.PointOnElement,
|
||||
new FuncFilter(e => e.Id == mepCurveToBend!.Id),
|
||||
"请选择另一个翻弯管线上的点或确定单侧翻弯的需要偏移一侧"
|
||||
);
|
||||
//两个断点,breakPoint1距离原直线起点近,反向时,交换值
|
||||
breakPoint1 = mepCurveToBend.GetLocCurve().Project(reference1.GlobalPoint).XYZPoint;
|
||||
breakPoint2 = mepCurveToBend.GetLocCurve().Project(reference2.GlobalPoint).XYZPoint;
|
||||
}
|
||||
break;
|
||||
case LocationType.Reference:
|
||||
|
||||
{
|
||||
var reference = uidoc.Selection.PickObject(
|
||||
ObjectType.Element,
|
||||
new FuncFilter(
|
||||
e =>
|
||||
e is MEPCurve mepCurve and not InsulationLiningBase
|
||||
&& mepCurve.GetLocCurve() is Line line
|
||||
&& !line.Direction.CrossProduct(XYZ.BasisZ).IsAlmostEqualTo(XYZ.Zero)
|
||||
),
|
||||
"请选择参照的管线"
|
||||
);
|
||||
//参考的管线定位
|
||||
var referenceMEPCurve = doc.GetElement(reference);
|
||||
var referenceLine = referenceMEPCurve.GetLocCurve() as Line;
|
||||
|
||||
var reference1 = uidoc.Selection.PickObject(
|
||||
ObjectType.PointOnElement,
|
||||
new FuncFilter(
|
||||
e =>
|
||||
e is MEPCurve mepCurve and not InsulationLiningBase
|
||||
&& mepCurve.GetLocCurve() is Line line
|
||||
&& !line.Direction.CrossProduct(XYZ.BasisZ).IsAlmostEqualTo(XYZ.Zero)
|
||||
&& e.Id != referenceMEPCurve!.Id
|
||||
),
|
||||
"请选择翻弯的管线或确定单侧翻弯的需要偏移一侧"
|
||||
);
|
||||
//翻弯的管线定位
|
||||
mepCurveToBend = doc.GetElement(reference1) as MEPCurve;
|
||||
var bendLine = mepCurveToBend.GetLocCurve() as Line;
|
||||
|
||||
var result = bendLine!.Intersect(referenceLine, out var array);
|
||||
|
||||
XYZ intersectPoint = default;
|
||||
switch (result)
|
||||
{
|
||||
case SetComparisonResult.Overlap:
|
||||
intersectPoint = array.get_Item(0).XYZPoint;
|
||||
break;
|
||||
case SetComparisonResult.Disjoint:
|
||||
{
|
||||
IList<ClosestPointsPairBetweenTwoCurves> points =
|
||||
[];
|
||||
bendLine.ComputeClosestPoints(referenceLine, true, true, false, out points);
|
||||
var point = points.FirstOrDefault()?.XYZPointOnFirstCurve;
|
||||
if (bendLine.IsInsideEx(point, 0.2))
|
||||
{
|
||||
intersectPoint = point;
|
||||
}
|
||||
var reference1 = uidoc.Selection.PickObject(
|
||||
ObjectType.PointOnElement,
|
||||
new FuncFilter(
|
||||
e =>
|
||||
e is MEPCurve mepCurve and not InsulationLiningBase
|
||||
&& mepCurve.GetLocCurve() is Line line
|
||||
&& !line.Direction.CrossProduct(XYZ.BasisZ).IsAlmostEqualTo(XYZ.Zero)
|
||||
),
|
||||
"请选择翻弯的管线上的点"
|
||||
);
|
||||
mepCurveToBend = doc.GetElement(reference1) as MEPCurve;
|
||||
if (mepCurveToBend.Pinned)
|
||||
{
|
||||
MessageBox.Show("错误", "请解锁图元");
|
||||
CanRunning = true;
|
||||
return;
|
||||
}
|
||||
var reference2 = uidoc.Selection.PickObject(
|
||||
ObjectType.PointOnElement,
|
||||
new FuncFilter(e => e.Id == mepCurveToBend!.Id),
|
||||
"请选择另一个翻弯管线上的点或确定单侧翻弯的需要偏移一侧"
|
||||
);
|
||||
//两个断点,breakPoint1距离原直线起点近,反向时,交换值
|
||||
breakPoint1 = mepCurveToBend.GetLocCurve().Project(reference1.GlobalPoint).XYZPoint;
|
||||
breakPoint2 = mepCurveToBend.GetLocCurve().Project(reference2.GlobalPoint).XYZPoint;
|
||||
}
|
||||
break;
|
||||
case LocationType.Reference:
|
||||
|
||||
{
|
||||
var reference = uidoc.Selection.PickObject(
|
||||
ObjectType.Element,
|
||||
new FuncFilter(
|
||||
e =>
|
||||
e is MEPCurve mepCurve and not InsulationLiningBase
|
||||
&& mepCurve.GetLocCurve() is Line line
|
||||
&& !line.Direction.CrossProduct(XYZ.BasisZ).IsAlmostEqualTo(XYZ.Zero)
|
||||
),
|
||||
"请选择参照的管线"
|
||||
);
|
||||
//参考的管线定位
|
||||
var referenceMEPCurve = doc.GetElement(reference);
|
||||
var referenceLine = referenceMEPCurve.GetLocCurve() as Line;
|
||||
|
||||
var reference1 = uidoc.Selection.PickObject(
|
||||
ObjectType.PointOnElement,
|
||||
new FuncFilter(
|
||||
e =>
|
||||
e is MEPCurve mepCurve and not InsulationLiningBase
|
||||
&& mepCurve.GetLocCurve() is Line line
|
||||
&& !line.Direction.CrossProduct(XYZ.BasisZ).IsAlmostEqualTo(XYZ.Zero)
|
||||
&& e.Id != referenceMEPCurve!.Id
|
||||
),
|
||||
"请选择翻弯的管线或确定单侧翻弯的需要偏移一侧"
|
||||
);
|
||||
//翻弯的管线定位
|
||||
mepCurveToBend = doc.GetElement(reference1) as MEPCurve;
|
||||
var bendLine = mepCurveToBend.GetLocCurve() as Line;
|
||||
|
||||
var result = bendLine!.Intersect(referenceLine, out var array);
|
||||
|
||||
XYZ intersectPoint = default;
|
||||
switch (result)
|
||||
{
|
||||
case SetComparisonResult.Overlap:
|
||||
intersectPoint = array.get_Item(0).XYZPoint;
|
||||
break;
|
||||
}
|
||||
}
|
||||
case SetComparisonResult.Disjoint:
|
||||
{
|
||||
IList<ClosestPointsPairBetweenTwoCurves> points =
|
||||
[];
|
||||
bendLine.ComputeClosestPoints(referenceLine, true, true, false, out points);
|
||||
var point = points.FirstOrDefault()?.XYZPointOnFirstCurve;
|
||||
if (bendLine.IsInsideEx(point, 0.2))
|
||||
{
|
||||
intersectPoint = point;
|
||||
}
|
||||
|
||||
breakPoint1 = intersectPoint - (bendLine.Direction * Offset / 304.8);
|
||||
breakPoint2 = intersectPoint + (bendLine.Direction * Offset / 304.8);
|
||||
if (
|
||||
reference1.GlobalPoint.DistanceTo(breakPoint1)
|
||||
< reference1.GlobalPoint.DistanceTo(breakPoint2)
|
||||
) //距离近的是breakpoint2
|
||||
{
|
||||
(breakPoint1, breakPoint2) = (breakPoint2, breakPoint1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (
|
||||
intersectPoint == default
|
||||
|| !bendLine.IsInsideEx(breakPoint1, 0.2)
|
||||
|| !bendLine.IsInsideEx(breakPoint2, 0.2)
|
||||
)
|
||||
{
|
||||
return;
|
||||
breakPoint1 = intersectPoint - (bendLine.Direction * Offset / 304.8);
|
||||
breakPoint2 = intersectPoint + (bendLine.Direction * Offset / 304.8);
|
||||
if (
|
||||
reference1.GlobalPoint.DistanceTo(breakPoint1)
|
||||
< reference1.GlobalPoint.DistanceTo(breakPoint2)
|
||||
) //距离近的是breakpoint2
|
||||
{
|
||||
(breakPoint1, breakPoint2) = (breakPoint2, breakPoint1);
|
||||
}
|
||||
|
||||
if (
|
||||
intersectPoint == default
|
||||
|| !bendLine.IsInsideEx(breakPoint1, 0.2)
|
||||
|| !bendLine.IsInsideEx(breakPoint2, 0.2)
|
||||
)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (Autodesk.Revit.Exceptions.OperationCanceledException)
|
||||
{
|
||||
CanRunning = true;
|
||||
return;
|
||||
}
|
||||
|
||||
var originBaseLine = mepCurveToBend.GetLocCurve() as Line;
|
||||
|
||||
Reference in New Issue
Block a user