找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5745|回复: 16

[讨论]:如何获得region的边界polyLine

[复制链接]
发表于 2002-9-14 16:37:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
region炸开后形成一组Line、Arc而不是PolyLines, 有什么方法得到region的边界PolyLine?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-9-14 16:38:47 | 显示全部楼层

Re: [讨论]:如何获得region的边界polyLine

最初由 rave 发布
[B]region炸开后形成一组Line、Arc而不是PolyLines, 有什么方法得到region的边界PolyLine? [/B]


可以炸开后,把新实体调用PEDIT或者使用AcDbPolyline类的方法连结一起。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-9-14 17:04:45 | 显示全部楼层

新实体一定是Region炸开的吗?

能否确认新实体是由Region炸开而得到的?
如果在炸开时,有其他反应器在后台生成了不相关的实体呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-9-14 17:14:44 | 显示全部楼层

Re: 新实体一定是Region炸开的吗?

最初由 rave 发布
[B]能否确认新实体是由Region炸开而得到的?
如果在炸开时,有其他反应器在后台生成了不相关的实体呢? [/B]


你调用AcDbEntity::explode方法,得到的AcDbVoidPtrArray 数组,这个数组里面的是炸开后的实体,你自己把这些实体,使用AcDbPolyline类的相关方法,链接到一起后,再添加到数据库中,这个能保证唯一。

或者先把数组里面的实体添加到数据库,然后调用PEDIT命令去编辑他们。添加后的实体,你自己可以把他们变成选择集交给PEDIT去做。

推荐第一种方法,既然用ARX,完全可以用ARX的方法去做,少调用ACAD的命令。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-9-14 18:00:55 | 显示全部楼层

-

我发现获得的AcDbVoidPtrArray 数组是按序存放的(也许是碰巧,否则还需排序),这样就可以新建一AcDbPolyLine然后逐点addVertexAt(),arc还需计算bulge.

但环状Region该有两条PolyLine, 如何处理?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-9-14 18:22:38 | 显示全部楼层
去看看几何库的:

AcGeCompositeCurve2d ,AcGeCompositeCurve3d 类,专门处理大量几何实体,得到首尾相连的几何实体的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-9-15 00:37:20 | 显示全部楼层
下面给大家贴一个AcGeCurve3转换到AcDbPolyline的代码,其中有AcGeCompositeCurve2d,AcGeCompositeCurve3d几何实体的转换。


  1. [FONT=courier new]
  2. //转换AcGeCurve2d到AcDbPolyline
  3. Acad::ErrorStatus XdDbUtils::convertGeCurveToPolyline(AcGeCurve2d* pCurve, AcDbPolyline*& pResultPoly)
  4. {
  5.         AcGeVoidPointerArray resultCurves;
  6.        
  7.         AcGeCompositeCurve2d* pResultCurve;
  8.         AcGeCurve2d* pThisCurve;
  9.         AcGeCircArc2d* pArc;
  10.         AcGeLineSeg2d* pLine;
  11.         AcGePoint2d endPt;
  12.        
  13.         int nCurves;
  14.         double bulge, ang;
  15.        
  16.         if(pCurve->isKindOf(AcGe::kCompositeCrv2d))
  17.         {
  18.                 pResultCurve = (AcGeCompositeCurve2d*)pCurve;
  19.                 pResultCurve->getCurveList(resultCurves );
  20.         }
  21.         else
  22.         {
  23.                 resultCurves.append(pCurve);
  24.         }
  25.        
  26.         nCurves = resultCurves.length();
  27.        
  28.         pResultPoly = new AcDbPolyline(nCurves);
  29.        
  30.         for(int i=0; i < nCurves; i++)
  31.         {
  32.                 pThisCurve = (AcGeCurve2d*)(resultCurves[i]);
  33.                
  34.                 if(pThisCurve->isKindOf(AcGe::kCircArc2d))
  35.                 {
  36.                         pArc = (AcGeCircArc2d*)pThisCurve;
  37.                         bulge = 0.0;
  38.                         ang = 0.25 * (pArc->endAng() - pArc->startAng());
  39.                         bulge = tan(ang);
  40.                         if(pArc->isClockWise())
  41.                         {
  42.                                 bulge = -bulge;
  43.                         }
  44.                        
  45.                         pResultPoly->addVertexAt(i, pArc->startPoint(), bulge
  46.                                 );
  47.                 }
  48.                 else if(pThisCurve->isKindOf( AcGe::kLineSeg2d))
  49.                 {
  50.                         pLine = (AcGeLineSeg2d*)pThisCurve;
  51.                         pResultPoly->addVertexAt(i, pLine->startPoint(), 0 );
  52.                 }
  53.         }// for
  54.         if(pThisCurve->hasEndPoint(endPt))
  55.         {
  56.                 pResultPoly->addVertexAt(i, endPt, 0);
  57.         }
  58.         pResultPoly->setClosed(pCurve->isClosed());
  59.         return Acad::eOk;
  60. }[/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-9-15 15:52:28 | 显示全部楼层
AcDbRegion 炸开后是Curves 包括(splines, lines, arcs, circles),
可通过AcGeCompositeCurve2d来获得PolyLine
我知道
AcDbline   => AcGeLineSeg2d
AcDbArc    => AcGeCircArc2d
AcDbCircle => AcGeCircArc2d
请问如何转换AcDbSpline到对应的AcGe类?
    AcDbSpline => ?????
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-9-15 15:57:17 | 显示全部楼层
最初由 rave 发布
[B]AcDbRegion 炸开后是Curves 包括(splines, lines, arcs, circles),
可通过AcGeCompositeCurve2d来获得PolyLine
我知道
AcDbline   => AcGeLineSeg2d
AcDbArc    => AcGeCircArc2d
AcDbCircle => AcGeCircArc... [/B]


AcGeSplineEnt3d,2d是个抽象几何实体基类,本身不能实例对象,它下面还有派生类,用来实例具体的对象:
AcGeNurbCurve3d,AcGeNurbCurve2d  
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-9-16 23:32:25 | 显示全部楼层
给大家贴一个通用的DB--->GE的转换吧:


  1. [FONT=courier new]
  2. //转换AcDbCurve到AcGeCurve3d
  3. Acad::ErrorStatus XdDbUtils::convertDbCurveToGeCurve(AcDbCurve *pDbCurve,AcGeCurve3d *&pGeCurve)
  4. {
  5.         pGeCurve=NULL;
  6.         if (pDbCurve->isKindOf(AcDbLine::desc()))
  7.         {
  8.                 AcDbLine *pL=(AcDbLine *)pDbCurve;
  9.                 AcGeLineSeg3d *pGL=new AcGeLineSeg3d;
  10.                 pGL->set(pL->startPoint(),pL->endPoint());
  11.                 pGeCurve=(AcGeCurve3d *)pGL;
  12.         }
  13.         else if (pDbCurve->isKindOf(AcDbArc::desc()))
  14.         {
  15.                 AcDbArc *pArc=(AcDbArc *)pDbCurve;
  16.                 double ans,ane;
  17.                 ans=pArc->startAngle();
  18.                 ane=pArc->endAngle();
  19.                 AcGeCircArc3d *pGArc=new AcGeCircArc3d;
  20.                 pGArc->setCenter(pArc->center());
  21.                 pGArc->setRadius(pArc->radius());
  22.                 pGArc->setAngles(ans,ane);
  23.                 pGeCurve=(AcGeCurve3d *)pGArc;
  24.         }
  25.         else if (pDbCurve->isKindOf(AcDbCircle::desc()))
  26.         {
  27.                 AcDbCircle *pCir=(AcDbCircle *)pDbCurve;
  28.                 AcGeCircArc3d * pGCir=new AcGeCircArc3d;
  29.                 pGCir->setCenter(pCir->center());
  30.                 pGCir->setRadius(pCir->radius());
  31.                 pGeCurve=(AcGeCurve3d *)pGCir;
  32.         }
  33.         else if (pDbCurve->isKindOf(AcDbEllipse::desc()))
  34.         {
  35.                 AcDbEllipse *pEli=(AcDbEllipse *)pDbCurve;
  36.                 AcGePoint3d pt1,center=pEli->center();
  37.                 AcGeEllipArc3d *pGEli=new AcGeEllipArc3d;
  38.                 pGEli->setCenter(center);
  39.                 pGEli->setAxes(pEli->majorAxis(),pEli->minorAxis());
  40.                 pEli->getClosestPointTo(center,pt1,Adesk::kTrue);
  41.                 pGEli->setMajorRadius(pt1.distanceTo(center)/pEli->radiusRatio());
  42.                 pGEli->setMinorRadius(pt1.distanceTo(center));
  43.                 double endang=pEli->endAngle(),startang=pEli->startAngle();
  44.                 if (startang>endang){
  45.                         endang+=2*PI;
  46.                 }
  47.                 pGEli->setAngles(endang,startang);
  48.                 pGeCurve=(AcGeCurve3d *)pGEli;
  49.         }
  50.         else if (pDbCurve->isKindOf(AcDbSpline::desc()))
  51.         {
  52.                 AcDbSpline *pSL=(AcDbSpline *)pDbCurve;
  53.                 if (!pSL)
  54.                         return Acad::eNotImplemented;
  55.                 if (pSL->isNull()==Adesk::kTrue)
  56.                         return Acad::eNotImplemented;
  57.                
  58.                 int degree;
  59.                 Adesk::Boolean rational;
  60.                 Adesk::Boolean closed;
  61.                 Adesk::Boolean periodic;
  62.                 AcGePoint3dArray controlPoints;
  63.                 AcGeDoubleArray knots;
  64.                 AcGeDoubleArray weights;
  65.                 double controlPtTol;
  66.                 double knotTol;
  67.                 AcGeTol tol;
  68.                 Acad::ErrorStatus es;
  69.                 es=pSL->getNurbsData(degree,rational,closed,periodic,controlPoints,knots,weights,
  70.                         controlPtTol,knotTol);
  71.                 if (es!=Acad::eOk)
  72.                         return Acad::eNotImplemented;
  73.                
  74.                 if (rational==Adesk::kTrue)
  75.                 {
  76.                         AcGeNurbCurve3d *pNurb=new AcGeNurbCurve3d(degree,knots,controlPoints,weights,periodic);
  77.                         if (closed==Adesk::kTrue)
  78.                                 pNurb->makeClosed();
  79.                         if (pSL->hasFitData()==Adesk::kTrue)
  80.                         {
  81.                                 AcGePoint3dArray fitPoints;
  82.                                 double fitTolerance;
  83.                                 Adesk::Boolean tangentsExist;
  84.                                 AcGeVector3d startTangent;
  85.                                 AcGeVector3d endTangent;
  86.                                 pSL->getFitData(fitPoints,degree,fitTolerance,tangentsExist,startTangent,endTangent);
  87.                                 tol.setEqualPoint(fitTolerance);
  88.                                 if (tangentsExist==Adesk::kTrue)
  89.                                         pNurb->setFitData(fitPoints,startTangent,endTangent,tol);
  90.                                 else
  91.                                         pNurb->setFitData(degree,fitPoints,tol);
  92.                                
  93.                         }
  94.                         pGeCurve=(AcGeCurve3d *)pNurb;
  95.                 }
  96.                 else
  97.                 {
  98.                         AcGeNurbCurve3d *pNurb=new AcGeNurbCurve3d(degree,knots,controlPoints,periodic);
  99.                         if (closed==Adesk::kTrue)
  100.                                 pNurb->makeClosed();
  101.                         if (pSL->hasFitData()==Adesk::kTrue)
  102.                         {
  103.                                 AcGePoint3dArray fitPoints;
  104.                                 double fitTolerance;
  105.                                 Adesk::Boolean tangentsExist;
  106.                                 AcGeVector3d startTangent;
  107.                                 AcGeVector3d endTangent;
  108.                                 pSL->getFitData(fitPoints,degree,fitTolerance,tangentsExist,startTangent,endTangent);
  109.                                 tol.setEqualPoint(fitTolerance);
  110.                                 if (tangentsExist==Adesk::kTrue)
  111.                                         pNurb->setFitData(fitPoints,startTangent,endTangent,tol);
  112.                                 else
  113.                                         pNurb->setFitData(degree,fitPoints,tol);
  114.                                
  115.                         }
  116.                         pGeCurve=(AcGeCurve3d *)pNurb;
  117.                 }
  118.         }
  119.         else if ((pDbCurve->isKindOf(AcDb2dPolyline::desc()))||
  120.                 (pDbCurve->isKindOf(AcDbPolyline::desc())))
  121.         {
  122.                 int type=0;
  123.                 AcDbPolyline *pPoly;
  124.                 if (pDbCurve->isKindOf(AcDb2dPolyline::desc()))
  125.                 {
  126.                         AcDb2dPolyline *p2L=(AcDb2dPolyline *)pDbCurve;
  127.                         XdDbUtils::Poly2dToLWPoly(p2L,pPoly);
  128.                         type=1;
  129.                 }
  130.                 else
  131.                         pPoly=(AcDbPolyline *)pDbCurve;
  132.                 XdDbUtils::convertPolylineToGeCurve(pPoly,pGeCurve);
  133.                 if (type)
  134.                         delete pPoly;
  135.         }
  136.         return (pGeCurve)?Acad::eOk:Acad::eNotImplemented;
  137. }
  138. [/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-9-17 23:30:52 | 显示全部楼层

-


  1. // convert AcDbLine to AcGeLineSeg3d
  2. AcGeLineSeg3d* LineDb2GE(AcDbLine* pDbLine)
  3. {
  4.         return(new AcGeLineSeg3d(pDbLine->startPoint(), pDbLine->endPoint()));
  5. }

  6. // convert AcDbArc to AcGeCircArc3d
  7. AcGeCircArc3d* ArcDb2Ge( AcDbArc* pDbArc)
  8. {
  9.         return(new AcGeCircArc3d(
  10.                 pDbArc->center(),
  11.                 pDbArc->normal(),
  12.                 pDbArc->normal().perpVector(),
  13.                 pDbArc->radius(),
  14.                 pDbArc->startAngle(),
  15.                 pDbArc->endAngle()));
  16. }



  17. // convert AcDbCircle to AcGeCircArc3d
  18. AcGeCircArc3d* CircleDb2Ge(AcDbCircle* pDbCircle)
  19. {
  20.         return(new AcGeCircArc3d(
  21.                 pDbCircle->center(),
  22.                 pDbCircle->normal(),
  23.                 pDbCircle->radius()));

  24. }

  25. // convert AcDbSpline to AcGeNurbCurve3d
  26. AcGeNurbCurve3d* SplineDb2Ge(AcDbSpline* pDbSpline)
  27. {
  28.         AcGeNurbCurve3d* pGeSpline;
  29.         AcGePoint3dArray fitPoints;
  30.         int degree;
  31.         double fitTolerance;
  32.         Adesk::Boolean tangentsExist;
  33.         AcGeVector3d startTangent, endTangent;
  34.     AcGeTol tol;

  35.         Adesk::Boolean rational, closed, periodic;
  36.         AcGePoint3dArray controlPoints;
  37.         AcGeDoubleArray knots, weights;
  38.         double controlPtTol, knotTol;

  39.         if (pDbSpline->hasFitData()) {
  40.                 pDbSpline->getFitData(fitPoints, degree, fitTolerance,
  41.                         tangentsExist,startTangent, endTangent);
  42.                
  43.                 tol.setEqualPoint(fitTolerance);
  44.                 pGeSpline=new AcGeNurbCurve3d(fitPoints, startTangent,
  45.                         endTangent, tangentsExist, tangentsExist,tol);               
  46.         }else{
  47.                 pDbSpline->getNurbsData(degree, rational, closed, periodic,
  48.                         controlPoints, knots, weights, controlPtTol, knotTol);

  49.                 pGeSpline=new AcGeNurbCurve3d(degree, knots, controlPoints,
  50.                         weights, periodic);
  51.                 if (closed==Adesk::kTrue)
  52.                         pGeSpline->makeClosed();

  53.         };
  54.         return(pGeSpline);

  55. }
  56. // convert AcDbEllipse to AcGeEllipArc3d
  57. AcGeEllipArc3d* EllipseDb2Ge(AcDbEllipse* pDbEllise)
  58. {
  59.         return(new AcGeEllipArc3d(
  60.                 pDbEllise->center(),
  61.                 pDbEllise->majorAxis(),
  62.                 pDbEllise->minorAxis(),
  63.                 pDbEllise->majorAxis().length(),
  64.                 pDbEllise->minorAxis().length(),
  65.                 pDbEllise->startAngle(),
  66.                 pDbEllise->endAngle()));
  67. }

  68. //转换AcGeCompositeCurve3d到AcDbPolyline, This routine only called by GetRegionBoundaryPolyline
  69. AcDbPolyline* convertGeCurveToPolyline(AcGeCompositeCurve3d* pCurve)
  70. {
  71.         AcGeVoidPointerArray resultCurves;
  72.         AcDbPolyline* pResultPolyline;
  73.         AcGeCurve3d* pThisCurve;
  74.         AcGeCircArc3d* pArc;
  75.         AcGeLineSeg3d* pLine;
  76.         AcGePoint3d startPt,endPt;
  77.        
  78.         int nCurves,i,j;
  79.         double bulge, ang;

  80.         pCurve->getCurveList(resultCurves );
  81.        
  82.         bool bCannotConvert=false;
  83.         nCurves = resultCurves.length();
  84.         for(i=0;i< nCurves;i++){
  85.                 pThisCurve = (AcGeCurve3d*)(resultCurves[i]);
  86.                 if (pThisCurve->isKindOf(AcGe::kSplineEnt3d) || pThisCurve->isKindOf(AcGe::kEllipArc3d)){
  87.                         bCannotConvert=true;
  88.                         break;
  89.                 }
  90.         };
  91.         if (bCannotConvert) {
  92.                 for(i=0;i< nCurves;i++)
  93.                         delete (AcGeCurve3d*)(resultCurves[i]);
  94.                 acedPrompt("\nCon't Convert to Polyline.");
  95.                 return(NULL);
  96.         };
  97.        
  98.         AcGeIntArray isArcs;
  99.         AcGePoint3dArray Vertexes;//存放每一线段的起点和终点
  100.         AcGeDoubleArray bulges;

  101.         for(i=0;i< nCurves;i++){
  102.                  pThisCurve = (AcGeCurve3d*)(resultCurves[i]);
  103.                
  104.                 if(pThisCurve->isKindOf(AcGe::kCircArc3d)){
  105.                         pArc = (AcGeCircArc3d*)pThisCurve;
  106.                         isArcs.append(1);
  107.                         Vertexes.append(pArc->startPoint());
  108.                         Vertexes.append(pArc->endPoint());
  109.                         ang = 0.25 * (pArc->endAng() - pArc->startAng());
  110.                         bulge = tan(ang);
  111.                         bulges.append(bulge);
  112.                 }
  113.                 else if(pThisCurve->isKindOf( AcGe::kLineSeg3d)){
  114.                         pLine = (AcGeLineSeg3d*)pThisCurve;
  115.                         isArcs.append(0);
  116.                         Vertexes.append(pLine->startPoint());
  117.                         Vertexes.append(pLine->endPoint());
  118.                         bulges.append(0.0);
  119.                 }
  120.                 //else nothing, This routine only called by GetRegionBoundaryPolyline

  121.                 delete pThisCurve;//Ge对象不再有用,删掉
  122.         }
  123.         j=-1;
  124.         for (i=0;i< nCurves;i++){
  125.                 if (isArcs[i]==0){//找到第一条直线
  126.                         j=i;
  127.                         break;
  128.                 }
  129.         }
  130.         pResultPolyline = new AcDbPolyline(nCurves);
  131.         bool bClockWise=false;
  132.         if (j==-1) {//polyline全部由arc构成
  133.                 if (Vertexes[0]==Vertexes[3]) bClockWise=true;
  134.                 if (bClockWise){
  135.                         for(i=0;nCurves;i++)
  136.                                 pResultPolyline->addVertexAt(i, AcGePoint2d(Vertexes[2*i+1].x,Vertexes[2*i+1].y), -bulges[i]);
  137.                 }else{
  138.                         for(i=0;nCurves;i++)
  139.                                 pResultPolyline->addVertexAt(i, AcGePoint2d(Vertexes[2*i].x,Vertexes[2*i].y), bulges[i]);
  140.                 }

  141.         }else{
  142.                 for(i=j+1;i< nCurves;i++){
  143.                         if ((isArcs[i]==1)&&(Vertexes[2*i]!=Vertexes[2*i-1])){
  144.                                 //当前圆弧的起点不等于上一线段的终点
  145.                                 startPt=Vertexes[2*i+1];
  146.                                 endPt=Vertexes[2*i];
  147.                                 Vertexes[2*i+1]=endPt;
  148.                                 Vertexes[2*i]=startPt;
  149.                                 bulges[i]=-bulges[i];
  150.                         }
  151.                 };
  152.                 for(i=j-1;i >=0;i--){
  153.                         if ((isArcs[i]==1)&&(Vertexes[2*i+1]!=Vertexes[2*(i+1)])){
  154.                                 //当前圆弧的终点不等于下一线段的起点
  155.                                 startPt=Vertexes[2*i+1];
  156.                                 endPt=Vertexes[2*i];
  157.                                 Vertexes[2*i+1]=endPt;
  158.                                 Vertexes[2*i]=startPt;
  159.                                 bulges[i]=-bulges[i];
  160.                         }
  161.                 };
  162.                 for(i=0;nCurves;i++)
  163.                                 pResultPolyline->addVertexAt(i, AcGePoint2d(Vertexes[2*i].x,Vertexes[2*i].y), bulges[i]);
  164.         }
  165.         pResultPolyline->close();
  166.         return(pResultPolyline);
  167. }

  168. //获取Region的边界PolyLines/Circles/Ellipses/Splines, 返回环的数目
  169. int GetRegionBoundaryPolyline(AcDbRegion *pRegion, AcDbVoidPtrArray*& pPolylines)
  170. {
  171.         AcDbVoidPtrArray subEntityArray;
  172.         AcGeVoidPointerArray tmpGeCurves;
  173.     int i, count=0;;

  174.         if (pRegion->explode(subEntityArray)!=Acad::eOk){
  175.                 for (i=0;i< subEntityArray.length();i++)
  176.                         delete (AcDbObject*)subEntityArray[i];//To XDSoft: 需要手工删除

  177.                 return 0;
  178.         }

  179.         AcDbCurve* pDbCurve;

  180.         for (i=0;i< subEntityArray.length();i++){
  181.                 pDbCurve=(AcDbCurve*)subEntityArray[i];
  182.                 if (pDbCurve->isClosed()){
  183.                         //this curve(Circle/Spline/Ellipse) is closed, then return the boundary(Circle/Spline/Ellipse)
  184.                         pPolylines->append(pDbCurve);
  185.                         count++;
  186.                 }else{
  187.                         if(pDbCurve->isKindOf(AcDbLine::desc()))
  188.                                 tmpGeCurves.append(LineDb2GE(AcDbLine::cast(pDbCurve)));
  189.                         else if(pDbCurve->isKindOf(AcDbArc::desc()))
  190.                                 tmpGeCurves.append(ArcDb2Ge(AcDbArc::cast(pDbCurve)));
  191.                         else if(pDbCurve->isKindOf(AcDbSpline::desc()))
  192.                                 tmpGeCurves.append(AcDbSpline::cast(pDbCurve));
  193.                         else if(pDbCurve->isKindOf(AcDbEllipse::desc()))
  194.                                 tmpGeCurves.append(AcDbEllipse::cast(pDbCurve));
  195.                         //else I don't know

  196.                         delete pDbCurve;
  197.                 }
  198.         };

  199.         AcGeIntArray isOwnerOfCurves;
  200.         AcGeCompositeCurve3d* pGeCompositeCurve;
  201.         AcDbPolyline *pPloyline;

  202.         while (tmpGeCurves.length()>0){
  203.                 isOwnerOfCurves.setLogicalLength(0);
  204.                 for (i=0;i< tmpGeCurves.length();i++)
  205.                         isOwnerOfCurves.append(1);
  206.                 pGeCompositeCurve=new AcGeCompositeCurve3d(tmpGeCurves,isOwnerOfCurves);
  207.                 if (pGeCompositeCurve==NULL){
  208.                         for (i=0;i< tmpGeCurves.length();i++)
  209.                                 delete (AcGeCurve3d*)tmpGeCurves[i];
  210.                         count=-count;//负数表示有部分边界被获得,但出错
  211.                         break;
  212.                 }
  213.                 pPloyline=convertGeCurveToPolyline(pGeCompositeCurve);
  214.                 delete pGeCompositeCurve;//连带删除tmpGecurve
  215.                 if (pPloyline!=NULL){
  216.                         pPolylines->append(pPloyline);
  217.                         count++;
  218.                 }
  219.         }
  220.         return(count);
  221. }
复制代码
[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-8-8 17:13:02 | 显示全部楼层
感谢楼上2位,真是个很好的帖子,值得推荐
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-10-7 02:19:37 | 显示全部楼层
感谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-4-15 07:37:01 | 显示全部楼层
12年前的帖子 。。。。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2016-4-26 11:36:49 | 显示全部楼层
学习............
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-24 18:26 , Processed in 0.240094 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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