最近更新于 2025-11-11 12:32
前言
2025/10/27
刚从 Solidworks 换成 NX 建模和出图纸,还在不断摸索 NX 的图纸使用,本篇将摸索经验汇总记录。主要是实现修改模板做到一键填写图纸标题栏(值来源于零件属性),以及一些改进设置。
注意本文适用于中文语言设置下,其它语言下模板路径设置是不同的。
零件属性模板
创建
新建一个空白文件

打开属性模板
文件 – 实用工具 – 属性模板

切换到目录

开始创建属性,这里类别我都统一写的“自定义模型属性”,每次设置后点“应用”就不会关闭窗口

- DB_PART_NAME 零件名 字符串
- DB_PART_NO 图号 字符串
- DESIGNER 设计 字符串
- Designer_Date 设计日期 字符串
- CHECKER 校对 字符串
- Checker_Date 校对日期 字符串
- AUDITOR 审核 字符串
- Auditor_Date 审核日期 字符串
- APPROVER 批准 字符串
- Approver_Date 批准日期 字符串
- DB_PART_TYPE 类型 字符串
- DMaterial 材料 字符串
- CompanyName 公司名 字符串
创建好后,展开操作,导出至目录

选一个固定目录保存,并命名文件

修改默认属性模板
文件 – 实用工具 – 用户默认设置

基本环境 – 用户属性,在 Windows 那里点击“浏览”,选择前面导出的文件,修改后重启 NX 生效,前面创建的空白文件可以不用保存

设置生效后,新建零件或打开零件也都有这些属性
在装配导航器的零件上右键属性就能看到对应零件的属性
如果要恢复可以设为原值:%UGII_TMP_DIR%\NXAttributeCatalog.xml
批量编辑属性
在装配导航器重可以同时选择多个零件,按住Ctrl就是累计点选,按住Shift就是选中两次点击之间的所有零件,然后右键,点开属性,可以进行批量编辑

Python 脚本自动化
添加按钮后,点击即可执行代码

更新图号和名称
我设计工装时,文件的命名都是 "图号 名称.prt",这里就写了一个脚本,实现自动分解文件名填给 DB_PART_NO 和 DB_PART_NAME 两个属性。
import NXOpen
import os
def main():
session = NXOpen.Session.GetSession()
work_part = session.Parts.Work
lw = session.ListingWindow
lw.Open()
if not work_part:
lw.WriteLine("未检测到活动零件。")
return
# 从顶层装配开始递归处理所有组件
root_component = work_part.ComponentAssembly.RootComponent
if root_component is None:
# 当前是单个零件
update_part_attributes(work_part, lw)
else:
# 当前是装配体
process_component_recursive(root_component, lw)
lw.WriteLine("\n=== 属性更新完成 ===")
def process_component_recursive(component, lw):
"""递归遍历组件及其子组件"""
try:
# 获取组件对应的零件对象
part = component.Prototype
if part is not None:
update_part_attributes(part, lw)
except Exception as e:
lw.WriteLine("组件处理失败:{} -> {}".format(component.DisplayName, e))
# 递归子组件
for child in component.GetChildren():
process_component_recursive(child, lw)
def update_part_attributes(part, lw):
"""根据零件文件名更新属性"""
try:
if not part.IsFullyLoaded:
part.LoadFully()
filename = os.path.basename(part.FullPath)
name_without_ext, ext = os.path.splitext(filename)
# 拆分格式 “图号 名称.prt”
parts = name_without_ext.split(" ", 1)
if len(parts) != 2:
lw.WriteLine("❌ 文件名不符合规则: {}".format(filename))
return
part_no, part_name = parts
# 设置属性
set_nx_attribute(part, "DB_PART_NO", part_no)
set_nx_attribute(part, "DB_PART_NAME", part_name)
lw.WriteLine("✔ [{}] DB_PART_NO='{}', DB_PART_NAME='{}'".format(
filename, part_no, part_name
))
except Exception as e:
lw.WriteLine("更新零件失败:{} -> {}".format(part.FullPath, e))
def set_nx_attribute(part, attr_name, value):
"""设置或更新属性"""
part.SetUserAttribute(attr_name, -1, value, NXOpen.Update.Option.Now)
if __name__ == "__main__":
main()
同步材料
将材料值从系统属性 NX_MATERIAL 同步到自定义属性 DMaterial
import NXOpen
def main():
session = NXOpen.Session.GetSession()
lw = session.ListingWindow
lw.Open()
# 获取当前工作部件(若是装配,则后续递归遍历)
work_part = session.Parts.Work
# 用集合去重,避免装配中多次实例化同一 part 文件
processed = set()
def process_part(part):
"""递归处理装配并给每个零件写 DMaterial"""
if part is None:
return
# 按完整路径去重
key = part.FullPath
if key in processed:
return
processed.add(key)
# 取 NX_Material(系统只读属性)
nx_mat = part.GetStringAttribute("NX_Material")
if nx_mat:
# 写入/覆盖 DMaterial
part.SetUserAttribute("DMaterial", 0, nx_mat, NXOpen.Update.Option.Now)
lw.WriteLine(f"{part.Leaf} --> DMaterial = {nx_mat}")
else:
lw.WriteLine(f"{part.Leaf} --> NX_Material 为空,跳过")
# 若是装配,继续递归
if part.ComponentAssembly.RootComponent:
for comp in part.ComponentAssembly.RootComponent.GetChildren():
child_part = comp.Prototype
process_part(child_part)
# 从工作部件开始
process_part(work_part)
lw.WriteLine("==== 全部完成 ====")
if __name__ == "__main__":
main()
质量属性
设置自动创建质量属性
打开用户默认设置
基本环境 – 材料/质量
在部件属性选项里,确保质量相关的属性勾选了“创建属性”

在累计属性选项里,确保质量相关的属性勾选了“创建属性”

在杂项选项里,勾选“生成质量数据”,并将“替代生成质量数据”选为“始终生成”

测试:新建一个零件,随意建模一个实体,并保存文件,在零件上右键属性,在质量选项卡下可以看到质量

然后我创建了一个子零件,在属性选项卡可以看到“MassPropRollupMass”的值就是累计质量(所选装配体的总质量),“MassPropMass”是当前零件的质量

图纸模板
可以选择自己新建一个空白文件,然后进入制图环境绘制图框,这样创建的模板文件更小一点,我这里就直接用自带的模板修改,操作更简单。
这里以 A3 图框示例,其它大小的图框设置可以同样操作。
制图首选项
新建一个 A3 图框文件

文件 – 首选项 – 制图
制图首选项的设置内容是保存在图纸文件里的,设置好模板就不用再改了

字体设置
参考现行标准《GB/T 14691-1993》,字体使用长仿宋体,字宽=\frac{字高}{\sqrt2}\approx0.71\times字高。也就是仿宋体,但字体高度:宽度=1:0.71。

公共 – 文字
字体选仿宋,高度3.5,宽高比设置为0.71

同样操作,在尺寸 – 文本下,分别设置附加文本、尺寸文本、公差文本



孔标注设置
尺寸 – 孔和螺纹标注
在类型那里可以选不同的孔,下面勾选这种类型的孔要标注的内容,一般孔就标注大小和深度就行了,那一堆让位槽、孔口倒角就不用标注了,看着烦,就取消勾选了。通孔文本可以汉化一下,我就写成完全贯穿。


孔表
表 – 孔表 – 格式
一般只需要 X 和 Y 坐标就行,合并相同尺寸的单元格

表 – 孔表 – 标签格式
Solidworks 中默认用字母和数字,NX 默认是直接全编数字,我觉得 Solidworks 默认的更好。
这里也改为字母和数字,这样同种大小的孔用一个字母,可以快速区分不同孔

坐标原点符号
主要是 NX 的孔表默认状态不会在图上标识原点(创建的时候有,创建好了就不显示了),就显示一个“ORDINATE数字”,看图的时候就不太明确了。


尺寸 – 坐标
原点符号:显示名称样式选“用户定义”
点下面输入框右侧的“A”编辑文本符号

点“符号”

点“更多符号”

在“系统字体”选项卡下
字体:NX ISO Symbols
子集:Basic Latin
下面就可以看到基准符号,选中一个,然后点击右下角插入字符按钮

就插入符号了

这样创建好孔表的时候就会在原点显示这个符号


尺寸标注的小数位数
尺寸 – 文本 -单位
我这边搞机械加工,一般以丝为单位,即0.01,所以一般情况至少要 2 位小数

尺寸 – 公差
公差一般涉及 3 位小数

删除剖视图标签
图纸视图 – 截面 – 标签
把前缀填的 SECTION 删掉,这样剖视图就不会显示 SECTION 标签了

标题栏
按Ctrl+L打开图层设置,勾选 170 图层,这样标题栏就可以编辑了。修改完后,再重新勾选仅可见,锁定标题栏。

标题栏引用
(1)公司名可以直接编辑修改作为固定值,或者我这里设置成引用 CompanyName 的值


标题栏有些单元格设置的属性值可以维持默认不修改

(2)重量,双击编辑,填入
<W@NX_MassPropRollupMass>
再右键设置

公共 – 单元格
类别设置为数值,小数位数一般 2 位

还可以设置一下后缀 kg

(3)共 页,双击编辑,填入
共 <W@$SH_NUMBER_OF_SHEETS> 页
(4)第 页,双击编辑,填入
第 <W@$SH_SHEET_NUMBER> 页
(5)设计日期

<W@Designer_Date>
(6)校对日期

<W@Checker_Date>
(7)审核日期

<W@Auditor_Date>
(8)批准日期

<W@Approver_Date>
(9)材料

<C1.500><W@DMaterial><C>
(10)比例

<W@$SH_SHEET_SCALE_NUMERATOR>:<W@$SH_SHEET_SCALE_DENOMINATOR>
比例的值由:图纸页右键 – 编辑图纸页,大小 – 比例 设置决定
似乎这里有 bug,如果一开始创建的基本视图不是用的 1:1,这个比例值依然会是 1:1,只有后期再修改这里的比例到一个不同的值才会刷新


像有些预填的文字,建议把两侧的F标签去掉
不然替换零件内图纸的时候,可能变成方块
比如下面的 F2 和 F,两侧的尖括号一起删掉


标题栏单元格格式
所有单元格建议都勾选 “自动调整文本大小”和“换行”,宽度小的把换行排到第一个,比如序号和数量,其它可以设置优先自动调整文本大小


材料明细表引用(非装配图框,跳过)
选中材料明细表,右键打开设置

零件明细表 – 列
把“单件”和“总计表”的“属性名称”都设置为“NX_MassPropRollupMass”,输入后回车确认
注意改属性名称时标题可能也会发生修改,记得把标题重新设回去

添加自定义模板
在资源管理器地址栏打开: %UGII_BASE_DIR%\GCTOOLKIT\prc\simpl_chinese\startup
本部分修改的文件都在这个目录下

新建/替换时使用的模板
将前面设置好的图纸文件复制到这个目录下,然后看到 ugs_drawing_templates_simpl_chinese.pax 文件,右键属性,取消只读

以管理员身份打开记事本,然后用记事本编辑这个文件,每一块都是一个图纸模板

复制一个,然后粘粘到末尾
原文件的 id 已经到 d52 了,我这里就从 d101 开始,也方便和原本的区别
name 设置图框名字,description 设置描述,Filename 设置自己创建的图框文件名

写好配置后,重新在这个文件上右键,设置只读
重启 NX,新建图纸里就能看见自己创建的图纸模板了

菜单 – GC 工具包 – 制图工具 – 替换模板


零件内插入图纸页时的模板
在图纸中切换图框的时候,模板列表要设置另外一个文件
文件名叫 ugs_sheet_templates_simpl_chinese.pax
同样先取消只读,然后以管理员打开记事本编辑,类似操作,复制里面的一个图纸模板来修改就行,注意不要沿用新建/替换写的配置,格式有点区别的

修改装配体和模型的制图首选项
前面修改的内容可以保证独立的图纸文件按照预期模板创建,但是如果是零件内插入图纸,只有图框会使用模板的配置内容,制图首选项相关的内容(字体、标注、孔表等)依然不生效,还需要修改模型和装配体模板才行。
公制单位的建模模板:model-plain-1-mm-template.prt
公制单位的装配模板:assembly-mm-template.prt
右键属性取消它们的只读,以管理员身份启动 NX 分别编辑。
比如现在打开了建模模板

按Ctrl+Shift+D进入模型内置制图,任意选一个模板或图纸大小进去

按Ctrl+L打开图层设置,勾选 170 图层的仅可见,不然插入的图纸页默认看不到图框

接下来的设置内容就参考制图首选项部分,完全一样的设置
设置完以后,按M回到建模环境,在部件导航器中展开图纸,在插入的图纸页上右键删除,这样就把前面为了配置制图首选项插入的图纸删掉了,接着保存文件

装配模板同样的方式修改,最后再把他们的属性设置回只读

补充:调试辅助脚本
自定义模板的时候,经常要复制文件操作,还要设置和取消只读,有点麻烦。我用 ChatGPT 写了脚本来执行复制操作。
把自定义的模板 .prt 文件保存到一个目录下,然后把配置文件的 .pax 文件也复制到这个目录下,并取消只读,方便随时编辑。

然后创建一个 PowerShell 脚本文件:复制模板文件.ps1
我使用的自己安装的 PowerShell 7,Windows 系统预装的 PowerShell 7 执行可能出错
Set-StrictMode -Version Latest
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
Write-Host "==============================================="
Write-Host "🔧 正在更新 NX 启动模板文件与图框..."
Write-Host "==============================================="
# 源目录=脚本所在目录
$srcDir = $PSScriptRoot
$dstDir = Join-Path $env:UGII_BASE_DIR "GCTOOLKIT\prc\simpl_chinese\startup"
# 仅取当前目录下的 .prt 和 .pax 文件
$files = Get-ChildItem -Path $srcDir -File |
Where-Object { $_.Extension -in '.prt','.pax' }
if (-not $files) {
Write-Host "⚠️ 当前目录未发现任何 .prt 或 .pax 文件,脚本终止。"
exit 1
}
# 确保目标目录存在
if (-not (Test-Path -Path $dstDir)) {
Write-Host "📁 目标目录不存在,正在创建: $dstDir"
New-Item -ItemType Directory -Force -Path $dstDir | Out-Null
}
# 复制+只读
foreach ($file in $files) {
$dstPath = Join-Path $dstDir $file.Name
Write-Host "➡️ 正在复制:$($file.Name)"
Copy-Item -Path $file.FullName -Destination $dstPath -Force
(Get-Item $dstPath).Attributes = 'ReadOnly'
}
Write-Host "==============================================="
Write-Host "✅ 模板文件复制完成并已设置为只读。"
Write-Host "目标路径: $dstDir"
Write-Host "==============================================="
再创建了一个批处理文件:执行复制模板文件.bat
批处理文件可以直接右键管理员执行,用它间接调用 PowerShell 脚本
@echo off
chcp 65001 >nul
title 部署模板文件(管理员检测)
:: ---- 检测管理员权限 ----
fltmc >nul 2>&1 || (
:: 非管理员:在当前窗口输出红字,然后 pause 等待
powershell -NoLogo -NoProfile -Command "Write-Host '错误:本脚本需要以管理员身份运行!' -ForegroundColor Red"
pause
goto :EOF
)
:: ---- 已管理员,调用 PowerShell 脚本 ----
cd /d "%~dp0"
pwsh -NoLogo -NoProfile -ExecutionPolicy Bypass -File "复制模板文件.ps1"
pause
.prt 模板文件做好后,.pax 配置文件也设置好的情况下,直接右键执行

就把文件复制过去,并设置只读了

我上班的公司最大只能打印 A3 图纸,装配图基本固定使用 A3,零件使用 A3 或 A4,我总共就只改了这 3 个出来。
修改建模模板
验证自定义模板
独立图纸文件
我这里创建了一个装配体,命名是“图号 名称.prt”的格式

执行脚本自动根据文件名填写图号和名称


当零件处于工作部件时
菜单 – 工具 – 材料 – 指派材料
可以给零件设置材料

我这里已经设置好材料的,然后运行脚本把材料同步到自定义属性(用于标题栏显示)

新建图纸,为装配体文件创建图纸

按Ctrl+S保存一下文件,可以看到标题栏的质量就显示出来了

菜单 – GC 工具包 – 标准化工具 – 属性工具

在属性同步标签页,点确定,就会把模型的属性同步到图纸,标题栏就会显示出来了

为零件创建图纸

进行同样的操作后,标题栏就会显示了

零件内图纸文件
按Ctrl+Shift+D进入模型内置制图,选择自定义的图纸页

