NX Lab

Đồng bộ thuộc tính giữa assembly và các part con: đẩy xuống hoặc kéo lên theo quy tắc

#Python#Attribute#Assembly1 lượt xem

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

    Câu hỏi ·

    Dự án thường có thuộc tính chung (tên dự án, khách hàng) cần có trên mọi part. Script đẩy từ assembly xuống mọi part con, hoặc ngược lại tổng hợp từ part con lên assembly (ví dụ khối lượng tổng).

    Đồng bộ thuộc tính giữa assembly và các… Đồng bộ thuộc tính giữa assembly và các…

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

    1. Xác định thuộc tính chung. TEN_DU_AN, KHACH_HANG.
    2. Duyệt part con. Mọi component lá đã nạp.
    3. Ghi nếu thiếu. Không ghi đè thuộc tính đã có.
    4. Tổng hợp lên. Cộng KHOI_LUONG của các part con.
    5. Ghi vào assembly. KHOI_LUONG_TONG.

    Code tham khảo (Python)

    import NXOpen
    
    NGAY = NXOpen.Update.Option.Now
    KIEU = NXOpen.NXObject.AttributeType
    
    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 day_xuong(assembly_part, thuoc_tinh_chung, ghi_de=False):
        dem = 0
        for c in duyet_la(assembly_part.ComponentAssembly.RootComponent):
            p = c.Prototype
            if p is None or p.IsReadOnly:
                continue
            for ten, gia_tri in thuoc_tinh_chung.items():
                co_san = p.HasUserAttribute(ten, KIEU.String, -1)
                if ghi_de or not co_san:
                    p.SetUserAttribute(ten, -1, gia_tri, NGAY)
                    dem += 1
        return dem
    
    def tong_hop_len(assembly_part, ten="KHOI_LUONG"):
        tong, thieu = 0.0, []
        for c in duyet_la(assembly_part.ComponentAssembly.RootComponent):
            p = c.Prototype
            if p is None or not p.HasUserAttribute(ten, KIEU.Real, -1):
                thieu.append(c.DisplayName)
                continue
            for a in p.GetUserAttributes():
                if a.Title == ten and a.Type == KIEU.Real:
                    tong += a.RealValue
        return tong, thieu
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Display
        if part is None or part.ComponentAssembly.RootComponent is None:
            lw.WriteLine("Không phải assembly")
            return
        session.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "Dong bo thuoc tinh")
        n = day_xuong(part, {"TEN_DU_AN": "May dong goi A1", "KHACH_HANG": "Cong ty ABC"})
        tong, thieu = tong_hop_len(part)
        part.SetUserAttribute("KHOI_LUONG_TONG", -1, round(tong, 3), NGAY)
        lw.WriteLine("Đã ghi %d thuộc tính xuống part con; tổng khối lượng %.3f kg; %d part chưa có KHOI_LUONG" % (n, tong, len(thieu)))
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • Ghi xuống chỉ khi part con chưa có thuộc tính, trừ khi bật ghi_de.
    • Tổng hợp lên không tính số lượng; muốn khối lượng đúng của assembly cần nhân với số lần xuất hiện của mỗi part.
    • Part chỉ đọc (từ PDM) được bỏ qua để không gây lỗi.

    Lỗi thường gặp

    • Đẩy thuộc tính xuống sửa nhiều file; hãy sao lưu và kiểm tra trước khi lưu.
    • Khối lượng tổng nên tính theo số lần xuất hiện: dùng bài BOM đã học để đếm.

    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.