revit二次开发的过程中常用的方法。
public static void NewLine(this Document doc, XYZ pStart, XYZ pEnd)
{
if (pStart.IsAlmostEqualTo(pEnd))
{
return;
}
using (Transaction tr = new Transaction(doc, Guid.NewGuid().ToString()))
{
try
{
tr.Start();
Line line = Line.CreateBound(pStart, pEnd);
double angle = line.Direction.AngleTo(XYZ.BasisX);
XYZ norm = line.Direction.CrossProduct(XYZ.BasisX).Normalize();
if (angle - 0.0 < 1e-6)
{
angle = line.Direction.AngleTo(XYZ.BasisY);
norm = line.Direction.CrossProduct(XYZ.BasisY).Normalize();
}
if (angle - 0.0 < 1e-6)
{
angle = line.Direction.AngleTo(XYZ.BasisZ);
norm = line.Direction.CrossProduct(XYZ.BasisZ).Normalize();
}
Plane plane = doc.Application.Create.NewPlane(norm, line.Origin);
SketchPlane skplane = SketchPlane.Create(doc, plane);
ModelCurve newLine = doc.Create.NewModelCurve(line, skplane);
tr.Commit();
}
catch (Exception ex)
{
tr.RollBack();
}
}
}
它可以绘制任意直线,绘制直线的时候,当直线与XY平面或XZ平面或YZ平面共线也可以绘制。它是开发的重
要辅助工具。
关键还是在于这段代码,处理了多种情况。
XYZ norm = line.Direction.CrossProduct(XYZ.BasisX).Normalize(); if (angle - 0.0 < 1e-6) { angle = line.Direction.AngleTo(XYZ.BasisY); norm = line.Direction.CrossProduct(XYZ.BasisY).Normalize(); } if (angle - 0.0 < 1e-6) { angle = line.Direction.AngleTo(XYZ.BasisZ); norm = line.Direction.CrossProduct(XYZ.BasisZ).Normalize(); }