这篇能做出什么
一句话说清楚:读完并照着做一遍,你会得到一个带参数、能改尺寸、能导出 STEP 的实体零件,而不是一个只能看不能量的网格模型。
具体成果:
- 用一段中文描述(含尺寸、孔径、圆角、壁厚)生成一个零件初稿;
- 在参数面板或特征树里改一个数字,整个模型跟着重建;
- 用脚本把关键尺寸量一遍,确认没有“看着像、量着错”;
- 导出 STEP 给下游 CAD/CAE 用,同时导出 STL 切片打印;
- 拿卡尺量实物,把偏差回填到参数里,形成一次闭环。
示例零件选一个最常见的:矩形安装块,四角四个通孔,顶面一个圆形沉槽。它同时包含外形尺寸、孔位、孔径、深度、圆角五类约束,足够把整条链路走通。你要是做机器人底板、传感器支架、面板开孔,结构都是同一套。
顺带说清楚它和通用 3D 生成模型的区别:后者擅长“长得像”,前者要负责“装得上”。
前置条件清单
动手前把下面这些备齐,能省掉一半来回:
- 一个 zCAD AI 账号,能用文本生成/编辑 CAD 模型。具体入口、套餐与功能边界以官方页面为准。
- 一台能跑 Python 3.10 左右的电脑。版本以满足依赖为准,以官方文档当前版本为准。
- Python 环境(可选但强烈建议):CadQuery 或 build123d,用来在本地复现、校验、批量改参数。安装命令见步骤四。
- 一个能看 STEP 的工具:FreeCAD 即可,免费且跨平台。
- 一个切片软件:PrusaSlicer、OrcaSlicer、Cura 任选其一,以官方文档当前版本为准。
- 一把数显卡尺(精度 0.01 mm),这是验证环节的核心工具。
- 一台 FDM 打印机。没有也能做完前五步,只是拿不到实物反馈。
另外准备两条心理预期:第一,生成结果第一版几乎一定需要改,这很正常;第二,凡是涉及“配合”的尺寸(孔、轴、槽宽),必须自己定公差,不要指望模型猜。
步骤一:把“一句话”写成工程规格
模型猜不准,十有八九是话没说明白。像“做一个支架”这种输入,生成器只能给你一个大概的比例。
把需求写成五行以内的规格书,每行一个可测量的量:
```text
零件:矩形安装块
外形:80 × 40 × 12 mm
孔:四角各一个 Ø4.2 mm 通孔,孔心距长边 10 mm、距短边 10 mm
沉槽:顶面中心 Ø30 mm,深 6 mm
圆角:四条竖直棱边 R4
单位:mm;材料按 PLA 考虑
```
几个写作要点:
- 每个尺寸都带单位和数值,不要用“适中”“稍微”这类词;
- 孔用“Ø + 直径”表达,避免生成器理解成半径;
- 圆角写清楚是哪几条棱,竖直棱和顶面棱的加工效果完全不同;
- 明确单位是 mm,跨国工具默认英寸的情况并不罕见。
步骤二:在 zCAD AI 里生成第一版
把上面那段规格原样粘进输入框提交。生成完成后,别急着导出,先在界面里确认三件事:
1. 单位。找单位显示或设置项,确认是 mm。
2. 特征结构。找特征树/历史面板/参数面板。理想情况下你能看到类似“草图 → 拉伸 → 切除 → 孔 → 圆角”的列表,而不是一个整体网格。这份结构就是“可编辑”三个字的实际含义。
3. 参数表。看有没有可调的数值项,比如长度、宽度、孔径、圆角半径。有滑块或输入框,说明它是参数化模型;只能整体重新生成,说明当前输出偏网格。
如果界面里完全找不到特征树和参数项,只有“重新生成”,那这次生成的结果不适合做功能件,换一种提示词再试,或者在导出选项里找找有没有“导出脚本 / 导出参数化源文件”。
步骤三:拿到可编辑模型的三条路径
不同工具给的出口不一样,通常有这三种,按优先级排:
路径 A:直接改参数。 在参数面板里把 80 改成 82,看模型是否实时重建。能重建,说明约束链是通的,后面可以放心用。
路径 B:改特征树里的草图。 展开草图,改标注尺寸。这一步要留意草图是否“完全约束”——多数 CAD 会把欠约束的线条标成另一种颜色。欠约束的草图在改大尺寸时会整体“跑位”,孔位跟着漂。发现跑位,就补约束(水平、垂直、同心、距离),直到草图稳定。
路径 C:导出脚本,本地跑。 很多文本生成 CAD 的工具会把结果表示成一段几何脚本(Python + CadQuery/build123d 之类的组合很常见)。把这段脚本存成 bracket.py,本地跑一遍,得到一个和线上完全一致的模型。这条路最省心,因为脚本能进 Git、能做 diff、能批量改参数。
如果三条路都走不通,退一步:导出 STEP,在 FreeCAD 里当作“哑实体”手工改。能改,但下次重生成还得重来,属于兜底方案。
步骤四:用脚本做尺寸与约束校正
这一步是整个流程里最值钱的部分。思路是:把设计意图写成一组“期望值”,让脚本去量模型,对不上就报错。
先装环境:
```bash
python -m venv .venv
source .venv/bin/activate # Windows 用 .venv\Scripts\activate
pip install cadquery
```
下面是一个可以直接照抄的建模脚本,参数全部提到顶部,改数字就能重建:
```python
bracket.py —— 参数化安装块
import cadquery as cq
===== 设计参数:只改这里 =====
L, W, H = 80.0, 40.0, 12.0 # 外形长宽高
FILLET_R = 4.0 # 竖直棱边圆角
HOLE_D = 4.2 # 通孔直径(M4 过孔,按打印机留余量)
HOLE_INSET_X = 10.0 # 孔心距短边
HOLE_INSET_Y = 10.0 # 孔心距长边
POCKET_D = 30.0 # 顶部沉槽直径
POCKET_DEPTH = 6.0 # 沉槽深度
============================
part = (
cq.Workplane("XY")
.box(L, W, H)
.edges("|Z").fillet(FILLET_R) # 先倒竖直棱,避免和孔冲突
)
四角通孔:从顶面往下打通
part = (
part.faces(">Z").workplane()
.pushPoints([
( L/2 - HOLE_INSET_X, W/2 - HOLE_INSET_Y),
(-L/2 + HOLE_INSET_X, W/2 - HOLE_INSET_Y),
( L/2 - HOLE_INSET_X, -W/2 + HOLE_INSET_Y),
(-L/2 + HOLE_INSET_X, -W/2 + HOLE_INSET_Y),
])
.hole(HOLE_D) # depth 省略 = 通孔
)
顶部中心沉槽
part = (
part.faces(">Z").workplane()
.circle(POCKET_D / 2)
.cutBlind(-POCKET_DEPTH)
)
cq.exporters.export(part, "bracket.step")
cq.exporters.export(part, "bracket.stl", tolerance=0.01, angularTolerance=0.1)
print("体积 mm^3:", round(part.val().Volume(), 1))
```
再写一个校验脚本,把“设计意图”变成断言。它读回 STEP,量外形、量圆柱面半径,对不上就打印偏差:
```python
check.py —— 尺寸体检
from cadquery import importers
EXPECT = {"x": 80.0, "y": 40.0, "z": 12.0} # 期望外形
TOL = 0.05 # 允许偏差 mm
shape = importers.importStep("bracket.step").val()
bb = shape.BoundingBox()
actual = {"x": bb.xlen, "y": bb.ylen, "z": bb.zlen}
ok = True
for k, v in EXPECT.items():
d = actual[k] - v
flag = "OK" if abs(d) <= TOL else "偏差超限"
if abs(d) > TOL:
ok = False
print(f"{k}: 期望 {v:.2f} 实际 {actual[k]:.3f} 差值 {d:+.3f} {flag}")
把所有圆柱面的半径列出来,核对孔径与沉槽直径
radii = set()
for f in shape.Faces():
if f.geomType() == "CYLINDER":
for e in f.Edges():
if e.geomType() == "CIRCLE":
radii.add(round(e.radius() * 2, 3)) # 转成直径
print("模型中的圆柱直径:", sorted(radii))
print("整体判定:", "通过" if ok else "需要修正")
```
跑一遍:
```bash
python bracket.py
python check.py
```
输出里应该能看到 Ø4.2 和 Ø30 两个圆柱直径。如果孔径出现 4.0 或者沉槽变成 Ø15,说明某处把直径当半径用了,回步骤三改参数。
关于“约束校正”,有三条实战经验:
- 尺寸链要闭合。比如孔心距短边 10、孔心距长边 10,隐含了一个约束:孔不能跑到圆角外面去。圆角 R4、孔径 Ø4.2 时,孔边到圆角切点的距离只剩不到 2 mm,再缩小外形尺寸就会破口。脚本里加一条断言更保险。
- 壁厚要显式检查。沉槽 Ø30 深 6,外形高 12,底部剩 6 mm,够用;如果外形改成 10,底就只剩 4 mm,打印时会翘。把“最小壁厚 ≥ 1.2 mm(3 层 0.4 喷嘴)”写进检查脚本。
- 配合尺寸单独建表。凡是和别的零件发生关系的尺寸(孔径、槽宽、轴径),单独列成一张表维护,别散落在提示词里。
步骤五:导出 STEP 并做几何体检
STEP 是 B-rep 实体格式,保留精确的曲面与尺寸,是给 CAD/CAE/CAM 用的;STL 是三角网格,是给切片软件用的。两个都要出,但用途不同。
导出后先做三道体检:
```python
mesh_check.py —— 网格体检
import trimesh
m = trimesh.load("bracket.stl")
print("水密:", m.is_watertight) # 应为 True,否则切片可能出空洞
print("法向一致:", m.is_winding_consistent)
print("体积 mm^3:", round(m.volume, 1))
print("包围盒:", m.bounds) # 对照外形尺寸
```
- 水密(watertight):False 说明网格有破洞或自交,先回 CAD 修,别硬切。
- 体积:和脚本里 B-rep 的体积对一下,差距在 1% 以内算正常,差很多说明导出公差设太大。
- 包围盒:核对单位。bounds 显示 80/40/12 就是 mm;显示 3.15/1.57/0.47 说明被当成英寸换算了。
然后在 FreeCAD 里打开 STEP 目视一遍:孔是不是通到底、沉槽有没有穿、圆角有没有破面。这一步花两分钟,能挡掉大部分返工。
步骤六:切片并打印验证
导入 STL 到切片软件,注意两点:
- 导入时如果弹单位提示,选毫米。
- 看一眼自动修复提示。多数切片软件会提示“模型存在非流形边”,出现这个提示就回步骤五。
打印参数按常规走:0.2 mm 层高、3 层壁、20% 填充、无需支撑(这个零件顶面朝上、孔轴竖直,天然好打)。想省时间就只打关键区域:把模型沿 XY 切一小块,只保留一个孔和一个圆角,二十分钟出结果。
FDM 有一个绕不开的现象:孔会缩小。喷嘴走圆弧时的路径补偿会让 Ø4.2 的孔实际量出来偏小,通常需要每侧补 0.1~0.2 mm。这是经验值,不同机器、不同材料差异明显,需要自己标定。
打印完用卡尺量三个数:
| 测量项 | 设计值 | 实测 | 处理 |
|---|---|---|---|
| 外形长 | 80.00 | 79.85 | 可接受,属收缩 |
| 孔径 | 4.20 | 4.02 | 每侧补 0.1,改回 4.4 |
| 沉槽深 | 6.00 | 5.90 | 可接受 |
把偏差回填到 bracket.py 顶部的参数区,重跑脚本,重打一件。两轮之内基本能收敛。
步骤七:把修正写回提示词与参数
最后一步容易被跳过,但决定了下次能不能更快:把这次踩到的坑写回你的规格模板。
比如原来的提示词里没写“孔必须完全落在平面内、不得与圆角相交”,这次破了口,就补上一句;原来没写“最小壁厚 1.2 mm”,就补上。模板越写越像一张工程任务书,生成的第一版就越接近可用。
同时把 bracket.py、check.py、mesh_check.py 三个文件放进 Git。以后改设计只改参数,diff 一眼就能看出“孔径从 4.2 改成 4.4”,比对着界面截图靠谱得多。
和通用 3D 生成模型的差别
两类工具都能“从一句话出模型”,但解决的问题不在一个层面上:
| 维度 | CAD 原生生成(文本/草图 → 参数化实体) | 通用 3D 生成模型(文本/图像 → 网格) |
|---|---|---|
| 输出表示 | B-rep 实体 + 特征树/参数 | 三角网格或隐式场 |
| 尺寸精度 | 由参数与约束保证,可精确控制 | 只有大致比例,无法保证具体数值 |
| 可编辑性 | 改一个参数,整模型重建 | 多为整体重生成,或局部雕刻 |
| 装配配合 | 能做孔轴配合、间隙、尺寸链 | 需要后期手工修 |
| 有机造型 | 较弱 | 较强,适合角色、雕塑、外观件 |
| 工程交付 | STEP 可进 CAD/CAE/CAM | 多为 STL/OBJ,常需修复 |
| 典型用途 | 支架、底板、外壳、夹具 | 概念图、游戏资产、艺术造型 |
一句话总结:要做“装得上、量得准、改得动”的功能件,走参数化 CAD 这条路;要做“看着像”的外观件,通用生成模型更省事。两者不冲突,一个零件完全可以先生成外观网格定形态,再用 CAD 重建关键配合面。
常见坑与排错
- 提示词太笼统,模型乱猜尺寸。 表现是外形比例大致对、数值全是零头。对策:每个尺寸写数值加单位,孔写 Ø。
- 直径当半径用。 表现是 Ø4.2 的孔变成 Ø2.1。对策:跑
check.py,看圆柱直径列表。 - 圆角和孔打架。 表现是孔边缘破口、STEP 导入报错。对策:先打孔后倒角,或加大孔心距;脚本里加最小边距断言。
- 草图欠约束导致改参数跑位。 表现是长度从 80 改到 82,孔位整体偏移。对策:补水平/垂直/同心约束,直到草图完全约束。
- 导出的 STEP 单位错乱。 表现是切片软件里模型只有几毫米大。对策:检查导出设置与导入提示,用包围盒校验。
- 网格不水密。 表现是切片后出现空洞或薄壁。对策:提高 STL 导出精度(减小 tolerance),或回 CAD 修面。
- 打印出来的孔偏小装不进螺丝。 对策:按机器实测补偿,每侧加 0.1~0.2 mm,做一次孔径标定块。
- 只在界面里改、不落盘成脚本。 表现是下次重生成又从零开始。对策:导出脚本进 Git,参数集中在文件顶部。
下一步建议
1. 建一个自己的参数模板库。 把安装块、法兰、L 形支架、面板开孔这几类做成模板脚本,新零件从模板改,比从零写提示词快很多。
2. 做一块公差标定片。 一次打出 Ø3.0/3.2/3.4/3.6/3.8/4.0/4.2/4.4 八个孔,量一遍,得到你自己机器的孔径补偿表。以后所有零件的孔径直接查表。
3. 把校验脚本接进流程。 check.py 通过才允许导出 STL,用一条 shell 命令串起来,避免手滑。
4. 试试草图路径。 文本生成适合起步,真正复杂的零件还是“画草图 + 标约束 + 拉伸”更可控。CadQuery 和 build123d 的官方文档都有完整示例,从官方文档当前版本看起。
5. 学一点尺寸链。 知道哪些尺寸是“设计基准”、哪些是“被派生出来的”,改参数时才不会牵一发动全身。这是从“会用工具”到“会做设计”的分界线。
