从零开始玩转 NX 二次开发:C# 与 VB.NET 实战入门指南
你有没有遇到过这样的场景?
每天重复打开 NX,新建零件、拉伸建模、标注尺寸、出图归档……一套流程走下来,熟练工也要十几分钟。如果企业有上百个类似结构的变型设计,靠人工操作不仅效率低,还容易出错。
这时候,很多人会想到“能不能让软件自己来做?”
答案是:完全可以!而且比你想象中更简单。
今天我们就来聊聊如何用C# 或 VB.NET给 Siemens NX “装上大脑”,实现自动化建模、批量处理和系统集成——这正是NX 二次开发的核心价值所在。
为什么选择 C# 和 VB 来做 NX 开发?
Siemens NX 是工业设计领域的“全能选手”,集 CAD/CAM/CAE 于一体,在航空、汽车、模具等行业广泛应用。但它的标准功能再强大,也难以覆盖所有企业的定制需求。
比如:
- 某车企要根据 Excel 表格自动生成发动机支架族件
- 某模具厂希望一键完成模架装配 + 标准件插入 + 工程图输出
- 某研究院需要将仿真参数自动写入模型属性并与 Teamcenter 同步
这些“个性化”任务,靠点鼠标完不成,必须通过编程扩展来解决。
而 NX 提供了多种开发方式:Journal 脚本、Block UI Styler、C++ API、.NET 开发等。其中,基于 .NET 的 C# / VB.NET 开发因其易上手、功能强、生态好,已经成为大多数工程师的首选。
📌一句话总结:
如果你会一点编程,又常和 NX 打交道,那么用 C# 或 VB 写插件,就是提升生产力的“杠杆支点”。
核心武器:NX Open for .NET 到底是什么?
NX 的“后门”叫NX Open API,它是一套官方提供的编程接口,允许外部程序操控 NX 的内核功能。
我们重点关注的是它的 .NET 版本 ——NX Open for .NET。这个东西有多厉害?
你可以把它理解为一个“遥控器”:
- 它封装了几乎所有 NX 操作(建模、装配、制图、分析)
- 支持 C# 和 VB.NET 编程语言
- 可以在 Visual Studio 中直接调试
- 最终编译成 DLL 插件,注册进 NX 菜单就能用
它是怎么工作的?
当你在 NX 里点击一个自定义命令时,背后发生的过程其实是这样的:
- NX 启动 .NET 运行时环境(CLR)
- 加载你的 DLL 程序集
- 调用
Main(string[] args)方法启动逻辑 - 通过
NXOpen.Session获取当前会话 - 调用各种类库方法执行建模或数据操作
- 完成后释放资源并退出
整个过程就像你写了一个“机器人助手”,让它代替你去操作 NX。
先看个例子:用 C# 自动生成一个立方体
别被“API”、“会话”这些词吓到,其实代码非常直观。下面是一个完整的 C# 示例,功能是在 NX 中创建一个 10×20×30mm 的立方体。
using System; using NXOpen; using NXOpen.UF; namespace NxPluginExample { public class Program { public static Session theSession; public static UFSession theUfSession; public static void Main(string[] args) { try { // 获取当前 NX 会话 theSession = Session.GetSession(); theUfSession = UFSession.GetUFSession(); Part workPart = theSession.Parts.Work; if (workPart == null) { // 没有工作部件?那就新建一个 workPart = theSession.Parts.NewWork("cube.prt", Session.NewUnit.Millimeters); theSession.Parts.SetWork(workPart); } // 创建一个长方体几何体 Box box = workPart.Shapes.CreateBox(0, 0, 0, 10, 20, 30); // 构建实体特征 BodyFeatureBuilder builder = workPart.Features.CreateBodyFeatureBuilder(null); builder.BooleanOption = BodyFeatureBuilder.BooleanOptions.CreateNewBody; builder.ToolBodies = new Body[] { box }; Feature feature = builder.Commit(); // 提交生成 builder.Destroy(); // 清理临时对象 // 输出日志到 NX 列表窗口 theSession.ListingWindow.Open(); theSession.ListingWindow.WriteLine("✅ 立方体创建成功!"); } catch (Exception ex) { theSession.ListingWindow.WriteLine("❌ 错误: " + ex.Message); } } // 插件加载后立即卸载(推荐用于测试) public static int GetUnloadOption(string arg) { return Session.LibraryUnloadOption.Immediately; } } }🔍关键点解析:
-Session.GetSession()是一切操作的起点,相当于登录系统
-CreateBox创建的是“几何体”,还不是“特征”;要用BodyFeatureBuilder包装成可编辑的特征
-Commit()才真正提交到模型树,类似“确认按钮”
-Destroy()很重要!不调用会导致内存泄漏
- 日志输出用ListingWindow,是你最好的调试伙伴
这段代码在 Visual Studio 中编译成.dll文件后,配合一个简单的.res资源文件注册到 NX 菜单,就可以变成一个可点击的命令了。
那 VB.NET 呢?是不是更简单?
如果你是从 VBA 或 VB6 过来的工程师,VB.NET 会让你感觉格外亲切。
语法更接近自然语言,不需要分号、大括号,连类型声明都可以省略(虽然建议显式声明)。更重要的是,它调用的 NXOpen API 和 C# 完全一样!
来看一个对等的例子:用 VB.NET 创建一个圆柱体。
Imports NXOpen Imports NXOpen.UF Public Module NxVbExample Public theSession As Session Public theUfSession As UFSession Sub Main(ByVal args() As String) Try theSession = Session.GetSession() theUfSession = UFSession.GetUFSession() Dim workPart As Part = theSession.Parts.Work If workPart Is Nothing Then workPart = theSession.Parts.NewWork("cylinder.prt", Session.NewUnit.Inches) theSession.Parts.SetWork(workPart) End If ' 创建圆柱:起点(0,0,0),方向沿Z轴(0,0,1),半径5,高度10 Dim cylinder As Cylinder = workPart.Shapes.CreateCylinder(0, 0, 0, 0, 0, 1, 5, 10) Dim builder As BodyFeatureBuilder = workPart.Features.CreateBodyFeatureBuilder(Nothing) builder.BooleanOption = BodyFeatureBuilder.BooleanOptions.CreateNewBody builder.ToolBodies = New Body(){cylinder} Dim feature As Feature = builder.Commit() builder.Destroy() theSession.ListingWindow.Open() theSession.ListingWindow.WriteLine("✅ VB.NET 圆柱体创建完成!") Catch ex As Exception theSession.ListingWindow.WriteLine("❌ 异常:" & ex.Message) End Try End Sub Function GetUnloadOption(ByVal arg As String) As Integer Return Session.LibraryUnloadOption.Immediately End Function End Module👀 看出来没?除了语法风格不同,其他完全一致!
✅适合谁学 VB.NET?
- 设计师出身,想搞自动化但怕代码太难
- 熟悉 Excel VBA,已有一定逻辑思维
- 做小型工具、参数导入导出类任务✅适合谁学 C#?
- 有编程基础,追求性能和可维护性
- 要做复杂系统集成(数据库、Web API)
- 团队协作项目,需面向对象设计
两者都能胜任绝大多数 NX 自动化任务,选哪个取决于你的背景和偏好。
实际怎么用?一个真实应用场景
假设你是某机械厂的工程师,每个月都要根据客户订单生成几十种法兰盘图纸。每种法兰都有不同的孔数、直径、厚度,但结构相似。
以前的做法:
1. 打开模板 → 改尺寸 → 画孔阵列 → 出工程图 → 改文件名 → 保存 → 下一个……
现在我们可以这样做:
🔧解决方案:用 C# 写一个“法兰生成器”插件
流程如下:
1. 用户点击 NX 菜单中的【生成法兰】
2. 弹出一个 WinForm 窗口,输入:外径、内径、螺栓圈直径、孔数、厚度
3. 点击“确定”,程序自动:
- 新建部件
- 拉伸外圈
- 拉伸内圈
- 圆周阵列通孔
- 添加材料属性
- 自动生成工程图并导出 PDF
4. 所有文件按规则命名保存到指定目录
💡 效果:
- 原来每个法兰耗时 15 分钟 → 现在只需 30 秒
- 全厂统一标准,杜绝人为错误
- 参数可记录,便于追溯
而这整个流程,只需要几百行 C# 代码 + 一点点 UI 设计能力。
开发环境怎么搭?三步搞定
别担心环境配置很复杂,其实很简单:
第一步:安装必备工具
- Siemens NX(版本建议 NX 12 以上)
- Visual Studio(推荐 VS 2019 或 2022,Community 免费版即可)
- NX Open API 类库(通常随 NX 安装自带,路径如:
C:\Program Files\Siemens\NXxx\NXOPEN\Managed)
第二步:创建项目
在 Visual Studio 中新建一个Class Library (.NET Framework)项目
⚠️ 注意目标框架要匹配 NX 的 .NET 版本(一般是 .NET 4.0 ~ 4.8)
添加引用:
-NXOpen.dll
-NXOpen.UF.dll
-NXOpen.Utilities.dll
第三步:注册插件
有两种常见方式:
1.使用.res文件注册菜单项(适合初学者)text EDIT_menu_items ADD_ITEM_AFTER_FILE_SAVE_AS MyPlugin "生成立方体" EXECUTE=YourPluginName.dll@NxPluginExample.Program.Main
2.修改ug_customizing.dat并注册动态库(适合高级用户)
重启 NX 后,就能在菜单看到自己的命令了!
踩坑提醒:新手最容易犯的几个错误
📌1. 忘记释放对象导致卡顿甚至崩溃
每次使用Builder、TaggedObject等对象后,记得调用.Destroy()或.Dispose()。
var builder = workPart.Features.CreateExtrudeBuilder(null); // ... 配置参数 builder.Commit(); builder.Destroy(); // ❗不能少!📌2. 没捕获异常,一出错就整个 NX 崩掉
一定要用try-catch包裹主逻辑,至少把错误信息打出来。
📌3. 在非主线程访问 NX API
NX 的大部分 API 只能在主线程调用。不要随便开线程,除非你知道自己在做什么。
📌4. 忽视单位系统
建模时注意单位是毫米还是英寸,否则尺寸会差好几倍!
📌5. 不做兼容性测试
不同 NX 版本 API 可能有差异。如果你写的插件要在 NX 1872 和 NX 2312 上都运行,务必分别测试。
更进一步:不只是建模,还能做什么?
你以为这只是“自动画图”?远远不止。
结合 .NET 强大的生态,你能做到的事情包括:
| 功能 | 技术组合 |
|---|---|
| 读取 Excel 参数驱动建模 | VB.NET + EPPlus / ClosedXML |
| 自动生成 BOM 表 | C# + DataTable + NX Open Query |
| 与 PDM/PLM 系统同步 | C# + SOAP/Web API + Teamcenter SDK |
| 批量转换格式(STEP/PDF) | C# + 多线程 + File I/O |
| 图像识别辅助建模 | C# + OpenCVSharp + AI 模型 |
甚至可以把 NX 插件做成微服务的一部分,未来接入 MES、ERP 系统,真正实现“设计-制造-管理”一体化。
写在最后:自动化不是替代人,而是让人更值钱
掌握 NX 二次开发,并不意味着你要转行做程序员。
恰恰相反,它是让你作为一名懂技术的设计工程师,拥有“放大器”般的能力。
当你能用 200 行代码替代别人一周的手工劳动时,你就不再只是“画图员”,而是“流程设计师”。
而 C# 和 VB.NET,正是那把最趁手的工具。
🔧给初学者的建议:
1. 先跑通第一个“Hello World”级别的插件(比如弹个消息框)
2. 然后尝试创建一个简单拉伸体
3. 接着加个界面让用户输入参数
4. 最后连上 Excel 或数据库
一步一步来,你会发现:原来自动化,也没那么难。
如果你正在这条路上摸索,欢迎留言交流。也可以分享你最想自动化的任务,我们一起想想怎么实现。