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

最近更新于 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 开始
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",
    }

    # 取值
    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 开发 – 读写属性
Scroll to top
打开目录