opencascade TopoDS_Builder 源码学习 原创
opencascade TopoDS_Builder
前言
构建器(Builder)用于创建拓扑数据结构。它是构建器类层次结构的根。
构建器中包含三组方法:
- Make 方法用于创建形状(Shapes)。
- Add 方法用于将一个形状包含到另一个形状中。
- Remove 方法用于从一个形状中移除另一个形状。
构建器中的方法不是静态的,它们可以在继承的构建器中被重新定义。
此构建器不提供用于创建顶点(Vertices)、边(Edges)、面(Faces)、壳(Shells)或实体(Solids)的 Make 方法。这些方法在继承的构建器中提供,因为它们必须提供几何形状信息。
Add 方法遵循以下规则:
任何形状(SHAPE)都可以被添加到复合形状(COMPOUND)中。
只有实体(SOLID)可以被添加到复合实体(COMPSOLID)中。
只有壳(SHELL)、边(EDGE)和顶点(VERTEX)可以被添加到实体(SOLID)中。边和顶点可以是内部的或外部的。
只有面(FACE)可以被添加到壳(SHELL)中。
只有线框(WIRE)和顶点(VERTEX)可以被添加到面(FACE)中。顶点可以是内部的或外部的。
只有边(EDGE)可以被添加到线框(WIRE)中。
只有顶点(VERTEX)可以被添加到边(EDGE)中。
顶点(VERTEX)中不能添加任何内容。
方法
1
创建一个空的线框(Wire)。
void MakeWire (TopoDS_Wire& W) const;
2
创建一个空的壳(Shell)。
void MakeShell (TopoDS_Shell& S) const;
3
创建一个覆盖整个3D空间的实体(Solid)。
void MakeSolid (TopoDS_Solid& S) const;
4
创建一个空的复合实体(Composite Solid)。
void MakeCompSolid (TopoDS_CompSolid& C) const;
5
创建一个空的组合体(Compound)。
void MakeCompound (TopoDS_Compound& C) const;
6
将形状C添加到形状S中。
异常如果S不是自由状态且无法被修改,则抛出TopoDS_FrozenShape异常。
如果S和C不兼容,则抛出TopoDS__UnCompatibleShapes异常。
void Add (TopoDS_Shape& S, const TopoDS_Shape& C) ;
7
从形状S中移除形状C。
异常如果S被冻结且无法被修改,则抛出TopoDS_FrozenShape异常。
void Remove (TopoDS_Shape& S, const TopoDS_Shape& C)
用法用例
在OpenCASCADE(OCCT)中,TopoDS_Builder
是一个用于构建复杂拓扑结构的类,它允许用户按照自定义的方式构建 TopoDS_Shape
对象,例如顶点、边、面或实体等。下面是一个简单的示例,展示如何使用 TopoDS_Builder
类来构建一个简单的几何体,并添加顶点、边和面。
示例:使用 TopoDS_Builder
构建几何体
#include <iostream>
#include <TopoDS.hxx>
#include <TopoDS_Builder.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Face.hxx>
int main() {
// 创建一个空的 TopoDS_Shape 对象
TopoDS_Shape shape;
TopoDS_Builder builder;
builder.MakeCompound(shape); // 创建一个复合体
// 添加一个顶点
TopoDS_Vertex vertex;
builder.MakeVertex(vertex, gp_Pnt(0.0, 0.0, 0.0)); // 在原点创建一个顶点
builder.Add(shape, vertex); // 将顶点添加到复合体中
// 添加一条边
TopoDS_Edge edge;
builder.MakeEdge(edge, gp_Pnt(0.0, 0.0, 0.0), gp_Pnt(1.0, 0.0, 0.0)); // 创建一条连接两个顶点的边
builder.Add(shape, edge); // 将边添加到复合体中
// 添加一个面
TopoDS_Face face;
builder.MakeFace(face); // 创建一个空面
builder.Add(shape, face); // 将面添加到复合体中
// 输出复合体中包含的元素数量
std::cout << "Number of elements in the compound shape: " << shape.NbChildren() << std::endl;
return 0;
}
示例说明:
-
包含头文件:
<TopoDS.hxx>
:包含了TopoDS_Shape
及其相关类型的定义。<TopoDS_Builder.hxx>
:定义了TopoDS_Builder
类,用于构建拓扑结构。<TopoDS_Vertex.hxx>
、<TopoDS_Edge.hxx>
、<TopoDS_Face.hxx>
:定义了分别用于顶点、边和面的TopoDS
类型。
-
创建
TopoDS_Shape
对象:- 使用
TopoDS_Builder builder;
创建一个TopoDS_Builder
实例。 - 使用
builder.MakeCompound(shape);
创建一个空的复合体TopoDS_Shape
对象。
- 使用
-
添加顶点、边和面:
- 使用
builder.MakeVertex(vertex, gp_Pnt(0.0, 0.0, 0.0));
创建一个位于原点的顶点,并将其添加到复合体中。 - 使用
builder.MakeEdge(edge, gp_Pnt(0.0, 0.0, 0.0), gp_Pnt(1.0, 0.0, 0.0));
创建一条从原点到 (1, 0, 0) 的边,并将其添加到复合体中。 - 使用
builder.MakeFace(face);
创建一个空的面,并将其添加到复合体中。
- 使用
-
输出:
- 使用
shape.NbChildren()
获取复合体中包含的子元素数量,并输出结果。
- 使用
示例的运行结果:
如果一切顺利,该示例将输出复合体中包含的元素数量,应该是 3(一个顶点、一条边和一个面)。
这个示例展示了如何使用 TopoDS_Builder
类来逐步构建复杂的拓扑结构。在实际应用中,可以根据需要添加更复杂的拓扑实体,并使用OpenCASCADE提供的各种工具和算法进行更高级的操作和分析。