参数化设计:约束、特征树与可复现的 CAD 模型
系列文章 · 计算机建模
参数化不等于“把尺寸变成变量”#
把 20 mm 改成 width,只是给尺寸起了个名字。真正的参数化,是让模型在输入变化时仍然保持设计意图:
- 孔始终居中;
- 壁厚始终均匀;
- 阵列数量变化时,间距自动重算;
- 修改总长不会让某个特征悬空。
这要求模型表达的是“关系”,而不是一串固定坐标。参数化做得好,改一个数就能得到一整套新规格;做得不好,改一个数会引发十几处报错。
自由度与约束#
草图的本质是一个约束求解问题。每个点在平面上有两个自由度,每条线段、圆弧又引入新的自由度;尺寸约束和几何约束负责把自由度逐个消掉。
| 约束类型 | 例子 | 作用 |
|---|---|---|
| 几何约束 | 水平、垂直、相切、同心 | 表达形状关系 |
| 尺寸约束 | 长度、半径、角度 | 锁定具体数值 |
| 位置约束 | 重合、中点、对称 | 锁定相对位置 |
| 驱动约束 | 表达式、全局变量 | 让数值随参数变化 |
判断草图是否“过约束”有一个实用方法:拖动一个顶点。如果整个形状按预期联动,说明约束网络是活的;如果拖不动,或者出现互相矛盾的提示,说明约束过度或冲突。
欠约束同样危险。欠约束的草图在参数变化时可能翻转方向,导致实体自交。工程模型应尽量做到“完全约束”,至少让关键轮廓完全确定。
特征树是设计意图的骨架#
特征树不是操作记录,而是建模思路的层级。推荐按“基准—主形体—细节—修饰”组织:
Body
├─ Sketch_MainProfile
├─ Pad_Main
├─ Sketch_Holes
├─ Pocket_Holes
├─ Fillet_Outer
├─ Chamfer_Edges
└─ Mirror_Right几条经验:
- 基准面和基准轴单独命名,例如
Datum_Split,不要用默认的XY_Plane001。 - 主形体特征尽量靠前,细节特征靠后,避免在早期特征上挂太多子项。
- 圆角、倒角放在特征树末端,减少父子关系断裂。
- 镜像和阵列放在最后,方便整体调整。
当特征树出现大量“跨分支引用”时,通常意味着建模顺序需要重构,而不是继续打补丁。
命名与表达式#
参数命名建议带单位和语义:
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 工作台:
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% 时,模型是否仍然有效?
- 是否能在不打开原生文件的情况下,从脚本重建?
参数化的终点不是“全自动”,而是让变化可控。能做到这一点,模型就有了工程价值。
评论加载中...