最近更新于 2025-11-10 22:29
环境
- Windows 11 25H2
- NX 2506
- 内置 Python 3.12.8
获取零件的所有属性
import NXOpen
def listAllAttributes(part: NXOpen.Part, lw: NXOpen.ListingWindow):
"""
列出零件的所有属性
Args:
part (NXOpen.Part): 零件
lw (NXOpen.ListingWindow): 列表窗口
"""
lw.WriteLine(f'零件 {part.Name} 的属性:')
attrs = part.GetUserAttributes()
if len(attrs) == 0:
lw.WriteLine('没有属性')
return
ATTR_TYPE_MAP = {
NXOpen.NXObject.AttributeType.Invalid: "Invalid",
NXOpen.NXObject.AttributeType.Null: "Null",
NXOpen.NXObject.AttributeType.Boolean: "Boolean",
NXOpen.NXObject.AttributeType.Integer: "Integer",
NXOpen.NXObject.AttributeType.Real: "Real",
NXOpen.NXObject.AttributeType.String: "String",
NXOpen.NXObject.AttributeType.Time: "Time",
NXOpen.NXObject.AttributeType.Reference: "Reference",
NXOpen.NXObject.AttributeType.Any: "Any",
}
for attr in attrs:
attrName = attr.Title
attrAlias = attr.TitleAlias
attrIndex = attr.ArrayElementIndex # 属性值可能是数组,这个索引表示数组中的位置
attrUnit = 'null'
match attr.Type:
case NXOpen.NXObject.AttributeType.String:
attrValue = attr.StringValue
case NXOpen.NXObject.AttributeType.Integer:
attrValue = attr.IntegerValue
case NXOpen.NXObject.AttributeType.Real:
attrValue = attr.RealValue
attrUnit = attr.Unit.Abbreviation # 排版缩写符号
case NXOpen.NXObject.AttributeType.Boolean:
attrValue = attr.BooleanValue
case NXOpen.NXObject.AttributeType.Time:
attrValue = attr.TimeValue
case NXOpen.NXObject.AttributeType.Null:
attrValue = 'null'
case _:
attrValue = '未知类型'
attrTypeName = ATTR_TYPE_MAP[attr.Type]
lw.WriteLine(f'属性名={attrName:<40} 别名={attrAlias:<40} 索引={attrIndex:<4} 类型={attrTypeName:<10} 值={attrValue:<30} 单位={attrUnit}')
def main():
session = NXOpen.Session.GetSession()
lw = session.ListingWindow
lw.Open()
workPart = session.Parts.Work
if workPart is None:
lw.WriteLine('没有打开的零件')
return
listAllAttributes(workPart, lw)
if __name__ == '__main__':
main()
这个示例获取当前工作部件的所有属性名、别名、索引、类型、值
存在别名的时候,NX 属性列表里会优先显示别名
属性值可以是数组,索引从 0 开始

获取指定属性值
import NXOpen
def findAttribute(part: NXOpen.Part, nameOrAlias: str) -> NXOpen.NXObject.AttributeInformation:
"""
在指定零件中查找属性
Args:
part (NXOpen.Part): 零件
nameOrAlias (str): 属性名或别名
Returns:
NXOpen.NXObject.AttributeInformation: 属性信息
"""
# 尝试用内部方法查找属性名
try:
# 第一个参数是属性名
# 第二个参数是属性类型,可以用 Any 表示任意类型
# 第三个参数是属性索引,非数组属性必须用 -1,数组属性用 -1 会返回其中一个元素,或者可以指定索引
if part.HasUserAttribute(nameOrAlias, NXOpen.NXObject.AttributeType.Any, -1):
attrInfo = part.GetUserAttribute(nameOrAlias, NXOpen.NXObject.AttributeType.Any, -1)
return attrInfo
except NXOpen.NXException as e:
pass
# 遍历属性,通过别名查找
attrs = part.GetUserAttributes()
nameOrAlias = nameOrAlias.lower()
index = 0
for attr in attrs:
if attr.TitleAlias.lower() == nameOrAlias and attr.ArrayElementIndex == index:
return attr
return None
def showAttribute(attr: NXOpen.NXObject.AttributeInformation, lw: NXOpen.ListingWindow):
"""
显示单个属性的信息
Args:
attr (NXOpen.NXObject.AttributeInformation): 属性信息
lw (NXOpen.ListingWindow): 列表窗口
"""
ATTR_TYPE_MAP = {
NXOpen.NXObject.AttributeType.Invalid: 'Invalid',
NXOpen.NXObject.AttributeType.Null: 'Null',
NXOpen.NXObject.AttributeType.Boolean: 'Boolean',
NXOpen.NXObject.AttributeType.Integer: 'Integer',
NXOpen.NXObject.AttributeType.Real: 'Real',
NXOpen.NXObject.AttributeType.String: 'String',
NXOpen.NXObject.AttributeType.Time: 'Time',
NXOpen.NXObject.AttributeType.Reference: 'Reference',
NXOpen.NXObject.AttributeType.Any: 'Any',
}
attrUnit = 'null'
# 取值
if attr.Type == NXOpen.NXObject.AttributeType.String:
value = attr.StringValue
elif attr.Type == NXOpen.NXObject.AttributeType.Integer:
value = attr.IntegerValue
elif attr.Type == NXOpen.NXObject.AttributeType.Real:
value = attr.RealValue
attrUnit = attr.Unit.Abbreviation
elif attr.Type == NXOpen.NXObject.AttributeType.Boolean:
value = attr.BooleanValue
elif attr.Type == NXOpen.NXObject.AttributeType.Time:
value = attr.TimeValue
elif attr.Type == NXOpen.NXObject.AttributeType.Null:
value = 'null'
else:
value = '未知类型'
lw.WriteLine(f'属性名={attr.Title:<40} 别名={attr.TitleAlias:<40} 类型={ATTR_TYPE_MAP[attr.Type]:<10} 值={value:<40} 单位={attrUnit:<10}')
def main():
session = NXOpen.Session.GetSession()
lw = session.ListingWindow
lw.Open()
queryName = 'DB_PART_NAME' # 支持属性名或别名
for part in session.Parts:
lw.WriteLine(f'当前零件:{part.Name} 完全加载:{part.IsFullyLoaded}')
attr = findAttribute(part, queryName)
if attr:
showAttribute(attr, lw)
else:
lw.WriteLine(f'未找到属性:{queryName}')
if __name__ == '__main__':
main()

Siemens NX(UG)Python 开发 – 读写属性
