1. NX 二次开发里最容易被低估的三类函数
如果你写过 NX Open 或 UFUN 的插件,大概会有这种体会:建模相关的函数查文档就能拼出来,但一碰到工程图、属性、视图这三块,就容易卡在“函数名记得住、参数传不对、结果验证不了”的状态。NX 二次开发常用函数实战这个题目,核心其实就落在工程图创建、读取属性、视图操作这三类高频场景上——它们几乎出现在每一个要出图、要写 BOM、要做图纸批处理的插件里。
这篇面向的是已经在写 NX 插件、需要把 AI 能力接进工具链的开发者。我会把 UF_ATTR、UF_DRAW、UF_VIEW 这几组函数的落地写法拆开讲,同时给出 config.toml 和 settings.json 的可复制骨架,把 TaoToken 作为统一的 Key/API 通道接进来。这样你的 NX 插件在读取完部件属性、生成完工程图之后,可以直接调用模型做属性补全、图纸说明生成或视图命名规范化,而不用在每台机器上散落一堆 Key。
先说清楚适合谁:能编译 NX Open C/C++ 或 C# 项目、知道 UF_initialize 和 UF_terminate 怎么配对、手上有一个能跑通的插件工程。如果你还没到这一步,建议先把 NX Open 的 Hello World 跑通再回来。
2. 读取属性与工程图函数的落地写法
2.1 读取部件属性的函数组合
读取属性这块,最常用的是UF_ATTR_ask_part_attrs和UF_ATTR_read_value。前者拿到部件上所有属性的列表,后者按类型和标题精确取值。实际写的时候,我一般先用UF_ATTR_ask_part_attribute拿到属性对象的标识,再决定是遍历还是直取。
// 读取当前工作部件的所有属性 tag_t part = UF_ASSEM_ask_work_part(); UF_ATTR_part_attr_p_t attrs = NULL; int attr_count = 0; UF_ATTR_ask_part_attrs(part, &attrs, &attr_count); for (int i = 0; i < attr_count; i++) { char title[UF_ATTR_MAX_TITLE_LEN + 1] = {0}; UF_ATTR_ask_title(attrs[i].attr_id, title); // 按标题过滤你关心的属性 }如果要读一个没打开的部件文件里的属性,用UF_ATTR_ask_part_attrs_in_file,它不需要你先把部件加载进会话,做批量 BOM 提取时很省事。取值的时候注意类型:字符串用UF_ATTR_read_value配UF_ATTR_STRING_TYPE,数值属性要区分整型和浮点,传错类型不会报错但会拿到脏数据。
2.2 工程图创建与信息查询
新建工程图用UF_DRAW_create_drawing,打开用UF_DRAW_open_drawing,删除和更名分别是UF_DRAW_delete_drawing和UF_DRAW_rename_drawing。这几个函数的参数里,图纸大小、比例、单位、投影角这几项最容易传错,因为它们和UF_DRAW_ask_drawing_info返回的结构体字段是一一对应的。
// 查询当前工程图页面信息 tag_t drawing = UF_DRAW_ask_current_drawing(); UF_DRAW_drawing_info_t info; UF_DRAW_ask_drawing_info(drawing, &info); // info.size / info.scale / info.units / info.projection_angleUF_DRAW_ask_drawings能一次拿到当前工作部件里所有工程图页面的标识数组,做图纸遍历或批量导出时先调它。设置信息用UF_DRAW_set_drawing_info,改比例、改单位都走这里,改完记得调一次更新。
2.3 视图操作的核心函数
视图这块函数最多,但真正高频的就那几个。UF_DRAW_ask_views查某张工程图上的视图数量和标识数组,UF_DRAW_ask_view_scale拿比例(参数化比例还会返回表达式标识),UF_DRAW_set_view_scale设比例。视图显示设置用UF_DRAW_ask_view_display和UF_DRAW_set_view_display,它们对应的就是交互状态下双击视图弹出的“视图样式”对话框。
移动视图用UF_DRAW_move_view,跨图纸移动用UF_DRAW_move_view_to_drawing。按名称找视图用UF_VIEW_ask_tag_of_view_name,这个在批处理里特别有用,因为视图名往往是你自己命名的规则。删除视图用UF_VIEW_delete,注意它会返回错误码,视图被引用时删不掉,要先判断返回值。
添加视图的函数按类型分得很细:辅助视图UF_DRAW_add_auxiliary_view、局部视图UF_DRAW_add_detail_view、圆形局部视图UF_DRAW_add_circ_detail_view、正交视图UF_DRAW_add_orthographic_view。剖视图这边,简单剖UF_DRAW_create_simple_sxview、阶梯剖UF_DRAW_create_stepped_sxview、半剖UF_DRAW_create_create_half_sxview、旋转剖UF_DRAW_create_revolved_sxview、展开剖UF_DRAW_create_unfolded_sxview。中心线和螺栓圆用UF_DRF_create_linear_cline、UF_DRF_create_3pt_cline_fcir这一组。
3. TaoToken 统一 Key 通道的前置配置
3.1 为什么要在 NX 插件里接统一通道
NX 插件调用 AI 的典型场景是:读完属性后让模型补全缺失字段、生成图纸说明、或者把视图名规范化。如果每个开发者本地各配一套 Key,换机器、换项目就要重新配,团队协作时很容易出现“我这能跑你那报 401”的情况。把 TaoToken 作为统一通道,好处是 Key 集中管理,插件里只读配置不硬编码。
TaoToken 的 API 地址是https://taotoken.net/api,官网入口在https://taotoken.net/?utm_source=taotoken_aicg_blog_end。注意 API 地址不带 UTM 参数,配置里直接写这个就行。
3.2 config.toml 骨架
# config.toml —— NX 插件读取的 AI 通道配置 [ai] provider = "taotoken" base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" # 从环境变量读,不写死在文件里 model = "claude-sonnet-4-20250514" timeout_seconds = 60 max_retries = 2 [nx] attr_scan_batch = 200 drawing_export_dir = "./output/drawings" view_name_rule = "VIEW_{index:03d}"3.3 settings.json 骨架
{ "ai": { "provider": "taotoken", "baseUrl": "https://taotoken.net/api", "apiKeyEnv": "TAOTOKEN_API_KEY", "model": "claude-sonnet-4-20250514", "timeoutSeconds": 60 }, "nx": { "attrScanBatch": 200, "drawingExportDir": "./output/drawings", "viewNameRule": "VIEW_{index:03d}" } }Key 的获取在控制台的 API Keys 页面,地址是https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite。拿到之后写进环境变量,别提交到仓库。接入文档在https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite,里面有各语言的调用示例。
4. 验证请求与成功结果
4.1 先验证通道通不通
在把 AI 调用塞进 NX 插件之前,先用一个最小请求验证通道。用 curl 打一次模型对话接口:
curl -X POST "https://taotoken.net/api/v1/chat/completions" \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "回复 OK 两个字母"}] }'返回里能看到choices[0].message.content就是通的。如果这一步就报 401,先查 Key 有没有写对、环境变量有没有生效。模型对话入口在https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite,可以在页面上先手动试一次。
4.2 在插件里验证属性读取结果
属性读取的验证动作很简单:读完之后把结果打到日志,和 NX 交互界面里“文件-属性”看到的值对一遍。重点核对三类:字符串属性有没有截断、数值属性类型对不对、多值属性有没有漏读。我一般会写一个临时的 dump 函数,把UF_ATTR_ask_part_attrs拿到的每个属性的标题和值都打出来。
4.3 验证工程图与视图操作
工程图创建后,用UF_DRAW_ask_drawings确认新图纸在列表里,再用UF_DRAW_ask_drawing_info核对大小、比例、单位、投影角是不是你设的值。视图操作后,用UF_DRAW_ask_views确认视图数量变化,用UF_DRAW_ask_view_scale确认比例生效。移动视图后,用UF_DRAW_ask_view_borders拿边界信息,确认位置变了。
5. 本篇常见报错排查
5.1 属性读取返回空或脏数据
最常见的原因是类型不匹配。UF_ATTR_read_value的第三个参数是类型,字符串、整型、浮点必须对上。另一个原因是属性在部件上不存在,但函数不报错只返回空,所以读之前最好先用UF_ATTR_ask_part_attrs确认属性存在。如果读的是未打开文件,确认用的是UF_ATTR_ask_part_attrs_in_file而不是会话内的函数。
5.2 工程图函数返回错误码
UF_DRAW_create_drawing失败通常是图纸大小或单位参数不合法,检查你传的值是不是在 NX 支持的枚举范围内。UF_DRAW_set_drawing_info改比例时,如果图纸上有视图已经引用了旧比例,可能改不动,要先处理视图。UF_VIEW_delete返回错误码说明视图被引用,先解除引用再删。
5.3 AI 调用报 401 或超时
401 基本是 Key 问题:环境变量没生效、Key 复制时带了空格、或者用了错误的 base_url。超时的话先看timeout_seconds设了多少,NX 插件里同步调用 AI 会阻塞 UI,建议放到后台线程。如果返回 429,说明触发了限流,把max_retries调大并加退避。
5.4 视图比例设置不生效
UF_DRAW_set_view_scale设的是指定值,但如果视图比例是参数化的,直接设值可能被表达式覆盖。先用UF_DRAW_ask_view_scale看返回的表达式标识是不是 NULL_TAG,不是的话要改表达式而不是直接设比例。
6. 把 AI 能力接进 NX 工具链的下一步
属性读取、工程图创建、视图操作这三类函数跑通之后,你的 NX 插件就有了“读数据、出图纸、调视图”的基础能力。接下来把 TaoToken 接进来,就能在这些环节上叠加 AI:读完属性让模型补全缺失字段,生成工程图后让模型写图纸说明,视图批量创建后让模型按规则重命名。
长期做编码和 Agent 类工具的话,可以看 Coding Plan,地址是https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite,适合需要稳定调用、批量任务的场景。接入细节和参数说明在接入文档里,地址是https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite。Key 在 API Keys 页面管理,地址是https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite。
实际写的时候有个小技巧:把 AI 调用封装成一个独立的AiClient类,NX 插件里只调AiClient::complete(prompt),这样换模型、换通道、加重试都只改一个地方。属性读取和视图操作的函数调用保持纯 UFUN,不要和 AI 逻辑混在一起,方便单独测试。