☰
【Claude SKILL vs Gemini 3.1 Pro】用智能无人船系统描述驱动FreeCAD 3D建模:完整对话与可复现配置
2026/10/3 16:37:35 网站建设 项目流程

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 CAD,Python 控制台可以直接调Part模块做布尔运算、放样、旋转体。适合谁?适合需要批量生成结构件、做方案快速迭代、又希望脚本可版本管理的人。无人船这种「多零件 + 强尺寸约束 + 需要导出 STEP 给下游」的场景,正好是它的强项。

我试过把描述直接粘给模型,结果两家给的脚本风格差异很大:一个偏「先定全局锚点再挂零件」,一个偏「边写边算坐标」。下面把完整对话、可复现配置和排障过程都摊开讲。

2. TaoToken 统一 Key 与 API 通道的前置准备

要让 Claude SKILL 和 Gemini 3.1 Pro 都能被同一套代码调用,最省事的做法是走统一 API 通道。TaoToken 提供的就是这个:一个 Key、一个 Base URL,背后可以切不同模型。官网入口在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 地址是 https://taotoken.net/api (这个不加 UTM)。

前置准备分三步,都不复杂:

第一步,注册后在控制台创建 API Key。地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,进去后点 API Keys 页面生成。Key 形如sk-开头的一串,复制下来存好,后面所有请求都用它。

第二步,确认你要调的模型 ID。Claude 系列和 Gemini 系列在模型列表里都能看到,对话类走模型对话页 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 可以先试跑一句,确认通道通。

第三步,如果你打算长期做编码/Agent 类任务,比如让模型反复生成 FreeCAD 脚本、自动跑验证,那 Coding Plan 更划算,入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。它适合高频调用场景,不用每次单独计费。

这里要强调一点:TaoToken 是合规的 API 聚合通道,不是所谓「中转」的灰色玩法,所有调用都走标准 HTTP 接口,你本地代码里就是普通的requests.post。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面有完整的请求示例。

环境上你只需要 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_key="model_claude"): url = f"{CFG['base_url']}/v1/chat/completions" headers = { "Authorization": f"Bearer {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, headers=headers, json=payload, timeout=CFG["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/api,Key 是控制台生成的sk-串,Model ID 是claude-sonnet-4-5或gemini-3.1-pro。任何一处写错都会在验证阶段报错,第 5 节会逐个对。

FreeCAD 脚本这边,Gemini 3.1 Pro 生成的版本结构很典型,它先定义配色和add_obj辅助函数,再用make_stealth_box做放样甲板,然后按「船体 → 甲板 → 机舱 → 桅杆 → 感知设备 → 推进声呐」的顺序挂零件。核心锚点它写在注释里:L_TOTAL=6000、SPACING=1800、R_HULL=350、X_CABIN_CENTER=3000、X_MAST_FRONT=4500、Z_DECK_TOP=480。这套锚点表是它能一次跑通的关键。

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.1e8
STEP 导出无异常抛出通过修正后通过
锚点一致性改总长后零件不脱节需手动改 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_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 。但无人船这类项目往往要反复迭代:改总长、改设备布局、换推进方案,每次都要重新生成脚本、重新验证。这时候把 Key 和 Base URL 固定到项目配置里,配合 Coding Plan 做高频调用更顺,入口 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。

我自己的做法是把config_taotoken.py和提示词模板一起放进项目仓库,FreeCAD 脚本生成后自动跑第 4 节的验证脚本,体积和零件数对不上就回滚重生成。API Key 管理在控制台 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,接入细节看文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。这样一套下来,从描述到可导出 STEP 的模型,基本能压到十分钟以内。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询