admin 发表于 2024-10-6 17:19:28

c++ 偏移样条曲线

void cmdTestOffsetSpline()
{
        ads_point pt;
        ads_name ename;
        if (acedEntSel(NULL, ename, pt) != RTNORM)
                return;

        AcDbObjectId id;
        acdbGetObjectId(id, ename);

        AcDbEntityPointer pent(id, AcDb::kForRead);
        pent.openStatus();
        AcDbCurve* psp = AcDbCurve::cast(pent);
        if (psp == NULL) return;

        AcGeCurve3d* pGeCurve = NULL;
        Acad::ErrorStatus es = psp->getAcGeCurve(pGeCurve); //TB check ErrorStatus!
        pent->close();

        if (es || !pGeCurve) {//TB check ErrorStatus!
                acutPrintf(L"\ngetAcGeCurve(crv)=%s, crv=%x", acadErrorStatusText(es), pGeCurve);
                return;
        }

        double offsetdist = 100.0;
        AcGeVoidPointerArray arr;
        pGeCurve->getTrimmedOffset(offsetdist, AcGeVector3d::kZAxis, arr, AcGe::kExtend);

        delete pGeCurve;
        pGeCurve = NULL;

        AcAxDocLock lock;
        for (int i = 0; i < arr.length(); ++i) {
                AcGeCurve3d* pCurve = (AcGeCurve3d*)arr.at(i);
                if (!pCurve)
                        continue;
                AcGe::EntityId type = pCurve->type();
                AcDbCurve* pNewcurve = NULL;
                es = AcDbCurve::createFromAcGeCurve(*pCurve, pNewcurve);
                if (!es) //TB check es! eInvalidInput is returned for splines!
                        delete pCurve;
                else {
                        if (type == AcGe::kCompositeCrv3d){
                                AcGeNurbCurve3d* pFinalNurb = NULL;
                                AcGePoint3d ptNurbEnd, ptEnd, ptStart;
                                AcGeCompositeCurve3d *ccrv = (AcGeCompositeCurve3d*)pCurve;
                                AcGeVoidPointerArray curveList;
                                ccrv->getCurveList(curveList);
                                for (void* vp : curveList)
                                {
                                        AcGeNurbCurve3d *pNurb = NULL, *pTmpNurb = NULL;
                                        AcGeCurve3d* crv = (AcGeCurve3d*)vp;
                                        type = crv->type();
                                        if (type != AcGe::kNurbCurve3d) {
                                                double epsilon = AcGeContext::gTol.equalPoint();
                                                pTmpNurb = pNurb = new AcGeNurbCurve3d(*crv, epsilon);
                                        }
                                        else
                                                pNurb = (AcGeNurbCurve3d*)crv;

                                        if (!pFinalNurb) {
                                                pFinalNurb = pNurb;
                                                if (!pTmpNurb)
                                                        crv = NULL; // don't delete crv!
                                        }
                                        else {
                                                if (pNurb->hasStartPoint(ptStart) && (ptStart==ptNurbEnd)) {
                                                        pFinalNurb->joinWith(*pNurb);
                                                        if (pFinalNurb->hasEndPoint(ptEnd))
                                                                ptNurbEnd = ptEnd;
                                                }
                                        }
                                        if (pFinalNurb->hasEndPoint(ptEnd))
                                                ptNurbEnd = ptEnd;

                                        if (crv)
                                                delete crv;
                                }
                                if (pFinalNurb) {
                                        AcDbCurve* segment=NULL;
                                        es = AcDbCurve::createFromAcGeCurve(*pFinalNurb, pNewcurve);
                                        delete pFinalNurb;
                                }
                        }
                }

                if (pNewcurve)        {
                        AcDbDatabase* pdb = acdbHostApplicationServices()->workingDatabase();
                        pNewcurve->setDatabaseDefaults(pdb);
                        pNewcurve->setColorIndex(1); {
                                // append to database
                                AcDbObjectId curid = pdb->currentSpaceId();

                                AcDbBlockTableRecordPointer pbtr(curid, AcDb::kForWrite);
                                pbtr.openStatus();
                                AcDbObjectId newid;
                                pbtr->appendAcDbEntity(newid, pNewcurve);
                        }
                        pNewcurve->close();
                }
        }
}
页: [1]
查看完整版本: c++ 偏移样条曲线