Calculating the Center of an Arc in a Polyline using ObjectARX

by Fenton Webb

The easiest way to do this is to construct an AcGeCircArc2d or AcGeCircArc3d
object and then use its center() method to get the point you want.

The following function finds any arc segments in a lightweight polyline and
identifies the center by dropping a point entity (AcDbPoint) in the calculated
location.

#include     void show_centers()    {            // UI for selecting an entity         ads_name en;         ads_point pt;         int rc = acedEntSel(L"Select LW polyline: ", en, pt);         if (rc != RTNORM)       {           acutPrintf(L"Nothing selected.n", rc);           return;          }                  // convert ads_name to object id        AcDbObjectId eId;           Acad::ErrorStatus es = acdbGetObjectId(eId, en);         // open object        AcDbObjectPointer pPolyline(eId, AcDb::kForRead);      if(pPolyline.openStatus() != Acad::eOk)         {           acutPrintf(L"You did not select a LW polyline.n");             return;          }               // get the number of segments         int segments = pPolyline->numVerts() - 1;         for(int i = 0; i < segments; i++)       {            if(pPolyline->segType(i) != AcDbPolyline::kArc)           continue;                 // get arc segment on polyline            AcGeCircArc2d geArc;            pPolyline->getArcSegAt(i, geArc);            // get center            AcGePoint2d center = geArc.center();            // create a point entity            AcDbObjectPointer pPoint;             AcDbPoint *pointPtr = new AcDbPoint(AcGePoint3d(center[0],         center[1], 0.0));          pPoint.acquire(pointPtr);
<p style="margin: 0px"><font face="Consolas"><font style="font-size: 8pt" color="#000000">&#160;</font></font></p>    <p style="margin: 0px"><font face="Consolas"><font color="#000000"><font style="font-size: 8pt">&#160;&#160;&#160; </font></font><span style="color:"><font style="font-size: 8pt" color="#008000">// add the point entity to the block table record&#160;&#160;&#160; </font></span></font></p>    <p style="margin: 0px"><font face="Consolas"><font color="#000000"><font style="font-size: 8pt">&#160;&#160;&#160; </font></font><span style="color:"><font style="font-size: 8pt" color="#008000">// containing the selected polyline&#160;&#160;&#160; </font></span></font></p>    <p style="margin: 0px"><font face="Consolas"><font color="#000000"><font style="font-size: 8pt">&#160;&#160;&#160; </font></font><font style="font-size: 8pt"><span style="color:"><font color="#010001">AcDbBlockTableRecordPointer</font></span><font color="#000000"> </font><span style="color:"><font color="#010001">curSpace</font></span><font color="#000000">(</font><span style="color:"><font color="#010001">pPolyline</font></span><font color="#000000">-&gt;</font><span style="color:"><font color="#010001">blockId</font></span><font color="#000000">(), </font></font></font></p>    <p style="margin: 0px"><font face="Consolas"><font color="#000000"><font style="font-size: 8pt">&#160;&#160;&#160;&#160;&#160; </font></font><font style="font-size: 8pt"><span style="color:"><font color="#010001">AcDb</font></span><font color="#000000">::</font><span style="color:"><font color="#010001">kForWrite</font></span><font color="#000000">);</font></font></font></p>    <p style="margin: 0px"><font face="Consolas"><font color="#000000"><font style="font-size: 8pt">&#160;&#160;&#160; </font></font><font style="font-size: 8pt"><span style="color:"><font color="#0000ff">if</font></span><font color="#000000"> (</font><span style="color:"><font color="#010001">curSpace</font></span><font color="#000000">.</font><span style="color:"><font color="#010001">openStatus</font></span><font color="#000000">() == </font><span style="color:"><font color="#010001">Acad</font></span><font color="#000000">::</font><span style="color:"><font color="#010001">eOk</font></span><font color="#000000">)</font></font></font></p>    <p style="margin: 0px"><font face="Consolas"><font color="#000000"><font style="font-size: 8pt">&#160;&#160;&#160;&#160;&#160; </font></font><font style="font-size: 8pt"><span style="color:"><font color="#010001">curSpace</font></span><font color="#000000">-&gt;</font><span style="color:"><font color="#010001">appendAcDbEntity</font></span><font color="#000000">(</font><span style="color:"><font color="#010001">pPoint</font></span><font color="#000000">);&#160;&#160;&#160; </font></font></font></p>    <p style="margin: 0px"><font face="Consolas"><font style="font-size: 8pt" color="#000000">&#160;</font></font></p>    <p style="margin: 0px"><font face="Consolas"><font color="#000000"><font style="font-size: 8pt">&#160;&#160;&#160; </font></font><font style="font-size: 8pt"><span style="color:"><font color="#010001">acutPrintf</font></span><font color="#000000">(</font><span style="color:"><font color="#010001">L</font></span><span style="color:"><font color="#a31515">&quot;n - center: [%f, %f]&quot;</font></span><font color="#000000">, </font><span style="color:"><font color="#010001">center</font></span><font color="#000000">[0], </font><span style="color:"><font color="#010001">center</font></span><font color="#000000">[1]); </font></font></font></p>    <p style="margin: 0px"><font face="Consolas"><font style="font-size: 8pt" color="#000000">&#160; }&#160;&#160; </font></font></p>    <p style="margin: 0px"><font face="Consolas"><font style="font-size: 8pt" color="#000000">}</font></font></p>    <p style="margin: 0px"><font face="Consolas"><font style="font-size: 8pt" color="#000000">&#160;</font></font></p> </div>

Comments

Leave a Reply

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading