如何从OpenCascade的TopoDS_CompSolid提取内外表面
OpenCascade中TopoDS_CompSolid内外表面提取问题
需求
- 获取
TopoDS_CompSolid的所有外表面列表(即其外壳) - 获取
TopoDS_CompSolid中各TopoDS_Solid的共享面(即内表面列表)
当前实现与问题
我使用BOPAlgo_CellsBuilder将多个TopoDS_Solid合并为TopoDS_CompSolid,调用RemoveInternalBoundaries()尝试移除内部边界,再通过对比外边界实体与原实体的TopoDS_Face来区分内外表面,但始终无法找到任何内边界。
通过ShapeAnalysis_ShapeContents分析统计TopoDS_Face数量后发现,RemoveInternalBoundaries()并未生效——所有原始面都保留在了最终的外边界实体中。
相关实现代码
void GetExternalBoundary(const TArray<TopoDS_Solid>& Solids, TopoDS_Solid& ExternalBoundary) { // 获取Cells TopTools_ListOfShape BuilderArguments; for (const TopoDS_Solid& Solid : Solids) { BuilderArguments.Append(Solid); } // 构建CompSolid BOPAlgo_CellsBuilder Builder; Builder.SetArguments(BuilderArguments); Builder.Perform(); if (Builder.HasErrors()) { UE_LOG(LogTemp, Error, TEXT("OCCT solids union failed.")); return; } // 添加结果 int32 Material = 1; bool bUpdate = false; Builder.AddAllToResult(Material, bUpdate); Builder.RemoveInternalBoundaries(); // 返回第一个形状 for (TopExp_Explorer ExternalBoundaryShapeExplorer(ExternalBoundaryShape, TopAbs_SOLID); ExternalBoundaryShapeExplorer.More(); ExternalBoundaryShapeExplorer.Next()) { ExternalBoundary = TopoDS::Solid(ExternalBoundaryShapeExplorer.Current()); return; } } void TestGetBoundaries(const TArray<TopoDS_Solid>& Solids) { // 计算外壳Cell TopoDS_Solid ExternalBoundary; GetExternalBoundary(Solids, ExternalBoundary); // 获取外壳面 TArray<TopoDS_Face> ExternalBoundaryFaces; for (TopExp_Explorer ExternalBoundaryExplorer(ExternalBoundary, TopAbs_FACE); ExternalBoundaryExplorer.More(); ExternalBoundaryExplorer.Next()) { ExternalBoundaryFaces.Add(TopoDS::Face(ExternalBoundaryExplorer.Current())); } // 获取原始所有面 TArray<TopoDS_Face> Faces; for (const TopoDS_Solid& Solid : Solids) { for (TopExp_Explorer SolidExplorer(Solid, TopAbs_FACE); SolidExplorer.More(); SolidExplorer.Next()) { Faces.Add(TopoDS::Face(SolidExplorer.Current())); } } // 内表面是存在于原始面列表但不在外壳面列表中的面 TArray<TopoDS_Face> InternalFaces; Handle(IntTools_Context) pOcctIntToolsContext = new IntTools_Context(); for (const TopoDS_Face& Face : Faces) { bool isExternalFace = false; for (const TopoDS_Face& ExternalBoundaryFace : ExternalBoundaryFaces) { if (BOPTools_AlgoTools::AreFacesSameDomain(Face, ExternalBoundaryFace, pOcctIntToolsContext)) { isExternalFace = true; break; } } if (!isExternalFace) { InternalFaces.Add(Face); } } UE_LOG(LogTemp, Warning, TEXT("Found %d exterior faces and %d interior faces."), ExternalBoundaryFaces.Num(), InternalFaces.Num()); }
形状分析代码
ShapeAnalysis_ShapeContents ShapeAnalysis; ShapeAnalysis.Perform(Shape);
内容的提问来源于stack exchange,提问作者sandeman_13
相关产品推荐
相关产品推荐

