TopoDS_Compound
是 Open CASCADE Technology (OCCT) 中用于表示 复合拓扑形状(Compound Shape) 的类,属于 TopoDS
包(Topology Data Structure)。它允许将多个独立的 TopoDS_Shape
(如实体、面、边等)组合成一个逻辑上的整体,而不进行布尔运算或几何合并。
1. 核心特性
- 容器作用:将多个形状(
Solid
、Face
、Edge
等)组合成一个单一对象。 - 非参数化:仅存储形状引用,不修改原始几何或拓扑关系。
- 轻量级:相比布尔运算(如
BRepAlgoAPI_Fuse
),Compound
不生成新几何,仅管理形状集合。 - 用途:常用于临时分组、简化模型处理流程、或导出多部件组合。
2. 使用场景
- 组合多个独立形状(如装配体中的零件)。
- 简化复杂模型的交互(如同时移动一组面)。
- 导出多部件模型(如 STEP/IGES 文件中的多个几何体)。
- 避免不必要的布尔运算(当仅需逻辑组合时)。
3. 关键方法
(1) 创建 Compound
TopoDS_Compound aCompound;
BRep_Builder aBuilder;
aBuilder.MakeCompound(aCompound); // 初始化空Compound
(2) 添加形状到 Compound
aBuilder.Add(aCompound, aShape); // 将aShape添加到Compound中
aShape
可以是任意 TopoDS_Shape
(如 Solid
、Face
、Edge
)。
(3) 遍历 Compound
中的形状
TopExp_Explorer anExp(aCompound, TopAbs_SOLID); // 遍历所有Solid
for (; anExp.More(); anExp.Next()) {TopoDS_Solid aSolid = TopoDS::Solid(anExp.Current());// 处理每个Solid...
}
4. 完整示例
示例1:将多个立方体组合成 Compound
#include <TopoDS_Compound.hxx>
#include <BRep_Builder.hxx>
#include <BRepPrimAPI_MakeBox.hxx>void createCompound() {// 创建两个独立的立方体TopoDS_Solid box1 = BRepPrimAPI_MakeBox(10, 10, 10).Solid();TopoDS_Solid box2 = BRepPrimAPI_MakeBox(5, 5, 5).Solid();box2.Move(gp_Trsf().SetTranslation(gp_Vec(15, 0, 0))); // 移动第二个立方体// 创建Compound并添加立方体TopoDS_Compound aCompound;BRep_Builder aBuilder;aBuilder.MakeCompound(aCompound);aBuilder.Add(aCompound, box1);aBuilder.Add(aCompound, box2);// 可视化CompoundHandle(AIS_Shape) aisCompound = new AIS_Shape(aCompound);aisCompound->SetColor(Quantity_NOC_GREEN);myContext->Display(aisCompound, Standard_True);
}
示例2:从 Compound
中提取特定类型形状
TopExp_Explorer anExp(aCompound, TopAbs_FACE); // 遍历所有面
for (; anExp.More(); anExp.Next()) {TopoDS_Face aFace = TopoDS::Face(anExp.Current());// 对每个面进行操作...
}
5. 与类似结构的区别
类型 | 描述 | 与 Compound 的区别 |
---|
TopoDS_Compound | 逻辑组合多个形状 | 不修改几何,仅存储引用 |
BRepAlgoAPI_Fuse | 布尔并集运算 | 生成新几何体,合并拓扑 |
TopoDS_Solid | 单一封闭实体 | Compound 可包含多个 Solid |
TopTools_ListOfShape | 形状列表 | Compound 是拓扑结构,支持OCCT算法 |
6. 常见问题
Q1: Compound
和布尔运算的区别?
-
Compound
仅逻辑组合形状,原始几何保持不变。 - 布尔运算(如
Fuse
/Cut
)会生成新的几何体,改变拓扑结构。
Q2: 如何判断一个形状是否为 Compound
?
if (aShape.ShapeType() == TopAbs_COMPOUND) {// 是Compound
}
Q3: 能否从 Compound
中移除某个形状?
- 不能直接移除,需重建
Compound
或使用 TopTools_ListOfShape
过滤。
Q4: Compound
会影响性能吗?
7. 总结
-
TopoDS_Compound
是OCCT中管理多形状组的轻量级工具。 - 适用场景:装配体、多部件导出、临时形状分组。
- 优势:避免不必要的几何计算,保持原始形状独立性。
- 注意:若需几何合并,应使用布尔运算(如
BRepAlgoAPI_Fuse
)。