天气与日历 切换到窄版

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

JoinToPline 连接线段成多段线

  [复制链接]
  • TA的每日心情
    开心
    2024-5-16 08:01
  • 签到天数: 82 天

    [LV.6]常住居民II

    1607

    主题

    204

    回帖

    214748万

    积分

    管理员

    积分
    2147483647
    发表于 2024-2-15 16:33:55 | 显示全部楼层 |阅读模式
    1. //-----------------------------------------------------------------------------
    2. //----- acrxEntryPoint.cpp
    3. //-----------------------------------------------------------------------------
    4. #include "StdAfx.h"
    5. #include "resource.h"

    6. //-----------------------------------------------------------------------------
    7. #define szRDS _RXST("")

    8. //-----------------------------------------------------------------------------
    9. //----- ObjectARX EntryPoint
    10. class CJoinToPlineApp : public AcRxArxApp {

    11. public:
    12.   CJoinToPlineApp () : AcRxArxApp () {}

    13.   virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
    14.     AcRx::AppRetCode retCode = AcRxArxApp::On_kInitAppMsg (pkt) ;
    15.     return (retCode) ;
    16.   }

    17.   virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
    18.     AcRx::AppRetCode retCode = AcRxArxApp::On_kUnloadAppMsg (pkt) ;
    19.     return (retCode) ;
    20.   }

    21.   virtual void RegisterServerComponents () {
    22.   }

    23.   static void JoinToPlineJoinToPline () {
    24.     // Фильтр для выбора отрезков (LINE) и дуг (ARC)
    25.     ACHAR* promptPtrs[] = {
    26.       _T("\nSelect lines and arcs for join in poyline (ENTER - exit): "),
    27.       _T("\nRemove lines and arcs from selection set: ")
    28.     };

    29.     ads_name ss;
    30.     resbuf *rbFilter = acutBuildList(RTDXF0,_T("LINE,ARC"),RTNONE);
    31.     int rc = acedSSGet(_T(":$"),promptPtrs,NULL,rbFilter,ss);
    32.     acutRelRb(rbFilter);

    33.     if (rc != RTNORM) return;

    34.     AcDbObjectIdArray ids;
    35.     if (ObjectIdArrayFromSelSet(ss, ids) != Acad::eOk) return;
    36.     while (ids.length() > 0)
    37.     {
    38.       AcDbEntity *p = MakeJonedPoly(ids);
    39.       if (p) {
    40.         AcDbBlockTableRecordPointer pSpace(acdbCurDwg()->currentSpaceId(), AcDb::kForWrite);
    41.         if (pSpace.openStatus() != Acad::eOk) return;
    42.         pSpace->appendAcDbEntity(p);
    43.         p->close();
    44.       } else {
    45.         acutPrintf(_T("\nError in data!"));
    46.         return;
    47.       }
    48.     }

    49.   }

    50.   /// <summary>
    51.   /// AcDbObjectIdArray from SelectionSet
    52.   /// </summary>
    53.   /// <param name="sset">SelectionSet</param>
    54.   /// <param name="ids">AcDbObjectIdArray</param>
    55.   /// <returns></returns>
    56.   static Acad::ErrorStatus ObjectIdArrayFromSelSet(ads_name sset, AcDbObjectIdArray &ids)
    57.   {
    58.     Acad::ErrorStatus es = Acad::eOk;
    59.     long nset = -1;
    60.     if (acedSSLength(sset,&nset) != RTNORM) return Acad::eAmbiguousInput;
    61.     ids.setLogicalLength(nset);
    62.     ads_name en;
    63.     AcDbObjectId id;
    64.     for (long i=0; i < nset; i++) {
    65.       if (acedSSName(sset,i,en) == RTNORM) {
    66.         if ((es = acdbGetObjectId(id,en)) != Acad::eOk) return es;
    67.         ids[i] = id;
    68.       }
    69.     }
    70.     return Acad::eOk;
    71.   }

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

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

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

    99.     while (ids.length() > 0 && ids.length() < prevCnt)
    100.     {
    101.       prevCnt = ids.length();
    102.       for (int i = 0; i < ids.length(); i++) {
    103.         AcDbObjectId id = ids[i];
    104.         AcDbObjectPointer<AcDbCurve> cv(id,AcDb::kForRead);
    105.         if (cv.openStatus() == Acad::eOk) {
    106.           AcGePoint3d ptStart, ptEnd;
    107.           cv->getStartPoint(ptStart); cv->getEndPoint(ptEnd);
    108.           if (ptStart.distanceTo(nextPt) < FUZZ || ptEnd.distanceTo(nextPt) < FUZZ) {
    109.             double bulge = BulgeFromArc(cv, ptEnd.distanceTo(nextPt) < FUZZ);
    110.             p->setBulgeAt(p->numVerts() - 1, bulge);
    111.             if (ptStart.distanceTo(nextPt) < FUZZ)
    112.               nextPt = ptEnd;
    113.             else
    114.               nextPt = ptStart;
    115.             p->addVertexAt(p->numVerts(), asPnt2d(asDblArray(nextPt)), 0, 0, 0);
    116.             ids.remove(id);
    117.             break;
    118.           } else if (ptStart.distanceTo(prevPt) < FUZZ || ptEnd.distanceTo(prevPt) < FUZZ) {
    119.             double bulge = BulgeFromArc(cv, ptStart.distanceTo(prevPt) < FUZZ);
    120.             if (ptStart.distanceTo(prevPt) < FUZZ)
    121.               prevPt = ptEnd;
    122.             else
    123.               prevPt = ptStart;
    124.             p->addVertexAt(0, asPnt2d(asDblArray(prevPt)), bulge, 0, 0);
    125.             ids.remove(id);
    126.             break;
    127.           }
    128.         }
    129.       }
    130.     }
    131.     if (p->numVerts() == 0) {
    132.       delete p;  return NULL;
    133.     }  else  {
    134.       return p;
    135.     }
    136.   }

    137.   /// <summary>
    138.   /// Getting bulge of curve
    139.   /// </summary>
    140.   /// <param name="c">AcDbCurve pointer</param>
    141.   /// <param name="clockwise">direction.</param>
    142.   /// <returns></returns>
    143.   static double BulgeFromArc(AcDbCurve *c, bool clockwise)
    144.   {
    145.     double bulge = 0.0;
    146.     AcDbArc *a = AcDbArc::cast(c);
    147.     if (a == NULL) return bulge;

    148.     double newStart =
    149.       (a->startAngle() > a->endAngle()) ?
    150.       (a->startAngle() - 8 * atan(1.0)) :
    151.       (a->startAngle());

    152.     bulge = tan((a->endAngle() - newStart) / 4.0);
    153.     if (clockwise) bulge = -bulge;
    154.     return bulge;
    155.   }
    156. } ;

    157. //-----------------------------------------------------------------------------
    158. IMPLEMENT_ARX_ENTRYPOINT(CJoinToPlineApp)
    159. ACED_ARXCOMMAND_ENTRY_AUTO(CJoinToPlineApp, JoinToPline, JoinToPline, JoinToPline, ACRX_CMD_MODAL, NULL)
    复制代码

     

     

     

     

    JoinToPline 连接线段成多段线
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
  • TA的每日心情
    开心
    2024-5-16 08:01
  • 签到天数: 82 天

    [LV.6]常住居民II

    1607

    主题

    204

    回帖

    214748万

    积分

    管理员

    积分
    2147483647
     楼主| 发表于 2024-2-15 16:35:15 | 显示全部楼层
    1. //-----------------------------------------------------------------------------
    2. //----- acrxEntryPoint.cpp
    3. //-----------------------------------------------------------------------------
    4. #include "StdAfx.h"
    5. #include "acedCmdNF.h"
    6. #include "resource.h"
    7. //-----------------------------------------------------------------------------
    8. #define szRDS _RXST("")
    9. //-----------------------------------------------------------------------------
    10. //----- ObjectARX EntryPoint
    11. class CMyJoinApp : public AcRxArxApp {

    12. public:
    13.   CMyJoinApp() : AcRxArxApp() {}
    14.   virtual AcRx::AppRetCode On_kInitAppMsg(void *pkt) {
    15.     AcRx::AppRetCode retCode = AcRxArxApp::On_kInitAppMsg(pkt);
    16.     return (retCode);
    17.   }
    18.   virtual AcRx::AppRetCode On_kUnloadAppMsg(void *pkt) {
    19.     AcRx::AppRetCode retCode = AcRxArxApp::On_kUnloadAppMsg(pkt);
    20.     return (retCode);
    21.   }
    22.   virtual void RegisterServerComponents() {}

    23.   static void RivilisMyJoin() {
    24.     ads_name en1;  ads_point p;
    25.     while (acedEntSel(_T("\nSelect first segment: "), en1, p) == RTNORM)
    26.     {
    27.       bool bConvertToPoly = false;
    28.       AcDbObjectId id1; acdbGetObjectId(id1, en1);
    29.       if (id1.objectClass() == AcDbLine::desc() ||
    30.           id1.objectClass() == AcDbArc::desc())
    31.       {
    32.         bConvertToPoly = true;
    33.       }
    34.       ads_name en2;
    35.       if (acedEntSel(_T("\nSelect next segment: "), en2, p) == RTNORM)
    36.       {
    37.         if (bConvertToPoly)
    38.           acedCommandS(RTSTR, _T("_PEDIT"), RTENAME, en1, RTSTR, _T("_YES"), RTSTR, _T("_Join"),
    39.             RTENAME, en2, RTSTR, _T(""), RTSTR, _T(""), RTNONE);
    40.         else
    41.           acedCommandS(RTSTR, _T("_PEDIT"), RTENAME, en1, RTSTR, _T("_Join"),
    42.             RTENAME, en2, RTSTR, _T(""), RTSTR, _T(""), RTNONE);
    43.       }
    44.     }
    45.   }
    46. };

    47. //-----------------------------------------------------------------------------
    48. IMPLEMENT_ARX_ENTRYPOINT(CMyJoinApp)

    49. ACED_ARXCOMMAND_ENTRY_AUTO(CMyJoinApp, Rivilis, MyJoin, MyJoin, ACRX_CMD_MODAL, NULL)
    复制代码

     

     

     

     

    JoinToPline 连接线段成多段线
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
  • TA的每日心情
    开心
    2024-5-16 08:01
  • 签到天数: 82 天

    [LV.6]常住居民II

    1607

    主题

    204

    回帖

    214748万

    积分

    管理员

    积分
    2147483647
     楼主| 发表于 2024-2-15 16:35:39 | 显示全部楼层
    1. //-----------------------------------------------------------------------------
    2. //----- acrxEntryPoint.cpp
    3. //-----------------------------------------------------------------------------
    4. #include "StdAfx.h"
    5. #include "acedCmdNF.h"
    6. #include "resource.h"
    7. //-----------------------------------------------------------------------------
    8. #define szRDS _RXST("")
    9. //-----------------------------------------------------------------------------
    10. //----- ObjectARX EntryPoint
    11. class CMyJoinApp : public AcRxArxApp {

    12. public:
    13.   CMyJoinApp() : AcRxArxApp() {}
    14.   virtual AcRx::AppRetCode On_kInitAppMsg(void *pkt) {
    15.     AcRx::AppRetCode retCode = AcRxArxApp::On_kInitAppMsg(pkt);
    16.     return (retCode);
    17.   }
    18.   virtual AcRx::AppRetCode On_kUnloadAppMsg(void *pkt) {
    19.     AcRx::AppRetCode retCode = AcRxArxApp::On_kUnloadAppMsg(pkt);
    20.     return (retCode);
    21.   }
    22.   virtual void RegisterServerComponents() {}

    23.   static void RivilisMyJoin() {
    24.     // Check PEDITACCEPT sysvar
    25.     resbuf rb = { 0, RTSHORT, 0 };
    26.     acedGetVar(_T("PEDITACCEPT"), &rb);
    27.     bool bPeditAccept = (rb.resval.rint == 1) ? true : false;
    28.     ads_name en1;  ads_point p;
    29.     while (acedEntSel(_T("\nSelect first segment: "), en1, p) == RTNORM)
    30.     {
    31.       // if PEDITACCEPT == 1 then PEDIT no ask about converting
    32.       bool bConvertToPoly = false;
    33.       if (!bPeditAccept)
    34.       {
    35.         AcDbObjectId id1; acdbGetObjectId(id1, en1);
    36.         if (id1.objectClass() == AcDbLine::desc() ||
    37.           id1.objectClass() == AcDbArc::desc())
    38.         {
    39.           bConvertToPoly = true;
    40.         }
    41.       }
    42.       ads_name en2;
    43.       if (acedEntSel(_T("\nSelect next segment: "), en2, p) == RTNORM)
    44.       {
    45.         if (bConvertToPoly)
    46.           acedCommandS(RTSTR, _T("_PEDIT"), RTENAME, en1, RTSTR, _T("_YES"), RTSTR, _T("_Join"),
    47.             RTENAME, en2, RTSTR, _T(""), RTSTR, _T(""), RTNONE);
    48.         else
    49.           acedCommandS(RTSTR, _T("_PEDIT"), RTENAME, en1, RTSTR, _T("_Join"),
    50.             RTENAME, en2, RTSTR, _T(""), RTSTR, _T(""), RTNONE);
    51.       }
    52.     }
    53.   }
    54. };

    55. //-----------------------------------------------------------------------------
    56. IMPLEMENT_ARX_ENTRYPOINT(CMyJoinApp)

    57. ACED_ARXCOMMAND_ENTRY_AUTO(CMyJoinApp, Rivilis, MyJoin, MyJoin, ACRX_CMD_MODAL, NULL)
    复制代码

     

     

     

     

    JoinToPline 连接线段成多段线
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
  • TA的每日心情
    开心
    2024-5-16 08:01
  • 签到天数: 82 天

    [LV.6]常住居民II

    1607

    主题

    204

    回帖

    214748万

    积分

    管理员

    积分
    2147483647
     楼主| 发表于 2024-2-15 16:36:19 | 显示全部楼层
    1. //------------------------------------------------------------------------------
    2. class SubentityOverrule : public AcDbSubentityOverrule
    3. //------------------------------------------------------------------------------
    4. {
    5. public:
    6.   static SubentityOverrule* _pTheOverrule;
    7.   ACRX_DECLARE_MEMBERS(SubentityOverrule);

    8.   //--------------------------------------------------------------------------
    9.   bool isApplicable(const AcRxObject* pOverruledSubject) const
    10.   //--------------------------------------------------------------------------
    11.   {
    12.     if (pOverruledSubject->isA() == MyClass::desc())
    13.     {
    14.       MyClass* pMine = MyClass::cast(pOverruledSubject);
    15.       if (pMine != NULL)
    16.       {
    17.         return true;
    18.       }
    19.     }
    20.     return false;
    21.   }

    22.   //--------------------------------------------------------------------------
    23.   static void SubentityOverrule::AddOverrule()
    24.   //--------------------------------------------------------------------------
    25.   {
    26.     if (_pTheOverrule != NULL)
    27.     {
    28.       return;
    29.     }

    30.     _pTheOverrule = new SubentityOverrule();

    31.     Acad::ErrorStatus es = AcRxOverrule::addOverrule(MyClass::desc(), _pTheOverrule, true);

    32.     SubentityOverrule::setIsOverruling(true);
    33.   }

    34.   //--------------------------------------------------------------------------
    35.   static void SubentityOverrule::RemoveOverrule()
    36.   //--------------------------------------------------------------------------
    37.   {
    38.     if (_pTheOverrule == NULL)
    39.     {
    40.       return;
    41.     }

    42.     SubentityOverrule::setIsOverruling(false);

    43.     Acad::ErrorStatus es = AcRxOverrule::removeOverrule(MyClass::desc(), _pTheOverrule);
    44.     delete _pTheOverrule;

    45.     _pTheOverrule = NULL;
    46.   }

    47.   //--------------------------------------------------------------------------
    48.   Acad::ErrorStatus SubentityOverrule::getSubentPathsAtGsMarker(const AcDbEntity* pSubject, AcDb::SubentType type, Adesk::GsMarker gsMark, const AcGePoint3d& pickPoint,
    49.                   const AcGeMatrix3d& viewXform, int& numPaths, AcDbFullSubentPath*& subentPaths, int numInserts = 0, AcDbObjectId* entAndInsertStack = NULL)
    50.   //--------------------------------------------------------------------------
    51.   {
    52.     return  Acad::eOk;
    53.   }

    54.   //--------------------------------------------------------------------------
    55.   AcDbEntity* SubentityOverrule::subentPtr(const AcDbEntity* pSubject, const AcDbFullSubentPath& id)
    56.   //--------------------------------------------------------------------------
    57.   {
    58.     return NULL;
    59.   }
    60. };

    61. SubentityOverrule* SubentityOverrule::_pTheOverrule = NULL;
    62. ACRX_NO_CONS_DEFINE_MEMBERS(SubentityOverrule, AcDbSubentityOverrule);
    复制代码

     

     

     

     

    JoinToPline 连接线段成多段线
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
  • TA的每日心情
    开心
    2024-5-16 08:01
  • 签到天数: 82 天

    [LV.6]常住居民II

    1607

    主题

    204

    回帖

    214748万

    积分

    管理员

    积分
    2147483647
     楼主| 发表于 2024-2-15 16:36:51 | 显示全部楼层
    1. //------------------------------------------------------------------------------
    2. Acad::ErrorStatus MyClass::subGetSubentPathsAtGsMarker(AcDb::SubentType type, Adesk::GsMarker gsMark, const AcGePoint3d& pickPoint,
    3.                                                                 const AcGeMatrix3d& viewXform, int& numPaths, AcDbFullSubentPath*& subentPaths, int numInserts, AcDbObjectId* entAndInsertStack) const
    4. //------------------------------------------------------------------------------
    5. {
    6.     BOOL bCtrl = KEY_DOWN(VK_CONTROL);

    7.     if (bCtrl)
    8.     {
    9.         return Acad::eNotImplementedYet;
    10.     }
    11.     else
    12.     {
    13.         return AcDbPolyline::subGetSubentPathsAtGsMarker(type, gsMark, pickPoint, viewXform, numPaths, subentPaths, numInserts, entAndInsertStack);
    14.     }
    15. }

    16. //------------------------------------------------------------------------------
    17. AcDbEntity* MyClass::subSubentPtr(const AcDbFullSubentPath& id) const
    18. //------------------------------------------------------------------------------
    19. {
    20.     BOOL bCtrl = KEY_DOWN(VK_CONTROL);

    21.     if (bCtrl)
    22.     {
    23.         return NULL;
    24.     }
    25.     else
    26.     {
    27.         return AcDbPolyline::subSubentPtr(id);
    28.     }
    29. }
    复制代码

     

     

     

     

    JoinToPline 连接线段成多段线
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
  • TA的每日心情
    开心
    2024-5-16 08:01
  • 签到天数: 82 天

    [LV.6]常住居民II

    1607

    主题

    204

    回帖

    214748万

    积分

    管理员

    积分
    2147483647
     楼主| 发表于 2024-2-15 17:29:13 | 显示全部楼层
    1. acedCommandS(RTSTR, _T("PEDIT"),
    2.                 RTSTR, _T("M"),
    3.                 RTPICKS, result,
    4.                 RTSTR, _T(""),
    5.                 RTSTR, _T("Y"),
    6.                 RTSTR, _T("J"),
    7.                 RTSTR, _T("1"),//表示模糊距离
    8.                 RTSTR, _T(""),
    9.                 RTSTR, _T(""),
    10.                 RTNONE);
    11. 解释:RTPICKS 是你要转变为多段线的选择集,它的类型是ads_name的。

    12. acedCommandS(RTSTR, _T("PEDIT"),
    13.             RTENAME, entName,
    14.             RTSTR, _T("Y"),
    15.             RTSTR, _T("J"),
    16.             RTPICKS, result,//选择集,表示需要转换的实体集合。
    17.             RTSTR, _T(""), RTSTR, _T(""), RTNONE);
    18. 解释:RTENAME ,entName 表示选择一个需要转换为多段线的实体,只能是一个,它应该是属于集合resut的。
    复制代码

     

     

     

     

    JoinToPline 连接线段成多段线
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
  • TA的每日心情
    开心
    2024-5-16 08:01
  • 签到天数: 82 天

    [LV.6]常住居民II

    1607

    主题

    204

    回帖

    214748万

    积分

    管理员

    积分
    2147483647
     楼主| 发表于 2024-2-15 17:44:00 | 显示全部楼层
    1. PEDITACCEPT(系统变量)
    2. 自动将选定对象转换为多段线,而在使用 PEDIT 时不显示提示。

    3. 类型:        整数

    4. 保存位置:        注册表

    5. 初始值:        0


    6. 0        将显示提示,允许用户选择将选定对象转换为多段线

    7. 1        自动将选定对象转换为多段线,而不显示提示




    8. CAD 编辑多段线PEDIT命令使用
    9. PEDIT命令的使用:

    10. 在CAD的命令行中,输入PEDIT命令空格,选择要编辑的多段线,一定要是多段线。空格就可以进行修改了。

    11. 定义和用法:

    12. PEDIT编辑多段线,编辑多段线和三维多边形网格。PEDIT的常见用途包含合并二维多段线、将线条和圆弧转换为二维多段线以及将多段线转换为近似B样条曲线的曲线(拟合多段线)。

    复制代码

     

     

     

     

    JoinToPline 连接线段成多段线
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
  • TA的每日心情
    开心
    昨天 07:34
  • 签到天数: 72 天

    [LV.6]常住居民II

    579

    主题

    142

    回帖

    2932

    积分

    高级会员

    积分
    2932
    QQ
    发表于 2024-2-22 16:19:08 | 显示全部楼层
    1. //-----------------------------------------------------------------------------
    2. //----- acrxEntryPoint.cpp
    3. //-----------------------------------------------------------------------------
    4. #include "StdAfx.h"
    5. #include "resource.h"
    6. #include "dbJoinEntityPE.h"

    7. //-----------------------------------------------------------------------------
    8. #define szRDS _RXST("")

    9. //-----------------------------------------------------------------------------
    10. //----- ObjectARX EntryPoint
    11. class CJoinEntitiesApp : public AcRxArxApp {

    12. public:
    13.   CJoinEntitiesApp() : AcRxArxApp() {}

    14.   virtual AcRx::AppRetCode On_kInitAppMsg(void* pkt) {
    15.     AcRx::AppRetCode retCode = AcRxArxApp::On_kInitAppMsg(pkt);
    16.     return (retCode);
    17.   }

    18.   virtual AcRx::AppRetCode On_kUnloadAppMsg(void* pkt) {
    19.     AcRx::AppRetCode retCode = AcRxArxApp::On_kUnloadAppMsg(pkt);
    20.     return (retCode);
    21.   }

    22.   virtual void RegisterServerComponents() {  }

    23.   static void RivilisJoinEnts()
    24.   {
    25.     // filter for selectin lines and arcs
    26.     ACHAR* promptPtrs[] = {
    27.       _T("\nSelect lines, arcs, polylines for getting polyline (ENTER - exit): "),
    28.       _T("\nRemove lines, arcs, polylines from selection set: ")
    29.     };

    30.     ads_name ss;
    31.     resbuf* rbFilter = acutBuildList(RTDXF0, _T("LINE,ARC,LWPOLYLINE"), RTNONE);
    32.     int rc = acedSSGet(_T(":$"), promptPtrs, NULL, rbFilter, ss);
    33.     acutRelRb(rbFilter);

    34.     if (rc != RTNORM) return;

    35.     AcDbObjectIdArray ids;
    36.     if (ObjectIdArrayFromSelSet(ss, ids) != Acad::eOk) return;

    37.     AcDbObjectPointer<AcDbPolyline> pPoly; pPoly.create();
    38.     pPoly->setDatabaseDefaults();
    39.     AcArray<AcDbEntity*> ents; ents.setPhysicalLength(ids.length());

    40.     AcDbObjectPointer<AcDbCurve> c(ids[0], AcDb::kForRead);
    41.     if (c.openStatus() == Acad::eOk) {
    42.       AcGePoint3d ptStart, ptEnd;
    43.       c->getStartPoint(ptStart); c->getEndPoint(ptEnd);
    44.       pPoly->addVertexAt(0, asPnt2d(asDblArray(ptStart)), BulgeFromArc(c, false), 0, 0);
    45.       pPoly->addVertexAt(1, asPnt2d(asDblArray(ptEnd)), 0, 0, 0);
    46.     }

    47.     for (int i = 1; i < ids.length(); i++)
    48.     {
    49.       AcDbObjectPointer<AcDbCurve> c(ids[i], AcDb::kForRead);
    50.       if (c.openStatus() == Acad::eOk)
    51.         ents.append(c);
    52.     }

    53.     if (ents.length() > 0)
    54.     {
    55.       AcDbJoinEntityPE* pPE = AcDbJoinEntityPE::cast(pPoly->queryX(AcDbJoinEntityPE::desc()));

    56.       AcGeIntArray aInts;

    57.       Acad::ErrorStatus es = pPE->joinEntities(pPoly, ents, aInts);

    58.       if (es != Acad::eOk)
    59.       {
    60.         acutPrintf(_T("\nError pPE->joinEntities(pPoly, ents, aInts) = %s"), acadErrorStatusText(es));
    61.         return;
    62.       }
    63.     }
    64.     AcDbBlockTableRecordPointer pSpace(acdbCurDwg()->currentSpaceId(), AcDb::kForWrite);
    65.     if (pSpace.openStatus() != Acad::eOk) return;
    66.     pSpace->appendAcDbEntity(pPoly);
    67.   }

    68.   /// <summary>
    69.   /// Getting AcDbObjectIdArray from SelectionSet
    70.   /// </summary>
    71.   /// <param name="sset">SelectionSet</param>
    72.   /// <param name="ids">AcDbObjectIdArray</param>
    73.   /// <returns></returns>
    74.   static Acad::ErrorStatus ObjectIdArrayFromSelSet(ads_name sset, AcDbObjectIdArray& ids)
    75.   {
    76.     Acad::ErrorStatus es = Acad::eOk;
    77.     Adesk::Int32 nset = -1;
    78.     if (acedSSLength(sset, &nset) != RTNORM) return Acad::eAmbiguousInput;
    79.     ids.setLogicalLength(nset);
    80.     ads_name en;
    81.     AcDbObjectId id;
    82.     for (long i = 0; i < nset; i++) {
    83.       if (acedSSName(sset, i, en) == RTNORM) {
    84.         if ((es = acdbGetObjectId(id, en)) != Acad::eOk) return es;
    85.         ids[i] = id;
    86.       }
    87.     }
    88.     return Acad::eOk;
    89.   }
    90.   /// <summary>
    91.   /// Getting bulge for curve
    92.   /// </summary>
    93.   /// <param name="c">curve pointer</param>
    94.   /// <param name="clockwise">clockwise or counterclockwise.</param>
    95.   /// <returns></returns>
    96.   static double BulgeFromArc(AcDbCurve* c, bool clockwise)
    97.   {
    98.     double bulge = 0.0;
    99.     AcDbArc* a = AcDbArc::cast(c);
    100.     if (a == NULL) return bulge;

    101.     double newStart =
    102.       (a->startAngle() > a->endAngle()) ?
    103.       (a->startAngle() - 8 * atan(1.0)) :
    104.       (a->startAngle());

    105.     bulge = tan((a->endAngle() - newStart) / 4.0);
    106.     if (clockwise) bulge = -bulge;
    107.     return bulge;
    108.   }
    109. };

    110. //-----------------------------------------------------------------------------
    111. IMPLEMENT_ARX_ENTRYPOINT(CJoinEntitiesApp)

    112. ACED_ARXCOMMAND_ENTRY_AUTO(CJoinEntitiesApp, Rivilis, JoinEnts, JoinEnts, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, NULL)
    复制代码
    JoinToPline 连接线段成多段线
    深圳市诺科空间膜结构有限公司 专业膜结构设计施工20年,一级设计一级施工  www.nkmjg.cn 欢迎联系电话:138-2526-2292
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-5-24 01:39 , Processed in 0.064525 second(s), 22 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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