public static Autodesk.AutoCAD.DatabaseServices.Polyline ToPolyline(CompositeCurve3d cc3d)
{
Autodesk.AutoCAD.DatabaseServices.Polyline pl = new Autodesk.AutoCAD.DatabaseServices.Polyline();
pl.Elevation = cc3d.StartPoint[2];
Plane plane = pl.GetPlane();
Point2d endver = Point2d.Origin;
int i = 0;
foreach (Curve3d c3d in cc3d.GetCurves())
{
if (c3d is CircularArc3d)
{
CircularArc3d ca3d = (CircularArc3d)c3d;
double b = Math.Tan(0.25 * (ca3d.EndAngle - ca3d.StartAngle)) * ca3d.Normal[2];
pl.AddVertexAt(i, c3d.StartPoint.Convert2d(plane), b, 0, 0);
endver = c3d.EndPoint.Convert2d(plane);
}
else
{
pl.AddVertexAt(i, c3d.StartPoint.Convert2d(plane), 0, 0, 0);
endver = c3d.EndPoint.Convert2d(plane);
}
i++;
}
pl.AddVertexAt(i, endver, 0, 0, 0);
return pl;
}
public static CompositeCurve3d ToCompositeCurve3d(Autodesk.AutoCAD.DatabaseServices.Polyline pl)
{
List<Curve3d> c3ds = new List<Curve3d>();
for (int i = 0; i < pl.NumberOfVertices; i++)
{
switch (pl.GetSegmentType(i))
{
case SegmentType.Line:
c3ds.Add(pl.GetLineSegmentAt(i));
break;
case SegmentType.Arc:
c3ds.Add(pl.GetArcSegmentAt(i));
break;
default:
break;
}
}
return new CompositeCurve3d(c3ds.ToArray());
}
[CommandMethod("t8")]
public static void Test8()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
Autodesk.AutoCAD.DatabaseServices.Polyline pl = new Autodesk.AutoCAD.DatabaseServices.Polyline();
pl.AddVertexAt(0, new Point2d(0, 0), 0, 0, 0);
pl.AddVertexAt(1, new Point2d(10, 0), 0.5, 0, 0);
pl.AddVertexAt(2, new Point2d(20, 0), 0, 0, 0);
pl.Elevation = 10;
CompositeCurve3d cc3d = ToCompositeCurve3d(pl);
cc3d = (CompositeCurve3d)cc3d.GetOrthoProjectEntity(new Plane());
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
pl = ToPolyline(cc3d);
btr.AppendEntity(pl);
tr.AddNewlyCreatedDBObject(pl, true);
tr.Commit();
}