17370845950

如何在 Siemens NX 中正确使用 NXOpen Python API

本文详解如何在 siemen

s nx 环境中调用官方 nxopen python api(非 pypi 第三方包),包括环境配置、脚本执行方式、常见错误根源及正确示例代码,帮助开发者避免 `modulenotfounderror: no module named 'nxopen'` 等典型问题。

Siemens NX 的 NXOpen API 并非一个可通过 pip install nxopen 安装的独立 Python 包——它是由 NX 软件自身提供的原生 .NET/Python 绑定库,深度集成于 NX 运行时环境。你遇到的 ModuleNotFoundError: No module named 'NXOpen' 错误,根本原因在于:你在外部 Python 解释器(如 VS Code 或命令行)中直接运行了依赖 NXOpen 的脚本,而该解释器无法访问 NX 的运行时上下文与底层 DLL/CLR 组件

✅ 正确使用方式如下:

  1. 不安装任何 PyPI 版本的 nxopen
    删除通过 pip install nxopen 安装的第三方包(它与 Siemens 官方 NXOpen 无关,甚至可能引发冲突):

    pip uninstall nxopen
  2. 脚本必须在 NX 内部执行

    • 启动 Siemens NX(建议使用 NX 1980+ 或更新版本,对 Python 3.7+ 支持更完善);
    • 进入菜单栏:File → Utilities → Run Journal…(或按快捷键 Ctrl+Shift+J);
    • 选择你的 .py 文件(例如 get_mass_properties.py),点击 OK —— NX 将自动加载其内置 Python 引擎(含 NXOpen 模块)并执行。
  3. 修正代码:适配 NXOpen 原生 Python 接口
    注意:NX 内置 Python 使用的是 NXOpen(首字母大写)模块名,且无需手动 session.close()(NX 会自动管理生命周期)。以下是修正后的可靠示例:

import NXOpen
import os

def get_mass_properties(file_path):
    # 验证文件存在且可读
    if not os.path.exists(file_path):
        raise ValueError(f"File not found: {file_path}")
    if not os.access(file_path, os.R_OK):
        raise PermissionError(f"Insufficient permissions to access file: {file_path}")

    # 获取当前 NX 会话(无需 new Session())
    the_session = NXOpen.Session.GetSession()
    work_part = the_session.Parts.Work

    # 关闭当前工作部件(如有),再打开目标 .prt
    if work_part is not None:
        the_session.Parts.CloseAll(False)

    # 打开指定部件文件
    part_load_options = the_session.TransientPartLoadOptions
    part_load_options.DisplayPart = False
    part_load_options.LoadGeometry = True
    part_load_options.LoadAttributes = True

    opened_part = the_session.Parts.Open(file_path, part_load_options)
    the_session.Parts.SetWork(opened_part)

    # 获取实体体并计算质量属性
    bodies = opened_part.Bodies
    solid_bodies = [body for body in bodies if body.Type == NXOpen.Body.Types.Solid]

    if len(solid_bodies) != 1:
        raise RuntimeError(f"Unsupported file: expected exactly 1 solid body, got {len(solid_bodies)}")

    mass_props = opened_part.MeasureManager.CreateMassProperties()
    mass_props.Compute()
    mass = mass_props.Mass  # 单位:克(取决于建模单位制)

    # 可选:获取完整质量属性(质心、惯性矩等)
    # print(f"Mass: {mass:.3f} g")
    # print(f"Centroid: {mass_props.Centroid}")

    # 关闭部件(非必需,但推荐释放资源)
    the_session.Parts.CloseBasePart(opened_part, False)

    return [mass]

# 示例调用(路径需使用正斜杠或双反斜杠)
if __name__ == "__main__":
    try:
        result = get_mass_properties(r"D:/NX Files/model1.prt")
        print(f"Mass = {result[0]:.4f} g")
    except Exception as e:
        NXOpen.UI.GetUI().NXMessageBox.Show("Error", NXOpen.NXMessageBox.DialogType.Error, str(e))

⚠️ 重要注意事项:

  • 路径格式:Windows 下推荐使用原始字符串(r"D:\NX Files\model1.prt")或正斜杠("D:/NX Files/model1.prt"),避免转义问题;
  • 单位制:NXOpen 返回的质量单位默认为 克(g),若模型单位为毫米,则密度单位为 g/mm³;请确保材料属性已正确定义;
  • 智能提示(IntelliSense)支持:若需在 VS Code 中获得代码补全,可参考 Siemens 官方社区指南(链接),通过配置 NXOpen 类型存根(.pyi)实现静态分析支持;
  • 调试技巧:NX 内置 Python 控制台(Ctrl+Shift+P → 输入 Python Console)可用于交互式测试 API 调用。

总结:NXOpen 不是“外部库”,而是 NX 的编程接口。一切脚本都必须在 NX 进程内运行——这是唯一能成功导入 NXOpen 模块并访问 CAD 数据的前提。放弃外部解释器执行思维,拥抱 NX 原生开发流程,才能真正释放自动化建模与分析的生产力。