1,233 字
4 分钟阅读

参数化设计:约束、特征树与可复现的 CAD 模型


系列文章 · 计算机建模

  1. 1机器学习代理模型:让仿真从“算一次”变成“随时预测”
  2. 2参数化设计:约束、特征树与可复现的 CAD 模型
  3. 3有限差分与热传导:用 Python 搭一个可验证的数值仿真
  4. 4Blender 硬表面建模:从 Blockout 到 PBR 烘焙的完整管线
  5. 5网格与半边结构:三维模型在计算机里怎么存
  6. 6计算机建模全景:从几何表示到仿真闭环

参数化不等于“把尺寸变成变量”#

把 20 mm 改成 width,只是给尺寸起了个名字。真正的参数化,是让模型在输入变化时仍然保持设计意图:

  • 孔始终居中;
  • 壁厚始终均匀;
  • 阵列数量变化时,间距自动重算;
  • 修改总长不会让某个特征悬空。

这要求模型表达的是“关系”,而不是一串固定坐标。参数化做得好,改一个数就能得到一整套新规格;做得不好,改一个数会引发十几处报错。

自由度与约束#

草图的本质是一个约束求解问题。每个点在平面上有两个自由度,每条线段、圆弧又引入新的自由度;尺寸约束和几何约束负责把自由度逐个消掉。

约束类型 例子 作用
几何约束 水平、垂直、相切、同心 表达形状关系
尺寸约束 长度、半径、角度 锁定具体数值
位置约束 重合、中点、对称 锁定相对位置
驱动约束 表达式、全局变量 让数值随参数变化

判断草图是否“过约束”有一个实用方法:拖动一个顶点。如果整个形状按预期联动,说明约束网络是活的;如果拖不动,或者出现互相矛盾的提示,说明约束过度或冲突。

欠约束同样危险。欠约束的草图在参数变化时可能翻转方向,导致实体自交。工程模型应尽量做到“完全约束”,至少让关键轮廓完全确定。

特征树是设计意图的骨架#

特征树不是操作记录,而是建模思路的层级。推荐按“基准—主形体—细节—修饰”组织:

text
Body
├─ Sketch_MainProfile
├─ Pad_Main
├─ Sketch_Holes
├─ Pocket_Holes
├─ Fillet_Outer
├─ Chamfer_Edges
└─ Mirror_Right

几条经验:

  • 基准面和基准轴单独命名,例如 Datum_Split,不要用默认的 XY_Plane001。
  • 主形体特征尽量靠前,细节特征靠后,避免在早期特征上挂太多子项。
  • 圆角、倒角放在特征树末端,减少父子关系断裂。
  • 镜像和阵列放在最后,方便整体调整。

当特征树出现大量“跨分支引用”时,通常意味着建模顺序需要重构,而不是继续打补丁。

命名与表达式#

参数命名建议带单位和语义:

text
plate_length_mm      = 240
plate_width_mm       = 120
wall_thickness_mm    = 6
hole_diameter_mm     = 8
hole_count           = 4
hole_pitch_mm        = plate_length_mm / (hole_count + 1)

这样写有三个好处:单位一目了然;公式能自解释;导出到表格或脚本时不需要再猜含义。

不要在表达式里写魔法数字。plate_length_mm / 5 不如 plate_length_mm / (hole_count + 1),后者在孔数变化时仍然成立。

脚本化:把重复劳动交给代码#

当同类零件有几十个规格时,手工改参数不现实。FreeCAD 的 Python 接口可以直接驱动 Part 工作台:

python
import FreeCAD as App
import Part
 
doc = App.newDocument("Plate")
length = 240.0
width = 120.0
thickness = 6.0
hole_d = 8.0
 
box = Part.makeBox(length, width, thickness)
holes = []
for i in range(4):
    x = length * (i + 1) / 5
    axis = App.Vector(x, width / 2, -1)
    holes.append(Part.makeCylinder(hole_d / 2, thickness + 2, axis))
 
shape = box
for hole in holes:
    shape = shape.cut(hole)
 
Part.show(shape, "Plate")
doc.recompute()

脚本化的关键不是“能用代码建模”,而是参数、几何、导出在同一条可版本控制的链路里。把参数抽成 JSON 或 YAML,脚本只负责读取和执行,批量生成会稳定很多。

Grasshopper 的思路类似,只是把代码换成了数据流图:输入端是参数,中间是几何运算,输出端是烘焙或导出。无论用哪种工具,都要避免把关键逻辑藏在没有命名的簇里。

版本控制与可复现#

CAD 文件的二进制 diff 几乎不可读,所以更需要外部记录:

  • 参数文件用文本格式,进 Git。
  • 每个发布版本导出 STEP 和缩略图,附版本号。
  • 在 README 里记录软件版本、插件版本和单位制。
  • 重大结构改动单独开分支,不覆盖旧版本。

这样即使原生文件损坏,也能从参数和脚本重建模型。

常见失效模式#

现象 根因 处理
改参数后特征报错 引用了被删除的边或面 用基准面/基准轴替代拓扑引用
圆角失败 半径大于相邻壁厚 先改壁厚或拆分圆角
阵列错位 间距写死,未随长度变化 用表达式绑定总长
模型翻转 草图欠约束 补对称、角度或方向约束
导出尺寸不对 单位制或缩放未应用 导出前检查单位与变换

一份实用检查清单#

  • 关键尺寸是否都有语义化名称?
  • 草图是否完全约束,拖动测试是否正常?
  • 特征树是否能从下往上稳定重建?
  • 参数变化 20% 时,模型是否仍然有效?
  • 是否能在不打开原生文件的情况下,从脚本重建?

参数化的终点不是“全自动”,而是让变化可控。能做到这一点,模型就有了工程价值。

相关文章

评论

欢迎留下你的想法、问题或补充,评论通过 GitHub Discussions 提供支持。

如果这篇文章对你有帮助,可以请作者喝杯咖啡~

订阅博客

不想错过新文章?留下邮箱,有新内容时我会通知你。