文本转Fusion 360纯参数化CAD模型技能
当用户用自然语言描述机械对象、零件、修改、配件托盘、紧固件规格、爆炸装配图或运动动画,且未提供参考3D文件(.3mf/.stl → 使用 3mf-to-fusion)或视觉媒体(.png/.mp4 → 使用 media-to-fusion),请遵循以下6阶段确定性CAD工作流程。
严格的CAD指令:
- 所有几何体必须使用原生草图、构造平面、用户参数和拉伸/旋转/接合特征在Fusion 360时间轴中重建。绝不能生成原始网格体(
root.meshBodies.add)或经过面片转换的网格。 - 所有代码必须在
execute_api_script内干净执行,使用厘米单位(cm = mm / 10.0)。 - 始终使用
get_screenshot视觉验证每个生成或修改的实体。
阶段0:预飞行探测与工作区对齐
-
验证活着的Fusion 360 MCP会话: 通过
fusion-mcp工具execute_api_script执行金丝雀探测:def run(context): import adsk.core, adsk.fusion app = adsk.core.Application.get() if not app or not adsk.fusion.Design.cast(app.activeProduct): raise RuntimeError("未打开活动的Fusion 360设计文档。") print("FUSION_MCP_READY")快速失败规则:如果探测失败,停止执行并提示用户打开Autodesk Fusion 360。
-
工作区与单仓库路由:
- 主仓库:活跃的CAD单仓库或项目根目录(
CAD_MONOREPO_ROOT或当前工作区)。 - 严格隔离保证:绝对不要在仓库根目录下创建临时文件、脚本或渲染文件,也不得修改
shared/。 - 如果创建全新模型,请为其搭建专用文件夹:
python3 <路径到技能>/text-to-fusion/scripts/scaffold_text_model.py "<模型名称>" - 将模型脚本存储在
models/<NN>_<模型名称>/scripts/中,视觉渲染存储在models/<NN>_<模型名称>/renders/中,中间工作区文件存储在models/<NN>_<模型名称>/workspace/中。 - 从
../../shared/导入通用CAD辅助模块(fusion_client、cad_primitives、hardware_library、scene_animator)。
- 主仓库:活跃的CAD单仓库或项目根目录(
-
领域参考资料: 在编写自定义几何体之前,请查阅本地参考库:
references/prompt-to-geometry-patterns.md— 将自然语言转化为参数化草图约束。references/exploded-view-guidelines.md— 爆炸向量、金色导杆和正交构图。references/assembly-animation-pipeline.md— Matrix3D出现变换动画和GIF编译。references/variant-management-and-undo.md— 安全的A/B变体展示与无损隐藏。
阶段1:消歧与参数化规范
当用户以对话方式描述几何体时,识别并形式化缺失的工程约束:
- 包络与关键尺寸:
- 整体边界框($W \times D \times H$,单位mm)。
- 最小壁厚(结构件默认
2.0 - 2.5 mm,内部分隔件1.6 mm)。 - 3D打印平台限制(如
220 × 220 × 250 mm)。
- 注册主用户参数(
design.userParameters): 始终将关键尺寸暴露为用户参数,使用户能够一键缩放:def set_user_param(design, name, expr_str, units="mm", comment=""): existing = design.userParameters.itemByName(name) if existing: existing.expression = expr_str return existing return design.userParameters.add( name, adsk.core.ValueInput.createByString(expr_str), units, comment )
阶段2:变体分阶段展示与可逆探索
当用户要求设计选项(“给我方案二”、“尝试一个没有盖子的版本”):
- 展示厅模式:
- 在专用组件中建模实验性选项(例如
Sample_Options_Showroom:1)。 - 在虚拟工作台地面上并排放置变体(例如 $Y = -350\text{ mm}$ 或 $X = -200\text{ mm}$),并赋予独特外观(
Rack_Desert_Tan、Rack_Matte_White)。 - 捕获带有标签的并排概览截图。
- 在专用组件中建模实验性选项(例如
- 无损采纳:
- 当用户选定优胜方案后,将选中的实体克隆到活动装配体中(
InSitu_Tier3_Option2)。 - 通过
bRepBody.isLightBulbOn = False隐藏被拒绝的展示体。 - 绝对不要调用
body.deleteMe()删除可能破坏下游时间轴引用的对象。
- 当用户选定优胜方案后,将选中的实体克隆到活动装配体中(
阶段3:标准紧固件与硬件BOM合成
当用户要求螺丝、螺母或装配硬件时:
- 硬件标准化:
- 所有枢轴和结构接头默认使用 DIN 7991 M3沉头螺丝 和 DIN 934 M3六角螺母。
- 标准口袋尺寸:
- 六角螺母口袋:对边距离(AF)建模为
5.70 mm(在5.50 mm螺母基础上增加+0.20 mmFDM间隙),深度2.50 mm。 - 螺丝孔:$x 3.20\text{ mm}$ 通孔,带90°锥形沉头口袋($x 6.20\text{ mm} \times 1.80\text{ mm}$)。
- 保持垫圈:3D打印垫圈(外径 $x 9.50\text{ mm}$,内径 $x 3.20\text{ mm}$,厚度
1.80 mm,90°沉头),夹紧枢轴凸台尖端,同时允许连杆自由旋转。
- 六角螺母口袋:对边距离(AF)建模为
- 模板停放规则:
- 主硬件模板(
Template_DIN_7991_M3x10、Template_DIN_934_M3)必须保持isLightBulbOn = True。 - 将模板停放在远地面下(
Z = -500.0 cm),使装配体中的子实例保持可见,而模板完全远离屏幕。
- 主硬件模板(
阶段4:爆炸视图与技术图解
当用户要求说明零件如何装配时:
- 线性爆炸偏移:
- 将连杆沿主轴向+X方向偏移(
35 - 50 mm)。 - 将结构支架或框架沿Y向后偏移(
+45 - 60 mm)。 - 将模块化插入件沿Z向上偏移(
+40 - 50 mm)。
- 将连杆沿主轴向+X方向偏移(
- 金色对齐导杆:
- 拉伸细圆柱杆($x 1.2 - 1.4\text{ mm}$,外观
Rack_Mustard_Yellow或Gold - Polished),穿过每个螺丝/枢轴接头轴,从最内螺丝头到最外螺母。 - 将所有导杆分组到专用组件中:
Opened_Explosion_Guides。
- 拉伸细圆柱杆($x 1.2 - 1.4\text{ mm}$,外观
- 正交相机设置:
设置
cam.cameraType = OrthographicCameraType,并定位边界范围,以确保平行轴且无透视畸变。
阶段5:高速装配动画流水线
当用户要求展示零件动画安装的GIF时:
- 基于出现的场景图绑定:
- 将每个运动装配体分组到其专用
Occurrence中(Anim_Bars、Anim_Stand、Anim_Fasteners)。 - 不要在帧循环中使用
features.moveFeatures.add()(会导致每帧约2.2秒的时间轴重建)。 - 直接重新分配
occ.transform = Matrix3D(每帧0.005 s)。
- 将每个运动装配体分组到其专用
- 多阶段交错Smoothstep缓动:
应用smoothstep缓动函数 $s(\tau) = 3\tau^2 - 2\tau^3$,在分阶段子装配体区间($t \in [0.0, 1.0]$)内:
- 底座对接:$t \in [0.00, 0.40]$
- 连杆就位:$t \in [0.15, 0.60]$
- 保持垫圈就位:$t \in [0.30, 0.70]$
- 紧固件夹紧:$t \in [0.40, 0.92]$
- 导杆淡出:
guides_occ.isLightBulbOn = (t < 0.88)
- 脚本内批量渲染与往返编译:
- 直接将帧渲染到磁盘:
vp.saveAsImageFile('/tmp/frames/frame_%03d.png', 800, 800)。 - 使用
PIL.Image编译:28个正向帧(45ms)→ 28个保持帧已装配(50ms)→ 26个反向帧(45ms)→ 20个保持帧已爆炸(50ms)。 - 使用128种自适应颜色和Floyd-Steinberg抖动进行量化(约
2.3 MB)。 - 使用唯一/带版本的文件名(例如
_final.gif)以避免浏览器聊天图像缓存。
- 直接将帧渲染到磁盘:
阶段6:数学自验证与开发大脑同步
- 数学验证配合边界:
- 如果某个零件出现意外间隙(“看起来滞后”),检查世界坐标:
delta = target_face.x - moving_face.x。 - 应用精确的数学增量;切勿猜测调整量。
- 如果某个零件出现意外间隙(“看起来滞后”),检查世界坐标:
- 执行收尾与内存同步:
- 将局部更改提交到活跃的CAD仓库。
- 如果发现了新机制、公差规则或API技巧,将其记录在
references/中,并在CHANGELOG.md中记录更改。