各位老师,当我使用mdlMesh_extractVisibleChains提取Mesh边界(在该Mesh中,边界并不分段,是完整的)时,发现提取出来的Boundary是打散的,分段的,要使用mdlElmdscr_assembleChains才能缝合。每次缝合时,
由于Mesh分段边界之间的间距不同,设置合适的tolerance也需要反复测试,很繁琐。
然而使用MS自带Mesh Utilities中的Extract Boundary,则可以一次性提取完整的边界。想请问下,Extract Boundary工具是否有对应的API函数可以调用?
提前感谢
您试试尝试调用PolyfaceHeader下的EdgeChain来得到一个PolyfaceEdgeChain的对象试一下。目前您的方法适用的比较多,也只能提取后利mdlElmdscr_assembleChains进行缝合。
尝试出一种效果佳的提取Mesh边界方法:
1. 调用PolyFaceHeader的CollectEdgeMateData函数提取边界集合
2. 将边界集合转换为CurveVector,调用CurveVector的AssembleChains函数,此时并没有assemble成一个shape
3. 将curveVector中每一个Curve Primitive转成元素,调用mdlElmdscr_initOrAddToChain()函数 最后mdlElmdscr_assembleChains
得到的边界是完整的,可以围合成一个shape,而且内部没有多余的面片残留。
Answer Verified By: mkt
Thanks张工,anyway!
厉害!感谢分享!
如果要用mdlElmdscr_xxx之类的C函数的话,似乎没有必要再到CurveVector下去绕了。下面是我写的测试代码供你参考:
void meshExtractBoundary(WCharCP) { ElementHandle eh(7338L, ACTIVEMODEL); auto meshQuery = dynamic_cast<IMeshQuery*>(&eh.GetHandler()); PolyfaceHeaderPtr pPolyface; meshQuery->GetMeshData(eh, pPolyface); bvector<FacetEdgeDetail> segs; pPolyface->CollectEdgeMateData(segs); MSElementDescrP edP = NULL; for (auto seg : segs) { MSElementDescrP newEdP = NULL; mdlLine_create(dgnBuf, NULL, (DPoint3dP)&seg.segment); mdlElmdscr_new(&newEdP, NULL, dgnBuf); mdlElmdscr_initOrAddToChain(&edP, newEdP); } mdlElmdscr_assembleChains(&edP, fc_p01, ACTIVEMODEL); mdlElmdscr_simplifyComplexChainOrShape(&edP, ACTIVEMODEL); mdlElmdscr_add(edP); mdlElmdscr_freeAll(&edP); }