You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 16:25:59