5.基础参数化建模算法
第五部分:基础参数化建模算法
前面把BRep底层、gp/Geom/TopoDS讲完,现在看OCCT的建模API,就知道每个输入输出到底是什么。 OCCT生成实体的核心分为:基础图元、扫掠类(拉伸、旋转)、放样、布尔运算。
一、基础体元生成器(Primitive)
头文件:BRepPrimAPI_MakeBox / BRepPrimAPI_MakeCylinder等 生成简单方块、圆柱、球体、圆锥。
示例‑方块:
gp_Pnt p0(0,0,0);
BRepPrimAPI_MakeBox boxMaker(p0, 10,20,30);
TopoDS_Solid box = boxMaker.Solid();
内部过程:
- 根据尺寸生成6份
gp_Pln; - 包装成6个
Handle(Geom_Plane); - 构造Edge、Vertex,组装Wire→Face→Shell→Solid;
- 返回
TopoDS_Solid句柄。
注意:
boxMaker.Shape()返回TopoDS_Shape;.Solid()直接强返回Solid。
二、扫掠算法(Sweep):把2D轮廓生成3D实体
输入一般是 TopoDS_Wire(闭合线框),把轮廓沿着路径扫出实体。
1.拉伸 BRepPrimAPI_MakePrism
把闭合Wire沿着某个方向拉伸。
//wire:闭合轮廓线框
gp_Vec dir(0,0,50); //拉伸方向与长度
BRepPrimAPI_MakePrism prism(wire, dir);
TopoDS_Solid solid = prism.Solid();
输入:闭合TopoDS_Wire(2D轮廓) 输出:TopoDS_Solid实体。
内部逻辑: 把轮廓的每一条Edge做平移复制,生成新Edge,构建侧面Face,缝合上下底面,组装成闭合Shell,得到Solid。
注意:Wire必须闭合、无自相交,否则生成失败,
prism.IsDone() == false。
2.旋转 BRepPrimAPI_MakeRevol
轮廓绕一根轴旋转,生成回转体。
gp_Ax1 axis(gp_Pnt(0,0,0), gp_Dir(0,1,0)); //旋转轴
BRepPrimAPI_MakeRevol revol(wire, axis);
TopoDS_Solid solid = revol.Solid();
适合轴类零件:圆盘、法兰、回转壳体。
三、放样/Loft(BRepOffsetAPI_ThruSections)
多个不同的闭合Wire截面,按顺序插值生成实体。 例如:下面是方形截面,上面是圆形截面,生成方转圆过渡体。
输入:一组有序闭合Wire截面。 输出:Solid或者Shell。
工程上:变径接头、异形过渡件大量使用Loft。
⚠️要求:每个截面Wire边数量最好匹配;否则会出现扭曲面片。
四、布尔运算(最重要、坑最多)
把多个实体做合并、求交、差集。 类:
BRepAlgoAPI_Common(求交)、BRepAlgoAPI_Fuse(合并并集)、BRepAlgoAPI_Cut(差集,裁剪)
//boxA 被减,boxB用来切掉部分
BRepAlgoAPI_Cut cutOp(boxA, boxB);
if(cutOp.IsDone())
{
TopoDS_Solid result = TopoDS::Solid(cutOp.Shape());
}
| 布尔类 | 作用 |
|---|---|
| BRepAlgoAPI_Fuse | 并集,两个实体合并成一个 |
| BRepAlgoAPI_Cut | 差集,A减去B |
| BRepAlgoAPI_Common | 交集,保留两者重叠部分 |
布尔运算高频坑(结合前面BRep知识理解)
- 输入不能直接传Compound 虽然参数是
TopoDS_Shape,编译可以传Compound,但运算大概率失败。要把Compound拆出子Solid。 - 实体必须有效、闭合、无自由边。 如果Shell不是闭合,布尔直接失败。可以用
BRepCheck_Analyzer做模型有效性检查。 - 容差Tolerance是布尔失败头号元凶。 顶点容差、边容差设置不合理,会判定两个本该重合的顶点不重合,导致缝合失败。
- 布尔运算会生成全新的BRep底层数据。输出result是全新BRep_TXXX;和原来输入的boxA、boxB底层互不共享。
👉布尔运算输出得到的Shape,是新BRep底层,不是简单句柄复制。
五、倒角、倒圆角(修饰特征)
BRepFilletAPI_MakeFillet 圆角;BRepFilletAPI_MakeChamfer倒角。
输入:Solid + 指定要圆角的Edge;输出新Solid。
内部:对选中Edge相邻的两个Face做曲面重构,生成新Geom曲面,重新构建整套BRep。 圆角失败绝大多数来自:几何曲率冲突、容差不合适、相邻面夹角过大过小。
六、建模API通用模式(非常固定)
OCCT几乎所有建模生成器都是这个模式:
Maker类 构造(输入shape)
if(maker.IsDone())
{
auto res = maker.Shape(); //返回TopoDS_Shape父类
//再向下转换为Solid / Face / Wire
}
不要直接拿返回值不判断
IsDone();几何失败不会崩溃,只会返回空的Shape。
梳理输入输出对应关系(复习前面四层)
- 你传给建模函数:
TopoDS_Wire / TopoDS_Face / TopoDS_Solid,都是句柄; - Maker内部读取底层BRep_TXXX,读取里面的
Handle(Geom_Curve/Surface); - 做几何计算,生成全新Geom对象;
- 构建一整套全新BRep_TXXX底层;
- 返回新的TopoDS_Shape句柄指向新底层。
⚠️很多算法(布尔、圆角)会产生全新BRep底层,输入的原始模型不会被修改,输入输出是两套独立BRep数据。
关键思考题(检验是否打通)
做一次BRepAlgoAPI_Cut,输入boxA、boxB,输出res。
res和boxA是否共享BRep底层? 👉答案:不共享。布尔运算输出是全新BRep底层。boxA、boxB保持原样。

浙公网安备 33010602011771号