资讯详情

资讯详情

NX二次开发中UF_CURVE_ask_isocline函数怎么用?TaoToken统一Key通道调试UFUN等距曲线提取

1. 从等距线提取说起UF_CURVE_ask_isocline 到底解决什么问题做 NX 二次开发的朋友尤其是搞曲面分析和加工路径预处理的大概率会遇到一个需求拿到模型上某条等距线isocline的完整几何数据包括它由哪些面参与计算、方向矢量是什么、起止角度和步进角度是多少、最终生成了几条曲线。这些数据在手工建模时点几下就能看到但要在程序里批量提取、自动判断就得靠 UFUN 里的UF_CURVE_ask_isocline。这个函数属于uf_curve.h作用是询问等倾曲线特征的数据返回连接曲线特征的参数。你可以把它理解成一个“逆向读取器”等距线特征在 NX 里已经存在可能是用户手动创建的也可能是上游流程生成的你通过传入这个特征的 tag把它的内部参数全部读出来。读出来的东西包括面数组、方向矢量、角度字符串、曲线 tag 数组。适合谁用三类人最需要一是做曲面质量检查的需要批量判断等距线分布是否合理二是做 CAM 前处理的要把等距线转成刀路参考线三是做自动化建模的需要根据已有等距线反推参数再生成新的。如果你只是偶尔在 UI 里画一条看看那用不上这个函数但只要涉及批量、自动化、参数回读它就是绕不开的一环。我试过在一个叶轮叶片分析项目里用它批量提取等距线模型上有几十条手工点根本来不及。用这个函数配合遍历几分钟就能把所有等距线的面、角度、曲线数量整理成表。下面把参数、调用、编译配置、调试通道和排错一次讲清楚。2. 前置准备TaoToken 统一 Key 通道与 UFUN 调试环境在写代码之前先把两件事准备好NX 二次开发的编译环境以及调试请求的统一通道。很多人卡在第一步——Visual Studio 版本和 NX 版本不匹配编译出来的 DLL 加载就报错。我的建议是NX 12 配 VS2017NX 1847 以上配 VS2019 或 VS2022具体以你安装目录下UGOPEN里的头文件为准。编译配置的核心是三处包含目录指向%UGII_BASE_DIR%\ugopen库目录指向%UGII_BASE_DIR%\ugopen链接器附加依赖项加上libufun.lib、libugopenint.lib。字符集用多字节或 Unicode 都行但要注意 UFUN 里字符串参数的类型匹配混用会出乱码。然后是调试通道。UFUN 开发最烦的是报错信息不直观UF_CURVE_ask_isocline返回一个 int 错误码你得去查uf_err.h才知道什么意思。如果每次都在 NX 里跑一遍再看日志效率很低。我的做法是把调试请求统一走 TaoToken 的 API 通道用同一个 Key 管理所有调试调用省得在多个工具之间来回切 Key。TaoToken 的官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 。它的作用是给你一个统一的 Key把模型对话、编码辅助、文档查询这些请求都归到一个通道里。比如你在调 UFUN 时不确定某个参数含义可以直接在模型对话里问写 C 代码时用 coding-plan 辅助补全需要查 API 文档时走 doc 入口。这样调试过程中产生的请求都有记录方便回溯。具体操作先到 console 页面 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsole_debugutm_campaignrewrite 创建一个 Key然后在 api-keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapikeys_debugutm_campaignrewrite 管理这个 Key。如果你用 Claude Code 做辅助开发可以走 https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecode_debugutm_campaignrewrite 这个入口配置。长期做编码和 Agent 任务的建议直接上 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcodingplan_debugutm_campaignrewrite 比单次调用划算。这里要强调一点TaoToken 是调试辅助通道不是替代 NX 本身。你的 UFUN 代码还是在 NX 里跑TaoToken 帮你管理调试过程中的请求和文档查询。两者分工明确别搞混。3. 可复制配置UF_CURVE_ask_isocline 参数详解与 C 调用示例先把函数原型摆出来这是uf_curve.h里的定义UF_CURVE_ask_isocline( tag_t isocline_feat, // 输入等距线特征 tag int *face_cnt, // 输出参与计算的面数量 tag_p_t *faces, // 输出面 tag 数组需 UF_free 释放 double direction[3], // 输出等距线方向矢量 char **start_angle, // 输出起始角度需 UF_free 释放 char **end_angle, // 输出终止角度单角度时为 NULL char **step_angle, // 输出步进角度单角度时为 NULL int *curve_cnt, // 输出等距线数量 tag_p_t *curves // 输出曲线 tag 数组需 UF_free 释放 );参数里最容易踩坑的是内存释放。faces、start_angle、end_angle、step_angle、curves这五个输出参数凡是标了Output to UF_free的用完必须调UF_free或UF_free_array否则内存泄漏。end_angle和step_angle在单角度情况下返回 NULL释放前要判空。下面是一个完整的 C 调用示例假设你已经拿到了一个等距线特征的 tag#include uf.h #include uf_curve.h #include uf_modl.h #include uf_ui.h #include stdio.h extern DllExport void ufusr(char* param, int* returnCode, int rlen) { UF_initialize(); // 假设 isocline_feat 已通过选择或遍历获得 tag_t isocline_feat 0; // 这里用 UF_UI_select_feature 让用户选一个等距线特征 UF_UI_select_feature(请选择等距线特征, NULL, isocline_feat); int face_cnt 0; tag_p_t faces NULL; double direction[3] {0.0, 0.0, 0.0}; char* start_angle NULL; char* end_angle NULL; char* step_angle NULL; int curve_cnt 0; tag_p_t curves NULL; int err UF_CURVE_ask_isocline( isocline_feat, face_cnt, faces, direction, start_angle, end_angle, step_angle, curve_cnt, curves ); if (err 0) { char msg[512]; sprintf_s(msg, 面数量: %d, 曲线数量: %d\n, face_cnt, curve_cnt); UF_UI_write_listing_window(msg); sprintf_s(msg, 方向: (%.3f, %.3f, %.3f)\n, direction[0], direction[1], direction[2]); UF_UI_write_listing_window(msg); if (start_angle) { sprintf_s(msg, 起始角度: %s\n, start_angle); UF_UI_write_listing_window(msg); } if (end_angle) { sprintf_s(msg, 终止角度: %s\n, end_angle); UF_UI_write_listing_window(msg); } if (step_angle) { sprintf_s(msg, 步进角度: %s\n, step_angle); UF_UI_write_listing_window(msg); } // 遍历曲线 tag for (int i 0; i curve_cnt; i) { sprintf_s(msg, 曲线[%d] tag: %d\n, i, curves[i]); UF_UI_write_listing_window(msg); } } else { char errmsg[256]; UF_get_fail_message(err, errmsg); UF_UI_write_listing_window(errmsg); } // 释放内存 if (faces) UF_free(faces); if (start_angle) UF_free(start_angle); if (end_angle) UF_free(end_angle); if (step_angle) UF_free(step_angle); if (curves) UF_free(curves); UF_terminate(); } extern int ufusr_ask_unload(void) { return (UF_UNLOAD_IMMEDIATELY); }编译配置方面在 Visual Studio 里新建一个 DLL 项目配置类型选动态库。C/C 常规里的附加包含目录加上$(UGII_BASE_DIR)\ugopen链接器常规里的附加库目录加上同一路径输入里的附加依赖项加上libufun.lib;libugopenint.lib。平台选 x64别选 Win32NX 现在都是 64 位。如果你用 CMake 管理项目可以写一个CMakeLists.txtcmake_minimum_required(VERSION 3.15) project(NXIsoclineDemo) set(UGII_BASE_DIR C:/Program Files/Siemens/NX 12.0) include_directories(${UGII_BASE_DIR}/ugopen) link_directories(${UGII_BASE_DIR}/ugopen) add_library(NXIsoclineDemo SHARED main.cpp) target_link_libraries(NXIsoclineDemo libufun.lib libugopenint.lib)这套配置在 NX 12 VS2017 上实测可用。NX 1847 以上版本路径略有不同把UGII_BASE_DIR换成实际安装路径即可。4. 验证请求与成功结果用 NX 日志和返回值确认等距线提取正确代码写完了怎么确认提取结果是对的三个验证点返回值、NX 信息窗口输出、日志文件。返回值是最直接的。UF_CURVE_ask_isocline返回 0 表示成功非 0 就是错误码。常见的错误码有UF_CURVE_NOT_ISOCLINE传入的 tag 不是等距线特征、UF_CURVE_INVALID_TAGtag 无效。拿到错误码后用UF_get_fail_message转成文字直接写到信息窗口。信息窗口输出是第二层验证。上面代码里把面数量、曲线数量、方向矢量、角度都打印出来了。你可以在 NX 里手动创建一条等距线然后用代码读它对比手工看到的数据。比如手工创建时设了起始角度 0、终止角度 90、步进 15那代码读出来应该也是这三个值。如果对不上说明特征 tag 传错了或者选中的不是等距线特征。日志文件是第三层验证。NX 的日志默认在%TEMP%目录下文件名类似syslog.txt。你可以在代码里用UF_print_syslog把关键信息写进去跑完之后去日志里搜。这样做的好处是即使信息窗口被关掉了日志里还有记录。我试过在批量提取时用日志做校验把每条等距线的面数量、曲线数量写进日志跑完之后统计一下如果某条线的曲线数量是 0那大概率是特征有问题需要单独检查。这个方法比一条条在 UI 里点开看快得多。还有一个技巧把提取到的曲线 tag 再传给UF_CURVE_ask_curve_struct或UF_MODL_ask_curve_props看看能不能正常读出曲线属性。如果能读出来说明曲线 tag 有效如果报错说明curves数组里的 tag 有问题。这是交叉验证比只看返回值更可靠。如果你在调试过程中需要查某个 UFUN 函数的用法可以走模型对话入口 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchat_verifyutm_campaignrewrite 直接问比翻头文件快。查文档走 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdoc_verifyutm_campaignrewrite 。这些请求都用同一个 Key在 console 里能看到调用记录。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth 报错对照调试过程中遇到的报错分两类一类是 UFUN 本身的错误码一类是调试通道的报错。分开说。UFUN 错误码最常见的是UF_CURVE_NOT_ISOCLINE意思是传入的 tag 不是等距线特征。排查方法用UF_MODL_ask_feat_type查一下这个 tag 的特征类型等距线特征的类型码是UF_CURVE_ISOCLINE_FEAT。如果类型不对说明你选错了对象。另一个常见错误是UF_CURVE_INVALID_TAGtag 无效可能是特征已经被删除或者 tag 是跨部件传递的需要先做 tag 转换。调试通道的报错如果你用 TaoToken 的 API 做辅助查询可能会遇到 401。401 的意思是 Key 无效或过期。排查步骤先到 api-keys 页面确认 Key 还在然后检查请求头里的 Authorization 字段格式对不对通常是Bearer 你的Key。如果 Key 没问题还是 401检查一下是不是把 Key 写到了 URL 参数里而不是请求头有些接口只认请求头。local proxy failed这个报错通常出现在本地调试工具配置了代理但代理没启动的情况下。排查方法检查你的调试工具配置里有没有设置代理地址如果有确认代理服务是否在运行。如果不需要代理把代理配置清空。注意这里说的是本地调试工具的代理配置不是让你去搞什么网络代理别混淆。reading choices报错一般出现在解析 API 返回的 JSON 时字段名对不上或者返回结构变了。排查方法先把原始返回打印出来看看实际结构是什么再对照文档调整解析代码。常见原因是返回里多了或少了某个字段导致解析器读不到choices数组。OAuth 报错通常出现在用 Claude Code 或类似工具接入时授权流程没走完或者 token 过期。排查方法重新走一遍授权流程确认回调地址配置正确。如果用的是 TaoToken 的 Claude Code 入口按 https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecode_troubleshootutm_campaignrewrite 上的步骤重新配置。这里要提醒一句如果你在代码里同时用了 Cline MCP 或 Codex 的 auth.json 配置记得把三件套写全——Base URL、Key、Model ID。少任何一个都会报错。Base URL 填 https://taotoken.net/api Key 填你在 console 里创建的那个Model ID 按你实际使用的模型填。三个都对上才能正常调用。还有一个坑是字符编码。UFUN 返回的角度字符串是 char*如果你在 Unicode 项目里直接当宽字符用会出乱码。解决办法是统一用多字节字符集或者用MultiByteToWideChar转换。这个坑我踩过排查了半天才发现是编码问题。6. 语义一致 CTA把调试通道用起来别让 Key 管理拖慢进度回到最开始的问题为什么要在 NX 二次开发里引入 TaoToken 的统一 Key 通道因为 UFUN 调试本身就很琐碎如果每个辅助工具都要单独配 Key、单独管理时间全花在配置上了。统一通道的价值在于你只需要在 console 里创建一个 Key然后在模型对话、coding-plan、doc 查询、Claude Code 接入这些场景里复用同一个 Key调用记录集中可见排查问题时有据可查。具体怎么用分场景排障和接入相关的走 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapikeys_ctautm_campaignrewrite 管理 Key接入文档走 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdoc_ctautm_campaignrewrite 。这两个入口配合使用一个管凭证一个查用法。验证模型和快速问答走模型对话 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchat_ctautm_campaignrewrite 。比如你不确定UF_CURVE_ask_isocline的某个参数在特定 NX 版本里有没有变化直接问比翻文档快。长期做编码和 Agent 任务的走 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcodingplan_ctautm_campaignrewrite 。这个适合需要频繁调用、批量处理的场景比单次调用省事。如果你用 Claude Code 做辅助开发配置入口在 https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecode_ctautm_campaignrewrite 。按页面上的步骤把 Base URL、Key、Model ID 三件套填好就能在 Claude Code 里直接调用。最后说一个实用技巧把UF_CURVE_ask_isocline的调用封装成一个独立函数输入特征 tag输出一个结构体里面包含面数组、方向、角度、曲线数组。这样在主流程里只需要调这个封装函数内存释放也在封装内部处理不容易漏。封装函数的返回值用 int 表示成功失败结构体用引用传出。这个模式在批量处理时特别省心我现在的项目里就是这么干的。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →