找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 265|回复: 3

[研讨] AcDbCurve转换AcGeCurve中的样条化3dpoly

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-2-23 22:53:07 | 显示全部楼层 |阅读模式
在 AutoCAD 2014 SDK 中 AcDbCurve 提供了 getAcGeCurve() 方法,同时 AcDbCurve::createFromAcGeCurve(), 经测试在 AcDbCurve 是 3dpoly 经过 Pedit S 后,如果使用前者再使用后者添加到数据库后可以生成真正的 Spline,而对 LWPOLYLINE 经过 S 后,生成的曲线和原曲线一致

对 3dpoly 样条化后在 AcDb 时表现为折线模拟,getAcGeCurve()获取的反而是真正的 Spline ,这和 AcDb表现不一致,应该是一个Bug
  1. static void asdkMyGroupCTest(void)
  2.         {
  3.                 ads采用name ent;
  4.                 ads采用point pt;
  5.                 if(RTNORM != acedEntSel(NULL,ent,pt))
  6.                 {
  7.                         return;
  8.                 }
  9.                 AcDbObjectId id;
  10.                 acdbGetObjectId(id,ent);
  11.                 AcDbEntityPointer pEnt(id,AcDb::kForRead);
  12.                 if (pEnt.openStatus()!=Acad::eOk||!pEnt->isKindOf(AcDbCurve::desc()))
  13.                 {
  14.                         return;
  15.                 }
  16.                 AcDbCurve *pCurve=NULL;
  17.                 pCurve=AcDbCurve::cast(pEnt);
  18.                 if(pCurve==NULL)
  19.                 {
  20.                         return;
  21.                 }
  22.                 AcGeCurve3d *pGe=NULL;
  23.                 Acad::ErrorStatus es=pCurve->getAcGeCurve(pGe);
  24.                 pCurve->closes();
  25.                 if (es!=Acad::eOk)
  26.                 {
  27.                         return;
  28.                 }
  29.                 AcDbBlockTableRecordPointer btr(curDoc()->database()->currentSpaceId(),AcDb::kForWrite);
  30.                 if (btr.openStatus()!=Acad::eOk)
  31.                 {
  32.                        delete pGe;
  33.                        return;
  34.                 }
  35.                 AcDbCurve *pDbCv=NULL;
  36.                 es=AcDbCurve::createFromAcGeCurve(*pGe,pDbCv);
  37.                 delete pGe;
  38.                 if (es!=Acad::eOk)
  39.                 {
  40.                         return;
  41.                 }           
  42.                 btr->appendAcDbEntity(pDbCv);
  43.                 pDbCv->close();     
  44.         }
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-2-23 22:53:21 | 显示全部楼层
  1. // POLYLINE3D ?fit 后是折线模拟
  2. Acad::ErrorStatus Conversion::AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDb3dPolyline * pPoly3d)
  3. {
  4.         AcGePoint3dArray pts;
  5.         AcGePoint3d pt1;
  6.         AcDbObjectId id;
  7.         AcDbVertex *p3dVertex=NULL;
  8.         Acad::ErrorStatus es;
  9.         AcDb3dPolylineVertex *pPoly3dVertex=NULL;
  10.         AcDbObjectIterator* vertexIterator = pPoly3d->vertexIterator();
  11.         for (vertexIterator->start();!vertexIterator==vertexIterator->done();vertexIterator->step())
  12.         {
  13.                 id=vertexIterator->objectId();
  14.                 es=acdbOpenObject(p3dVertex,id,AcDb::kForRead);
  15.                 if (es==Acad::eOk)
  16.                 {
  17.                         pPoly3dVertex=AcDb3dPolylineVertex::cast(p3dVertex);
  18.                         if (pPoly3dVertex->vertexType()!=AcDb::k3dControlVertex)
  19.                         {
  20.                                 pts.append(pPoly3dVertex->position());
  21.                         }                       
  22.                 }
  23.                 if (p3dVertex!=NULL)
  24.                 {
  25.                         p3dVertex->close();
  26.                 }
  27.                 if (pPoly3dVertex!=NULL)
  28.                 {
  29.                         pPoly3dVertex->close();
  30.                 }
  31.         }
  32.         delete vertexIterator;
  33.         if (pPoly3d->isClosed())
  34.         {
  35.                 pPoly3d->getStartPoint(pt1);
  36.                 pts.append(pt1);
  37.         }
  38.         pGe=new AcGePolyline3d(pts);      
  39.         return Acad::eOk;
  40. }
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-2-23 22:53:36 | 显示全部楼层
  1. #pragma once
  2. class CConversion
  3. {
  4. public:
  5.         CConversion(void);
  6.         virtual ~CConversion(void);
  7.         static Acad::ErrorStatus AcGeCurveToAcDbCurve(AcDbCurve * &pDb,const AcGeCurve3d * pGe);
  8.         static Acad::ErrorStatus AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDbEntity *pEnt);
  9.         static Acad::ErrorStatus AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDbCurve *pDbCurve);
  10. private:        
  11.         static Acad::ErrorStatus AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDb2dPolyline *pPoly2d);
  12.         static Acad::ErrorStatus AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDb3dPolyline * pPoly3d);
  13.         static Acad::ErrorStatus AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDbPolyline * pPoly);
  14.         static Acad::ErrorStatus AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDbSpline * pSpline);
  15.         static Acad::ErrorStatus AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDbEllipse * pDb);
  16.         static Acad::ErrorStatus AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDbCircle * pDbCircle);
  17.         static Acad::ErrorStatus AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDbArc * pDbArc);
  18.         static Acad::ErrorStatus AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDbLine * pLine);
  19.         static Acad::ErrorStatus AcGeCurveToAcDbCurve(AcDbCurve * &pDb,const AcGePolyline3d *pGe);
  20.         static Acad::ErrorStatus AcGeCurveToAcDbCurve(AcDbCurve * &pDb,const AcGeCompositeCurve3d * pGe);
  21.         static Acad::ErrorStatus AcGeCurveToAcDbCurve(AcDbCurve * &pDb,const AcGeNurbCurve3d * pGe);
  22.         static Acad::ErrorStatus AcGeCurveToAcDbCurve(AcDbCurve * &pDb,const AcGeEllipArc3d * pGe);
  23.         static Acad::ErrorStatus AcGeCurveToAcDbCurve(AcDbCurve * &pDb,const AcGeCircArc3d * pGe);
  24.         static Acad::ErrorStatus AcGeCurveToAcDbCurve(AcDbCurve * &pDb,const AcGeLineSeg3d * pGe);
  25. };
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-2-23 22:54:01 | 显示全部楼层
  1. #include "stdafx.h"
  2. #include "CConversion.h"
  3. CConversion::CConversion(void)
  4. {
  5. }
  6. CConversion::~CConversion(void)
  7. {
  8. }
  9. //////////////////////////////////////////////////////////////////////////
  10. // catch all for all other entity types.
  11. Acad::ErrorStatus CConversion::AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDbCurve *pDbCurve)
  12. {
  13.         if (pDbCurve->isKindOf(AcDbLine::desc()))
  14.         {
  15.                 return AcDbCurveToAcGeCurve(pGe,(AcDbLine *)pDbCurve);
  16.         }
  17.         if (pDbCurve->isKindOf(AcDbArc::desc()))
  18.         {
  19.                 return AcDbCurveToAcGeCurve(pGe,(AcDbArc *)pDbCurve);
  20.         }
  21.         if (pDbCurve->isKindOf(AcDbCircle::desc()))
  22.         {
  23.                 return AcDbCurveToAcGeCurve(pGe,(AcDbCircle *)pDbCurve);
  24.         }
  25.         if (pDbCurve->isKindOf(AcDbEllipse::desc()))
  26.         {
  27.                 return AcDbCurveToAcGeCurve(pGe,(AcDbEllipse *)pDbCurve);
  28.         }
  29.         if (pDbCurve->isKindOf(AcDbSpline::desc()))
  30.         {
  31.                 return AcDbCurveToAcGeCurve(pGe,(AcDbSpline *)pDbCurve);
  32.         }
  33.         if (pDbCurve->isKindOf(AcDbPolyline::desc()))
  34.         {
  35.                 return AcDbCurveToAcGeCurve(pGe,(AcDbPolyline *)pDbCurve);
  36.         }
  37.         if (pDbCurve->isKindOf(AcDb3dPolyline::desc()))
  38.         {
  39.                 return AcDbCurveToAcGeCurve(pGe,(AcDb3dPolyline *)pDbCurve);
  40.         }
  41.         if (pDbCurve->isKindOf(AcDb2dPolyline::desc()))
  42.         {
  43.                 return AcDbCurveToAcGeCurve(pGe,(AcDb2dPolyline *)pDbCurve);
  44.         }
  45.         return Acad::eNotImplementedYet;
  46. }
  47. Acad::ErrorStatus CConversion::AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDbEntity *pEnt)
  48. {
  49.         if (pEnt->isKindOf(AcDbCurve::desc()))
  50.         {
  51.                 return AcDbCurveToAcGeCurve(pGe,(AcDbCurve *)pEnt);
  52.         }
  53.         return Acad::eNotImplementedYet;
  54. }
  55. Acad::ErrorStatus CConversion::AcGeCurveToAcDbCurve(AcDbCurve * &pDb,const AcGeCurve3d * pGe)
  56. {
  57.         AcGe::EntityId type = pGe->type();
  58.         switch (type)
  59.         {
  60.         case AcGe::kLineSeg3d:
  61.                 return AcGeCurveToAcDbCurve(pDb,(AcGeLineSeg3d *) pGe);
  62.         case AcGe::kCircArc3d:
  63.                 return AcGeCurveToAcDbCurve(pDb,(AcGeCircArc3d *) pGe);
  64.         case AcGe::kEllipArc3d:
  65.                 return AcGeCurveToAcDbCurve(pDb,(AcGeEllipArc3d *) pGe);
  66.         case AcGe::kNurbCurve3d:
  67.                 return AcGeCurveToAcDbCurve(pDb,(AcGeNurbCurve3d *) pGe);
  68.         case AcGe::kCompositeCrv3d:
  69.                 return AcGeCurveToAcDbCurve(pDb,(AcGeCompositeCurve3d*) pGe);
  70.         case AcGe::kPolyline3d:
  71.                 return AcGeCurveToAcDbCurve(pDb,(AcGePolyline3d *) pGe);
  72.         default:
  73.                 return Acad::eNotImplementedYet;
  74.         }
  75. }
  76. //////////////////////////////////////////////////////////////////////////
  77. //#include "Conversion.h"
  78. // LINE
  79. Acad::ErrorStatus CConversion::AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDbLine * pLine)
  80. {
  81.         pGe = new AcGeLineSeg3d(pLine->startPoint(), pLine->endPoint());
  82.         return Acad::eOk;
  83. }
  84. Acad::ErrorStatus CConversion::AcGeCurveToAcDbCurve(AcDbCurve * &pDb,const AcGeLineSeg3d * pGe)
  85. {
  86.         pDb= new AcDbLine(pGe->startPoint(),pGe->endPoint());
  87.         return Acad::eOk;
  88. }
  89. // ARC
  90. Acad::ErrorStatus  CConversion::AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDbArc * pDbArc)
  91. {
  92.         pGe =  new AcGeCircArc3d(
  93.                 pDbArc->center(),
  94.                 pDbArc->normal(),
  95.                 pDbArc->normal().perpVector(),
  96.                 pDbArc->radius(),
  97.                 pDbArc->startAngle(),
  98.                 pDbArc->endAngle());
  99.         return Acad::eOk;
  100. }
  101. Acad::ErrorStatus CConversion::AcGeCurveToAcDbCurve(AcDbCurve * &pDb,const AcGeCircArc3d * pGe)
  102. {
  103.         if (pGe->isClosed())
  104.         {
  105.                 pDb = new AcDbCircle(pGe->center(),pGe->normal(),pGe->radius());
  106.         }
  107.         else
  108.         {
  109.                 pDb = new AcDbArc(pGe->center(),pGe->normal(),pGe->radius(),pGe->startAng(),pGe->endAng());
  110.         }
  111.         return Acad::eOk;
  112. }
  113. // CIRCLE
  114. Acad::ErrorStatus  CConversion::AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDbCircle * pDbCircle)
  115. {
  116.         pGe =  new AcGeCircArc3d(pDbCircle->center(),pDbCircle->normal(),pDbCircle->radius());
  117.         return Acad::eOk;
  118. }
  119. // ELLIPSE
  120. Acad::ErrorStatus  CConversion::AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDbEllipse * pDb)
  121. {
  122.         pGe =  new AcGeEllipArc3d(
  123.                 pDb->center(),
  124.                 pDb->majorAxis(),
  125.                 pDb->minorAxis(),
  126.                 pDb->majorAxis().length(),
  127.                 pDb->minorAxis().length(),
  128.                 pDb->startAngle(),
  129.                 pDb->endAngle());
  130.         return Acad::eOk;
  131. }
  132. Acad::ErrorStatus  CConversion::AcGeCurveToAcDbCurve(AcDbCurve * &pDb,const AcGeEllipArc3d * pGe)
  133. {
  134.         pDb = new AcDbEllipse(
  135.                 pGe->center(),
  136.                 pGe->normal(),
  137.                 pGe->majorAxis()*pGe->majorRadius(),
  138.                 pGe->minorRadius()/pGe->majorRadius(),
  139.                 pGe->startAng(),
  140.                 pGe->endAng());
  141.         return Acad::eOk;
  142. }
  143. // SPLINE
  144. Acad::ErrorStatus CConversion::AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDbSpline * pSpline/*bool isFit*/)
  145. {
  146.         Acad::ErrorStatus es;
  147.         int degree;
  148.         double fitTolerance,controlPtTol,knotTol;
  149.         Adesk::Boolean tangent**ist,tangentStartDef,tangentEndDef,bIsRational,bIsPeriodic,bIsClosed;
  150.         AcGeVector3d startTangent,endTangent;
  151.         AcGePoint3dArray controlPoints,fitPoints;
  152.         AcGeDoubleArray knots,weights;
  153.         bIsClosed = pSpline->isClosed();
  154.         AcGeNurbCurve3d *pNurb = NULL;
  155.         if (pSpline->hasFitData()==Adesk::kTrue/* && isFit*/)
  156.         {
  157.                 AcGeTol tol;
  158.                 es = pSpline->getFitData(fitPoints,degree,fitTolerance,tangent**ist,startTangent,endTangent);
  159.                 if (es == Acad::eOk)
  160.                 {
  161.                         tangentStartDef = tangent**ist;
  162.                         tangentEndDef   = tangent**ist;
  163.                         AcGeTol fitTol;
  164.                         pSpline->fitTolerance();
  165.                         fitTol.setEqualPoint(fitTolerance);
  166.                         if (tangent**ist)
  167.                         {
  168.                                 pNurb = new AcGeNurbCurve3d(fitPoints,startTangent,endTangent,tangentStartDef,tangentEndDef,fitTol);
  169.                         }
  170.                         else
  171.                         {
  172.                                 pNurb = new AcGeNurbCurve3d(fitPoints,fitTol);
  173.                         }
  174.                 }
  175.                 else
  176.                 {
  177.                         return Acad::eNotImplementedYet;
  178.                 }
  179.         }
  180.         else
  181.         {
  182.                 es = pSpline->getNurbsData(degree,bIsRational,bIsClosed,bIsPeriodic,controlPoints,knots,weights,controlPtTol,knotTol);
  183.                 if (es == Acad::eOk)
  184.                 {
  185.                         if (bIsRational)
  186.                         {
  187.                                 pNurb = new AcGeNurbCurve3d(degree,knots,controlPoints,weights,bIsPeriodic);
  188.                         }
  189.                         else
  190.                         {
  191.                                 pNurb = new AcGeNurbCurve3d(degree,knots,controlPoints,bIsPeriodic);
  192.                         }
  193.                 }
  194.                 else
  195.                 {
  196.                         return Acad::eNotImplementedYet;
  197.                 }
  198.         }
  199.         bIsClosed?pNurb->makeClosed():pNurb->makeOpen();
  200.         pGe = pNurb;
  201.         return es;
  202. }
  203. Acad::ErrorStatus CConversion::AcGeCurveToAcDbCurve(AcDbCurve * &pDb,const AcGeNurbCurve3d * pGe)
  204. {
  205.         if (pGe->hasFitData())
  206.         {
  207.                 AcGePoint3dArray fitPoints;
  208.                 AcGeTol fitTolerance;
  209.                 Adesk::Boolean tangent**ist;
  210.                 AcGeVector3d startTangent;
  211.                 AcGeVector3d endTangent;
  212.                 //double tol;
  213.                 pGe->getFitData(fitPoints,fitTolerance,tangent**ist,startTangent,endTangent);
  214.                 pDb = new AcDbSpline(fitPoints,startTangent,endTangent,pGe->order(),fitTolerance.equalPoint());
  215.         }
  216.         else
  217.         {
  218.                 int degree;
  219.                 Adesk::Boolean bIsRational,periodic;
  220.                 AcGePoint3dArray controlPoints;
  221.                 AcGeKnotVector knots1;
  222.                 AcGeDoubleArray weights;
  223.                 pGe->getDefinitionData(degree,bIsRational,periodic,knots1,controlPoints,weights);
  224.                 AcGeDoubleArray knots;
  225.                 for (int i = 0;i<knots1.length();i++)
  226.                 {
  227.                         knots.append(knots1[i]);
  228.                 }
  229.                 pDb =new AcDbSpline(degree,bIsRational,pGe->isClosed(),periodic,controlPoints,knots,weights,0.0,pGe->knots().tolerance());
  230.         }
  231.         return Acad::eOk;
  232. }
  233. // POLYLINE
  234. Acad::ErrorStatus  CConversion::AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDbPolyline * pPoly)
  235. {
  236.         AcGeLineSeg3d *pLine = NULL;
  237.         AcGeCircArc3d *pArc = NULL;
  238.         AcGeVoidPointerArray GeCurves;
  239.         for( int i = 0; i <(int)pPoly->numVerts(); i++ )
  240.         {
  241.                 if( pPoly->segType(i) == AcDbPolyline::kLine )
  242.                 {
  243.                         pLine = new AcGeLineSeg3d;
  244.                         pPoly->getLineSegAt(i, *pLine);
  245.                         GeCurves.append(pLine);
  246.                 }
  247.                 else if( pPoly->segType(i) == AcDbPolyline::kArc )
  248.                 {
  249.                         pArc = new AcGeCircArc3d;
  250.                         pPoly->getArcSegAt(i, *pArc);
  251.                         GeCurves.append(pArc);
  252.                 }
  253.         }
  254.         pGe =  new AcGeCompositeCurve3d(GeCurves);
  255.         return Acad::eOk;
  256. }
  257. Acad::ErrorStatus CConversion::AcGeCurveToAcDbCurve(AcDbCurve * &pDb,const AcGeCompositeCurve3d * pGe)
  258. {  
  259.         AcGePoint3d startPnt,endPnt;
  260.         if( pGe->hasEndPoint(endPnt) == Adesk ::kFalse ||
  261.                 pGe->hasStartPoint(startPnt) == Adesk::kFalse)
  262.         {
  263.                 return Acad::eNotImplementedYet;
  264.         }
  265.         //get the plane of Curve3d
  266.         AcGePlane plane;
  267.         AcGeLine3d line;
  268.         AcGePoint3d p1,p2,p3;
  269.         if(pGe->isPlanar(plane))
  270.         {
  271.                 if(pGe->isLinear(line))    //Oh,it's a little tricky!
  272.                 {
  273.                         line.getPerpPlane(startPnt,plane);
  274.                         plane.get(p1,p2,p3);
  275.                         plane.set(p2,p3-p2);
  276.                 }
  277.                 plane.get(p1,p2,p3);
  278.         }
  279.         else
  280.         {
  281.                 return Acad::eNotImplementedYet;
  282.         }
  283.         //Creat a polyline
  284.         AcDbPolyline *pPoly = new AcDbPolyline();
  285.         AcGeVoidPointerArray curveList;
  286.         pGe->getCurveList(curveList);  //get all the segments
  287.         AcGeCurve3d *pCurve = NULL;
  288.         AcGeCircArc3d *pArc = NULL;
  289.         int i;
  290.         double b;
  291.         AcGePoint2d pt;
  292.         for(i = 0;i < curveList.length();i++)
  293.         {
  294.                 pCurve  =  (AcGeCurve3d *) (curveList[i]);
  295.                 pCurve->hasStartPoint(startPnt);
  296.                 pt = startPnt.convert2d(plane);
  297.                 if (pCurve->isKindOf(AcGe::kCircArc3d))
  298.                 {
  299.                         pArc = (AcGeCircArc3d *)(pCurve);
  300.                         b = tan(0.25 * pArc->endAng());
  301.                         if (pArc->normal()!=plane.normal())
  302.                         {
  303.                                 pPoly->addVertexAt(i,pt,-b);
  304.                         }
  305.                         else
  306.                         {
  307.                                 pPoly->addVertexAt(i,pt,b);
  308.                         }
  309.                 }
  310.                 else
  311.                 {
  312.                         pPoly->addVertexAt(i,pt);
  313.                 }
  314.         }
  315.         if(!pGe->isClosed())
  316.         {
  317.                 pt = endPnt.convert2d(plane);
  318.                 pPoly->addVertexAt(i,pt);
  319.         }
  320.         else
  321.         {
  322.                 pPoly->setClosed(Adesk::kTrue);
  323.         }
  324.         //the most important step;
  325.         AcGeMatrix3d xform;
  326.         AcGeVector3d XAxis = p1-p2;
  327.         AcGeVector3d YAxis = p3-p2;
  328.         AcGeVector3d ZAxis = XAxis.crossProduct(YAxis);
  329.         xform.setCoordSystem(p2,XAxis,YAxis,ZAxis);
  330.         pPoly->transformBy(xform);
  331.         pDb = pPoly;
  332.         return Acad::eOk;
  333. }
  334. // POLYLINE3D ?fit 后是折线模拟
  335. Acad::ErrorStatus CConversion::AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDb3dPolyline * pPoly3d)
  336. {
  337.         AcGePoint3dArray pts;
  338.         AcGePoint3d pt1;
  339.         AcDbObjectId id;
  340.         AcDbVertex *p3dVertex=NULL;
  341.         Acad::ErrorStatus es;
  342.         AcDb3dPolylineVertex *pPoly3dVertex=NULL;
  343.         AcDbObjectIterator* vertexIterator = pPoly3d->vertexIterator();
  344.         for (vertexIterator->start();!vertexIterator==vertexIterator->done();vertexIterator->step())
  345.         {
  346.                 id=vertexIterator->objectId();
  347.                 es=acdbOpenObject(p3dVertex,id,AcDb::kForRead);
  348.                 if (es==Acad::eOk)
  349.                 {
  350.                         pPoly3dVertex=AcDb3dPolylineVertex::cast(p3dVertex);
  351.                         if (pPoly3dVertex->vertexType()!=AcDb::k3dControlVertex)
  352.                         {
  353.                                 pts.append(pPoly3dVertex->position());
  354.                         }                       
  355.                 }
  356.                 if (p3dVertex!=NULL)
  357.                 {
  358.                         p3dVertex->close();
  359.                 }
  360.                 if (pPoly3dVertex!=NULL)
  361.                 {
  362.                         pPoly3dVertex->close();
  363.                 }
  364.         }
  365.         delete vertexIterator;
  366.         if (pPoly3d->isClosed())
  367.         {
  368.                 pPoly3d->getStartPoint(pt1);
  369.                 pts.append(pt1);
  370.         }
  371.         pGe=new AcGePolyline3d(pts);      
  372.         return Acad::eOk;
  373. }
  374. Acad::ErrorStatus CConversion::AcGeCurveToAcDbCurve(AcDbCurve * &pDb,const AcGePolyline3d *pGe)
  375. {
  376.         AcGePoint3dArray pts;
  377.         for (int i = 0;i < pGe->numControlPoints();i++)
  378.         {
  379.                 pts.append(pGe->controlPointAt(i));
  380.         }
  381.         pDb = new AcDb3dPolyline((AcDb::Poly3dType)pGe->type(),pts,pGe->isClosed());
  382.         return Acad::eOk;
  383. }
  384. // POLYLINE2D
  385. Acad::ErrorStatus CConversion::AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDb2dPolyline *pPoly2d)
  386. {
  387.         AcDb::Poly2dType type;
  388.         type=pPoly2d->polyType();
  389.         AcDbPolyline * pLwpoly = NULL;
  390.         Acad::ErrorStatus es;
  391.         if ((type==AcDb::k2d**Poly)||(type==AcDb::k2dFitCurvePoly))
  392.         {
  393.                 pLwpoly=new AcDbPolyline;
  394.                 es = pLwpoly->convertFrom((AcDbEntity *&)pPoly2d,Adesk::kFalse);
  395.                 if (es!=Acad::eOk)
  396.                 {
  397.                         delete pLwpoly;
  398.                         pLwpoly=NULL;
  399.                         return es;
  400.                 }
  401.                 es = AcDbCurveToAcGeCurve(pGe,pLwpoly);
  402.                 pLwpoly->close();
  403.                 return es;
  404.         }
  405.         else
  406.         {
  407.                 AcGeVoidPointerArray GeCurves;
  408.                 AcGePoint3d pt1;
  409.                 AcGePoint3d pt2;
  410.                 double Param;
  411.                 pPoly2d->getEndParam(Param);
  412.                 AcGeLineSeg3d *pLine = NULL;
  413.                 for (int i= 0; i < (int)Param;i++)
  414.                 {
  415.                         pPoly2d->getPointAtParam(i,pt1);
  416.                         pPoly2d->getPointAtParam(i+1,pt2);
  417.                         pLine = new AcGeLineSeg3d(pt1,pt2);
  418.                         GeCurves.append(pLine);
  419.                 }
  420.                 pGe = new AcGeCompositeCurve3d(GeCurves);
  421.                 return Acad::eOk;
  422.         }
  423. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-28 13:42 , Processed in 0.130918 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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