
1. 从 .dat 翼型到 CATIA 实体为什么值得用 Codex 做一套 skills如果你画过机翼或者翼肋大概率经历过这个循环打开 Profili 或者 Airfoil Tools挑一个翼型导出 .dat 坐标文件然后回到 CATIA 里手动建点、连样条、拉伸、倒角。一个翼肋还好要是做整段机翼从翼根到翼尖十几个截面每个截面都要重复一遍导入坐标、生成样条、检查闭合性的动作画到第三个截面的时候人已经开始机械操作了。更麻烦的是「遗忘成本」。隔两三周不画再打开 CATIA 就得重新回忆样条是用「通过点」还是「控制点」坐标要不要缩放前缘那个尖点怎么处理才不会自交于是又去翻视频、翻笔记画一次错一次。我这次想做的事情很具体让 Codex 读取 .dat 翼型坐标文件自动在 CATIA 里生成机翼或者翼肋的草图并且把「坐标解析规则」「缩放映射」「闭合性验证」这几件容易出错的事固化下来做成一套可以反复调用的 skills。这样下次不管隔多久只要 .dat 文件在一条指令就能出草图。这篇文章会给你三样能直接抄走的东西一份可复制的 skills 配置片段、.dat 解析与坐标映射的具体规则、以及一键绘制之后的尺寸与闭合性验证动作。适合已经在用 CATIA 做翼型设计、又想让 Codex 帮忙把重复劳动吃掉的人。核心检索词就三个Codex 连接 CATIA、.dat 翼型解析、翼肋草图自动生成。先说清楚边界Codex 在这里的角色是「帮你写并执行 CATIA COM 自动化脚本的助手」不是替代 CATIA。真正的几何内核还是 CATIA 自己Codex 负责把 .dat 里的数字翻译成 CATIA 能听懂的建点、连样条、闭合、拉伸指令。理解这一点后面所有配置都不会跑偏。2. 前置准备Codex 连接 CATIA 的环境与 TaoToken 接入在写 skills 之前得先让 Codex 能稳定地调用模型来生成和修正脚本。这里我用 TaoToken 作为模型接入层原因是它同时提供 OpenAI 兼容接口和 Claude Code 这类编码场景的接入方式配置一次就能在 Codex 里长期用。先明确几个地址后面配置会反复用到官网入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI 基址https://taotoken.net/api模型对话页https://taotoken.net/api?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteCoding Plan 页https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteAPI Keys 管理https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteClaude Code 接入说明https://taotoken.net/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite环境侧你需要准备三样东西。第一是 CATIA 本体V5 或 V6 都行但要确认本机已经能通过 COM 被外部脚本调用也就是在 CATIA 里能正常新建 Part 文档。第二是 Python 环境建议 3.10 以上因为我们要用 pycatia 或者 win32com 来驱动 CATIA。第三是 Codex 的运行环境它需要能读写你本地的 .dat 文件和脚本目录。安装依赖这一步别偷懒命令如下pip install pycatia pywin32pywin32负责 COM 通信pycatia是对 CATIA 对象模型的一层封装能让你少写很多Dispatch样板代码。装完之后先做一次最小连通性测试确认 Python 能唤起 CATIAimport win32com.client catia win32com.client.Dispatch(CATIA.Application) catia.Visible True doc catia.Documents.Add(Part) print(doc.Name)如果这一步能弹出一个新的 Part 文档说明 COM 通道是通的后面 skills 才有意义。如果报错先别急着往下走多半是 CATIA 没启动过、或者权限不够用管理员身份跑一次 Python 通常能解决。接下来是 TaoToken 的接入。在 Codex 的配置里把模型请求指向 TaoToken 的 API 基址Key 从 API Keys 页面拿。这里给一份通用的配置片段路径按你自己的 Codex 配置目录来放{ provider: taotoken, base_url: https://taotoken.net/api, api_key: sk-你的Key, model: claude-sonnet-4-5, timeout: 120 }注意base_url后面不要手动加/v1TaoToken 的兼容层会自己处理路径。Key 一定要放在本地配置文件里不要硬编码进脚本提交到仓库。如果你用的是 Claude Code 形态的接入参考 Claude Code 接入说明那一页把 Base URL、Key、Model ID 三件套填全缺一个都会在请求时报鉴权或模型不存在的错。配置完成后用一次最简单的对话请求验证链路curl https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的Key \ -H Content-Type: application/json \ -d {model:claude-sonnet-4-5,messages:[{role:user,content:ping}]}返回里有正常的choices字段就说明模型侧通了。这一步和 CATIA 的 COM 通道是两条独立的链路任何一条断了skills 都跑不起来所以务必分开验证。3. 可复制的 skills 配置.dat 解析与坐标映射规则这一节是全文的核心给你一份可以直接落地的 skills 配置。所谓 skills本质上是把「读 .dat → 解析坐标 → 映射到 CATIA 草图 → 闭合验证」这套流程写成一个 Codex 能识别并调用的结构化描述加上配套的 Python 执行脚本。先看 .dat 文件的格式。Profili 导出的 base1.0 格式长这样NACA 2412 1.00000 0.00130 0.95000 0.00820 0.50000 0.04000 ... 0.00000 0.00000 ... 0.50000 -0.03000 1.00000 0.00130第一行是翼型名称后面每行是x y坐标从后缘上表面出发绕前缘再回到后缘下表面。这里有两个坑一是坐标可能是归一化弦长0 到 1也可能是实际毫米二是首尾点理论上应该重合但导出时经常差一点点直接连样条会留下缝隙。skills 配置片段如下放在你的 Codex skills 目录里[skill] name catia_airfoil description 读取 .dat 翼型坐标并在 CATIA 中生成机翼或翼肋草图 entry airfoil_skill.py triggers [画翼型, 生成翼肋, airfoil, 翼型草图] [skill.params] dat_path { type string, required true, desc .dat 文件绝对路径 } target { type string, default rib, enum [rib, wing], desc 翼肋或机翼 } chord { type float, default 200.0, desc 弦长单位毫米 } thickness { type float, default 20.0, desc 翼肋厚度单位毫米 } close_tol { type float, default 0.01, desc 闭合容差单位毫米 }对应的解析与映射脚本关键部分我拆开讲。解析函数要处理注释行、空行和首尾闭合def parse_dat(path): pts [] with open(path, r, encodingutf-8, errorsignore) as f: for line in f: line line.strip() if not line or line[0].isalpha(): continue parts line.split() if len(parts) 2: continue x, y float(parts[0]), float(parts[1]) pts.append((x, y)) return pts坐标映射规则是重点。归一化坐标乘以弦长得到实际尺寸同时要注意 CATIA 草图的坐标系方向。我习惯把弦线放在 X 轴厚度方向放在 Y 轴前缘在原点def map_points(pts, chord): mapped [] for x, y in pts: mapped.append((x * chord, y * chord)) return mapped闭合处理不能省。首尾点如果距离超过容差就强制把最后一点替换成第一点保证样条闭合import math def enforce_close(pts, tol): if not pts: return pts dx pts[0][0] - pts[-1][0] dy pts[0][1] - pts[-1][1] if math.hypot(dx, dy) tol: pts[-1] pts[0] return pts然后在 CATIA 里建草图、打点、连样条。用 pycatia 的写法大致是这样from pycatia import catia from pycatia.mec_mod_interfaces.part_document import PartDocument def draw_airfoil(mapped_pts, thickness): caa catia() doc caa.documents.add(Part) part doc.part sketch part.main_body.sketches.add(part.origin_planes.xy_plane) factory sketch.factory_2d for x, y in mapped_pts: factory.create_point(x, y) spline factory.create_spline(mapped_pts) sketch.close_edition() pad part.shape_factory.add_new_pad(sketch, thickness) part.update() return doc这份配置和脚本合起来就是「一键绘制」的全部内容。你可以把它理解成一个模板.dat 路径、目标类型、弦长、厚度、闭合容差都是参数改参数就能复用到不同翼型。实测下来一个 80 点左右的翼型从解析到出实体大概十几秒比手动建点快一个数量级。4. 验证请求与成功结果尺寸、闭合性与实体检查画出来不等于画对了。翼型建模最容易出问题的地方有三个尺寸不对、样条没闭合、拉伸方向反了。所以一键绘制之后必须有一套验证动作不能看到草图就收工。第一项验证是尺寸。弦长参数是 200mm那草图包围盒的 X 方向跨度应该接近 200mm。可以在脚本里直接读包围盒spa doc.part.spa_workbench bbox spa.get_body_bounding_box(doc.part.main_body) print(X span:, bbox[3] - bbox[0]) print(Y span:, bbox[4] - bbox[1])如果 X 跨度明显偏离弦长多半是 .dat 本身不是归一化坐标或者解析时把名称行当成了坐标。这时候回去检查第一行是不是被正确跳过了。第二项验证是闭合性。样条闭合的判据是首尾点距离小于容差。脚本里加一句断言assert math.hypot(mapped_pts[0][0] - mapped_pts[-1][0], mapped_pts[0][1] - mapped_pts[-1][1]) close_tol, 翼型未闭合如果这里报错说明 .dat 首尾点差得比较多enforce_close没生效检查一下容差是不是设得太小。第三项验证是实体。翼肋应该是拉伸出来的实体不是曲面。用part.update()之后检查 body 里有没有 Pad 特征features [f.name for f in doc.part.main_body.features] print(features)正常应该能看到类似Pad.1的条目。如果只有Sketch.1没有 Pad说明拉伸那一步失败了常见原因是草图没有闭合CATIA 拒绝生成实体。把这三项验证串起来就是一次完整的成功结果确认。我一般会在脚本最后打印一份摘要翼型: NACA 2412 点数: 81 弦长: 200.00 mm 厚度: 20.00 mm 闭合误差: 0.0000 mm 实体特征: Pad.1 状态: OK看到这份摘要才算是真正画完了。这套验证动作的价值在于它把「看起来对」变成了「数据上对」后面批量画机翼的时候任何一个截面出问题都能立刻定位。5. 常见报错排查401、local proxy failed、reading choices、OAuth跑这套流程报错基本集中在两类模型接入侧和 CATIA 自动化侧。我把踩过的几个典型错误列出来对照着查。401 Unauthorized出现在模型请求里几乎都是 Key 的问题。要么 Key 复制时带了空格要么配置文件里的api_key字段名写错要么 Key 已经失效。去 API Keys 页面重新生成一个替换后重试。注意 Base URL 和 Key 要配套别把别处的 Key 填到 TaoToken 的配置里。local proxy failed这种报错通常出现在网络层意思是请求没能到达目标地址。先确认base_url写的是https://taotoken.net/api没有多余路径再确认本机没有奇怪的网络拦截。如果是在公司内网检查一下出口策略是否放行了这个域名。reading choices相关的报错一般是返回体结构和预期不符。比如你按 OpenAI 格式去取choices[0].message.content但实际返回里choices是空的或者字段名不同。这时候把原始返回打印出来看别猜。多数情况是模型名写错了服务端返回了一个错误对象而你的代码还在按成功结构解析。OAuth报错多出现在 Claude Code 形态的接入里。如果你用的是 Claude Code 接入方式鉴权走的是另一套流程需要确认 Base URL、Key、Model ID 三件套都填了并且 Model ID 是 TaoToken 支持的名称。缺任何一个都会在握手阶段失败。参考 Claude Code 接入说明那一页把配置逐项核对一遍。CATIA 侧的报错也有几个高频的。Dispatch失败说明 COM 没注册或者 CATIA 没装好重装或者修复安装通常能解决。create_spline报错多半是点集里有重复点或者点数太少样条至少需要两个点实际建议 20 个以上。add_new_pad失败回去看闭合性验证九成是草图没闭合。排查的顺序建议是先确认模型链路通curl 能返回 choices再确认 COM 链路通能新建 Part最后才跑完整 skills。两条链路分开验证能把问题范围缩小一半。6. 把 skills 复用到实际翼型设计流程这套东西跑通之后真正的价值在于复用。你可以把catia_airfoil这个 skill 当成一个积木后面接上更多技能。比如批量读取一个文件夹里的多个 .dat循环生成多个翼肋再按翼展方向阵列就是一段机翼的骨架。再比如把弦长和厚度做成沿翼展变化的函数就能生成带扭转的机翼。我自己的用法是维护一个airfoils/目录里面放常用的 .dat 文件命名规范统一。每次要画新翼型只改 skills 调用里的dat_path和chord两个参数。如果要做参数化研究就把弦长、厚度、后掠角写成配置表让 Codex 循环调用。如果你打算长期做这类编码和自动化任务可以看一下 Coding Plan 页它更适合这种需要反复调用模型生成和修正脚本的场景https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite需要拿 Key 或者查接入细节从这里进API Keys 管理 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 。想先验证模型返回是否正常用模型对话页试一句https://taotoken.net/api?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite最后留一个我实际用下来的小技巧.dat 文件里的翼型名称行别删。解析时跳过它但把它记下来写进草图名称或者自定义属性里。这样以后打开 CATIA 文件一眼就知道这个翼肋用的是哪个翼型不用回去翻源文件。这个习惯在翼型多了之后特别省事。