【Claude SKILL vs Gemini 3.1 Pro】用智能无人船系统描述驱动FreeCAD 3D建模:完整对话与可复现配置
发布时间:2026/10/3 16:37:52 作者:尧图编辑部 阅读量:1,286

1. 智能无人船建模为什么值得用大模型来拆智能无人船USV的 3D 建模麻烦的地方不在画图本身而在于把一段自然语言描述翻译成结构清晰、尺寸自洽、能参数化复用的 CAD 脚本。我拿到的需求描述大概是这样双体船型、总长约 6 米、两侧浮筒间距 1.8 米、甲板上有白色机舱、机舱顶装太阳能板、桅杆横梁挂 LiDAR 和 PTZ 相机、机舱顶还有导航雷达和 RTK 天线、尾部两台喷水推进器、船底挂声呐。这种描述人读起来没问题但直接丢给 FreeCAD 手动建模光是确定各零件的 X/Y/Z 锚点就要来回改十几遍。所以这次我做了个对照实验同一段无人船系统描述分别交给 Claude SKILL 和 Gemini 3.1 Pro让它们输出 FreeCAD Python 控制台脚本然后逐项验证模型体积、零件数量、导出 STEP 是否报错。核心检索词就是「Claude SKILL vs Gemini 3.1 Pro FreeCAD 3D建模」适合想用大模型辅助参数化建模、又不想被尺寸约束坑到的工程师。FreeCAD 是什么、能做什么这里简单交代它是开源参数化 3D CADPython 控制台可以直接调Part模块做布尔运算、放样、旋转体。适合谁适合需要批量生成结构件、做方案快速迭代、又希望脚本可版本管理的人。无人船这种「多零件 强尺寸约束 需要导出 STEP 给下游」的场景正好是它的强项。我试过把描述直接粘给模型结果两家给的脚本风格差异很大一个偏「先定全局锚点再挂零件」一个偏「边写边算坐标」。下面把完整对话、可复现配置和排障过程都摊开讲。2. TaoToken 统一 Key 与 API 通道的前置准备要让 Claude SKILL 和 Gemini 3.1 Pro 都能被同一套代码调用最省事的做法是走统一 API 通道。TaoToken 提供的就是这个一个 Key、一个 Base URL背后可以切不同模型。官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 这个不加 UTM。前置准备分三步都不复杂第一步注册后在控制台创建 API Key。地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 进去后点 API Keys 页面生成。Key 形如sk-开头的一串复制下来存好后面所有请求都用它。第二步确认你要调的模型 ID。Claude 系列和 Gemini 系列在模型列表里都能看到对话类走模型对话页 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 可以先试跑一句确认通道通。第三步如果你打算长期做编码/Agent 类任务比如让模型反复生成 FreeCAD 脚本、自动跑验证那 Coding Plan 更划算入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。它适合高频调用场景不用每次单独计费。这里要强调一点TaoToken 是合规的 API 聚合通道不是所谓「中转」的灰色玩法所有调用都走标准 HTTP 接口你本地代码里就是普通的requests.post。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有完整的请求示例。环境上你只需要 Python 3.9 和requests库FreeCAD 装 0.20 以上版本即可。FreeCAD 的 Python 控制台在「视图 → 面板 → Python 控制台」打开或者直接用freecadcmd跑无界面脚本。3. 可复制的调用配置与 FreeCAD 脚本模板这一节给的是能直接抄的配置。先看调用模型的 Python 配置我用一个settings风格的字典路径和字段名都写清楚方便你对照改# config_taotoken.py TAOTOKEN_CONFIG { base_url: https://taotoken.net/api, api_key: sk-你的Key粘贴在这里, model_claude: claude-sonnet-4-5, model_gemini: gemini-3.1-pro, timeout: 120, max_tokens: 8192 }调用函数这样写两家模型共用一套import requests from config_taotoken import TAOTOKEN_CONFIG as CFG def ask_model(prompt, model_keymodel_claude): url f{CFG[base_url]}/v1/chat/completions headers { Authorization: fBearer {CFG[api_key]}, Content-Type: application/json } payload { model: CFG[model_key], messages: [{role: user, content: prompt}], max_tokens: CFG[max_tokens], temperature: 0.2 } resp requests.post(url, headersheaders, jsonpayload, timeoutCFG[timeout]) resp.raise_for_status() return resp.json()[choices][0][message][content]提示词模板是关键我用的这版强调「先输出全局锚点表再输出脚本」你是 FreeCAD 参数化建模专家。根据以下无人船系统描述输出可直接在 FreeCAD Python 控制台运行的脚本。 要求 1. 先列出全局锚点表X/Y/Z 关键坐标、总长、间距、各层高度用注释写在脚本开头。 2. 使用 Part 模块零件命名规范颜色分组。 3. 所有尺寸用变量禁止硬编码魔法数字。 4. 结尾调用 doc.recompute()并尝试 viewAxometric。 5. 只输出 Python 代码不要解释。 系统描述双体无人船总长6000mm浮筒间距1800mm浮筒半径350mm...Claude SKILL 的配置片段如果你用 Claude Code 或 Cline 这类工具settings.json里这样填{ mcpServers: { taotoken: { command: npx, args: [-y, taotoken/mcp-server], env: { TAOTOKEN_BASE_URL: https://taotoken.net/api, TAOTOKEN_API_KEY: sk-你的Key, TAOTOKEN_MODEL: claude-sonnet-4-5 } } } }三件套记牢Base URL 是https://taotoken.net/apiKey 是控制台生成的sk-串Model ID 是claude-sonnet-4-5或gemini-3.1-pro。任何一处写错都会在验证阶段报错第 5 节会逐个对。FreeCAD 脚本这边Gemini 3.1 Pro 生成的版本结构很典型它先定义配色和add_obj辅助函数再用make_stealth_box做放样甲板然后按「船体 → 甲板 → 机舱 → 桅杆 → 感知设备 → 推进声呐」的顺序挂零件。核心锚点它写在注释里L_TOTAL6000、SPACING1800、R_HULL350、X_CABIN_CENTER3000、X_MAST_FRONT4500、Z_DECK_TOP480。这套锚点表是它能一次跑通的关键。Claude SKILL 的版本更强调约束表达它会把「桅杆支柱从甲板连向横梁两端」写成向量计算p_bot Vector(X_MAST_FRONT-300, (SPACING/2-100)*side, Z_DECK_TOP) p_top Vector(X_MAST_FRONT, (SPACING/2-100)*side, Z_MAST_TOP) leg Part.makeCylinder(40, (p_top-p_bot).Length, p_bot, p_top-p_bot)这种写法好处是改Z_MAST_TOP时支柱长度自动跟着变不会脱节。Gemini 版本在桅杆横梁和支柱连接处也用了类似思路但它的make_stealth_box放样甲板用了inset参数控制上下面收缩视觉上更像真实甲板收边。4. 验证请求与成功结果对照脚本拿到后别急着信按三个动作验证模型体积、零件数量、导出 STEP 是否报错。先跑一段验证脚本在 FreeCAD Python 控制台里执行import FreeCAD as App doc App.ActiveDocument objs [o for o in doc.Objects if o.TypeId Part::Feature] print(零件数量:, len(objs)) total_vol sum(o.Shape.Volume for o in objs) print(总体积(mm^3):, round(total_vol, 2)) for o in objs: print(o.Name, round(o.Shape.Volume, 1), o.Shape.BoundBox)Gemini 3.1 Pro 版本实测下来零件数量在 20 个左右两侧船体各 1、甲板 1、机舱 1、太阳能板 1、横梁 1、支柱 2、LiDAR 1、PTZ 1、雷达 1、RTK 2、卫星穹顶 1、喷水推进 2、声呐 1加上融合后的对象。总体积量级在 10^8 mm³ 上下因为船体是实心圆柱加锥体不是壳体这个数值偏大是正常的做体积对比时只看相对变化。导出 STEP 验证import Part Part.export(doc.Objects, /tmp/usv_gemini.step) print(STEP 导出完成)如果这一步不报错说明所有 Shape 都是有效实体没有出现空 Shape 或自交。Claude SKILL 版本在导出时我遇到过Part.OCCError原因是某个fuse结果为空排查发现是支柱向量长度为 0改掉锚点后正常。成功结果的判断标准我列成表验证项通过标准Gemini 3.1 ProClaude SKILL零件数量≥18 且无 None2019总体积量级 10^8 mm³1.2e81.1e8STEP 导出无异常抛出通过修正后通过锚点一致性改总长后零件不脱节需手动改 3 处自动跟随从结构拆解看Gemini 3.1 Pro 更擅长「一次成型」它把布局参数集中写在顶部改一个值影响面清晰Claude SKILL 更擅长「约束联动」向量计算让零件间关系显式化。参数化脚本上Gemini 的make_stealth_box是个可复用函数Claude 则把每个零件写成独立块复用性稍弱但可读性强。尺寸约束上两家都用了变量但 Gemini 的Z_CABIN_TOP Z_DECK_TOP 500这种派生写法更符合参数化直觉。5. 本篇常见报错与排查这一节按真实报错来你大概率会撞上其中几个。401 Unauthorized。最常见原因是 Key 没填对或带了多余空格。检查config_taotoken.py里api_key是不是完整的sk-串请求头是不是Bearer加空格。如果用的是 Cline/Claude Code检查settings.json里TAOTOKEN_API_KEY有没有被环境变量覆盖成空值。local proxy failed。这个报错通常出现在你本地配了代理但代理没起来或者 Base URL 写成了带路径的地址。确认base_url就是https://taotoken.net/api不要自己拼/v1之外的路径。请求函数里url f{CFG[base_url]}/v1/chat/completions是标准写法。reading choices 报错 / KeyError: choices。说明返回体结构和你预期不符多半是模型 ID 写错服务端返回了错误对象而不是正常 completion。打印resp.text看原始返回把model字段改成模型列表里确认存在的 ID。Gemini 3.1 Pro 和 Claude 的 ID 大小写敏感别写错。OAuth 相关报错。如果你用 Claude Code 接入它可能默认走 OAuth 流程。改成 API Key 模式在settings.json里显式填TAOTOKEN_API_KEY并把TAOTOKEN_BASE_URL指向https://taotoken.net/api。三件套 Base URL Key Model ID 缺一不可OAuth 报错九成是 Key 没被识别。FreeCAD 侧报错。Part.OCCError: Null shape说明某个布尔运算结果为空检查参与 fuse 的 Shape 是否有效打印shape.isValid()。NameError: name Vector is not defined是忘了from FreeCAD import Vector。App.closeDocument报错说明文档名不存在用 try/except 包住即可Gemini 脚本里就是这么处理的。导出 STEP 报错。Part.export要求所有对象都是Part::Feature如果你把 Group 或 Sketch 也传进去会报错。用列表推导过滤[o for o in doc.Objects if o.TypeId Part::Feature]。排障时建议先跑最小用例只建一个Part.makeBox(100,100,100)导出 STEP确认环境没问题再上完整脚本。这样能把「环境问题」和「脚本问题」分开。6. 把通道固定下来长期跑建模任务如果你只是偶尔生成一两个 FreeCAD 脚本模型对话页试跑就够了入口在 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。但无人船这类项目往往要反复迭代改总长、改设备布局、换推进方案每次都要重新生成脚本、重新验证。这时候把 Key 和 Base URL 固定到项目配置里配合 Coding Plan 做高频调用更顺入口 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。我自己的做法是把config_taotoken.py和提示词模板一起放进项目仓库FreeCAD 脚本生成后自动跑第 4 节的验证脚本体积和零件数对不上就回滚重生成。API Key 管理在控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 接入细节看文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。这样一套下来从描述到可导出 STEP 的模型基本能压到十分钟以内。