Revit的offset函数结果会自交,一些二维图形处理函数并不完善。因此萌生Revit调用CAD的几何库;
1、引用AcDbMgd.dll;
2、命令函数
[Transaction(TransactionMode.Manual)]
[Regeneration(RegenerationOption.Manual)]
public class TestReduceCommand : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
Maker.Instance.Init(commandData);
try
{
//选择第一个
UIApplication app = commandData.Application;
Document doc = app.ActiveUIDocument.Document;
Reference ref1 = app.ActiveUIDocument.Selection.PickObject(
ObjectType.Face, "选择第一个面");
var element1 = doc.GetElement(ref1);
if (element1 == null)
{
//MessageBox.Show("选择类型需要为element");
return Result.Failed;
}
var f1 = element1.GetGeometryObjectFromReference(ref1) as Face;
//获得两个loop
CurveLoop clp = f1.GetEdgesAsCurveLoops().First();
var res=OffsetTool.TestOffset(clp,1);
Maker.GetInstance().MakeCurveLoop(res);
return Result.Succeeded;
}
catch (Exception e)
{
MessageBox.Show(e.Message + "\n" + e.StackTrace.ToString(), "error");
return Result.Failed;
}
}
}
3、工具函数
public class OffsetTool
{
public static XYZ Convert(Point3d pt)
{
return new XYZ(pt.X, pt.Y, pt.Z);
}
public static CurveLoop Convert(Polyline pl)
{
if (pl == null) return null;
CurveLoop res = new CurveLoop();
int nlen = pl.NumberOfVertices;
List<XYZ> pts = new List<XYZ>();
for(int i=0;i<nlen;++i)
{
Point3d curPt = pl.GetPoint3dAt(i);
pts.Add(Convert(curPt));
}
return CurveLoopTool.CreateCurveloop(pts);
}
public static Polyline Convert(CurveLoop clp)
{
var pts=CurveLoopTool.GetCurveloopPts(clp);
Polyline res = new Polyline();
int nlen = pts.Count;
for(int i=0;i<nlen;++i)
{
res.AddVertexAt(i, new Point2d(pts[i].X,pts[i].Y),0,0,0);
}
return res;
}
public static List<CurveLoop> TestOffset(CurveLoop clp,double offDis)
{
var res = new List<CurveLoop>();
Polyline pl = Convert(clp);
var results = pl.GetOffsetCurves(offDis);
foreach(var item in results)
{
var curPl=item as Polyline;
if (curPl == null) continue;
var newClp = Convert(curPl);
res.Add(newClp);
}
return res;
}
}
4、结论:调用时,会报错: