本帖最后由 1121443108qaz 于 2018-9-10 00:57 编辑
再分享个最终版本的面域转多段线吧,适用于经过uion处理后的面域合集,暂时我不知道有什么bug。由pregion获得相应的brep,由brep通过face遍历器获得一个个的face,通过faceloop遍历器获得loop,对于每个loop通过loopedge遍历器获得edge,由edge获得相应的acge曲线,最后转化为acdb曲线。
 - void CRegionUtil::r2p(AcDbRegion* pRegion)
- {
- AcBr::ErrorStatus es;
- AcGeVoidPointerArray Curves;
- AcDbCurve* pCurve = NULL;
- AcBrBrep brep;
- es = brep.set(*pRegion);
- AcGeCurve3d * pGeCurve3d = NULL;
- if (es == AcBr::eOk)
- {
- AcBrBrepFaceTraverser faceTrav;
- faceTrav.setBrep(brep);
- while (!faceTrav.done() && es == AcBr::eOk)
- {
- AcBrFace face;
- es = faceTrav.getFace(face);
- if (es == AcBr::eOk)
- {
- AcBrFaceLoopTraverser faceLoopTrav;
- es = faceLoopTrav.setFace(face);
- if (es == AcBr::eOk)
- {
- while (!faceLoopTrav.done() && es == AcBr::eOk)
- {
- AcBrLoop loop;
- es = faceLoopTrav.getLoop(loop);
- if (es == AcBr::eOk)
- {
- AcBrLoopEdgeTraverser loopEdgeTrav;
- es = loopEdgeTrav.setLoop(loop);
- if (es == AcBr::eOk)
- {
- while (!loopEdgeTrav.done() && es == AcBr::eOk)
- {
- AcBrEdge edge;
- es = loopEdgeTrav.getEdge(edge);
- if (es == AcBr::eOk)
- {
- es = edge.getCurve(pGeCurve3d);
- if (es == AcBr::eOk)
- {
- AcGeCurve3d *pNativeCurve = NULL;
- AcGeExternalCurve3d* pGeExter3d = (AcGeExternalCurve3d*)pGeCurve3d;
- if (pGeExter3d->isCircArc())
- {
- AcGeCircArc3d* pArc3d = NULL;
- pGeExter3d->isNativeCurve((AcGeCurve3d*&)pArc3d);
- acdbConvertGelibCurveToAcDbCurve(*pArc3d, pCurve);
- CDwgDatabaseUtil::postToMOdelSpace(pCurve);
- }
- else
- {
- Adesk::Boolean bRet = ((AcGeExternalCurve3d*)pGeCurve3d)->isNativeCurve(pNativeCurve);
- Curves.append(pNativeCurve);
- }
- delete pGeCurve3d;
- }
- }
- es = loopEdgeTrav.next();
- }
- if (Curves.length() > 0)
- {
- AcGeCompositeCurve3d* pComp = new AcGeCompositeCurve3d(Curves);
- acdbConvertGelibCurveToAcDbCurve(*pComp, pCurve);
- delete pComp;
- if (!pCurve->isClosed())
- {
- for (int i = 0; i < Curves.length(); i++)
- {
- pGeCurve3d = (AcGeCurve3d*)Curves.at(i);
- pGeCurve3d->reverseParam();
- }
- delete pCurve;
- pCurve = NULL;
- pComp = new AcGeCompositeCurve3d(Curves);
- acdbConvertGelibCurveToAcDbCurve(*pComp, pCurve);
- delete pComp;
- }
- CDwgDatabaseUtil::postToMOdelSpace(pCurve);
- for (int i = 0; i < Curves.length(); i++)
- {
- delete Curves.at(i);
- }
- }
- Curves.removeAll();
- }
- }
- es = faceLoopTrav.next();
- }
- }
- }
- es = faceTrav.next();
- }
- }
- //pRegion->erase();
- }
|