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

最近更新于 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 开始
file

获取指定属性值

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()

file

Siemens NX(UG)Python 开发 – 读写属性
Scroll to top
打开目录