<?xml encoding=”UTF-8″>By Deepak Nadig
We can make use of Brep support to determine the radius and center of a cone( properties shown up in the image image) with circular base.
Below .NET code snippet can be used :
[CommandMethod(<span>"circularConeRadiusAndCenter"</span>)]
<span>public</span> <span>void</span> circularConeRadiusAndCenter()
{
Document doc <span>=</span> Autodesk.AutoCAD.ApplicationServices.<span>Application</span>.DocumentManager.MdiActiveDocument;
Database db <span>=</span> doc.Database;
Editor ed <span>=</span> doc.Editor;
<span>// Ask the user to select a solid</span>
PromptEntityOptions peo <span>=</span> <span>new</span> PromptEntityOptions(<span>"Select a 3D solid"</span>);
peo.SetRejectMessage(<span>"<span>n</span>A 3D solid must be selected."</span>);
peo.AddAllowedClass(<span>typeof</span>(Solid3d), <span>true</span>);
PromptEntityResult per <span>=</span> ed.GetEntity(peo);
<span>if</span> (per.Status <span>!</span><span>=</span> PromptStatus.OK)
<span>return</span>;
Transaction tr <span>=</span> db.TransactionManager.StartTransaction();
using (tr)
{
Solid3d sol <span>=</span> tr.GetObject(per.ObjectId, OpenMode.ForRead) as Solid3d;
using (Brep brep <span>=</span> <span>new</span> Brep(sol))
{
<span>//check if base is a circular. If yes, then determine the center and radius</span>
foreach (Complex cmp <span>in</span> brep.Complexes)
{
<span>int</span> edgeCnt <span>=</span> <span>1</span>;
foreach (Edge edge <span>in</span> brep.Edges)
{
ed.WriteMessage(<span>"<span>n</span> --> Edge : {0}"</span>, edgeCnt<span>+</span><span>+</span>);
Curve3d edgeCurve <span>=</span> edge.Curve;
<span>if</span> (edgeCurve is ExternalCurve3d)
{
ed.WriteMessage(<span>"<span>n</span> Edge type : {0}"</span>, <span>"ExternalCurve3d"</span>);
ExternalCurve3d extCurve3d <span>=</span> edgeCurve as ExternalCurve3d;
Curve3d nativeCurve <span>=</span> extCurve3d.NativeCurve;
<span>if</span> (nativeCurve is CircularArc3d)
{
ed.WriteMessage(<span>"<span>n</span> Native curve type : {0}"</span>, <span>"CircularArc3d"</span>);
CircularArc3d circArc3d <span>=</span> nativeCurve as CircularArc3d;
ed.WriteMessage(<span>"<span>n</span> radius is "</span> <span>+</span> circArc3d.Radius.ToString());
ed.WriteMessage(<span>"<span>n</span> center is "</span> <span>+</span> PointToStr(circArc3d.Center));
}
<span>else</span>
{
ed.WriteMessage(<span>"<span>n</span> Native curve type of cone is not Circular"</span>);
<span>return</span>;
}
}
}
}
}
}
}
<span>private</span> string PointToStr(Point3d point)
{
<span>return</span> <span>"["</span> <span>+</span>
point.X.ToString(<span>"F2"</span>) <span>+</span> <span>", "</span> <span>+</span>
point.Y.ToString(<span>"F2"</span>) <span>+</span> <span>", "</span> <span>+</span>
point.Z.ToString(<span>"F2"</span>)
<span>+</span> <span>"]"</span>;
}


Leave a Reply