1. NX二次开发入门

NX 二次开发的核心价值,是把重复性的建模、装配、制图和数据处理工作交给程序自动完成。要迈出第一步,必须先弄清楚 NX 对外提供了哪些编程接口、这些接口分别适合什么场景,然后搭好一个能编译、能运行、能调试的最小工程。本章围绕这条主线展开:先认识 NX Open API 的体系结构,再完成开发环境配置,最后写出并调试第一个 Hello World 程序。

一、NX Open API 体系:先分清“用哪套接口”

NX 的二次开发接口统称为 NX Open,它并不是单一语言的一套函数库,而是按语言和运行方式划分的多个入口。理解它们的差异,比记住某个函数名更重要。

从语言维度看,最常用的是 NX Open .NET(C#/VB.NET)、NX Open C/C++、NX Open Java 以及 NX Open Python。其中 C# 与 Python 上手最快,C/C++ 功能最底层、性能最好,Java 在实际项目中较少使用。从运行方式看,又分为内部模式(Internal)和外部模式(External):内部模式程序运行在 NX 进程内,可以访问完整界面与交互对象,通常以 DLL 形式被 NX 加载;外部模式是独立进程,通过远程调用与 NX 通信,适合批处理、无人值守任务,但无法直接操作界面。

此外还有两类容易被混淆的接口:Journal(录制)与 GRIP。Journal 是把用户在界面上的操作录制成 C#、Python 或 VB 代码,是学习 API 用法最直接的途径;GRIP 是 NX 早期自带的专用语言,语法独立、功能受限,新项目一般不再选用,但阅读老代码时仍会遇到。

选择建议可以归纳为:需要与用户交互、嵌入菜单和对话框的,用内部模式 + C#;需要批量处理大量零件、夜间跑任务的,用外部模式或 Python;需要极致性能或访问底层内核的,用 C/C++。本章后续示例统一采用 C# + 内部模式,因为它与 Visual Studio 集成最好,调试体验最完整。

NX Open API 体系与选型路径 NX Open 统一接口层 C# / VB.NET 推荐入门 C / C++ 底层高性能 Python 脚本批处理 Java 较少使用 内部模式 Internal 运行于 NX 进程内 · DLL 加载 可访问界面、对话框、选择对象 适合菜单命令与交互工具 外部模式 External 独立进程 · 远程调用 NX 无界面,适合批量与无人值守 启动慢,不能直接操作 UI Journal 录制 界面操作 → 自动生成代码,学习 API 最快途径 GRIP(历史遗留) 独立语法,功能受限,仅维护老代码 本章选型:C# + 内部模式 —— 与 Visual Studio 集成最佳,调试体验最完整

二、开发环境搭建:三样东西缺一不可

要让 C# 代码在 NX 里跑起来,需要三部分配合:NX 本体、Visual Studio、以及NX Open 的引用程序集。NX 安装完成后,程序集位于安装目录下的 NXOPEN 文件夹中,例如 D:\Siemens\NX 12.0\NXOPEN\,其中 NXOpen.dll、NXOpen.UF.dll、NXOpen.Utilities.dll 是最常用的三个。

具体操作顺序如下。第一步,确认 NX 版本与位数(64 位),并记录安装路径。第二步,安装 Visual Studio,建议 2019 或更高版本,安装时勾选“.NET 桌面开发”工作负载。第三步,新建“类库(.NET Framework)”项目,目标框架选择与 NX 匹配的版本(NX 12 通常对应 .NET Framework 4.6 及以上)。第四步,在项目中添加对上述 NXOpen 程序集的引用,并把它们的“复制本地”属性设为 False,避免与 NX 自带版本冲突。第五步,设置生成输出路径,或后续手动把 DLL 放到 NX 能识别的目录。

这里有一个容易踩的坑:目标框架版本必须与 NX 内部使用的 .NET 版本兼容。如果框架选得过高,NX 加载 DLL 时会直接报错,且错误信息往往不指向真正原因。另一个坑是平台目标,必须设为 x64,因为 NX 是 64 位程序,AnyCPU 在某些情况下会导致加载失败。

建议在项目属性中把“生成”事件的输出目录直接指向一个自定义的 startup 文件夹,例如 D:\NXDev\startup\,后续只需在 NX 中配置该目录为启动目录,即可免去反复拷贝 DLL 的麻烦。

三、第一个 Hello World 程序

内部模式的入口是一个带 Main 方法的类,NX 加载 DLL 后会调用它。下面是最小可运行示例,功能是在 NX 信息窗口中输出一行文字,并弹出一个提示框。

using System;
using NXOpen;
using NXOpen.UF;

public class HelloWorld
{
    private static Session theSession = Session.GetSession();
    private static UI theUI = UI.GetUI();

    public static void Main(string[] args)
    {
        try
        {
            // 1. 在信息窗口输出
            theUI.NXMessageBox.Show("Hello", NXMessageBox.DialogType.Information,
                                    "Hello World from NX Open!");

            // 2. 写入信息窗口
            theUI.WriteListingWindow("Hello World - 第一个 NX Open 程序运行成功。\n");
            theUI.OpenListingWindow();
        }
        catch (Exception ex)
        {
            theUI.NXMessageBox.Show("Error", NXMessageBox.DialogType.Error, ex.Message);
        }
        finally
        {
            // 内部模式通常不主动退出 NX
        }
    }
}

代码中有几个关键点值得注意。Session.GetSession() 是获取当前 NX 会话的唯一入口,几乎所有 API 调用都要通过它或其派生对象。UI.GetUI() 拿到界面对象,用于弹框和写信息窗口。NXMessageBox.Show 的第一个参数是标题,第二个是类型,第三个是正文。整个逻辑包在 try/catch 中,是因为 NX Open 的异常如果不捕获,会直接导致 NX 崩溃或静默失败,这对调试非常不利。

编译成功后,把生成的 DLL 放到 NX 的启动目录,然后在 NX 中通过“文件 → 执行 → NX Open”选择该 DLL 运行。如果一切正常,会先弹出提示框,随后信息窗口出现文字。

四、调试方法:让错误“看得见”

NX Open 调试最大的难点在于:程序运行在 NX 进程内,不能像普通控制台程序那样直接 F5 启动。常用做法有两种。

方法一:附加到进程。先启动 NX,在 Visual Studio 中选择“调试 → 附加到进程”,找到 ugraf.exe(NX 主进程),附加后在代码中打上断点,再在 NX 中触发 DLL 运行,断点即可命中。这种方式最接近真实运行环境,推荐作为主要调试手段。

方法二:写日志文件。在关键位置把变量值、执行阶段写入文本文件,适合无法附加进程或需要长时间观察的场景。例如在 catch 块中把 ex.ToString() 写入 D:\NXDev\log.txt,可以完整保留堆栈信息。

调试时还要注意几个典型现象:如果 DLL 加载后毫无反应,多半是 Main 方法签名不对或类不是 public;如果弹出“无法加载程序集”,通常是目标框架或平台目标不匹配;如果断点显示为空心圆并提示“不会命中”,说明符号文件未加载或代码版本与 DLL 不一致,重新生成并确认输出路径即可。

不要用 Console.WriteLine 输出调试信息。内部模式下没有控制台窗口,这些内容会被丢弃,容易误判为“程序没执行”。统一使用信息窗口或日志文件。

五、小结与检查清单

入门阶段的目标不是写出复杂功能,而是打通“写代码 → 编译 → 加载 → 运行 → 看到结果 → 定位错误”这条完整链路。只要这条链路稳定,后续学习建模 API、装配 API 就只是替换函数调用的问题。

检查项正确做法常见错误
项目类型类库(.NET Framework)误建控制台应用
目标框架与 NX 匹配的 .NET 版本选得过高导致加载失败
平台目标x64AnyCPU 或 x86
NXOpen 引用复制本地 = False复制本地 = True 引发版本冲突
入口方法public static void Main(string[] args)签名不符,NX 找不到入口
异常处理try/catch 包裹并输出堆栈不捕获,NX 直接崩溃
调试方式附加到 ugraf.exe 或写日志依赖 Console 输出

把上表逐项核对一遍,再运行一次 Hello World,如果信息窗口出现预期文字,说明开发环境已经可用。接下来就可以在这个骨架上逐步加入建模、查询和自动化逻辑。