找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 25|回复: 0

c++ 偏移样条曲线

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-10-6 17:19:28 | 显示全部楼层 |阅读模式
  1. void cmdTestOffsetSpline()
  2. {
  3.         ads_point pt;
  4.         ads_name ename;
  5.         if (acedEntSel(NULL, ename, pt) != RTNORM)
  6.                 return;
  7.         AcDbObjectId id;
  8.         acdbGetObjectId(id, ename);
  9.         AcDbEntityPointer pent(id, AcDb::kForRead);
  10.         pent.openStatus();
  11.         AcDbCurve* psp = AcDbCurve::cast(pent);
  12.         if (psp == NULL) return;
  13.         AcGeCurve3d* pGeCurve = NULL;
  14.         Acad::ErrorStatus es = psp->getAcGeCurve(pGeCurve); //TB check ErrorStatus!
  15.         pent->close();
  16.         if (es || !pGeCurve) {  //TB check ErrorStatus!
  17.                 acutPrintf(L"\ngetAcGeCurve(crv)=%s, crv=%x", acadErrorStatusText(es), pGeCurve);
  18.                 return;
  19.         }
  20.         double offsetdist = 100.0;
  21.         AcGeVoidPointerArray arr;
  22.         pGeCurve->getTrimmedOffset(offsetdist, AcGeVector3d::kZAxis, arr, AcGe::kExtend);
  23.         delete pGeCurve;
  24.         pGeCurve = NULL;
  25.         AcAxDocLock lock;
  26.         for (int i = 0; i < arr.length(); ++i) {
  27.                 AcGeCurve3d* pCurve = (AcGeCurve3d*)arr.at(i);
  28.                 if (!pCurve)
  29.                         continue;
  30.                 AcGe::EntityId type = pCurve->type();
  31.                 AcDbCurve* pNewcurve = NULL;
  32.                 es = AcDbCurve::createFromAcGeCurve(*pCurve, pNewcurve);
  33.                 if (!es) //TB check es! eInvalidInput is returned for splines!
  34.                         delete pCurve;
  35.                 else {
  36.                         if (type == AcGe::kCompositeCrv3d)  {
  37.                                 AcGeNurbCurve3d* pFinalNurb = NULL;
  38.                                 AcGePoint3d ptNurbEnd, ptEnd, ptStart;
  39.                                 AcGeCompositeCurve3d *ccrv = (AcGeCompositeCurve3d*)pCurve;
  40.                                 AcGeVoidPointerArray curveList;
  41.                                 ccrv->getCurveList(curveList);
  42.                                 for (void* vp : curveList)
  43.                                 {
  44.                                         AcGeNurbCurve3d *pNurb = NULL, *pTmpNurb = NULL;
  45.                                         AcGeCurve3d* crv = (AcGeCurve3d*)vp;
  46.                                         type = crv->type();
  47.                                         if (type != AcGe::kNurbCurve3d) {
  48.                                                 double epsilon = AcGeContext::gTol.equalPoint();
  49.                                                 pTmpNurb = pNurb = new AcGeNurbCurve3d(*crv, epsilon);
  50.                                         }
  51.                                         else
  52.                                                 pNurb = (AcGeNurbCurve3d*)crv;
  53.                                         if (!pFinalNurb) {
  54.                                                 pFinalNurb = pNurb;
  55.                                                 if (!pTmpNurb)
  56.                                                         crv = NULL; // don't delete crv!
  57.                                         }
  58.                                         else {
  59.                                                 if (pNurb->hasStartPoint(ptStart) && (ptStart==ptNurbEnd)) {
  60.                                                         pFinalNurb->joinWith(*pNurb);
  61.                                                         if (pFinalNurb->hasEndPoint(ptEnd))
  62.                                                                 ptNurbEnd = ptEnd;
  63.                                                 }
  64.                                         }
  65.                                         if (pFinalNurb->hasEndPoint(ptEnd))
  66.                                                 ptNurbEnd = ptEnd;
  67.                                         if (crv)
  68.                                                 delete crv;
  69.                                 }
  70.                                 if (pFinalNurb) {
  71.                                         AcDbCurve* segment=NULL;
  72.                                         es = AcDbCurve::createFromAcGeCurve(*pFinalNurb, pNewcurve);
  73.                                         delete pFinalNurb;
  74.                                 }
  75.                         }
  76.                 }
  77.                 if (pNewcurve)        {
  78.                         AcDbDatabase* pdb = acdbHostApplicationServices()->workingDatabase();
  79.                         pNewcurve->setDatabaseDefaults(pdb);
  80.                         pNewcurve->setColorIndex(1); {
  81.                                 // append to database
  82.                                 AcDbObjectId curid = pdb->currentSpaceId();
  83.                                 AcDbBlockTableRecordPointer pbtr(curid, AcDb::kForWrite);
  84.                                 pbtr.openStatus();
  85.                                 AcDbObjectId newid;
  86.                                 pbtr->appendAcDbEntity(newid, pNewcurve);
  87.                         }
  88.                         pNewcurve->close();
  89.                 }
  90.         }
  91. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-27 06:44 , Processed in 0.135462 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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