在调管综的过程中,模型往往有些管道不平行,导致尺寸定位不了,所以在此做一个管道平行的功能。一键将管道平行,代码如下:
UIApplication uiapp = commandData.Application;
UIDocument uidoc = uiapp.ActiveUIDocument;
Document doc = uidoc.Document;
Selection sel = uidoc.Selection;
try
{
var elems = sel.PickObjects(ObjectType.Element);
var elem = sel.PickObject(ObjectType.Element).GetElement(doc) as MEPCurve;
//平行管道
Transaction tr = new Transaction(doc, "Create beam");
tr.Start();
foreach (var item in elems)
{
var elem2 = item.GetElement(doc) as MEPCurve;
var LocaCurve = elem.LocationLine().xyComponent();
LocaCurve.MakeUnbound();
var starpoint = elem2.LocationLine().StartPoint()
.xyComponent().ProjectToXLine(LocaCurve);
var endpoint = elem2.LocationLine().EndPoint()
.xyComponent().ProjectToXLine(LocaCurve);
var originaldis = getHorizontalDis(elem2, elem);
var transline = Line.CreateBound(starpoint, endpoint);
var offsetCurve = transline.CreateOffset(originaldis, XYZ.BasisZ);
(elem2.Location as LocationCurve).Curve = offsetCurve;
}
tr.Commit();
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
return Result.Succeeded;
double getHorizontalDis(MEPCurve mep, MEPCurve mep2)
{
var line1 = mep.LocationLine().xyComponent();
var line2 = mep2.LocationLine().xyComponent();
var origin = line1.StartPoint();
var originprojectonline2 = origin.ProjectToXLine(line2);
var dir = originprojectonline2 - origin;
var horizontaldir = dir.xyComponent();
return horizontaldir.GetLength();
}
public static Line xyComponent(this Line line)
{
var startpoint = line.GetEndPoint(0);
var endpoint = line.GetEndPoint(1);
var p0 = new XYZ(startpoint.X, startpoint.Y, 0);
var p1 = new XYZ(endpoint.X, endpoint.Y, 0);
return Line.CreateBound(p0, p1);
}