好的,这是我的代码。
- #define PI 3.14159265358979323846264338327950288
- //转换AcDbCurve到AcGeCurve3d
- //Function : Get AcGeCurve3d object associated with AcDbCurve (include : line,arc,circle,ellipse,spline,polyline...)
- //Arguments: from : AcDbCurve , the AcDbCurbe object, to : AcGeCurve3d object
- //return: Acad::ErrorStatus
- Acad::ErrorStatus convertDbCurveToGeCurve(AcDbCurve *pDbCurve,AcGeCurve3d *&pGeCurve)
- {
- pGeCurve=NULL;
- // for Line: is very simple;
- if (pDbCurve->isKindOf(AcDbLine::desc()))
- {
- AcDbLine *pL=(AcDbLine *)pDbCurve;
- AcGeLineSeg3d *pGL=new AcGeLineSeg3d;
- pGL->set(pL->startPoint(),pL->endPoint());
- pGeCurve=(AcGeCurve3d *)pGL;
- }
- // for Arc;
- else if (pDbCurve->isKindOf(AcDbArc::desc()))
- {
- AcDbArc *pArc=(AcDbArc *)pDbCurve;
- double ans,ane;
- ans=pArc->startAngle();
- ane=pArc->endAngle();
- AcGeCircArc3d *pGArc=new AcGeCircArc3d;
- pGArc->setCenter(pArc->center());
- pGArc->setRadius(pArc->radius());
- pGArc->setAngles(ans,ane);
- pGeCurve=(AcGeCurve3d *)pGArc;
- }
- // for Circle;
- else if (pDbCurve->isKindOf(AcDbCircle::desc()))
- {
- AcDbCircle *pCir=(AcDbCircle *)pDbCurve;
- AcGeCircArc3d * pGCir=new AcGeCircArc3d;
- pGCir->setCenter(pCir->center());
- pGCir->setRadius(pCir->radius());
- pGeCurve=(AcGeCurve3d *)pGCir;
- }
- //for Ellipse
- else if (pDbCurve->isKindOf(AcDbEllipse::desc()))
- {
- AcDbEllipse *pEli=(AcDbEllipse *)pDbCurve;
- AcGePoint3d center=pEli->center();
- AcGeVector3d pv1 = pEli->majorAxis();
- double majorRadius = sqrt(pv1.x*pv1.x+pv1.y*pv1.y+pv1.z*pv1.z);
- double param1,param2;
- pEli->getStartParam(param1);
- pEli->getEndParam(param2);
- AcGeEllipArc3d *pGEli=new AcGeEllipArc3d;
- pGEli->setCenter(center);
- pGEli->setAxes(pv1,pEli->minorAxis());
- pGEli->setMajorRadius(majorRadius);
- pGEli->setMinorRadius(majorRadius*(pEli->radiusRatio()));
- pGEli->setAngles(param1,param2);
- pGeCurve=(AcGeCurve3d *)pGEli;
- }
- //for Spline
- else if (pDbCurve->isKindOf(AcDbSpline::desc()))
- {
- AcDbSpline *pSL=(AcDbSpline *)pDbCurve;
- if (!pSL)
- {
- return Acad::eNotImplemented;
- }
- if (pSL->isNull()==Adesk::kTrue)
- {
- return Acad::eNotImplemented;
- }
- int degree;
- Adesk::Boolean rational;
- Adesk::Boolean closed;
- Adesk::Boolean periodic;
- AcGePoint3dArray controlPoints;
- AcGeDoubleArray knots;
- AcGeDoubleArray weights;
- double controlPtTol;
- double knotTol;
- AcGeTol tol;
- Acad::ErrorStatus es;
- es=pSL->getNurbsData(degree,rational,closed,periodic,controlPoints,knots,weights,controlPtTol,knotTol);
- if (es!=Acad::eOk)
- {
- return Acad::eNotImplemented;
- }
-
- if (rational==Adesk::kTrue)
- {
- AcGeNurbCurve3d *pNurb=new AcGeNurbCurve3d(degree,knots,controlPoints,weights,periodic);
- pGeCurve=(AcGeCurve3d *)pNurb;
- }
- else
- {
- AcGeNurbCurve3d *pNurb=new AcGeNurbCurve3d(degree,knots,controlPoints,periodic);
- pGeCurve=(AcGeCurve3d *)pNurb;
- }
- }
- // for Polyline
- else if (pDbCurve->isKindOf(AcDbPolyline::desc()))
- {
- AcDbPolyline *pPoly = (AcDbPolyline *)pDbCurve;
- int nSegs;
- AcGeLineSeg3d *pLine;
- AcGeLineSeg3d line;
- AcGeCircArc3d *pArc;
- AcGeCircArc3d arc;
- AcGeVoidPointerArray geCurves;
- if (pPoly->isClosed())
- {
- nSegs = pPoly->numVerts();
- }
- else
- {
- nSegs = pPoly->numVerts() - 1;
- }
-
- for( int i = 0; i segType(i) == AcDbPolyline::kLine )
- {
|