乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 38|回复: 1

使用ARX缩短一组AutoCAD线条

[复制链接]

26

主题

113

帖子

10

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
217
发表于 2010-7-18 21:07:05 | 显示全部楼层 |阅读模式

  1. //...
  2. template inline void destroy(T*& p) { delete p; p = 0; }
  3. //...
  4.     static AcGeVector3d delta (AcGePoint3d sp,AcGePoint3d ep)
  5.   {
  6.     acdbWcs2Ucs(asDblArray(sp),asDblArray(sp),false);
  7.     acdbWcs2Ucs(asDblArray(ep),asDblArray(ep),false);
  8.     return AcGeVector3d(ep.x - sp.x,ep.y - sp.y,ep.z - sp.z);
  9.   }
  10.   static Acad::ErrorStatus selectLines(AcDbObjectIdArray &ids)
  11.   {
  12.     Acad::ErrorStatus es = Acad::eOk;
  13.     // ssname
  14.     ads_name ssname = {0,0};
  15.     //build our filter on the stack so we don't have a ptr to free
  16.     resbuf filter = {NULL,RTDXF0};
  17.     filter.resval.rstring = _T("LINE");
  18.     // a nice happy message
  19.     const TCHAR *msg[] = {_T("\nSelect Lines: "), _T("\nRemove Lines: ")};
  20.     // get set, note the :$
  21.     if(acedSSGet(_T(":$"),msg,0,&filter,ssname)!= RTNORM)
  22.       return Acad::eNullObjectPointer;
  23.     // get the ids
  24.     es = acedGetCurrentSelectionSet(ids);
  25.     acedSSFree(ssname);
  26.     return es;
  27.   }
  28.   // - ArxExLine._exl command (do not rename)
  29.   static void ArxExLine_exl(void)
  30.   {
  31.     AcDbObjectIdArray objectIds;
  32.     if(selectLines(objectIds) != eOk)
  33.       return;
  34.     AcGePoint3d startPoint,endPoint;
  35.     //Paul this is a loop of objectIds
  36.     for(int idx = 0; idx  pLn(objectIds[idx], AcDb::kForWrite);
  37.       if(pLn.openStatus() == eOk)
  38.       {
  39.         // get the start and end points
  40.         pLn->getStartPoint(startPoint);
  41.         pLn->getEndPoint(endPoint);
  42.         // We'll extend our line by a quarter of the
  43.         // existing length in each direction
  44.         AcGeVector3d vext = delta(startPoint,endPoint) / 4;
  45.         // extend the line
  46.         pLn->extend(true, startPoint - vext);
  47.         // extend the line, but don't extend the start
  48.         pLn->extend(false, endPoint + vext);
  49.       }
  50.     }
  51.   }
  52.   // - ArxExLine._shl command (do not rename)
  53.   static void ArxExLine_shl(void)
  54.   {
  55.     AcDbObjectIdArray objectIds;
  56.     if(selectLines(objectIds) != eOk)
  57.       return;
  58.     double startParam=0;
  59.     double endParam=0;
  60.     double delta=0;
  61.     AcGeDoubleArray paramArray;
  62.     AcGeVoidPointerArray entPtrArray;
  63.     //Paul this is a loop of objectIds
  64.     for(int idx = 0; idx  pCurve(objectIds[idx], AcDb::kForWrite);
  65.       if(pCurve.openStatus() == eOk)
  66.       {
  67.         // get the start and end params
  68.         pCurve->getStartParam(startParam);
  69.         pCurve->getEndParam(endParam);
  70.         delta = (endParam-startParam) * 0.25;
  71.         // add the params to our array for getSplitCurves
  72.         paramArray.append(startParam + delta);
  73.         paramArray.append(endParam - delta);
  74.         if(pCurve->getSplitCurves(paramArray,entPtrArray)== eOk)
  75.         {
  76.           if (entPtrArray.length() == 3)
  77.           {
  78.             // See the arx docs for handOverTo
  79.             AcDbEntity *newent = (AcDbEntity*)entPtrArray[1];
  80.             pCurve->handOverTo(newent, true, true);
  81.             newent->close();
  82.             // delete the other new entities we don't need
  83.             AcDbEntity *tmpent = (AcDbEntity*)entPtrArray[0];
  84.             destroy(tmpent);
  85.             tmpent = (AcDbEntity*)entPtrArray[2];
  86.             destroy(tmpent);
  87.             pCurve.release((AcDbLine*&)tmpent);
  88.             destroy(tmpent);
  89.           }
  90.           else
  91.           {
  92.             // just-in-case do clean up
  93.             for(int i = 0; i : "), rStr);
  94.         int rVal;
  95.         acedInitGet(RSG_NOZERO + RSG_NONEG, _T(""));
  96.         rVal = acedGetDist(NULL, prompt, &perc);
  97.         switch (rVal)
  98.         {
  99.         case RTNORM:
  100.                 acdbRToS(perc, -1, -1, rStr);
  101.                 defPerc = perc;
  102.                 break;
  103.         case RTNONE:
  104.                 perc = defPerc;
  105.                 acdbRToS(perc, -1, -1, rStr);
  106.                 break;
  107.         case RTCAN:
  108.                 return;
  109.                 break;
  110.         }
  111.         for (int i = 0; i  pLine(objId, AcDb::kForWrite);
  112.                 if (pLine.openStatus() != Acad::eOk) continue;
  113.                 AcGePoint3d sp, ep;
  114.                 sp = pLine->startPoint();
  115.                 ep = pLine->endPoint();
  116.                 AcGeLineSeg3d line(sp, ep);
  117.                 AcGePoint3d midPt = sp + 0.5 * (ep - sp);
  118.                 line.scaleBy(perc, midPt);
  119.                 pLine->setStartPoint(line.startPoint());
  120.                 pLine->setEndPoint(line.endPoint());
  121.         }
  122.         acedSSFree(ss);
  123. }

和类似的东西
回复

使用道具 举报

116

主题

996

帖子

9

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1466
发表于 2010-7-19 02:07:39 | 显示全部楼层
不错!
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-5-1 13:59 , Processed in 0.888031 second(s), 67 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表