直线、多段线(1d 2d 3d)、圆弧、圆、椭圆弧、样条曲线
AutoCAD 2013 版本以上直接用
es = acdbConvertAcDbCurveToGelibCurve(pCurve, pGeCurve);
// 或者用 getAcGeCurve
// es = pCurve->getAcGeCurve(pGeCurve);
AcGeCurve3d::isOn
AutoCAD 2013 版本以下需要构造 AcGe 类,然后用
static_cast<AcGeCurve3d*>(pGeLine->copy())
至于曲线转换类高大侠分享过。
 - Acad::ErrorStatus es;
- ads_name name;
- AcGePoint3d pt;
- if (acedEntSel(_T("\n请选择一条曲线:"), name, asDblArray(pt)) != RTNORM)
- return;
- AcDbObjectId objId;
- es = acdbGetObjectId(objId, name);
- if (es != Acad::eOk) return;
- AcDbEntity *pEnt = NULL;
- es = acdbOpenObject(pEnt, objId, AcDb::kForRead);
- if (es != Acad::eOk) return;
- AcGeCurve3d* pGeCurve = NULL;
- #if _MSC_VER > 1500
- if (pEnt->isKindOf(AcDbCurve::desc()))
- {
- AcDbCurve *pCurve = AcDbCurve::cast(pEnt);
- // 转换为几何类
- es = acdbConvertAcDbCurveToGelibCurve(pCurve, pGeCurve);
- // 或者用 getAcGeCurve
- // es = pCurve->getAcGeCurve(pGeCurve);
- pCurve->close();
- }
- #else // 低于 AutoCAD 2013 版本
- if (pEnt->isKindOf(AcDbLine::desc()))
- {
- AcDbLine *pLine = AcDbLine::cast(pEnt);
- AcGeLineSeg3d* pGeLine = CCurveConversion::AcDbCurveToAcGeCurve(pLine);
- pGeCurve = static_cast<AcGeCurve3d*>(pGeLine->copy());
- pLine->close();
- }
- else if (pEnt->isKindOf(AcDbPolyline::desc()))
- {
- AcDbPolyline *pPoly = AcDbPolyline::cast(pEnt);
- AcGeCompositeCurve3d* pGePoly = CCurveConversion::AcDbCurveToAcGeCurve(pPoly);
- pGeCurve = static_cast<AcGeCurve3d*>(pGePoly->copy());
- pPoly->close();
- }
- else if (pEnt->isKindOf(AcDb2dPolyline::desc()))
- {
- AcDb2dPolyline *pPoly = AcDb2dPolyline::cast(pEnt);
- AcGeCompositeCurve3d* pGePoly = CCurveConversion::AcDbCurveToAcGeCurve(pPoly);
- pGeCurve = static_cast<AcGeCurve3d*>(pGePoly->copy());
- pPoly->close();
- }
- else if (pEnt->isKindOf(AcDb3dPolyline::desc()))
- {
- AcDb3dPolyline *pPoly = AcDb3dPolyline::cast(pEnt);
- AcGeCompositeCurve3d* pGePoly = CCurveConversion::AcDbCurveToAcGeCurve(pPoly);
- pGeCurve = static_cast<AcGeCurve3d*>(pGePoly->copy());
- pPoly->close();
- }
- else if (pEnt->isKindOf(AcDbArc::desc()))
- {
- AcDbArc *pArc = AcDbArc::cast(pEnt);
- AcGeCircArc3d* pGeArc = CCurveConversion::AcDbCurveToAcGeCurve(pArc);
- pGeCurve = static_cast<AcGeCurve3d*>(pGeArc->copy());
- pArc->close();
- }
- else if (pEnt->isKindOf(AcDbCircle::desc()))
- {
- AcDbCircle *pCircle = AcDbCircle::cast(pEnt);
- AcGeCircArc3d* pGeCircle = CCurveConversion::AcDbCurveToAcGeCurve(pCircle);
- pGeCurve = static_cast<AcGeCurve3d*>(pGeCircle->copy());
- pCircle->close();
- }
- else if (pEnt->isKindOf(AcDbEllipse::desc()))
- {
- AcDbEllipse *pEllipse = AcDbEllipse::cast(pEnt);
- AcGeCircArc3d* pGeEllipse = CCurveConversion::AcDbCurveToAcGeCurve(pEllipse);
- pGeCurve = static_cast<AcGeCurve3d*>(pGeEllipse->copy());
- pEllipse->close();
- }
- else if (pEnt->isKindOf(AcDbSpline::desc()))
- {
- AcDbSpline *pSpline = AcDbSpline::cast(pEnt);
- AcGeCircArc3d* pGeSpline = CCurveConversion::AcDbCurveToAcGeCurve(pSpline);
- pGeCurve = static_cast<AcGeCurve3d*>(pGeSpline->copy());
- pSpline->close();
- }
- #endif
- if (pGeCurve)
- {
- // 设置捕捉
- resbuf rb;
- rb.rbnext = NULL;
- rb.restype = RTSHORT;
- rb.resval.rint = 555;
- acedSetVar(_T("osmode"), &rb);
- AcGePoint3d ptTest;
- while (acedGetPoint(NULL, _T("\n请拾取点测试是否在曲线上:"), asDblArray(ptTest)) == RTNORM)
- {
- // 拾取点是否位于曲线上
- if (pGeCurve->isOn(ptTest))
- acutPrintf(_T("\n点在曲线上"));
- else
- acutPrintf(_T("\n点不在曲线上"));
- }
- rb.resval.rint = 0;
- acedSetVar(_T("osmode"), &rb);
- delete pGeCurve;
- }
- pEnt->close();
|