找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4764|回复: 9

[研讨] 分享个面域转多段线的代码

[复制链接]

已领礼包: 28个

财富等级: 恭喜发财

发表于 2018-9-10 00:25:27 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 1121443108qaz 于 2018-9-19 23:46 编辑

此程序仅适用于单个的面域,不适用于经过union生成的面域合集。bug在于同样的面域,一个由顺时针矩形形成,一个由逆时针矩形形成。顺时针形成的面域通过这个程序会出现问题,逆时针都没事。
而如果我每获得一条acge曲线就转化为acdb曲线再加入数据库,那么轮廓都是很正常的。只在我使用acgecomposite3d时出现问题,是我哪里写错了吗,或者说怎么解决这个bug呢。

  1. void CRegionUtil::r2p(AcDbRegion* pRegion)
  2. {
  3.         AcBr::ErrorStatus es;
  4.         AcGeVoidPointerArray Curves;
  5.         AcDbCurve* pCurve = NULL;
  6.         AcBrBrep brep;
  7.         es=brep.set(*pRegion);
  8.         AcGeCurve3d * pGeCurve3d = NULL;
  9.         if (es==AcBr ::eOk)
  10.         {
  11.                 AcBrBrepEdgeTraverser edgeTrav;
  12.                 edgeTrav.setBrep(brep);
  13.                 while (!edgeTrav.done() && es==AcBr ::eOk)
  14.                 {
  15.                         AcBrEdge edge;
  16.                         es = edgeTrav.getEdge(edge);
  17.                         if (es==AcBr ::eOk)
  18.                         {
  19.                                 es=edge.getCurve(pGeCurve3d);
  20.                                 if (es==AcBr ::eOk)
  21.                                 {
  22.                                         AcGeCurve3d *pNativeCurve = NULL;
  23.                                         AcGeExternalCurve3d* pGeExter3d = (AcGeExternalCurve3d*)pGeCurve3d;
  24.                                         if (pGeExter3d->isCircArc())
  25.                                         {
  26.                                                 AcGeCircArc3d* pArc3d = NULL;
  27.                                                 pGeExter3d->isNativeCurve((AcGeCurve3d*&)pArc3d);
  28.                                                 acdbConvertGelibCurveToAcDbCurve(*pArc3d, pCurve);
  29.                                                 CDwgDatabaseUtil::postToMOdelSpace(pCurve);
  30.                                         }
  31.                                         else
  32.                                         {
  33.                                                 Adesk::Boolean bRet = ((AcGeExternalCurve3d*)pGeCurve3d)->isNativeCurve(pNativeCurve);
  34.                                                 Curves.append(pNativeCurve);
  35.                                         }
  36.                                         delete pGeCurve3d;
  37.                                 }
  38.                         }
  39.                         es = edgeTrav.next();
  40.                 }
  41.         }
  42.         if (Curves.length()>0)
  43.         {
  44.                 //acutPrintf(L"\n curves length is %d", Curves.length());
  45.                 AcGeCompositeCurve3d* pComp = new AcGeCompositeCurve3d(Curves);
  46.                 acdbConvertGelibCurveToAcDbCurve(*pComp, pCurve);
  47.                 delete pComp;
  48.                 CDwgDatabaseUtil::postToMOdelSpace(pCurve);
  49.                 for (int i = 0; i < Curves.length(); i++)
  50.                 {
  51.                         delete Curves.at(i);
  52.                 }
  53.         }}



捕获.PNG

Drawing1.rar

28.32 KB, 下载次数: 28, 下载积分: D豆 -1 , 活跃度 1

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

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2018-9-10 00:43:59 | 显示全部楼层
本帖最后由 1121443108qaz 于 2018-9-10 00:45 编辑

我感觉不是我写的有问题,只好用笨方法,加上这几句代码,然后就运转正常了。桌子公司咱这么不靠谱
  1. if (!pCurve->isClosed())
  2. {
  3.         for (int i = 0; i < Curves.length(); i++)
  4.         {
  5.                 pGeCurve3d = (AcGeCurve3d*)Curves.at(i);
  6.                 pGeCurve3d->reverseParam();
  7.         }
  8.         delete pCurve;
  9.         pCurve = NULL;
  10.         pComp = new AcGeCompositeCurve3d(Curves);
  11.         acdbConvertGelibCurveToAcDbCurve(*pComp, pCurve);
  12.         delete pComp;
  13. }


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

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2018-9-10 00:52:35 | 显示全部楼层
本帖最后由 1121443108qaz 于 2018-9-10 00:57 编辑

再分享个最终版本的面域转多段线吧,适用于经过uion处理后的面域合集,暂时我不知道有什么bug。由pregion获得相应的brep,由brep通过face遍历器获得一个个的face,通过faceloop遍历器获得loop,对于每个loop通过loopedge遍历器获得edge,由edge获得相应的acge曲线,最后转化为acdb曲线。
  1. void CRegionUtil::r2p(AcDbRegion* pRegion)
  2. {
  3.         AcBr::ErrorStatus es;
  4.         AcGeVoidPointerArray Curves;
  5.         AcDbCurve* pCurve = NULL;
  6.         AcBrBrep brep;
  7.         es = brep.set(*pRegion);
  8.         AcGeCurve3d * pGeCurve3d = NULL;
  9.         if (es == AcBr::eOk)
  10.         {
  11.                 AcBrBrepFaceTraverser faceTrav;
  12.                 faceTrav.setBrep(brep);
  13.                 while (!faceTrav.done() && es == AcBr::eOk)
  14.                 {
  15.                         AcBrFace face;
  16.                         es = faceTrav.getFace(face);
  17.                         if (es == AcBr::eOk)
  18.                         {
  19.                                 AcBrFaceLoopTraverser faceLoopTrav;
  20.                                 es = faceLoopTrav.setFace(face);
  21.                                 if (es == AcBr::eOk)
  22.                                 {
  23.                                         while (!faceLoopTrav.done() && es == AcBr::eOk)
  24.                                         {
  25.                                                 AcBrLoop loop;
  26.                                                 es = faceLoopTrav.getLoop(loop);
  27.                                                 if (es == AcBr::eOk)
  28.                                                 {
  29.                                                         AcBrLoopEdgeTraverser loopEdgeTrav;
  30.                                                         es = loopEdgeTrav.setLoop(loop);
  31.                                                         if (es == AcBr::eOk)
  32.                                                         {
  33.                                                                 while (!loopEdgeTrav.done() && es == AcBr::eOk)
  34.                                                                 {
  35.                                                                         AcBrEdge edge;
  36.                                                                         es = loopEdgeTrav.getEdge(edge);
  37.                                                                         if (es == AcBr::eOk)
  38.                                                                         {
  39.                                                                                 es = edge.getCurve(pGeCurve3d);
  40.                                                                                 if (es == AcBr::eOk)
  41.                                                                                 {
  42.                                                                                         AcGeCurve3d *pNativeCurve = NULL;
  43.                                                                                         AcGeExternalCurve3d* pGeExter3d = (AcGeExternalCurve3d*)pGeCurve3d;
  44.                                                                                         if (pGeExter3d->isCircArc())
  45.                                                                                         {
  46.                                                                                                 AcGeCircArc3d* pArc3d = NULL;
  47.                                                                                                 pGeExter3d->isNativeCurve((AcGeCurve3d*&)pArc3d);
  48.                                                                                                 acdbConvertGelibCurveToAcDbCurve(*pArc3d, pCurve);
  49.                                                                                                 CDwgDatabaseUtil::postToMOdelSpace(pCurve);
  50.                                                                                         }
  51.                                                                                         else
  52.                                                                                         {
  53.                                                                                                 Adesk::Boolean bRet = ((AcGeExternalCurve3d*)pGeCurve3d)->isNativeCurve(pNativeCurve);
  54.                                                                                                 Curves.append(pNativeCurve);
  55.                                                                                         }
  56.                                                                                         delete pGeCurve3d;
  57.                                                                                 }
  58.                                                                         }
  59.                                                                         es = loopEdgeTrav.next();
  60.                                                                 }
  61.                                                                 if (Curves.length() > 0)
  62.                                                                 {
  63.                                                                         AcGeCompositeCurve3d* pComp = new AcGeCompositeCurve3d(Curves);
  64.                                                                         acdbConvertGelibCurveToAcDbCurve(*pComp, pCurve);
  65.                                                                         delete pComp;
  66.                                                                         if (!pCurve->isClosed())
  67.                                                                         {
  68.                                                                                 for (int i = 0; i < Curves.length(); i++)
  69.                                                                                 {
  70.                                                                                         pGeCurve3d = (AcGeCurve3d*)Curves.at(i);
  71.                                                                                         pGeCurve3d->reverseParam();
  72.                                                                                 }
  73.                                                                                 delete pCurve;
  74.                                                                                 pCurve = NULL;
  75.                                                                                 pComp = new AcGeCompositeCurve3d(Curves);
  76.                                                                                 acdbConvertGelibCurveToAcDbCurve(*pComp, pCurve);
  77.                                                                                 delete pComp;
  78.                                                                         }
  79.                                                                         CDwgDatabaseUtil::postToMOdelSpace(pCurve);
  80.                                                                         for (int i = 0; i < Curves.length(); i++)
  81.                                                                         {
  82.                                                                                 delete Curves.at(i);
  83.                                                                         }
  84.                                                                 }
  85.                                                                 Curves.removeAll();
  86.                                                         }
  87.                                                 }
  88.                                                 es = faceLoopTrav.next();
  89.                                         }
  90.                                 }
  91.                         }
  92.                         es = faceTrav.next();
  93.                 }
  94.         }
  95.         //pRegion->erase();
  96. }



点评

随着你的进步,你会发现,以前发现的所有所谓BUG,都是自己的原因。  详情 回复 发表于 2018-9-10 01:29
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-9-10 01:29:46 | 显示全部楼层
本帖最后由 newer 于 2018-9-10 01:31 编辑
1121443108qaz 发表于 2018-9-10 00:52
再分享个最终版本的面域转多段线吧,适用于经过uion处理后的面域合集,暂时我不知道有什么bug。由pregion获 ...

随着你的进步,你会发现,以前发现的所有所谓BUG,都是自己的原因。
你可以把EDGE遍历的顶点打印出来看看,你这样的循环,顶点不是一个挨着一个的,这也是问题所在。

点评

我想着可能是这样的,但是真的好像和时针有关系啊,请问大师怎样循环可以使得得到的曲线是首尾相连刚刚好的呢。我用最终版本由面到环,由环到边,这样得到的也不是首尾相连的,除了我那笨方法,还有什么函数可以解决  详情 回复 发表于 2018-9-10 02:07
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2018-9-10 02:07:22 | 显示全部楼层
本帖最后由 1121443108qaz 于 2018-9-10 02:13 编辑
newer 发表于 2018-9-10 01:29
随着你的进步,你会发现,以前发现的所有所谓BUG,都是自己的原因。
你可以把EDGE遍历的顶点打印出来看 ...

我想着可能是这样的,但是真的好像和时针有关系啊,同样的方法我逆时针的就没问题,请问大师怎样循环可以使得得到的曲线是首尾相连刚刚好的呢。我用最终版本由面到环,由环到边,这样得到的也不是首尾相连的,除了我那笨方法,还有什么函数可以解决,请指教。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1227个

财富等级: 财源广进

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

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2018-9-20 22:50:43 | 显示全部楼层
接楼上,加上那几句后遇到一些面域还是会出错。顺时针时遍历到的顶点确实不是头尾相连的,也不知道怎么遍历拿出来的曲线都是头尾相连的。继续用打破后再聚合的方法。
The 0 loop 0edge ptstart is 10,10,0,ptend  is 20,10,0
The 0 loop 1edge ptstart is 10,0,0,ptend  is 10,10,0
The 0 loop 2edge ptstart is 20,0,0,ptend  is 10,0,0
The 0 loop 3edge ptstart is 20,10,0,ptend  is 20,0,0
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2409个

财富等级: 金玉满堂

发表于 2019-3-20 15:05:02 | 显示全部楼层
Get points from a region (solid or body) in ObjectARX
By Augusto Goncalves

Using BRrep (Bound Representation) this sample does this for AcDbRegion. It can be modified to work on AcDb3dSolid or AcDbBody.

// Make sure you uncomment the following

//      #define _BREP_SUPPORT_

// On your StdAfx.h header file

// This will enable BREP on the code

static void getPoints(

            AcDbObjectId id,

            AcGePoint3dArray &points )

{   

  AcBrBrep*pBrep = new AcBrBrep;

  pBrep->setSubentPath( AcDbFullSubentPath( id, kNullSubentId ));  

  AcBrBrepFaceTraverser brFaTrav;

  for (brFaTrav.setBrep(*pBrep);!brFaTrav.done();brFaTrav.next())

  {      

    AcBrFaceLoopTraverser faLoTrav;      

    AcBrFace face;   

    brFaTrav.getFace(face);   

    for(faLoTrav.setFace(face);!faLoTrav.done();faLoTrav.next())

    {         

      AcBrLoopEdgeTraverser loEdTrav;

      if(loEdTrav.setLoop(faLoTrav) == AcBr::eOk)

      {           

        for( ; !loEdTrav.done(); loEdTrav.next())

        {            

          AcBrEdge edge;   

          loEdTrav.getEdge(edge);

          AcBrVertex start;     

          edge.getVertex1( start );  

          AcGePoint3d pt;           

          start.getPoint( pt );   

          points.append( pt );      

        }         

      } // else its an isolated loop   

    }   

  }

  delete pBrep;

}



static void AdskPointsFromRegion_GetPoints(void)

{

  ads_name eName;  

  ads_point pt;  

  if( RTNORM != acedEntSel(

    _T("\nPlease select a region "),

    eName, pt ) )

    return;

  AcDbObjectId id;

  acdbGetObjectId( id, eName );

  AcDbRegion*pRegion;   

  acdbOpenObject(pRegion, id, AcDb::kForRead );

  if( pRegion == NULL )   

    return;

  AcGePoint3dArray points;

  pRegion->close();

  getPoints( id, points );

  int nPoints = points.length();

  for( int i=0; i<nPoints; i++ )

  {

    acedGrDraw(

      asDblArray(points[i]),

      asDblArray(points[(i+1)%nPoints]), 1,0 );

  }

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-10 20:32 , Processed in 0.374897 second(s), 51 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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