最近更新于 2025-11-09 23:55
环境
- 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 # 属性值可能是数组,这个索引表示数组中的位置
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
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:<2} 类型={attrTypeName:<10} 值={attrValue}')
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",
}
# 取值
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
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}")
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 开发 – 读写属性
