天气与日历 切换到窄版

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

c++ 偏移样条曲线

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

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

    积分
    1308
    QQ
    发表于 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. }
    复制代码

     

     

     

     

    c++ 偏移样条曲线
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-11-1 10:35 , Processed in 0.128280 second(s), 25 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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