Creo 制造模型参数创建没生效?用 TaoToken 接入的 Codex 查 ProParameterCreate
2026/9/19 23:43:16 网站建设 项目流程

Creo 制造模型参数创建没生效?用 TaoToken 接入的 Codex 查 ProParameterCreate

这段 Pro/Toolkit 代码看起来没有语法问题:ProMdlCurrentGet拿到当前模型,ProMfgAssemGet取到制造装配,ProMdlToModelitem转出proItem,给new_value.type设成PRO_PARAM_STRING,再用wcscpynew_value.value.s_val里写"12345",最后调ProParameterCreate建一个叫「零件代号」的字符串参数,并且用if (status == PRO_TK_NO_ERROR)包了一层判断。可编译通过、运行也不弹错,回到 Creo 的制造模型参数表里看,要么压根没有这一行,要么多出一个空值参数,这就很难受了。我这次的排查路径不是反复改代码试,而是用 TaoToken(https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=)接入 Codex,让它把这段源码逐行读出来对照头文件语义定位。这里要说清楚:TaoToken 只提供 Key 和模型通道,不参与 Pro/Toolkit 的任何建模动作,参数建不建得上,最终还是由 Creo 的 API 返回值说话。

一、现象:ProParameterCreate 走了,制造模型的参数表却是空的

先把现象拆细,因为「没生效」至少有三种不同表现,排查方向完全不一样。

第一种是参数确实没建上。ProParameterCreate返回的不是PRO_TK_NO_ERROR,但代码里只用if判了一次,status被反复赋值覆盖,最后一次赋的是ProParameterCreate的返回值,可你没有把它打印出来、也没有对它做分支,于是错误码被吞掉了。你能看到的只有「参数表里没有」,看不到究竟是不合法入参、参数已存在、还是权限不足。

第二种是参数建上了,但建错了对象。制造模型(ProMfg)和它对应的制造装配(ProAssembly)是两个概念,ProMfgAssemGet拿到的model是那个装配。如果ProMdlToModelitem的入参用的是model而不是modelmfg,那么proItem指向的 owner 就是装配,参数会被挂到装配上。你如果只盯着制造模型的参数表看,自然什么都看不到——参数其实存在,只是长在另一个模型上。

第三种是参数建上了、对象也对,但值是空的或乱码。这种最典型的原因是ProParamvalue的联合体成员和type不配套,或者字符串缓冲、长度没对齐。题目里那段代码把注释掉的ProWstringCopy(strmfg.GetBuffer(), new_value.value.s_val, ii)扔在一边,改用wcscpy(new_value.value.s_val, _T("12345")),同时上面还留着一句被注释的new_value.value.d_val = 12;。这三行代码其实在互相打架:原本想写 double,后来改成写字符串,但长度和缓冲区的关系没人再核对过。

我遇到的现场是第三种加第一种的混合:参数行出现了,值是空的,status打印出来也不是PRO_TK_NO_ERROR。所以后面的排查我没有再凭感觉改,而是让 Codex 把「谁指向谁、哪个字段配哪种类型、返回值有哪几类」全部列出来。

二、前置:TaoToken 提供 Key 与通道,Codex 负责读代码

Pro/Toolkit 这类二次开发代码,难点不在语法,在语义:ProMdlProMfgProAssembly这几个类型在头文件里定义得很接近,编译器能过,运行期才出问题;ProParamvalue是个带 type 标签的联合体,写错成员不会报错,只会写进一块语义不对的内存。这类问题靠搜索引擎翻帖子效率很低,因为别人贴的代码往往和你手上的 SDK 版本、Creo 版本不一致。

我的做法是先把「上下文」喂进去,再让 Codex 帮我做静态审读。上下文包括四样:完整的这段函数、ProParamvalue在你本机 protoolkit 头文件里的声明、ProParameterCreate的函数原型与注释、以及ProMdlToModelitem的原型。头文件那两段一定要用你自己安装目录里的,不要用网上的,因为数组维度、返回码枚举在不同版本里会变。

接入这一步只做两件事:在 TaoToken 官网注册账号,然后在控制台创建一个 Key。Key 只用于让 Codex 走 TaoToken 的通道,不会写入任何 Creo 工程,也不会改变 Pro/Toolkit 的构建方式。这一步不需要装插件、不需要改 Creo 的启动配置、不需要动 protk.dat。

有一点要提前说清楚,避免误解:Codex 在这件事里的角色是「读代码 + 解释结构 + 列出可能的返回码分支」,它不会替你修改模型,也不应该让它凭空生成一段你没验证过的 Pro/Toolkit 代码直接扔进项目。凡是涉及 API 调用顺序的结论,最终都要回到头文件注释和实际运行的返回值上确认。

三、可复制配置:Codex 的 config.toml 与 API Key 环境变量

Codex 的配置走config.toml,不是在界面里点。配置文件默认在用户目录下的.codex/config.toml。把下面这段按需替换后写进去即可,重点是base_url必须是https://taotoken.net/api,不要在后面接/v1,也不要带任何查询参数:

model_provider = "taotoken" model = "gpt-5-codex" model_reasoning_effort = "high" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "responses"

Key 用环境变量传,不要硬编码进文件。Windows 的 PowerShell 里可以这样设:

$env:TAOTOKEN_API_KEY = "YOUR_API_KEY"

macOS 或 Linux 的 shell:

export TAOTOKEN_API_KEY=YOUR_API_KEY

几个容易填错的地方。model要填你在 TaoToken 控制台模型列表里实际看到的 ID,不要照抄别人的;wire_api如果填responses跑不通,可以改成chat再试,具体以接入文档为准。另外要确认你的环境里没有残留的OPENAI_API_KEY或旧 provider 配置,Codex 读取时的优先级可能会让你以为改的是新配置,实际还走着老地址。

配置文件保存后,在工程目录下起 Codex。如果不想污染默认配置,也可以在config.toml里加一个 profile 段,用codex --profile taotoken显式指定。

四、验证:让 Codex 对着 ProParamvalue 与 ProParameterCreate 逐行核对

配置完成后先做一次最轻量的验证,确认通道是通的:起一个 Codex 会话,让它读一下当前目录的文件列表,或者简单解释一段本地文本。这一步只验证「能稳定读到本地产物、能返回结果」,不要一上来就让它分析整份 Pro/Toolkit 代码。

通道确认没问题后,把这段函数和两个头文件声明一起给 Codex,然后按下面的顺序追问。第一问,请它把new_value的内存布局和type/value两个字段的关系讲清楚,特别指出PRO_PARAM_STRING对应的是哪一个联合体成员,以及s_val的数组维度是多少。第二问,让它把wcscpy那行和被注释的ProWstringCopy那行放在一起对比:源串的实际字符数、目标缓冲区容量、第三个参数的含义分别是什么,哪种写法会越界,哪种写法会因为长度参数语义不同而截断或漏掉终止符。第三问,请它列出ProParameterCreate在这个 SDK 版本里可能返回的几种ProError,并说明每一种通常对应什么原因。

这三问的价值在于,它逼着你去翻头文件,而不是停留在「返回值不是 NO_ERROR 所以失败」这种结论上。我那次核对出来的关键点有三个:ProMdlToModelitem的入参拿的是model而不是modelmfgproItem的归属对象就已经错了;s_val是宽字符数组,wcscpy不检查边界,源串长度必须严格小于数组容量;返回码被赋值覆盖后没有分支,导致真正的失败原因不可见。

接下来让 Codex 只做一件事:给出「最小修改清单」,每条修改都要写明依据是哪一行头文件声明,而不是给你一段新代码。改完之后回到 Creo,重新编译 dll、重启或重新加载应用,再打开制造模型的参数表核对「零件代号」是否出现、值是否是你要写入的字符串。这一步必须人工确认,不要只看日志。

五、本篇常见错排查:s_val、返回码、proItem 三处最容易踩

把这次排查过的东西整理成清单,按出现概率从高到低排。

第一,字符串缓冲与长度不匹配。注释掉ProWstringCopy本身没错,错在换用wcscpy之后没有人再确认s_val的容量。宽字符数组的容量单位是wchar_t,不是字节;wcscpy会把源串连同结尾的终止符一起写进去,所以源串字符数加一必须小于数组维度。如果s_val的维度是 32,你写"12345"是安全的,但如果后面改成从CString里取用户输入的中文参数名,长度立刻就会超。另外ProWstringCopy的第三个参数在部分版本里是「要复制的字符数」,不含终止符,这个语义一定要看头文件注释,不要凭记忆推断。

第二,返回码只赋值不细分。status在同一段代码里被ProMdlToModelitemProParameterCreate连续覆盖,两个调用的错误被压成了一个变量。更糟的是if (status == PRO_TK_NO_ERROR)只区分了「成功」和「非成功」,非成功时没有任何输出。建议的做法是每个 API 调用后立刻判断并打印数值化的错误码,参数已存在、入参非法、权限不足、一般性错误这些分支要分开看,处理方式完全不同——参数已存在时你可能只需要ProParameterModifyProParameterValueSet去更新值。

第三,proItem的来源对象不对。ProMfgAssemGet返回的是制造装配句柄,用它去ProMdlToModelitem,参数就挂到装配上了。制造模型的参数要建在制造模型本身,所以这里应该用ProMdlCurrentGet拿到的那个句柄。类型别名相近,编译器不会拦你,只能靠人逐行核对。

第四,new_value.type与联合体成员不一致。代码里先注释了d_val,又用s_val赋值,如果type因为复制粘贴还留在PRO_PARAM_DOUBLE上,读出来的就是浮点解释后的垃圾值。改类型之后一定要回头确认赋值语句用的是同一个成员。

第五,参数表看不到但参数存在。除了挂错对象,还有一种情况是当前窗口显示的模型和参数所属模型不是同一个,或者模型处于只读状态、没有进入修改模式,此时创建会失败或写不进去。重新加载 dll 之后记得重新打开一次制造模型再核对。

第六,编译产物没更新。Pro/Toolkit 的 dll 被 Creo 加载后未必会自动重载,改完代码只重新编译、不重启或不做增量注册,跑的仍然是旧版本,这时候任何排查都是在看历史结果。

六、继续排障与接入入口

如果你手上也是类似的情况,先别急着改代码,按上面第四节的三问顺序把ProParamvalue的字段语义、ProWstringCopy的长度含义、ProParameterCreate的返回码分支确认清楚,大部分「参数没生效」会自己浮出水面。

需要 Key 和接入配置的话,控制台里创建:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=creo_proparam,Codex 的base_urlwire_api等字段的具体写法以接入文档为准:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=creo_proparam。只想先在网页里验证一下模型通不通,可以直接用模型对话:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=creo_proparam。如果这类 Pro/Toolkit 代码审读是长期工作,每天都要反复读头文件、对返回码,可以看 Coding Plan 的额度方式:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=creo_proparam。

最后再强调一次边界:TaoToken 在这里只是把 Key 和通道给到 Codex,ProParameterCreate建没建上、建在哪个模型上、值对不对,全靠 Creo 的返回值和参数表来判定。

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

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

立即咨询