
最近我在整理 NX Open 的学习笔记第一篇自然绕不开“二次开发语言发展”这个话题。原因很简单几乎每一个刚接触 NX 二次开发的朋友都被同一个问题卡住过网上教程有的是 GRIP有的是 UFUN有的叫 NX Open到底学哪个我当年就是这个问题绕了差不多两个星期。这篇笔记把语言演进脉络、多语言入口、选型逻辑和常见坑一次性说清楚适合准备入门 NX Open或者在老项目上换语言的工程师参考。1. 为什么老的GRIP和UFUN教程不能直接套用到NX Open上1.1 从Unigraphics到NX二次开发语言的三个代际NX 的历史很长早期叫 Unigraphics后来经过 UGS、Siemens PLM Software 的演变产品统一改名 NX。伴随产品迭代二次开发语言大致分了三代。第一代是 GRIP一种类似 BASIC 的脚本语言对老工程师来说上手极快适合做简单线框、基本几何创建和批量操作。第二代是 UG/Open API也就是大家常说的 UFUN用 C 语言函数库的方式暴露功能满屏都是UF_MODL_create_block这类函数。第三代就是现在的 NX Open一套面向对象的 API 体系在同一套对象模型上分别提供 C、.NET、Python 等入口。GRIP 和 UFUN 并不是被突然淘汰的。NX 的功能组件越来越多从单机设计走向 PLM 协同旧入口逐渐变成“能用但维护有限”。很多老教程讲的内容仍然有参考价值但不能直接抄到 NX Open 工程里编译。理解三个代际的差异比你记住几个函数名重要得多因为代码只是表象背后是 API 设计思想的换代。1.2 为什么单机脚本语言撑不起今天的协同场景语言更替背后是 CAD 软件架构的变化。早期 UG 更多是单机设计工具二次开发主要做点、线、面批量操作、出图脚本和特征清理。GRIP 这种解释执行的语言天然适合短平快的任务。现代 NX 承载的是 PLM 协同、大型装配、知识工程、自动化出图对象之间关系复杂必须把会话、零件、特征、表达式、单位制全部抽象成对象。GRIP 很难描述这种对象关系。比如“当前工作零件里的所有实体”这句话在 GRIP 里写起来很别扭但在 NX Open 里就是Session.GetSession().Parts.Work再加一个实体遍历。面向对象模型带来的是更清晰的组织方式part 下面有 bodybody 下面有 featurefeature 又关联表达式。这也是为什么你看新代码时到处是 Session、Part、Body、Feature。可以说语言发展史就是 NX 从绘图工具走向产品生命周期平台的历史。1.3 现在仍然存在的UFUN应该怎么看待它UFUN 这个入口并没有完全消失。在 NX Open 里你依然能看到 UFSession许多底层操作、文件交互、单位转换、装配遍历在 UF 层仍然可用。我用过一段时间后的感受是UFUN 适合做系统级操作比如批量设置属性、处理文件、操作层和组、单位换算NXOpen 更适合做对象级建模、特征编辑和 UI 交互。新手容易犯的错是拿到老 UFUN 代码硬套到 NX Open 工程里编译报错后一脸茫然。正确姿势是先确认需求是对象操作还是底层操作再选择入口。如果你要做一个测量工具优先用 NXOpen 的 Measurement、Body 这类对象如果你只是想批量给所有零件加一个属性走 UFSession 反而更方便。UFUN 和 NX Open 并不是水火不容在同一个项目里混用很正常关键是别让老代码的风格污染新系统设计。下面是目前我能梳理出的一个大致的代际对照方便你在心里建立时间轴。代际入口语言风格典型场景当前状态第一代GRIP类 BASIC 脚本简单建模、批量点线面基本处于维护状态第二代UFUNC 函数库文件操作、属性、底层交互底层能力仍然可用第三代NX OpenC / .NET / Python对象建模、特征、UI、自动化官方主推持续增强2. NX Open 的“多语言入口”到底是怎么设计的2.1 C、.NET、Python、KF 四个入口的分工NX Open 不是一个单一语言而是一套基于 C 几何内核的多语言绑定。官方的体系大致分四类NXOpen C 是原生入口调用效率最高NXOpen .NET 把对象模型暴露给 C# 和 VB.NET开发效率高NXOpen Python 近年在自动化领域越来越常用还有知识融合 KF用于参数化和规则驱动设计。它们共享同一套对象结构大部分类名和成员是一致的。比如创建一个圆柱体C 和 C# 里的方法名基本一致只是语法不同。这个设计特别关键你不需要同时学会几种语言再开始学透一门其他语言入口只是语法替换。我最早是从 C# 入手的后来看 Python 代码几乎不需要重新学因为类名、方法名、枚举值都能对上。语言入口推荐场景上手建议常见用途C复杂几何算法、高频循环、底层性能优化需要 C 基础网格、曲面、自定义算法.NET (C#)企业工具、UI、数据库、报表集成从 Journal 录制开始批量出图、属性管理、集成Python自动化、原型验证、数据处理录制 脚本改写快速验证、批量脚本知识融合 KF规则驱动的参数化设计理解规则与函数式写法知识模板、设计自动化2.2 Journaling录制我唯一的入门方式如果让我推荐最快入门路径那就是录制。NX 的 Journal 功能可以把一次菜单操作录制为代码。新建 Part、选体、求最小包容块、创建工程图你每点一步代码就增加一段。录制生成的代码有时有冗余但结构一定是官方认可的写法。我见过太多人捧着帮助文档从命名空间开始看结果一天下来什么都没记住。正确做法是先做操作再录脚本再改脚本最后查帮助。以“获取最小包容块”为例你可以先手工点一次测量再看录制结果调用了哪个方法。这比任何网课都真实。特别是刚接触 NX Open 的朋友不要急着写第一行代码先打开录制功能把一个完整流程走一遍你会突然明白对象模型的调用关系。2.3 帮助文档别看功能介绍要从程序集进官方帮助文档默认首页是功能导航新手容易被带偏。搜一个 BoundingBox结果几百条不知道怎么选。我的习惯是打开 .NET API Reference按类查。具体路径通常是帮助 - NXOpen .NET API Reference - Namespace 列表 - 找 Part、Body、Measurement 相关命名空间。看到类名后先看 Constructors 和 Methods。还有一个高效技巧录制生成代码后把类名复制到文档里搜索直接跳到该类页面再看周边成员。比如录制完出现BoundingBlockBuilder你就去查这个类的成员看它有哪些 Set 方法、Get 方法。不要从“功能分类”进要从“类成员”进效率完全不一样。3. C 和 .NET 两条主线项目里到底怎么选3.1 高频调用与底层算法先看有多少次循环语言选择不应该看个人喜好而应看调用模式。如果一段程序要对几万个面做几何计算每次计算都从托管层穿越到 native 层互操作开销会被放大。C API 被设计成原生直接调用不需要托管边界。我印象很深的一个项目是批量求一组 B 样条曲面的包络数据C# 调用 NXOpen 完成大概要二十多秒后来把核心循环改成 C 原生实现耗时降到一半以下。相反给零件写属性、生成 Excel 表格、调用 Web 服务这些操作本身不是性能瓶颈.NET 反而是提升效率的法宝。所以判断标准不是“哪个语言高大上”而是“这段代码每次要跑多少次循环”。循环在十万次以下你甚至感觉不到差异到了百万次级别托管层和 native 层的切换成本就会让你想骂人。3.2 交付周期与UIC#生态给你的额外红利NX Open .NET 的最大优势不是语言本身而是整个 .NET 生态。做企业内部工具几乎都要连数据库、读配置、导出报表或对接 MES。C# 里 Newtonsoft.Json、NPOI、Dapper 这些库直接就能用而用 C 做同样的事要额外处理依赖和编译环境。再说到界面。NXOpen .NET 可以配合 WinForms 或者 WPF 做自定义窗口控件成熟按钮事件、数据绑定都很顺手。如果你们团队要在两周内交付一个批量改属性工具C# 是最理性的选择。我个人的经验法则是凡是带“批量”“导出”“报表”“数据库”这些词的需求默认先选 C#凡是带“包络”“干涉”“网格”“点云”这些词的需求默认先考虑 C。3.3 需求倒推法花半小时把调用模式写出来做选型前花半小时把所有核心功能列出来评估每个功能的调用频率和复杂度。批量参数、报表集成走 .NET几何算法、网格处理走 C快速原型和测试走 Python规则模板走 KF。任何语言都能做另一件事但代价不同。拿最小包容块需求来举例。假设你要遍历五百个零件每个零件几千个面这就是高频几何循环建议把核心算法放 C外壳用 C# 拼界面和数据处理。如果只是用户点一次按钮算一个零件的包围盒那 C# 就够了别为了性能去折腾 C 工程。先想清楚调用模式再决定语言你会发现大多数项目根本不需要 C。4. 从热搜需求反推语言选型包容块、刀柄长度、公英制转换怎么落地4.1 最小包容块和最小包容柱算法为主语言为辅最近看到好多人在找最小包容块、最小包容柱的答案这个需求在测量、排版、自动化检测里非常常见。表面上是调一个接口实际上算法分几步。第一步拿到目标体的点集或边界表示排除装配坐标系的影响第二步通过变换求最小有向包围盒第三步把结果作为新的块体或者柱体创建出来。C 适合写第二步的优化循环因为要不断旋转试算计算量大C# 适合把第一步和第三步组织起来因为遍历装配、创建设计特征这些操作用对象模型写起来更清晰。至于热词里那个 pkm我猜大概率是 Parasolid 内核的 PK 接口NX 的几何内核就是 Parasolid。如果要做底层几何算法用 PK 接口比直接走 NXOpen 封装更高效但这需要单独学习 Parasolid 文档不建议新手一上来就碰。4.2 刀柄长度、英制转公制参数驱动类需求怎么拆搜索热词里还有刀柄长度、英制转公制。这类需求本质是表达式 Expression 和单位 Unit 的管理。刀柄长度往往要从刀具装配中读取驱动参数批量改刀柄长度就要遍历相关 Part找到表达式并修改再由 NX Open 触发模型重建。英制转公制在老代码里到处是 UF_UNIT 函数而 NXOpen 里用 Unit 和 UnitType 来管理。用 C# 做这类参数管理非常舒服遍历表达式、读属性、写日志都是很自然的操作。建议先录一遍手工操作确认入口对象是 Expression 还是 Unit 相关设置再动代码。别拿着旧代码直接替换新版 API 里单位换算的方式已经变化不少直接抄容易踩坑。4.3 一个跨平台视野Creo、CATIA、Revit、GIS 都在怎么做搜索热词里同时出现了 creo 二次开发、catia 二次开发、revit 二次开发、gis 二次开发说明做这行的朋友经常在不同平台之间横跳。Creo 主流是用 Pro/TOOLKIT 走 C也可以用 J-Link 走 JavaCATIA 是 CAA 和 AutomationRevit 最主流是 C#Altium Designer 是引用 DLL 做 .NET 扩展GIS 则更常见 Python 和 JS。这些平台的 API 对象模型差别很大但学习顺序惊人地一致先录宏或日志理解对象模型小步迭代再编译部署。NX Open 的优点是语言选择不折腾C 不合适就转 C#Python 能快速验证思路。所以从别的平台转过来的人不要有压力你已经懂“对象模型”这件事了剩下的只是类名和调用习惯不同。5. 版本、编译器和API新旧切换我踩过的坑及完整排查链路5.1 程序集版本匹配为什么你的dll换台NX就加载失败开发机和生产机版本不同是最常见的坑。NX Open .NET 的程序集按版本放在 NX 安装目录的 NXBIN\managed 下面不同版本的程序集强名称不完全一样。你机器上引用了 NX1926 的 NXOpen.dll编译出来的东西拷贝到 NX2212不一定能加载。有些环境会直接报“Could not load file or assembly”或者找不到命名空间。正确做法是在目标 NX 版本安装目录下重新引用对应 dll再编译一次。如果你负责维护多个版本的插件最好给每个版本建一个独立编译配置引用路径分开输出目录分开。别偷懒用一个统一引用等换版本时你会花更多时间排查奇怪问题。5.2 一个“编译通过却加载失败”的完整排查链路有回同事拿一个 NXOpen C# 插件给我看编译通过放进 startup 目录菜单加载直接报错。第一反应不是改代码而是看日志。NX 的开发者日志会记录程序集加载异常把异常信息贴出来。结果发现是 Could not load file or assembly再用工具看程序集版本原来同事引用的还是 NX1953 的程序集而目标机是 NX2206。重新编译后又出现找不到第三方依赖库的问题因为同事把 Newtonsoft.Json.dll 只放在了开发目录忘了复制到 NX 的 startup 目录。整个问题看着琐碎但排查链路一定要按顺序先看日志再看依赖然后版本最后才怀疑代码。很多人一上来就翻源码浪费半天时间结果只是版本引用问题。5.3 编译环境配置和平台目标的关键细节用 Visual Studio 打开 NXOpen 项目时目标框架常用 .NET Framework 4.7.2 或 4.8平台目标必须设为 x64因为 NX 是 64 位进程。用 32 位编译的 dll 加载必失败而且报错信息往往不会直接说“位数不对”会伪装成各种奇怪的异常。具体配置上项目属性 - 生成 - 平台目标 - 选择 x64。引用路径指向目标 NX 版本的 NXBIN\managed 目录下的 NXOpen.dll、NXOpen.UF.dll、NXOpenUI.dll、NXOpen.Utilities.dll。另外不建议用 .NET Core 或 .NET 5/6 做传统 NX 插件NX 主进程走的是 Framework 兼容路线图省心直接用 .NET Framework 最稳。5.4 被Deprecated的UFUN和新旧API共存老 UG 二次开发资料里的 UFUN 函数很多还在但官方标了 Deprecated新功能不再增强。你用 NXOpen C# 写项目时会经常看到UFSession.GetUFSession()它内部把 UF 函数包了一层。如果不查更新照抄十年前代码编译可能正常但维护很累。我的处理方式很直接编译输出窗口里凡是警告有 Deprecated 的去帮助文档查替代 API一次换干净。不要用禁用警告的方式压下去那些过期 API 通常只是在旧版本上验证过新版本几何内核一变结果可能就不对了。新旧 API 共存是这个平台的常态你要做的是明确边界而不是混在一起。6. 一点个人选型建议如果让我给刚入门的团队提建议先别在语言上站队。第一天就让所有人用 Journal 把一条完整流程录下来不管选 C# 还是 Python先看懂对象模型。第二步用 C# 做一个小工具比如批量导出图纸和属性报表把 UI、数据库、日志走通。第三步再考虑某个模块是否要调到 C 去优化多数项目根本到不了这一步。这几年见过太多团队因为语言偏好吵了几个月生产力为零。NX Open 语言发展的真正价值不是让你多学几门语言而是让你根据问题难度随时切换工具。能录制的先录制能用 C# 解决的别急着写 C等真正遇到百万次调用级别的问题再回头把核心算法用 C 重写一遍。这条路走下来既稳又省时间。