NX Lab

Đọc thuộc tính (attribute) của component và của part: vật liệu, mã vật tư, nhà cung cấp

#Python#Attribute#Assembly1 lượt xem

  1. Quản trị viênQuản trị· 0 điểm

    Câu hỏi ·

    BOM thực tế cần mã vật tư, vật liệu, khối lượng ghi trong thuộc tính. Từ code đọc được thuộc tính của part gốc (gắn với file) và thuộc tính instance (gắn với từng component).

    Đọc thuộc tính (attribute) của component… Đọc thuộc tính (attribute) của component…

    Các bước thực hiện

    1. Thuộc tính của part. part.GetUserAttributes() trả về danh sách AttributeInformation.
    2. Thuộc tính của instance. component.GetInstanceUserAttributes().
    3. Đọc nhanh dạng chuỗi. GetUserAttributesAsStrings().
    4. Lọc theo tên. Chỉ lấy các thuộc tính chuẩn của công ty.
    5. In bảng. Mỗi component một dòng.

    Code tham khảo (Python)

    import NXOpen
    
    CAN_DOC = ["MA_VAT_TU", "VAT_LIEU", "NHA_CUNG_CAP", "KHOI_LUONG"]
    
    def doc_attr(doi_tuong, ten):
        """Đọc thuộc tính dạng chuỗi theo tên; trả về '' nếu chưa có."""
        for a in doi_tuong.GetUserAttributes():
            if a.Title.upper() == ten:
                return a.StringValue if a.Type == NXOpen.NXObject.AttributeType.String else str(a.IntegerValue)
        return ""
    
    def duyet_la(root):
        ngan_xep = list(root.GetChildren())
        while ngan_xep:
            c = ngan_xep.pop()
            con = c.GetChildren()
            if con:
                ngan_xep.extend(con)
            else:
                yield c
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Display
        root = part.ComponentAssembly.RootComponent if part else None
        if root is None:
            return
        lw.WriteLine(" | ".join(["%-20s" % "Part"] + ["%-14s" % t for t in CAN_DOC]))
        for c in duyet_la(root):
            p = c.Prototype
            if p is None:
                continue
            gia_tri = [doc_attr(p, t) for t in CAN_DOC]
            lw.WriteLine(" | ".join(["%-20s" % p.Leaf[:20]] + ["%-14s" % g[:14] for g in gia_tri]))
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • AttributeInformation có Title, Type, StringValue, IntegerValue... tùy kiểu của thuộc tính.
    • Thuộc tính gắn với part (file) nằm trên Prototype; thuộc tính riêng của từng lần dùng nằm trên component.
    • So sánh tiêu đề viết hoa để không phụ thuộc cách gõ chữ hoa/thường.

    Lỗi thường gặp

    • Thuộc tính số thực dùng RealValue, thời gian dùng TimeValue; xử lý theo Type nếu cần đọc mọi loại.
    • Thuộc tính đặt ở tên tiếng Việt có dấu vẫn đọc được nhưng khó so sánh; thống nhất quy ước không dấu.

    Code mang tính tham khảo, viết cho NX 12 trở lên (Python journal). Tên menu và một số lớp có thể khác theo phiên bản NX; hãy chạy thử trên bản sao của chi tiết trước khi dùng cho dữ liệu thật.

    Điểm: 0

Trả lời

Đăng nhập để tham gia thảo luận.