<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Joining Lines and Arcs into a Polyline? in ObjectARX Forum</title>
    <link>https://forums.autodesk.com/t5/objectarx-forum/joining-lines-and-arcs-into-a-polyline/m-p/12574182#M1083</link>
    <description>&lt;P&gt;Hello, In AutoCAD, the 'join' command can be used to connect multiple lines and arcs into a single polyline.&lt;/P&gt;&lt;P&gt;Is there a method or function available in the ObjectARX API that provides similar functionality, allowing us to achieve the same result programmatically?&lt;/P&gt;</description>
    <pubDate>Wed, 21 Feb 2024 17:11:40 GMT</pubDate>
    <dc:creator>suparhigh12345</dc:creator>
    <dc:date>2024-02-21T17:11:40Z</dc:date>
    <item>
      <title>Joining Lines and Arcs into a Polyline?</title>
      <link>https://forums.autodesk.com/t5/objectarx-forum/joining-lines-and-arcs-into-a-polyline/m-p/12574182#M1083</link>
      <description>&lt;P&gt;Hello, In AutoCAD, the 'join' command can be used to connect multiple lines and arcs into a single polyline.&lt;/P&gt;&lt;P&gt;Is there a method or function available in the ObjectARX API that provides similar functionality, allowing us to achieve the same result programmatically?&lt;/P&gt;</description>
      <pubDate>Wed, 21 Feb 2024 17:11:40 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/objectarx-forum/joining-lines-and-arcs-into-a-polyline/m-p/12574182#M1083</guid>
      <dc:creator>suparhigh12345</dc:creator>
      <dc:date>2024-02-21T17:11:40Z</dc:date>
    </item>
    <item>
      <title>Re: Joining Lines and Arcs into a Polyline?</title>
      <link>https://forums.autodesk.com/t5/objectarx-forum/joining-lines-and-arcs-into-a-polyline/m-p/12574214#M1084</link>
      <description>&lt;P&gt;&lt;A href="https://help.autodesk.com/view/OARX/2023/ENU/?guid=OARX-RefGuide-AcDbJoinEntityPE__joinEntities_AcDbEntity__AcArray_AcDbEntity____AcGeIntArray__AcGeTol__const" target="_blank"&gt;https://help.autodesk.com/view/OARX/2023/ENU/?guid=OARX-RefGuide-AcDbJoinEntityPE__joinEntities_AcDbEntity__AcArray_AcDbEntity____AcGeIntArray__AcGeTol__const&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 21 Feb 2024 17:27:40 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/objectarx-forum/joining-lines-and-arcs-into-a-polyline/m-p/12574214#M1084</guid>
      <dc:creator>Alexander.Rivilis</dc:creator>
      <dc:date>2024-02-21T17:27:40Z</dc:date>
    </item>
    <item>
      <title>Re: Joining Lines and Arcs into a Polyline?</title>
      <link>https://forums.autodesk.com/t5/objectarx-forum/joining-lines-and-arcs-into-a-polyline/m-p/12574408#M1085</link>
      <description>&lt;P&gt;Other sample:&lt;/P&gt;
&lt;LI-CODE lang="cpp"&gt; 
//-----------------------------------------------------------------------------
//----- acrxEntryPoint.cpp
//-----------------------------------------------------------------------------
#include "StdAfx.h"
#include "resource.h"
 
//-----------------------------------------------------------------------------
#define szRDS _RXST("")
 
//-----------------------------------------------------------------------------
//----- ObjectARX EntryPoint
class CJoinToPlineApp : public AcRxArxApp {
 
public:
  CJoinToPlineApp () : AcRxArxApp () {}
 
  virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
    AcRx::AppRetCode retCode = AcRxArxApp::On_kInitAppMsg (pkt) ;
    return (retCode) ;
  }
 
  virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
    AcRx::AppRetCode retCode = AcRxArxApp::On_kUnloadAppMsg (pkt) ;
    return (retCode) ;
  }
 
  virtual void RegisterServerComponents () {
  }
 
  static void JoinToPlineJoinToPline () {
    // filter for selectin lines and arcs
    ACHAR* promptPtrs[] = {
      _T("\nSelect lines and arcs for getting polyline (ENTER - exit): "),
      _T("\nRemove lines and arcs from selection set: ")
    };
 
    ads_name ss;
    resbuf *rbFilter = acutBuildList(RTDXF0,_T("LINE,ARC"),RTNONE);
    int rc = acedSSGet(_T(":$"),promptPtrs,NULL,rbFilter,ss);
    acutRelRb(rbFilter);
 
    if (rc != RTNORM) return;
 
    AcDbObjectIdArray ids;
    if (ObjectIdArrayFromSelSet(ss, ids) != Acad::eOk) return;
    while (ids.length() &amp;gt; 0)
    {
      AcDbEntity *p = MakeJonedPoly(ids);
      if (p) {
        AcDbBlockTableRecordPointer pSpace(acdbCurDwg()-&amp;gt;currentSpaceId(), AcDb::kForWrite);
        if (pSpace.openStatus() != Acad::eOk) return;
        pSpace-&amp;gt;appendAcDbEntity(p);
        p-&amp;gt;close();
      } else {
        acutPrintf(_T("\nError in input data!"));
        return;
      }
    }
 
  }
 
  /// &amp;lt;summary&amp;gt;
  /// Getting AcDbObjectIdArray from SelectionSet
  /// &amp;lt;/summary&amp;gt;
  /// &amp;lt;param name="sset"&amp;gt;SelectionSet&amp;lt;/param&amp;gt;
  /// &amp;lt;param name="ids"&amp;gt;AcDbObjectIdArray&amp;lt;/param&amp;gt;
  /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
  static Acad::ErrorStatus ObjectIdArrayFromSelSet(ads_name sset, AcDbObjectIdArray &amp;amp;ids)
  {
    Acad::ErrorStatus es = Acad::eOk;
    long nset = -1;
    if (acedSSLength(sset,&amp;amp;nset) != RTNORM) return Acad::eAmbiguousInput;
    ids.setLogicalLength(nset);
    ads_name en;
    AcDbObjectId id;
    for (long i=0; i &amp;lt; nset; i++) {
      if (acedSSName(sset,i,en) == RTNORM) {
        if ((es = acdbGetObjectId(id,en)) != Acad::eOk) return es;
        ids[i] = id;
      }
    }
    return Acad::eOk;
  }
 
  /// &amp;lt;summary&amp;gt;
  /// Crete polyline from lines and arcs.
  /// &amp;lt;/summary&amp;gt;
  /// &amp;lt;param name="ids"&amp;gt;array of objectId&amp;lt;/param&amp;gt;
  /// &amp;lt;param name="FUZZ"&amp;gt;&amp;lt;/param&amp;gt;
  /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
  static AcDbPolyline* MakeJonedPoly(
    AcDbObjectIdArray &amp;amp;ids,
    double FUZZ = AcGeContext::gTol.equalPoint())
  {
    AcDbPolyline *p = new AcDbPolyline();
    p-&amp;gt;setDatabaseDefaults();
    AcDbObjectId idFirst = ids[0];
    AcGePoint3d nextPt = AcGePoint3d::kOrigin;
    AcGePoint3d prevPt = AcGePoint3d::kOrigin;
 
    AcDbObjectPointer&amp;lt;AcDbCurve&amp;gt; c(idFirst,AcDb::kForRead);
    if (c.openStatus() == Acad::eOk) {
      AcGePoint3d ptStart, ptEnd;
      c-&amp;gt;getStartPoint(ptStart); c-&amp;gt;getEndPoint(ptEnd);
      p-&amp;gt;addVertexAt(0, asPnt2d(asDblArray(ptStart)), BulgeFromArc(c, false), 0, 0);
      p-&amp;gt;addVertexAt(1, asPnt2d(asDblArray(ptEnd)), 0, 0, 0);
      nextPt = ptEnd;
      prevPt = ptStart;
    }
 
    ids.remove(idFirst);
    int prevCnt = ids.length() + 1;
 
    while (ids.length() &amp;gt; 0 &amp;amp;&amp;amp; ids.length() &amp;lt; prevCnt)
    {
      prevCnt = ids.length();
      for (int i = 0; i &amp;lt; ids.length(); i++) {
        AcDbObjectId id = ids[i];
        AcDbObjectPointer&amp;lt;AcDbCurve&amp;gt; cv(id,AcDb::kForRead);
        if (cv.openStatus() == Acad::eOk) {
          AcGePoint3d ptStart, ptEnd;
          cv-&amp;gt;getStartPoint(ptStart); cv-&amp;gt;getEndPoint(ptEnd);
          if (ptStart.distanceTo(nextPt) &amp;lt; FUZZ || ptEnd.distanceTo(nextPt) &amp;lt; FUZZ) {
            double bulge = BulgeFromArc(cv, ptEnd.distanceTo(nextPt) &amp;lt; FUZZ);
            p-&amp;gt;setBulgeAt(p-&amp;gt;numVerts() - 1, bulge);
            if (ptStart.distanceTo(nextPt) &amp;lt; FUZZ)
              nextPt = ptEnd;
            else
              nextPt = ptStart;
            p-&amp;gt;addVertexAt(p-&amp;gt;numVerts(), asPnt2d(asDblArray(nextPt)), 0, 0, 0);
            ids.remove(id);
            break;
          } else if (ptStart.distanceTo(prevPt) &amp;lt; FUZZ || ptEnd.distanceTo(prevPt) &amp;lt; FUZZ) {
            double bulge = BulgeFromArc(cv, ptStart.distanceTo(prevPt) &amp;lt; FUZZ);
            if (ptStart.distanceTo(prevPt) &amp;lt; FUZZ)
              prevPt = ptEnd;
            else
              prevPt = ptStart;
            p-&amp;gt;addVertexAt(0, asPnt2d(asDblArray(prevPt)), bulge, 0, 0);
            ids.remove(id);
            break;
          }
        }
      }
    }
    if (p-&amp;gt;numVerts() == 0) {
      delete p;  return NULL;
    }  else  {
      return p;
    }
  }
 
  /// &amp;lt;summary&amp;gt;
  /// Getting bulge for curve
  /// &amp;lt;/summary&amp;gt;
  /// &amp;lt;param name="c"&amp;gt;curve pointer&amp;lt;/param&amp;gt;
  /// &amp;lt;param name="clockwise"&amp;gt;clockwise or counterclockwise.&amp;lt;/param&amp;gt;
  /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
  static double BulgeFromArc(AcDbCurve *c, bool clockwise)
  {
    double bulge = 0.0;
    AcDbArc *a = AcDbArc::cast(c);
    if (a == NULL) return bulge;
 
    double newStart =
      (a-&amp;gt;startAngle() &amp;gt; a-&amp;gt;endAngle()) ?
      (a-&amp;gt;startAngle() - 8 * atan(1.0)) :
      (a-&amp;gt;startAngle());
 
    bulge = tan((a-&amp;gt;endAngle() - newStart) / 4.0);
    if (clockwise) bulge = -bulge;
    return bulge;
  }
} ;
 
//-----------------------------------------------------------------------------
IMPLEMENT_ARX_ENTRYPOINT(CJoinToPlineApp)
ACED_ARXCOMMAND_ENTRY_AUTO(CJoinToPlineApp, JoinToPline, JoinToPline, JoinToPline, ACRX_CMD_MODAL, NULL)&lt;/LI-CODE&gt;</description>
      <pubDate>Wed, 21 Feb 2024 19:07:59 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/objectarx-forum/joining-lines-and-arcs-into-a-polyline/m-p/12574408#M1085</guid>
      <dc:creator>Alexander.Rivilis</dc:creator>
      <dc:date>2024-02-21T19:07:59Z</dc:date>
    </item>
    <item>
      <title>Re: Joining Lines and Arcs into a Polyline?</title>
      <link>https://forums.autodesk.com/t5/objectarx-forum/joining-lines-and-arcs-into-a-polyline/m-p/12574682#M1086</link>
      <description>&lt;P&gt;Sample with using&amp;nbsp;&lt;EM&gt;&lt;STRONG&gt;AcDbJoinEntityPE::joinEntities&lt;/STRONG&gt;&lt;/EM&gt; method:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="cpp"&gt;//-----------------------------------------------------------------------------
//----- acrxEntryPoint.cpp
//-----------------------------------------------------------------------------
#include "StdAfx.h"
#include "resource.h"
#include "dbJoinEntityPE.h"

//-----------------------------------------------------------------------------
#define szRDS _RXST("")

//-----------------------------------------------------------------------------
//----- ObjectARX EntryPoint
class CJoinEntitiesApp : public AcRxArxApp {

public:
  CJoinEntitiesApp() : AcRxArxApp() {}

  virtual AcRx::AppRetCode On_kInitAppMsg(void* pkt) {
    AcRx::AppRetCode retCode = AcRxArxApp::On_kInitAppMsg(pkt);
    return (retCode);
  }

  virtual AcRx::AppRetCode On_kUnloadAppMsg(void* pkt) {
    AcRx::AppRetCode retCode = AcRxArxApp::On_kUnloadAppMsg(pkt);
    return (retCode);
  }

  virtual void RegisterServerComponents() {  }

  static void RivilisJoinEnts()
  {
    // filter for selectin lines and arcs
    ACHAR* promptPtrs[] = {
      _T("\nSelect lines, arcs, polylines for getting polyline (ENTER - exit): "),
      _T("\nRemove lines, arcs, polylines from selection set: ")
    };

    ads_name ss;
    resbuf* rbFilter = acutBuildList(RTDXF0, _T("LINE,ARC,LWPOLYLINE"), RTNONE);
    int rc = acedSSGet(_T(":$"), promptPtrs, NULL, rbFilter, ss);
    acutRelRb(rbFilter);

    if (rc != RTNORM) return;

    AcDbObjectIdArray ids;
    if (ObjectIdArrayFromSelSet(ss, ids) != Acad::eOk) return;
    bool bContinue = true;
    while (bContinue)
    {
      bContinue = false;
      AcDbPolyline* pPoly = JoinToPolyline(ids);
      if (pPoly)
      {
        AcDbBlockTableRecordPointer pSpace(acdbCurDwg()-&amp;gt;currentSpaceId(), AcDb::kForWrite);
        if (pSpace.openStatus() != Acad::eOk) return;
        pSpace-&amp;gt;appendAcDbEntity(pPoly);
        pPoly-&amp;gt;close();
        pSpace-&amp;gt;close();
        for (int i = ids.length() - 1; i &amp;gt;= 0; i--)
        {
          if (ids[i].isNull()) {
            bContinue = true;
            ids.removeAt(i);
          }
        }
      }
    }
  }

  static AcDbPolyline* JoinToPolyline(AcDbObjectIdArray &amp;amp;ids)
  {
    AcGeIntArray aInts;
    AcDbPolyline *pPoly = new AcDbPolyline();
    pPoly-&amp;gt;setDatabaseDefaults();
    AcArray&amp;lt;AcDbEntity*&amp;gt; ents;
    AcDbObjectPointer&amp;lt;AcDbCurve&amp;gt; c(ids[0], AcDb::kForWrite);
    if (c.openStatus() == Acad::eOk) {
      if (c-&amp;gt;isKindOf(AcDbPolyline::desc())) {
        pPoly-&amp;gt;copyFrom(c);
        c-&amp;gt;erase();
      }
      else {
        AcGePoint3d ptStart, ptEnd;
        c-&amp;gt;getStartPoint(ptStart); c-&amp;gt;getEndPoint(ptEnd);
        pPoly-&amp;gt;addVertexAt(0, asPnt2d(asDblArray(ptStart)), BulgeFromArc(c, false), 0, 0);
        pPoly-&amp;gt;addVertexAt(1, asPnt2d(asDblArray(ptEnd)), 0, 0, 0);
        c-&amp;gt;erase();
      }
    }

    for (int i = 1; i &amp;lt; ids.length(); i++)
    {
      AcDbObjectPointer&amp;lt;AcDbCurve&amp;gt; c(ids[i], AcDb::kForWrite);
      if (c.openStatus() == Acad::eOk)
      {
        AcDbCurve* cc = NULL;  c.release(cc);
        ents.append(cc);
      }
    }

    if (ents.length() &amp;gt; 0)
    {
      AcDbJoinEntityPE* pPE = AcDbJoinEntityPE::cast(pPoly-&amp;gt;queryX(AcDbJoinEntityPE::desc()));

      Acad::ErrorStatus es = pPE-&amp;gt;joinEntities(pPoly, ents, aInts);
      if (es != Acad::eOk)
      {
        // acutPrintf(_T("\nError pPE-&amp;gt;joinEntities(pPoly, ents, aInts) = %s"), acadErrorStatusText(es));
      }
      else
      {
        for (int i = 0; i &amp;lt; aInts.length(); i++)
        {
          ents[aInts[i]]-&amp;gt;erase();
          ents[aInts[i]]-&amp;gt;close();
          ents[aInts[i]] = NULL;
          if (aInts[i] + 1 &amp;lt; ids.length()) 
            ids[aInts[i]+1].setNull();
        }
      }
    }
    for (int i = 0; i &amp;lt; ents.length(); i++) {
      if (ents[i] != NULL) {
        ents[i]-&amp;gt;close();
      }
    }
    ids[0].setNull();
    return pPoly;
  }

  /// &amp;lt;summary&amp;gt;
  /// Getting AcDbObjectIdArray from SelectionSet
  /// &amp;lt;/summary&amp;gt;
  /// &amp;lt;param name="sset"&amp;gt;SelectionSet&amp;lt;/param&amp;gt;
  /// &amp;lt;param name="ids"&amp;gt;AcDbObjectIdArray&amp;lt;/param&amp;gt;
  /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
  static Acad::ErrorStatus ObjectIdArrayFromSelSet(ads_name sset, AcDbObjectIdArray&amp;amp; ids)
  {
    Acad::ErrorStatus es = Acad::eOk;
    Adesk::Int32 nset = -1;
    if (acedSSLength(sset, &amp;amp;nset) != RTNORM) return Acad::eAmbiguousInput;
    ids.setLogicalLength(nset);
    ads_name en;
    AcDbObjectId id;
    for (long i = 0; i &amp;lt; nset; i++) {
      if (acedSSName(sset, i, en) == RTNORM) {
        if ((es = acdbGetObjectId(id, en)) != Acad::eOk) return es;
        ids[i] = id;
      }
    }
    return Acad::eOk;
  }
  /// &amp;lt;summary&amp;gt;
  /// Getting bulge for curve
  /// &amp;lt;/summary&amp;gt;
  /// &amp;lt;param name="c"&amp;gt;curve pointer&amp;lt;/param&amp;gt;
  /// &amp;lt;param name="clockwise"&amp;gt;clockwise or counterclockwise.&amp;lt;/param&amp;gt;
  /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
  static double BulgeFromArc(AcDbCurve* c, bool clockwise)
  {
    double bulge = 0.0;
    AcDbArc* a = AcDbArc::cast(c);
    if (a == NULL) return bulge;

    double newStart =
      (a-&amp;gt;startAngle() &amp;gt; a-&amp;gt;endAngle()) ?
      (a-&amp;gt;startAngle() - 8 * atan(1.0)) :
      (a-&amp;gt;startAngle());

    bulge = tan((a-&amp;gt;endAngle() - newStart) / 4.0);
    if (clockwise) bulge = -bulge;
    return bulge;
  }
};

//-----------------------------------------------------------------------------
IMPLEMENT_ARX_ENTRYPOINT(CJoinEntitiesApp)

ACED_ARXCOMMAND_ENTRY_AUTO(CJoinEntitiesApp, Rivilis, JoinEnts, JoinEnts, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, NULL)

&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Update: Code fixed.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 23 Feb 2024 15:55:04 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/objectarx-forum/joining-lines-and-arcs-into-a-polyline/m-p/12574682#M1086</guid>
      <dc:creator>Alexander.Rivilis</dc:creator>
      <dc:date>2024-02-23T15:55:04Z</dc:date>
    </item>
  </channel>
</rss>

