乐筑天下

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

如何从AcDb2dPolyline对象中获取AcGeCurve3d对象?

[复制链接]

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2010-6-10 03:37:29 | 显示全部楼层 |阅读模式
如何获取与AcDb2dPolyline对象关联的AcGeCurve3d对象?
例如,是否有一个名为“AcDb2dPolylineToAcGeCurve3d(AcDb2dPolyline*, AcGeCurve3d * & )"?
顺便说一下,我可以从其他类型的曲线(折线、圆、样条...)中获取AcGeCurve3d,但为此,我找不到方法。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2010-6-10 05:40:21 | 显示全部楼层
如果可以从多段线获取AcGeCurve3d,并且AcDb2dPolyline很简单,则可以在AcDbPolyline::convertFrom的帮助下将其转换为AcDbPolyline。如果AcDb2dPolyline不简单,可以尝试使用AcDbCurve::getSpline方法将其转换为样条线。
回复

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2010-6-10 05:48:42 | 显示全部楼层
没有了。
不知道。
怎么知道?你能提供一个代码样本吗?您总是可以使用AcDbPolyline::convertFrom函数将AcDb2dPolyline转换为AcDbPolyline,并从那里通过任何方式获得AcGeCurve3d对象。
回复

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2010-6-10 06:14:51 | 显示全部楼层
好的,这是我的代码。
  1. #define  PI 3.14159265358979323846264338327950288
  2. //转换AcDbCurve到AcGeCurve3d
  3. //Function : Get AcGeCurve3d object associated with AcDbCurve (include : line,arc,circle,ellipse,spline,polyline...)
  4. //Arguments: from : AcDbCurve , the AcDbCurbe object,  to : AcGeCurve3d object
  5. //return:  Acad::ErrorStatus
  6. Acad::ErrorStatus convertDbCurveToGeCurve(AcDbCurve *pDbCurve,AcGeCurve3d *&pGeCurve)
  7. {
  8.         pGeCurve=NULL;
  9.         // for Line: is very simple;
  10.         if (pDbCurve->isKindOf(AcDbLine::desc()))
  11.         {
  12.                 AcDbLine *pL=(AcDbLine *)pDbCurve;
  13.                 AcGeLineSeg3d *pGL=new AcGeLineSeg3d;
  14.                 pGL->set(pL->startPoint(),pL->endPoint());
  15.                 pGeCurve=(AcGeCurve3d *)pGL;
  16.         }
  17.         // for Arc;
  18.         else if (pDbCurve->isKindOf(AcDbArc::desc()))
  19.         {
  20.                 AcDbArc *pArc=(AcDbArc *)pDbCurve;
  21.                 double ans,ane;
  22.                 ans=pArc->startAngle();
  23.                 ane=pArc->endAngle();
  24.                 AcGeCircArc3d *pGArc=new AcGeCircArc3d;
  25.                 pGArc->setCenter(pArc->center());
  26.                 pGArc->setRadius(pArc->radius());
  27.                 pGArc->setAngles(ans,ane);
  28.                 pGeCurve=(AcGeCurve3d *)pGArc;
  29.         }
  30.         // for Circle;
  31.         else if (pDbCurve->isKindOf(AcDbCircle::desc()))
  32.         {
  33.                 AcDbCircle *pCir=(AcDbCircle *)pDbCurve;
  34.                 AcGeCircArc3d * pGCir=new AcGeCircArc3d;
  35.                 pGCir->setCenter(pCir->center());
  36.                 pGCir->setRadius(pCir->radius());
  37.                 pGeCurve=(AcGeCurve3d *)pGCir;
  38.         }
  39.         //for Ellipse
  40.         else if (pDbCurve->isKindOf(AcDbEllipse::desc()))
  41.         {
  42.                 AcDbEllipse *pEli=(AcDbEllipse *)pDbCurve;
  43.                 AcGePoint3d center=pEli->center();
  44.                 AcGeVector3d pv1 = pEli->majorAxis();
  45.                 double majorRadius = sqrt(pv1.x*pv1.x+pv1.y*pv1.y+pv1.z*pv1.z);
  46.                 double param1,param2;
  47.                 pEli->getStartParam(param1);
  48.                 pEli->getEndParam(param2);
  49.                 AcGeEllipArc3d *pGEli=new AcGeEllipArc3d;
  50.                 pGEli->setCenter(center);
  51.                 pGEli->setAxes(pv1,pEli->minorAxis());       
  52.                 pGEli->setMajorRadius(majorRadius);
  53.                 pGEli->setMinorRadius(majorRadius*(pEli->radiusRatio()));
  54.                 pGEli->setAngles(param1,param2);
  55.                 pGeCurve=(AcGeCurve3d *)pGEli;
  56.         }
  57.         //for Spline
  58.         else if (pDbCurve->isKindOf(AcDbSpline::desc()))
  59.         {
  60.                 AcDbSpline *pSL=(AcDbSpline *)pDbCurve;
  61.                 if (!pSL)
  62.                 {       
  63.                         return Acad::eNotImplemented;
  64.                 }
  65.                 if (pSL->isNull()==Adesk::kTrue)
  66.                 {
  67.                         return Acad::eNotImplemented;
  68.                 }
  69.                 int degree;
  70.                 Adesk::Boolean rational;
  71.                 Adesk::Boolean closed;
  72.                 Adesk::Boolean periodic;
  73.                 AcGePoint3dArray controlPoints;
  74.                 AcGeDoubleArray knots;
  75.                 AcGeDoubleArray weights;
  76.                 double controlPtTol;
  77.                 double knotTol;
  78.                 AcGeTol tol;
  79.                 Acad::ErrorStatus es;
  80.                 es=pSL->getNurbsData(degree,rational,closed,periodic,controlPoints,knots,weights,controlPtTol,knotTol);
  81.                 if (es!=Acad::eOk)
  82.                 {
  83.                         return Acad::eNotImplemented;
  84.                 }
  85.                        
  86.                 if (rational==Adesk::kTrue)
  87.                 {
  88.                         AcGeNurbCurve3d *pNurb=new AcGeNurbCurve3d(degree,knots,controlPoints,weights,periodic);
  89.                         pGeCurve=(AcGeCurve3d *)pNurb;
  90.                 }
  91.                 else
  92.                 {
  93.                         AcGeNurbCurve3d *pNurb=new AcGeNurbCurve3d(degree,knots,controlPoints,periodic);
  94.                         pGeCurve=(AcGeCurve3d *)pNurb;
  95.                 }
  96.         }
  97.         // for Polyline
  98.         else if (pDbCurve->isKindOf(AcDbPolyline::desc()))
  99.         {
  100.                 AcDbPolyline *pPoly = (AcDbPolyline *)pDbCurve;
  101.                 int nSegs;
  102.                 AcGeLineSeg3d *pLine;
  103.                 AcGeLineSeg3d line;
  104.                 AcGeCircArc3d *pArc;
  105.                 AcGeCircArc3d arc;
  106.                 AcGeVoidPointerArray geCurves;
  107.                 if (pPoly->isClosed())
  108.                 {
  109.                         nSegs = pPoly->numVerts();
  110.                 }
  111.                 else
  112.                 {
  113.                         nSegs = pPoly->numVerts() - 1;
  114.                 }
  115.                
  116.                 for( int i = 0; i segType(i) == AcDbPolyline::kLine )
  117.                         {
  118.                                 pPoly->getLineSegAt( i, line );
  119.                                 pLine = new AcGeLineSeg3d( line );
  120.                                 geCurves.append( pLine );
  121.                         }
  122.                         else if( pPoly->segType( i ) == AcDbPolyline::kArc )
  123.                         {
  124.                                 pPoly->getArcSegAt( i, arc );
  125.                                 pArc = new AcGeCircArc3d( arc );
  126.                                 geCurves.append( pArc );
  127.                         }
  128.                 }
  129.                 if( geCurves.length() == 1 )
  130.                 {
  131.                         pGeCurve = ( AcGeCurve3d* )( geCurves[0] );
  132.                 }
  133.                 else
  134.                 {
  135.                         pGeCurve = new AcGeCompositeCurve3d( geCurves );
  136.                 }
  137.         }
  138.         //else if (pDbCurve->isKindOf(AcDb2dPolyline::desc()))
  139.         //{
  140.         //}
  141.         return (pGeCurve)?Acad::eOk:Acad::eNotImplemented;
  142. }

我没有完成关于AcDb2dPolyline的部分代码,我希望AcGeCurve3d对象完全来自AcDbCurve对象,而不是合适的对象。
回复

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2010-6-10 06:25:40 | 显示全部楼层
是的,好的。继续处理转换过程。将AcDbPolyline::convertFrom与AcDb2dPolyline一起使用,并称之为良好。
回复

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2010-6-10 06:47:48 | 显示全部楼层
AcDbSpline的代码不是通用的(恕我直言)。查看: http://www.caduser.ru/forum/index.php?PAGE_NAME=message&FID=24&TID=22185&MID=125061#message125061
回复

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2010-6-10 07:04:18 | 显示全部楼层
我有一个方法,如果AcDb2dPolyline不简单:
  1.                 AcDbObjectIterator *pVertIter = NULL;
  2.                
  3.                 pVertIter=p2dPoly->vertexIterator();
  4.                 AcDb2dVertex *pVertex = NULL;
  5.                 AcDbObjectId vertId;
  6.                 AcGePoint3d pt;
  7.                 AcGePoint3dArray ptArray;
  8.                 for(pVertIter->start();!pVertIter->done();pVertIter->step())
  9.                 {
  10.                         vertId = pVertIter->objectId();
  11.                         acdbOpenObject(pVertex,vertId,AcDb::kForRead);
  12.                         pt=pVertex->position();
  13.                         ptArray.append(pt);
  14.                         pVertex->close();
  15.                 }

这样,我得到了点,所以我可以构造段,然后我可以构造AcGeCurve3d
回复

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2010-6-10 07:09:32 | 显示全部楼层
它仅适用于不带凸出的<strong>简单<AcDb2dPolyline。阅读有关AcDb2dPolyline::polyType方法的信息。
回复

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2010-6-10 07:15:49 | 显示全部楼层

我还是有点困惑,谢谢你,还有佩克胡特isKindOf(AcDbLine::desc())) ...
else if (pDbCurve->isKindOf(AcDbArc::desc())) ...
else if (pDbCurve->isKindOf(AcDbCircle::desc())) ...
else if (pGrass->isGreener(AcDbThatField::desc()))...
[/code]
这种类型的代码不是必需的。 当你发现自己在做一堆 isKindOf 函数时,问问自己是否有更好的方法来编写代码。在你的情况下有。将它们中的每一个分解成自己的小函数,让C++函数重载来完成所有工作。代码将更易于维护且速度更快。
仅供参考,在AcDbPolyline的测试中,您为局部变量分配了一个返回的引用
  1. AcGeVoidPointerArray geCurves; ... pGeCurve = ( AcGeCurve3d* )( geCurves[0] );

当convertDbCurveToGeCurve超出范围时,geCurves也是如此。这些类型的错误可能很难追踪。
下面是使用函数重载对代码进行重构,它可能无法编译或工作,因为我刚刚重新组织了一下。
  1. AcGeLineSeg3d * convertDbCurveToGeCurve3d(const AcDbLine * pLine)
  2. {
  3.     AcGeLineSeg3d * pGL = new AcGeLineSeg3d;
  4.     pGL->set(pLine->startPoint(), pLine->endPoint());
  5.     return pGL;
  6. }
  7. AcGeCircArc3d * convertDbCurveToGeCurve3d(const AcDbArc * pArc)
  8. {
  9.     //                AcDbArc *pArc=(AcDbArc *)pDbCurve;
  10.     double ans,ane;
  11.     ans=pArc->startAngle();
  12.     ane=pArc->endAngle();
  13.     AcGeCircArc3d *pGArc=new AcGeCircArc3d;
  14.     pGArc->setCenter(pArc->center());
  15.     pGArc->setRadius(pArc->radius());
  16.     pGArc->setAngles(ans,ane);
  17.     return pGArc;
  18. }
  19. AcGeCurve3d * Acad::ErrorStatus convertDbCurveToGeCurve3d(const AcDbCircle * pCircle)
  20. {
  21.     AcGeCircArc3d * pGCir=new AcGeCircArc3d;
  22.     pGCir->setCenter(pCir->center());
  23.     pGCir->setRadius(pCir->radius());
  24.     return pGCir;
  25. }
  26. AcGeEllipArc3d * Acad::ErrorStatus convertDbCurveToGeCurve3d(const AcDbEllipArc3d * pEli)
  27. {
  28.     AcGePoint3d center=pEli->center();
  29.     AcGeVector3d pv1 = pEli->majorAxis();
  30.     double majorRadius = sqrt(pv1.x*pv1.x+pv1.y*pv1.y+pv1.z*pv1.z);
  31.     double param1,param2;
  32.     pEli->getStartParam(param1);
  33.     pEli->getEndParam(param2);
  34.     AcGeEllipArc3d *pGEli=new AcGeEllipArc3d;
  35.     pGEli->setCenter(center);
  36.     pGEli->setAxes(pv1,pEli->minorAxis());       
  37.     pGEli->setMajorRadius(majorRadius);
  38.     pGEli->setMinorRadius(majorRadius*(pEli->radiusRatio()));
  39.     pGEli->setAngles(param1,param2);
  40.     return pGEli;
  41. }
  42. AcGeNurbCurve3d * Acad::ErrorStatus convertDbCurveToGeCurve3d(const AcDbSpline * pSL)
  43. {
  44.     int degree;
  45.     Adesk::Boolean rational;
  46.     Adesk::Boolean closed;
  47.     Adesk::Boolean periodic;
  48.     AcGePoint3dArray controlPoints;
  49.     AcGeDoubleArray knots;
  50.     AcGeDoubleArray weights;
  51.     double controlPtTol;
  52.     double knotTol;
  53.     AcGeTol tol;
  54.     Acad::ErrorStatus es;
  55.     es=pSL->getNurbsData(degree,rational,closed,periodic,controlPoints,knots,weights,controlPtTol,knotTol);
  56.     if (es!=Acad::eOk)
  57.     {
  58.         return NULL;
  59.     }
  60.     AcGeNurbeCurve3d * pNurb = NULL;                       
  61.     if (rational==Adesk::kTrue)
  62.     {
  63.         pNurb=new AcGeNurbCurve3d(degree,knots,controlPoints,weights,periodic);
  64.     }
  65.     else
  66.     {
  67.         pNurb=new AcGeNurbCurve3d(degree,knots,controlPoints,periodic);
  68.     }
  69.     return pNurb;
  70. }
  71. AcGeCompositeCurve3d * Acad::ErrorStatus convertDbCurveToGeCurve3d(const AcDbPolyline * pPoly)
  72. {
  73.     int nSegs;
  74.     AcGeLineSeg3d *pLine;
  75.     AcGeLineSeg3d line;
  76.     AcGeCircArc3d *pArc;
  77.     AcGeCircArc3d arc;
  78.     AcGeVoidPointerArray * geCurves = new AcGeVoidPointerArray;
  79.     if (pPoly->isClosed())
  80.     {
  81.         nSegs = pPoly->numVerts();
  82.     }
  83.     else
  84.     {
  85.         nSegs = pPoly->numVerts() - 1;
  86.     }
  87.     for( int i = 0; i segType(i) == AcDbPolyline::kLine )
  88.         {
  89.             pPoly->getLineSegAt( i, line );
  90.             pLine = new AcGeLineSeg3d( line );
  91.             geCurves->append( pLine );
  92.         }
  93.         else if( pPoly->segType( i ) == AcDbPolyline::kArc )
  94.         {
  95.             pPoly->getArcSegAt( i, arc );
  96.             pArc = new AcGeCircArc3d( arc );
  97.             geCurves->append( pArc );
  98.         }
  99.     }
  100.     if(geCurves.IsEmpty()) {
  101.         delete pGeCurves;
  102.         return NULL;
  103.     }
  104.     return new AcGeCompositeCurve3d( geCurves );
  105. }
  106. AcGeEntity3d * convertDbCurveToGeCurve3d(const AcDbCurve *pDbCurve)
  107. {
  108.     // catch all for all other entity types.
  109.     return NULL;
  110. }

回复

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2010-6-10 07:57:37 | 显示全部楼层

非常感谢,pkohut,太棒了!重载!万分感谢。
当2dPolyline是“k2dQuadSplinePoly”或“k2dCubicSplinePoly”时,我认为我的方法是正确的。我正在验证它。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-2-5 20:55 , Processed in 0.220539 second(s), 72 queries .

© 2020-2025 乐筑天下

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