## UG NX Python 二次开发项目配置与使用方法
### 一、 核心环境配置
UG NX Python 二次开发的核心是配置环境变量,使 NX 能够识别并加载您的自定义脚本和菜单。主要涉及以下两个关键环境变量 [ref_1]:
| 环境变量 | 作用 | 典型值示例 |
| :--- | :--- | :--- |
| `UGII_VENDOR_DIR` | 指向包含 `startup` 和 `application` 子目录的**根目录**。NX 启动时会自动扫描此目录下的自定义内容。 | `D:\MyNXProject` |
| `UGII_USER_DIR` | 指向用户自定义目录,通常用于存放个人宏、日志等。其优先级低于 `UGII_VENDOR_DIR`。 | `%UGII_VENDOR_DIR%` 或自定义路径 |
**配置方法**:
1. **创建项目目录**:在任意位置(如 `D:\`)创建项目文件夹,例如 `MyNXProject`。
2. **设置环境变量**:
* **方法一(推荐,永久生效)**:通过 Windows 系统属性 -> 高级 -> 环境变量,添加或编辑 `UGII_VENDOR_DIR`,将其值设置为您的项目根目录路径(如 `D:\MyNXProject`)。
* **方法二(临时生效)**:在启动 NX 的快捷方式或命令行中临时设置。例如,创建一个批处理文件 (`start_nx.bat`):
```batch
@echo off
set UGII_VENDOR_DIR=D:\MyNXProject
"C:\Program Files\Siemens\NX 12.0\UGII\ugraf.exe"
```
3. **验证配置**:启动 NX,在菜单栏点击 `帮助 -> 日志文件`,在打开的 `ugii_env.log` 文件中搜索 `UGII_VENDOR_DIR`,确认其值已正确指向您的项目目录 [ref_1]。
### 二、 项目目录结构与文件创建
在 `UGII_VENDOR_DIR` 指向的根目录下,必须创建特定的子目录来组织您的代码和菜单 [ref_1]:
```
D:\MyNXProject\ (UGII_VENDOR_DIR 指向的根目录)
├── startup\ # 存放应用程序脚本和菜单定义文件
│ ├── my_menu.men # 自定义菜单文件
│ └── custom_dirs.dat # (可选) 用于扩展搜索路径的配置文件
└── application\ # 存放应用程序的主体Python脚本文件
└── my_scripts\ # 建议按功能模块创建子目录
└── hello_world.py
```
#### 1. 创建菜单文件 (`*.men`)
菜单文件定义了将在 NX 界面中显示的按钮和菜单项。其基本语法如下 [ref_1]:
```plaintext
! 注释以感叹号开头
VERSION 120
EDIT UG_GATEWAY_MAIN_MENUBAR
! 在“工具”菜单后添加一个新的“我的工具”级联菜单
BEFORE UG_HELP
CASCADE_BUTTON MY_TOOLS_MENU
LABEL 我的工具
END_OF_BEFORE
! 定义“我的工具”下拉菜单的内容
MENU MY_TOOLS_MENU
BUTTON MY_HELLO_BTN
LABEL 打个招呼
! ACTIONS 后面跟的是 **不带扩展名** 的脚本文件名
ACTIONS hello_world
END_OF_MENU
```
将上述内容保存为 `startup` 目录下的 `my_menu.men` 文件。
#### 2. 创建Python脚本文件
在 `application\my_scripts\` 目录下创建 `hello_world.py` 文件。这是与菜单按钮关联的执行脚本 [ref_1]。
```python
# -*- coding: utf-8 -*-
"""
文件名必须与 .men 文件中 ACTIONS 后的名称一致 (hello_world)
这是第一个UG NX Python二次开发脚本示例。
"""
import NXOpen
import NXOpen.UF
def main() -> None:
"""主函数,菜单按钮点击后执行此函数。"""
# 获取NX会话和UI会话
the_session = NXOpen.Session.GetSession()
the_ui = the_session.ListingWindow
# 在NX信息窗口输出一条消息
the_ui.Open()
the_ui.WriteLine("你好,UG NX 世界!")
the_ui.Close()
# 也可以使用UFun函数(另一种API风格)弹出提示框
the_uf_session = NXOpen.UF.UFSession.GetUFSession()
the_uf_session.Ui.DisplayMessage("操作完成!", NXOpen.UF.UFConstants.UF_UI_MESSAGE_INFO)
# 必须包含以下代码块,这是NX识别脚本入口的标准方式
if __name__ == '__main__':
main()
```
### 三、 开发与调试环境搭建
为了获得更好的代码编写体验(如语法高亮、自动补全),建议配置专业的Python IDE。
#### 1. 配置 PyCharm 或 VS Code
* **解释器路径**:在 IDE 中设置 Python 解释器为 NX 自带的 Python。路径通常为 `NX安装目录\UGII\python.exe`(例如 `C:\Program Files\Siemens\NX 12.0\UGII\python.exe`)[ref_4]。
* **添加 NXOpen 模块路径**:NX 的 API 模块(如 `NXOpen.pyd`)位于 `NX安装目录\UGII\` 或 `NX安装目录\NXBIN` 下。需要将此路径添加到 IDE 的项目 `PYTHONPATH` 或系统 `PATH` 环境变量中,以便 IDE 能识别和自动补全 NX API [ref_4][ref_6]。
* 在 PyCharm 中:`File -> Settings -> Project -> Python Interpreter -> 点击齿轮图标 -> Show All -> 选中解释器 -> 点击路径图标 -> 添加 NX UGII 目录`。
* 在系统环境变量 `PATH` 中添加 `%UGII_BASE_DIR%\UGII` 也是一个有效的解决方法 [ref_6]。
#### 2. 解决常见问题
* **“DLL load failed” 错误**:当在 NX 外部运行脚本时,可能因找不到 NX 的 DLL 文件而报错。确保已将 `NX安装目录\UGII` 添加到系统 `PATH` 环境变量中,这是最根本的解决方法 [ref_6]。
* **脚本在 NX 中不执行**:
1. 检查 `UGII_VENDOR_DIR` 环境变量是否正确设置并生效。
2. 检查 `.men` 文件中 `ACTIONS` 后的名称是否与 `.py` 脚本文件名(不含扩展名)完全一致。
3. 检查脚本文件是否放在了 `application` 或其子目录下。
4. 查看 NX 日志文件 (`帮助 -> 日志文件`) 获取具体错误信息。
### 四、 NXOpen API 基础使用
成功配置环境后,即可开始使用 NXOpen API 进行开发。以下是一个创建简单几何体的示例,展示了核心对象的使用方法 [ref_4]。
```python
import NXOpen
import NXOpen.UF
def create_block(length: float, width: float, height: float) -> None:
"""创建一个长方体块体。"""
the_session = NXOpen.Session.GetSession()
work_part = the_session.Parts.Work
# 1. 获取建模所需的“工厂”对象
modeling_work_part = work_part
if modeling_work_part is None:
print("没有打开的工作部件。")
return
# 使用Builder模式创建特征
block_builder = modeling_work_part.Features.CreateBlockFeatureBuilder(None)
# 2. 设置块的原点、尺寸和方向
origin_point = NXOpen.Point3d(0.0, 0.0, 0.0)
block_builder.SetOriginAndLengths(origin_point, str(length), str(width), str(height))
# 3. 设置布尔操作类型(例如:创建)
block_builder.BooleanOption.Type = NXOpen.GeometricUtilities.BooleanOperation.BooleanType.Create
# 4. 提交构建器以生成特征
block_feature = block_builder.CommitFeature()
block_builder.Destroy() # 释放构建器资源
print(f"已创建长方体,尺寸: {length}x{width}x{height}")
# 测试函数
if __name__ == '__main__':
# 此脚本在NX外部独立运行时,需要先启动NX会话,通常用于测试逻辑。
# 在NX内部通过菜单调用时,直接执行 main 或相应函数即可。
create_block(100.0, 50.0, 25.0)
```
### 五、 进阶配置与部署
对于更复杂的项目,可以考虑以下配置:
1. **使用 `custom_dirs.dat`**:在 `startup` 目录下创建此文件,可以指定额外的 `application` 脚本搜索路径,方便模块化管理 [ref_1]。
```
D:\MyNXProject\application\my_scripts
D:\AnotherProject\shared_tools
```
2. **版本匹配**:确保您使用的 Python 版本与 NX 内置版本兼容。通常 NX 会自带一个特定版本的 Python(如 NX 12 带 Python 3.6)。使用该版本进行开发可避免兼容性问题 [ref_4][ref_5]。
3. **代码组织**:对于大型项目,建议在 `application` 目录下创建清晰的包结构,使用 `__init__.py` 文件,并利用相对导入来组织代码。