夜雨聆风学习资料网

ARTICLE · 1324879

一句话,让 AI 在我电脑上造出一辆车

一句话,让 AI 在我电脑上造出一辆车

—— 用混元 Hy4 完成一个真实 SolidWorks 建模任务的全过程

这不是一篇教程,也不是一次「AI 生成一段示例代码」的演示。我提了一句自然语言需求,混元 Hy4 在我本机的 SolidWorks 2018 里把模型真的建出来、装配好、检查完,最后交付了可以直接双击打开的 .SLDASM。全程我没写一行代码,也没给过它任何 API 文档。

2026 年 11 月 6 日 · Windows / SolidWorks 2018 / 混元 Hy4


一、先看结果

项目
结果
交付物
15 个可编辑 .SLDPRT 零件 + 1 个 33 实例装配体 + 通用 STEP
整车尺寸
205 × 238 × 148 mm
干涉检查
0 处
图纸落实
轮胎 φ65×27、轮毂 φ52、底板 200×180、六角联轴器、减速电机、L 型电机支架
附加产出
8 张渲染图、设计说明、一套可重跑的参数化脚本、一份踩坑笔记

模型不是网格也不是导入的实体,是SolidWorks 原生特征模型——草图、拉伸、切除都在特征树里,尺寸可以直接改。


二、我一共只说了四句话

整个过程我这边几乎没有「操作」,只有四轮需求:

  1. 「使用 solidworks 画一个 4轮机器人小车的模型」
  2. 贴了联轴器和减速电机的工程图,补了一句尺寸:轮胎 φ65、宽 27,轮毂 52,轮子和电机之间有个联轴器,底板 200×180,电机是这个尺寸
  3. 「电机有个支架的 请加上去」
  4. 贴了那张 L 型支架的尺寸图

就这些。没有告诉它 SolidWorks 装在哪个盘、COM 怎么调、FeatureExtrusion2 有 27 个参数、也没有说「请先写一个探测脚本」。它自己去找、去试、去改。

后面发生的每一件事,都是它在我这台机器上真实跑出来的。


三、最让我意外的一步:它没先建模,先去「摸」我的电脑

我原以为会收到一份「打开 SolidWorks,新建零件,选前视基准面……」的操作步骤。结果它第一步是查环境:

  • 在注册表里翻到 SldWorks.Application 的 CLSID,定位到 E:\sw2018\SOLIDWORKS\sldworks.exe
  • 确认是 SolidWorks 2018(26.5.0)中文版,找到 gb_part.prtdot / gb_assembly.asmdot 模板
  • 发现 Python 缺 pywin32,自己装上了
  • 发现 gencache.EnsureDispatch("SldWorks.Application") 必然失败(SW 对象没有 TypeInfo),改成手动对 sldworks.tlb 跑 makepy 生成类型库包装

然后它没有直接写两千行建模代码,而是先写了一堆几行到几十行的小脚本,一个一个验证:能不能新建文档、能不能画草图、能不能拉伸、切除怎么调、保存怎么调、装配体怎么插零件。

scripts/diag/ 里最后留下了28 个这样的验证脚本(probe*.py、diag*.py)。这个习惯是整件事能跑通的关键:每个不确定都先做一个最小复现,而不是在猜测上继续堆代码。


四、真实的坑,和它怎么一个个爬出来

这部分我原样留着,因为「一次成功」反而不真实。下面是几个有代表性的:

1. 整车「躺倒」了

第一版零件全建出来了,导出等轴测图一看,车是侧躺的。

原因很朴素:SolidWorks 的「上」是 +Y,不是 +Z。我凭直觉以为 Z 是高度,它一开始也按常见 CAD 习惯写了 Z,结果所有板子竖着长。修法是把全部零件的建模基准面重排——板类改「上视基准面沿 +Y 拉伸」,轮子改「前视基准面沿 +Z 拉伸」,让轮轴自然落在车宽方向。

它是靠「导出图 → 看图」发现这个错的,不是靠读代码。

2. 圆角板一切孔就多出碎片实体

给底板开角孔时,FeatureCut4 会在圆与板边相切的位置生成 90~2647 mm³ 的碎片实体,GetBodies2 返回的第一个 body 常常是碎片,导致包围盒看起来只有一个孔那么大。

它试了各种贯穿参数、改了圆角半径,确认是本机这个切除组合的固有毛病,于是换路线:板类零件一律「单一草图 + 一次拉伸」——外轮廓用 4 条直线 + 4 个三点弧画圆角矩形,孔直接画成内环圆,一次成型,单实体、体积与理论完全吻合。

有意思的是,后来做电机端面 6-M3 盲孔和联轴器 M4 顶丝孔时,它重新实测了一遍 FeatureCut4,发现切除本身没问题,只是「轮廓与板边相切」这个特定情形会出碎片,于是又把它用回来了。没有因为一次挫折就把一个 API 拉黑。

3. 装配体里的零件全嵌进底板

第一次装配,轮子陷进底盘、控制盒压进底板 5 mm,干涉检查报了27 处。

排查路径挺有意思:先按「面贴合被误判」加了 0.5 mm 间隙,降到 4 处;再逐个读组件变换矩阵,最后确认根因是——AddComponent5传的坐标是「零件包围盒中心」,不是零件原点。所有位置都按原点算,自然整体偏移。全部改成按包围盒中心定位后,27 处直接降到 0 附近。

顺带还挖出两个坑:AddComponent5 之前必须先用 OpenDoc6 把零件打开,否则静默返回空;app.GetMathUtility() 在这台机器上不可用,没法旋转组件,所以左右朝向相反的零件只能单独做镜像件——它用的是「把各段建模顺序整个反过来」这种干净做法,而不是硬掰旋转矩阵。

4. 一侧电机压住轮子

剩下几处干涉集中在负侧电机:输出轴是单向的,镜像过去以后轴朝内、机身压到了轮子上。它做了单独一版「轴段先画、机身最后画」的镜像电机,bbox 与原版一致,装配时按中心定位即可。

5. 支架竖板拉伸出来 0 个实体

第三轮加 L 型支架时,「跑道形腰孔 + 6 个圆孔」放在同一个草图里,SolidWorks 直接判定轮廓无效,拉伸返回 None。它把孔径缩小、把 6 孔减到 4 孔都试过,确认不是间隙问题,然后拆成两步:草图只留「倒 D 形外轮廓 + 腰孔内环」一次拉伸,6 个 φ3.2 孔改用独立贯穿切除,最后把底板 merge 进来 → 单实体 V=5670 mm³,与理论一致。

6. 一些零碎但很典型的类型问题

现象
正确写法
SelectByID2
 第 8 参数报「类型不匹配」
传 VARIANT(VT_DISPATCH, None),不能传 None
SaveAs4
 报错
Errors/Warnings 是 byref,要 VARIANT(VT_BYREF|VT_I4, 0)
生成 makepy 包装后大量方法报 'str' object is not callable
这些方法变成了属性,去掉括号
上色全部变成默认绿
MaterialPropertyValues
 要 VARIANT(VT_ARRAY|VT_R8, [8 元组]),普通 tuple 无效
反向拉伸 Flip=True 无效
用第 3 个参数 Dir=True

这些经验它顺手沉淀进了项目的 .workbuddy/memory/MEMORY.md,是一张可以直接复用的 API 踩坑表。


五、它是怎么「看见」自己做得对不对的

我觉得这最像一个真人干活的地方:它给自己接了一双眼睛。

每次改完,脚本会调 ShowNamedView2 + SaveBMP 导出等轴测 / 前视 / 俯视 / 右视 / 底视,然后真的去读这些图。除了前面那个「车躺倒了」,它还靠看图发现了:

  • 上层板有一根支柱从板面穿出来 → 把柱位往内移、放大过孔
  • 配色没生效、全车默认绿 → 回头查 MaterialPropertyValues 的参数类型
  • 支架加上以后被底盘挡住看不见 → 临时隐藏承载层组件,单独出了一张驱动层总成图
底视图 —— 4 台减速电机、4 个黄铜六角联轴器(M4 顶丝孔可见)、轮轴与轮毂,左右镜像一致。普通视角看不到这套传动链,是专门为验证补的视角。
驱动层总成 —— 隐藏承载层与感知层后,4 个 L 支架的腰孔和 6 个安装孔、以及「电机 → 联轴器 → 轮轴 → 轮毂 → 轮胎」完整传动链一目了然。
支架单件特写 —— 40×40 底板 + 40 宽 × 47.5 高竖板(R20 半圆端)、15.5×31 腰孔、6-φ3.2@φ31、底板 30×24 双孔,可对照图纸逐项核对。

「生成 → 看图 → 发现不对 → 改参数 → 再生成」这个循环跑了很多轮,比单纯跑通脚本要可信得多。


六、从「看着像」到「真的能用」:它做的几件工程活

光好看不算交差,后面这几件事我觉得才是「真实任务」和「演示」的分界线:

用体积校验几何。每个零件建完都算实体体积和理论值对账:底板 175361 mm³、轮胎 31812、轮毂 51369、电机 49440、支架 5670;6-M3 盲孔切除 118 mm³、M4 顶丝孔切除 51 mm³、支架 6 孔 97 mm³,全部吻合。这样「看着对但其实是碎片/空实体」的问题藏不住。

干涉检查当作验收线。用 InterferenceDetectionManager 逐对查,从 27 处一路追到0 处;所有配合面留 0.1–0.5 mm 间隙。最后还重新打开装配体,逐个确认 33 个组件引用的零件文件都真实存在。

一个尺寸源。第二轮图纸一到,它先建了 scripts/dims.py:P 字典放零件几何,layout() 放装配基准,bracket_base_holes() 统一算底盘的 8 个支架孔。建模脚本和装配脚本都 import 它,避免「改了零件忘了改装配」这种最难查的错。这是整件事里我最欣赏的一个架构决定——改一个数字,全套重跑。

交付可复现。7 个正式脚本、一份 README、一份 STEP、一套视图总览。不是给我一个孤零零的模型文件。


七、它替我做的判断,和留给我拍板的地方

真实工程图常常是「不完整」的,这部分处理得挺克制——它把判断和依据都摆出来,没有假装图纸上什么都有:

  • 发现图纸矛盾并给方案:联轴器图纸只标了 φ8 孔,但电机轴是 φ6。它做成 φ6.1 / φ8.1 阶梯孔,φ6 端吃电机 D 轴、φ8 端吃轮轴,各留 0.1 mm 间隙、各一颗 M4 顶丝;图纸没给的 φ8×31 轮轴也补上,把传动链闭合。
  • 从几何约束反推装配高度:支架图纸的 6 孔圆心距折弯线 27 mm,而电机轴必须和轮心同高 32.5 mm。它推出支架得倒装、底盘底面要从 51.5 抬到 61.5 mm(= 32.5 + 27 + 2),底盘相应补 8 个 φ3.2 孔,整车高 138 → 148。这样电机是被 4 个支架真正夹持,不是悬空贴着底板。
  • 明确标注取值假设:电机减速箱长度图纸是变量 L,取 24;支架板厚、孔径图纸没标,取 2 mm / φ3.2。这些都在 README 里写成一行,改 dims.py 一个参数就能换。

我把这部分单独列出来,是因为它恰好说明了我理想中的分工:繁琐的执行、试错、对账交给 AI;图纸里缺的那些需要工程经验的取舍,它给依据、我来点头。


八、一点体会

1. 「真实任务」和「问答」的差别,是有没有一个可验收的东西。这次的验收物很硬:一个能双击打开的装配体、33 个引用齐全的组件、0 处干涉、一份能重跑的脚本。有了这个东西,AI 说得再漂亮也没用,跑不通就是跑不通。

2. 遇到报错不猜,写最小复现。28 个诊断脚本看着笨,却是能一路摸清 30 多个 COM API 的原因。反过来说,如果一个 Agent 遇到 'str' object is not callable 就开始瞎改参数,这事第一轮就崩了。

3. 视觉闭环 + 数值校验,两条腿走路。看图抓「躺倒、穿模、没上色」这类语义错误,算体积和干涉抓「碎片实体、坐标偏移」这类数值错误,谁也替不了谁。

4. 沉淀比一次性结果更值钱。dims.py、README、项目笔记这三样,意味着下次我说「把轮距改窄点」或者「再出张工程图」,不用从零开始。

三轮下来,从一句「画个四轮小车」到一套按图纸建好、检查干净的装配体,中间隔了几十次失败重试。但对我来说,界面上就是四句话和最后那几张图——这大概就是这次体验最直观的感受。


附:文件与复现

机器人小车/├── parts/            15 个 .SLDPRT├── assembly/         robot_car.SLDASM(33 实例)├── output/           8 张 PNG + robot_car.step├── scripts/          dims.py / build_parts.py / assemble.py /│                     colorize.py / show_bracket.py /│                     check_interference.py / make_preview.py├── README.md         设计说明(尺寸对照表 / BOM / 传动链)└── 用混元Hy4完成真实任务_体验分享.*   本文

在装有 SolidWorks 2018 + pywin32 的机器上,改完 scripts/dims.py 后按顺序重跑:

python scripts/build_parts.pypython scripts/assemble.pypython scripts/colorize.pypython scripts/show_bracket.pypython scripts/check_interference.pypython scripts/make_preview.py

还可以继续做的:胎面花纹、支架折弯圆角与钣金展开、添加 Mate 配合、电池仓、出工程图与明细表。

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料