天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 9|回复: 0

命令pedit实现的连接LINE/ARC到POLYLINE的代码

[复制链接]
  • TA的每日心情
    开心
    昨天 15:23
  • 签到天数: 69 天

    [LV.6]常住居民II

    410

    主题

    167

    回帖

    2704

    积分

    管理员

    积分
    2704
    发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
    [code]下面是使用命令pedit实现的连接LINE/ARC到POLYLINE的代码:

    [mw_shl_code=cpp,true]//-----------------------------------------------------------------------------
    //----- acrxEntryPoint.cpp
    //-----------------------------------------------------------------------------
    #include "StdAfx.h"
    #include "acedCmdNF.h"
    #include "resource.h"
    //-----------------------------------------------------------------------------
    #define szRDS _RXST("")
    //-----------------------------------------------------------------------------
    //----- ObjectARX EntryPoint
    class CMyJoinApp : public AcRxArxApp {

    public:
      CMyJoinApp() : 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 RivilisMyJoin() {
        ads_name en1;  ads_point p;
        while (acedEntSel(_T("\nSelect first segment: "), en1, p) == RTNORM)
        {
          bool bConvertToPoly = false;
          AcDbObjectId id1; acdbGetObjectId(id1, en1);
          if (id1.objectClass() == AcDbLine::desc() ||
              id1.objectClass() == AcDbArc::desc())
          {
            bConvertToPoly = true;
          }
          ads_name en2;
          if (acedEntSel(_T("\nSelect next segment: "), en2, p) == RTNORM)
          {
            if (bConvertToPoly)
              acedCommandS(RTSTR, _T("_PEDIT"), RTENAME, en1, RTSTR, _T("_YES"), RTSTR, _T("_Join"),
                RTENAME, en2, RTSTR, _T(""), RTSTR, _T(""), RTNONE);
            else
              acedCommandS(RTSTR, _T("_PEDIT"), RTENAME, en1, RTSTR, _T("_Join"),
                RTENAME, en2, RTSTR, _T(""), RTSTR, _T(""), RTNONE);
          }
        }
      }
    };

    //-----------------------------------------------------------------------------
    IMPLEMENT_ARX_ENTRYPOINT(CMyJoinApp)

    ACED_ARXCOMMAND_ENTRY_AUTO(CMyJoinApp, Rivilis, MyJoin, MyJoin, ACRX_CMD_MODAL, NULL)[/mw_shl_code]


    下面是不用命令实现的连接LINE/ARC到POLYLINE的代码

    本帖隐藏的内容
    [mw_shl_code=cpp,true]//-----------------------------------------------------------------------------
    //----- 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 () {
        // Фильтр для выбора отрезков (LINE) и дуг (ARC)
        ACHAR* promptPtrs[] = {
          _T("\nSelect lines and arcs for join in poyline (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() > 0)
        {
          AcDbEntity *p = MakeJonedPoly(ids);
          if (p) {
            AcDbBlockTableRecordPointer pSpace(acdbCurDwg()->currentSpaceId(), AcDb::kForWrite);
            if (pSpace.openStatus() != Acad::eOk) return;
            pSpace->appendAcDbEntity(p);
            p->close();
          } else {
            acutPrintf(_T("\nError in data!"));
            return;
          }
        }

      }

      /// <summary>
      /// AcDbObjectIdArray from SelectionSet
      /// </summary>
      /// <param name="sset">SelectionSet</param>
      /// <param name="ids">AcDbObjectIdArray</param>
      /// <returns></returns>
      static Acad::ErrorStatus ObjectIdArrayFromSelSet(ads_name sset, AcDbObjectIdArray &ids)
      {
        Acad::ErrorStatus es = Acad::eOk;
        long nset = -1;
        if (acedSSLength(sset,&nset) != RTNORM) return Acad::eAmbiguousInput;
        ids.setLogicalLength(nset);
        ads_name en;
        AcDbObjectId id;
        for (long i=0; i < nset; i++) {
          if (acedSSName(sset,i,en) == RTNORM) {
            if ((es = acdbGetObjectId(id,en)) != Acad::eOk) return es;
            ids = id;
          }
        }
        return Acad::eOk;
      }

      /// <summary>
      /// Create polyline from lines and arcs.
      /// Those ids will remove from input array
      /// </summary>
      /// <param name="ids">Array of id's</param>
      /// <param name="FUZZ">The accuracy of determining the distance between points</param>
      /// <returns></returns>
      static AcDbPolyline* MakeJonedPoly(
        AcDbObjectIdArray &ids,
        double FUZZ = AcGeContext::gTol.equalPoint())
      {
        AcDbPolyline *p = new AcDbPolyline();
        p->setDatabaseDefaults();
        AcDbObjectId idFirst = ids[0];
        AcGePoint3d nextPt = AcGePoint3d::kOrigin;
        AcGePoint3d prevPt = AcGePoint3d::kOrigin;

        AcDbObjectPointer<AcDbCurve> c(idFirst,AcDb::kForRead);
        if (c.openStatus() == Acad::eOk) {
          AcGePoint3d ptStart, ptEnd;
          c->getStartPoint(ptStart); c->getEndPoint(ptEnd);
          p->addVertexAt(0, asPnt2d(asDblArray(ptStart)), BulgeFromArc(c, false), 0, 0);
          p->addVertexAt(1, asPnt2d(asDblArray(ptEnd)), 0, 0, 0);
          nextPt = ptEnd;
          prevPt = ptStart;
        }

        ids.remove(idFirst);
        int prevCnt = ids.length() + 1;

        while (ids.length() > 0 && ids.length() < prevCnt)
        {
          prevCnt = ids.length();
          for (int i = 0; i < ids.length(); i++) {
            AcDbObjectId id = ids;
            AcDbObjectPointer<AcDbCurve> cv(id,AcDb::kForRead);
            if (cv.openStatus() == Acad::eOk) {
              AcGePoint3d ptStart, ptEnd;
              cv->getStartPoint(ptStart); cv->getEndPoint(ptEnd);
              if (ptStart.distanceTo(nextPt) < FUZZ || ptEnd.distanceTo(nextPt) < FUZZ) {
                double bulge = BulgeFromArc(cv, ptEnd.distanceTo(nextPt) < FUZZ);
                p->setBulgeAt(p->numVerts() - 1, bulge);
                if (ptStart.distanceTo(nextPt) < FUZZ)
                  nextPt = ptEnd;
                else
                  nextPt = ptStart;
                p->addVertexAt(p->numVerts(), asPnt2d(asDblArray(nextPt)), 0, 0, 0);
                ids.remove(id);
                break;
              } else if (ptStart.distanceTo(prevPt) < FUZZ || ptEnd.distanceTo(prevPt) < FUZZ) {
                double bulge = BulgeFromArc(cv, ptStart.distanceTo(prevPt) < FUZZ);
                if (ptStart.distanceTo(prevPt) < FUZZ)
                  prevPt = ptEnd;
                else
                  prevPt = ptStart;
                p->addVertexAt(0, asPnt2d(asDblArray(prevPt)), bulge, 0, 0);
                ids.remove(id);
                break;
              }
            }
          }
        }
        if (p->numVerts() == 0) {
          delete p;  return NULL;
        }  else  {
          return p;
        }
      }

      /// <summary>
      /// Getting bulge of curve
      /// </summary>
      /// <param name="c">AcDbCurve pointer</param>
      /// <param name="clockwise">direction.</param>
      /// <returns></returns>
      static double BulgeFromArc(AcDbCurve *c, bool clockwise)
      {
        double bulge = 0.0;
        AcDbArc *a = AcDbArc::cast(c);
        if (a == NULL) return bulge;

        double newStart =
          (a->startAngle() > a->endAngle()) ?
          (a->startAngle() - 8 * atan(1.0)) :
          (a->startAngle());

        bulge = tan((a->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)[/mw_shl_code][/code]

     

     

     

     

    命令pedit实现的连接LINE/ARC到POLYLINE的代码
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|

    GMT+8, 2024-7-1 05:37 , Processed in 0.056443 second(s), 22 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表