最近在与同事讨论BRepAlgoAPI_Fuse与BRep_Builder.MakeCompound有什么区别。
一、从直觉上来说,BRepAlgoAPI_Fuse会对两个实体相交处理,相交的部分会重新的生成相关的曲面。而BRep_Builder.MakeCompound仅仅是把两个实体组合成一个新的实体,但相交的部分不会处理。
一个球体与一个长方体相交。三种方式:
1、直接放置在相近的位置,结果:两个独立的实体。
参考示例代码:
TopoDS_Shape topoBox = BRepPrimAPI_MakeBox(axis, 3.0, 4.0, 5.0).Shape();
TopoDS_Shape topoSphere = BRepPrimAPI_MakeSphere(axis, 2.5).Shape();
2、调用BRepAlgoAPI_Fuse,做融合,结果:融合成为一个实体。
参考示例代码:
TopoDS_Shape topoBox = BRepPrimAPI_MakeBox(axis, 3.0, 4.0, 5.0).Shape();
TopoDS_Shape topoSphere = BRepPrimAPI_MakeSphere(axis, 2.5).Shape();
TopoDS_Shape fusedShape = BRepAlgoAPI_Fuse(topoBox, topoSphere);
3、调用BRep_Builder.MakeCompound,做聚合,聚合成一个Compound实体。
参考示例代码:
TopoDS_Shape topoBox = BRepPrimAPI_MakeBox(axis, 3.0, 4.0, 5.0).Shape();
TopoDS_Shape topoSphere = BRepPrimAPI_MakeSphere(axis, 2.5).Shape();
// Make a compound shape.
TopoDS_Compound aComp;
BRep_Builder aBuilder;
aBuilder.MakeCompound(aComp);
aBuilder.Add(aComp, topoBox);
aBuilder.Add(aComp, topoSphere);
如下图所示:
二、如何发现BRepAlgoAPI_Fuse与BRep_Builder.MakeCompound区别。
方式一:点选实体,并切换Shading显示模式。
注意看,中间的Fuse的相交部分,有新的曲线与曲面生成。
方式二:对这些实体进行brep数据结构分析
1、长方体的6个Face ID: 28~33
2、Fuse融合的实体:是个Compound实体,只有一个Solid子实体,7个面中29,31,33是融合前的长方体的面,另4个面是重新生成的。
3、MakeCompound生成的聚合实体:有两个Solid子体。其中6个Face的ID,仍然是聚合前的长方体的6个Face。
所以,BRep_Builder.MakeCompound不会做曲面求交以及重新生成相交部分的曲线曲面的等动作。速度会大大快过BRepAlgoAPI_Fuse。但生成的聚合实体,可能不是你想要的。
三、几何内核信息
基于OCCT 7.7.0内核修改。
四、OGG 1.0内核
OGG 1.0内核,在OCCT 7.7.0的基础上有486项多改进。
编译并试用过后,目前情况是,OGG 1.0与OCCT 7.7.0的兼容性非常好。
只是我对内核的修改,ID生成,不知什么原因,全变成0了。
还需要进一步分析原因。
五、原因很简单,只添加了字段,未生成ID。
参考示例代码:
TopoDS_TShape()
: myFlags (TopoDS_TShape_Flags_Free
| TopoDS_TShape_Flags_Modified | TopoDS_TShape_Flags_Orientable)
{
id = getIdIndex();
}
编译OGG1.0的内核代码后,重新编译OGG测试插件,id生成正常。