乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
楼主: highflyingbird

两条曲线间getClosestPointTo的精确性。

[复制链接]

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2010-7-24 04:29:42 | 显示全部楼层

不,它不起作用。无论如何,谢谢你
顺便说一句,我修改了我的代码,我将稍后发布。
  1. #include "StdAfx.h"
  2. //Convert AcDb to AcGe;
  3. Acad::ErrorStatus        AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDbLine * pLine);
  4. Acad::ErrorStatus        AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDbArc * pDbArc);
  5. Acad::ErrorStatus        AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDbCircle * pDbCircle);
  6. Acad::ErrorStatus        AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDbEllipse * pDbEllise);
  7. Acad::ErrorStatus        AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDbSpline * pSpline,bool isFit = true);
  8. Acad::ErrorStatus        AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDbPolyline * pPoly);
  9. Acad::ErrorStatus        AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDb2dPolyline *pPoly2d,bool isFit = true);
  10. Acad::ErrorStatus        AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDb3dPolyline *pPoly3d,bool isFit = true);
  11. Acad::ErrorStatus        AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDbCurve *pDbCurve);
  12. Acad::ErrorStatus        AcDbCurveToAcGeCurve(AcGeCurve3d * &pGe,const AcDbEntity *pEnt);
  13. //Convert AcGe to AcDb;
  14. Acad::ErrorStatus        AcGeCurveToAcDbCurve(AcDbCurve * &pDb,const AcGeLineSeg3d * pGe);
  15. Acad::ErrorStatus        AcGeCurveToAcDbCurve(AcDbCurve * &pDb,const AcGeCircArc3d * pGe);
  16. Acad::ErrorStatus        AcGeCurveToAcDbCurve(AcDbCurve * &pDb,const AcGeEllipArc3d * pGe);
  17. Acad::ErrorStatus        AcGeCurveToAcDbCurve(AcDbCurve * &pDb,const AcGeNurbCurve3d * pGe);
  18. Acad::ErrorStatus        AcGeCurveToAcDbCurve(AcDbCurve * &pDb,const AcGeCompositeCurve3d * pGe);
  19. Acad::ErrorStatus        AcGeCurveToAcDbCurve(AcDbCurve * &pDb,const AcGeCurve3d * pGe);
  20. Acad::ErrorStatus        AcGeCurveToAcDbCurve(AcDbCurve * &pDb,const AcGePolyline3d *pGe);
  21. //This is for test.
  22. Acad::ErrorStatus        CreateEntity(AcDbEntity * pEnt,Adesk::UInt16 color = 256);code]

回复

使用道具 举报

LE3

10

主题

149

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
189
发表于 2010-7-24 10:25:19 | 显示全部楼层
是的,它只是昨晚睡觉前的一个快速帖子
回复

使用道具 举报

LE3

10

主题

149

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
189
发表于 2010-7-24 11:11:49 | 显示全部楼层

  1. [quote author=highflybird link=topic=34229.msg395459#msg395459 date=1279960182]
  2. No,it doesn't work.Thank you anyway.
  3. notice that: both of them can't get a right result.
  4. by the way, I modified my code,I will post it later.

我明白了,我没有看你的代码,我前段时间试图做一些类似的事情,但从未完成,还记得乔·伯克写了MinDist
一个伟大的宝石来做这一点,但不知道他是否在这里发布了他的代码(lisp/vlisp)
回复

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

对于Polyline3d(或2d)
如果要精确获取壁橱点,请将其转换为AcGeCompositeCurve3d,如果要相同的点,请使用getspline
实际上,对于拟合样条曲线,getNurbsData用于精度,getFitData用于相同类型。
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2010-7-29 07:18:39 | 显示全部楼层
干得好。
这个帖子很有趣,尽管我目前没有使用ARX本地语言。我已经做了一些类似的(DBCurve几何曲线)项目。不过,是网。
我确实注意到您的程序中有一个与椭圆相关的情况,与我最初在我的程序中看到的情况相似。用Start- and EndParameter代替Angle更准确地重新创建椭圆(正如xsfhlzh在本主题中告诉我的那样:)
我还研究了Curve3d。GetClosestPointTo(Curve3d,Tolerance),来自。NET端,发现方法有点气质。你更新的代码允许更一致的结果吗?
通过在结值处细分nurb曲线(使用HardTrimByParams方法),我获得了更好的性能。getLocalClosestPoints也可能对细分有用,只是它在ManagedARX中不可用。
这种细分似乎对所有曲线都相当准确,只有一个明显的例外:NurbCurve3d/LineSegment分析。对于线段,点曲线的位置并不总是正确的。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-5 19:51 , Processed in 0.274275 second(s), 61 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表