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();

内部过程:

  1. 根据尺寸生成6份gp_Pln;
  2. 包装成6个Handle(Geom_Plane);
  3. 构造Edge、Vertex,组装Wire→Face→Shell→Solid;
  4. 返回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知识理解)

  1. 输入不能直接传Compound 虽然参数是TopoDS_Shape,编译可以传Compound,但运算大概率失败。要把Compound拆出子Solid。
  2. 实体必须有效、闭合、无自由边。 如果Shell不是闭合,布尔直接失败。可以用BRepCheck_Analyzer做模型有效性检查。
  3. 容差Tolerance是布尔失败头号元凶。 顶点容差、边容差设置不合理,会判定两个本该重合的顶点不重合,导致缝合失败。
  4. 布尔运算会生成全新的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。

梳理输入输出对应关系(复习前面四层)

  1. 你传给建模函数:TopoDS_Wire / TopoDS_Face / TopoDS_Solid,都是句柄;
  2. Maker内部读取底层BRep_TXXX,读取里面的Handle(Geom_Curve/Surface);
  3. 做几何计算,生成全新Geom对象;
  4. 构建一整套全新BRep_TXXX底层;
  5. 返回新的TopoDS_Shape句柄指向新底层。

⚠️很多算法(布尔、圆角)会产生全新BRep底层,输入的原始模型不会被修改,输入输出是两套独立BRep数据。


关键思考题(检验是否打通)

做一次BRepAlgoAPI_Cut,输入boxA、boxB,输出res。 res和boxA是否共享BRep底层? 👉答案:不共享。布尔运算输出是全新BRep底层。boxA、boxB保持原样。


posted @ 2026-08-24 16:18  Drunker•L  阅读(38)  评论(0)    收藏  举报