Here's a C# method which creates a polyline matching a circle. It works whatever the circle plane.
public static Polyline CircleToPolyline(Circle circle)
{
var normal = circle.Normal;
var plane = new Plane(Point3d.Origin, circle.Normal);
var center2d = circle.Center.Convert2d(plane);
var pt1 = center2d + Vector2d.XAxis * circle.Radius;
var pt2 = center2d - Vector2d.XAxis * circle.Radius;
var pline = new Polyline(2);
pline.AddVertexAt(0, pt1, 1.0, 0.0, 0.0);
pline.AddVertexAt(1, pt2, 1.0, 0.0, 0.0);
pline.Closed = true;
pline.Normal = normal;
pline.Elevation = circle.Center.TransformBy(Matrix3d.WorldToPlane(plane)).Z; ;
return pline;
}
An equivalent LISP routine:
(defun circle2pline (circle / elst normal center vector)
(if
(and
(setq elst (entget circle))
(= (cdr (assoc 0 elst)) "CIRCLE")
(setq normal (cdr (assoc 210 elst)))
(setq center (cdr (assoc 10 elst)))
(setq vector (list (cdr (assoc 40 elst)) 0.))
)
(entmakex
(list
(cons 0 "LWPOLYLINE")
(cons 100 "AcDbEntity")
(cons 100 "AcDbPolyline")
(cons 90 2)
(cons 70 1)
(cons 38 (caddr center))
(cons 10 (mapcar '+ center vector))
(cons 42 1.)
(cons 10 (mapcar '- center vector))
(cons 42 1.)
(cons 210 normal)
)
)
)
)