乐筑天下

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

如何将AcGeCompositeCurve3d转换为AcDbPolyline?

[复制链接]

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2010-7-21 10:51:18 | 显示全部楼层 |阅读模式
这是我的代码。
  1. AcDbPolyline * AcGeCurveToAcDbCurve(const AcGeCompositeCurve3d * pGe)
  2. {  
  3.         AcGePoint3d startPnt,endPnt;
  4.         if(pGe->hasEndPoint(endPnt) == Adesk ::kFalse || pGe->hasStartPoint(startPnt) == Adesk::kFalse)
  5.                 return NULL;
  6.         AcGePlane plane;
  7.              pGe->isPlanar(plane);
  8.        
  9.         AcGePoint2d pt;
  10.         AcDbPolyline *pPoly = new AcDbPolyline();
  11.         AcGeVoidPointerArray curveList;
  12.         pGe->getCurveList(curveList);
  13.         AcGeCurve3d *pCurve        = NULL;
  14.         AcGeLine3d *pLine        = NULL;
  15.              AcGeCircArc3d *arc        = NULL;
  16.        
  17.         int i;
  18.         for(i = 0;i hasStartPoint(startPnt);
  19.                 pt = startPnt.convert2d(plane);
  20.                 if (pCurve->isKindOf(AcGe::kLineSeg3d))
  21.                 {
  22.                         pPoly->addVertexAt(i,pt);
  23.                 }
  24.                 else if (pCurve->isKindOf(AcGe::kCircArc3d))
  25.                 {
  26.                         arc = (AcGeCircArc3d *)(pCurve);
  27.                         double b = tan(0.25*(arc->endAng() - arc->startAng()))*(arc->normal().z);
  28.                         pPoly->addVertexAt(i,pt,b);
  29.                 }
  30.         }
  31.         pPoly->addVertexAt(i,endPnt.convert2d(plane),0,0,0);
  32.         return pPoly;
  33. }

但是当AcGeCompositeCurve3d的法线不是(0 0 1)时,它工作不正确。怎么了?

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

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

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2010-7-21 10:56:05 | 显示全部楼层

这是可以将AcDbPolyline转换为AcGeCompositeCurve3d的代码。它确实有效。
  1. // POLYLINE
  2. AcGeCompositeCurve3d * AcDbCurveToAcGeCurve(const AcDbPolyline * pPoly)
  3. {
  4.         AcGeLineSeg3d *pLine = NULL;
  5.         AcGeCircArc3d *pArc = NULL;
  6.         AcGeVoidPointerArray GeCurves;
  7.         for( int i = 0; i numVerts(); i++ )
  8.         {
  9.                 if( pPoly->segType(i) == AcDbPolyline::kLine )
  10.                 {
  11.                         pLine = new AcGeLineSeg3d;
  12.                         pPoly->getLineSegAt(i, *pLine);
  13.                         GeCurves.append(pLine);
  14.                 }
  15.                 else if( pPoly->segType(i) == AcDbPolyline::kArc )
  16.                 {
  17.                         pArc = new AcGeCircArc3d;
  18.                         pPoly->getArcSegAt(i, *pArc);
  19.                         GeCurves.append(pArc);
  20.                 }
  21.         }
  22.         return  new AcGeCompositeCurve3d(GeCurves);
  23. }

回复

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2010-7-22 10:27:36 | 显示全部楼层
好了,我找到解决这个问题的方法了。
看起来有点笨拙。有人有更简单的方法吗?
  1. AcDbPolyline * AcGeCurveToAcDbCurve(const AcGeCompositeCurve3d * pGe)
  2. {  
  3.         AcGePoint3d startPnt,endPnt;
  4.         if( pGe->hasEndPoint(endPnt) == Adesk ::kFalse ||
  5.                 pGe->hasStartPoint(startPnt) == Adesk::kFalse)
  6.         {
  7.                 return NULL;
  8.         }
  9.         //get the plane of Curve3d
  10.         AcGePlane plane;
  11.         AcGeLine3d line;
  12.         AcGePoint3d p1,p2,p3;
  13.     if(pGe->isPlanar(plane))
  14.         {
  15.                 if(pGe->isLinear(line))    //Oh,it's a little tricky!
  16.                 {
  17.                         line.getPerpPlane(startPnt,plane);
  18.                         plane.get(p1,p2,p3);
  19.                         plane.set(p2,p3-p2);
  20.                 }
  21.                 plane.get(p1,p2,p3);
  22.         }
  23.         else
  24.         {
  25.                 return NULL;
  26.         }
  27.         //Creat a polyline
  28.         AcDbPolyline *pPoly = new AcDbPolyline();
  29.         AcGeVoidPointerArray curveList;
  30.         pGe->getCurveList(curveList);
  31.         AcGeCurve3d *pCurve        = NULL;
  32.     AcGeCircArc3d *pArc        = NULL;
  33.        
  34.         int i;
  35.         double b;
  36.         AcGePoint2d pt;
  37.         for(i = 0;i hasStartPoint(startPnt);
  38.                 pt = startPnt.convert2d(plane);
  39.                 if (pCurve->isKindOf(AcGe::kCircArc3d))
  40.                 {
  41.                         pArc = (AcGeCircArc3d *)(pCurve);
  42.                         b = tan(0.25*(pArc->endAng() - pArc->startAng()));
  43.                         if (pArc->normal().z addVertexAt(i,pt,-b);
  44.                         }
  45.                         else
  46.                         {
  47.                                 pPoly->addVertexAt(i,pt,b);
  48.                         }
  49.                 }
  50.                 else
  51.                 {
  52.                         pPoly->addVertexAt(i,pt);
  53.                 }
  54.         }
  55.         if(!pGe->isClosed())
  56.         {
  57.                 pt = endPnt.convert2d(plane);
  58.                 pPoly->addVertexAt(i,pt);
  59.         }
  60.         else
  61.         {
  62.                 pPoly->setClosed(Adesk::kTrue);
  63.         }
  64.     //the most important step;
  65.         AcGeMatrix3d xform;
  66.         AcGeVector3d XAxis = p1-p2;
  67.         AcGeVector3d YAxis = p3-p2;
  68.         AcGeVector3d ZAxis = XAxis.crossProduct(YAxis);
  69.         xform.setCoordSystem(p2,XAxis,YAxis,ZAxis);
  70.         pPoly->transformBy(xform);
  71.         return pPoly;
  72. }
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-6-3 13:20 , Processed in 1.202555 second(s), 69 queries .

© 2020-2025 乐筑天下

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