NX Lab

Tạo BOM phẳng từ assembly: gom component trùng part và đếm số lượng

#Python#Assembly#BOM1 lượt xem

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

    Câu hỏi ·

    BOM phẳng cho biết cần bao nhiêu chi tiết mỗi loại. Cách làm: duyệt cây, gom theo file part gốc, đếm số lần xuất hiện, bỏ qua các assembly con (chỉ lấy lá).

    Tạo BOM phẳng từ assembly Tạo BOM phẳng từ assembly

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

    1. Duyệt toàn bộ cây. Thu thập mọi component không có con.
    2. Gom theo part gốc. Dùng đường dẫn đầy đủ của Prototype làm khóa.
    3. Đếm số lượng. Counter theo khóa.
    4. Lấy tên và đường dẫn. Leaf và FullPath.
    5. In bảng. Sắp xếp theo tên.

    Code tham khảo (Python)

    from collections import Counter
    import NXOpen
    
    def thu_la(comp, ket_qua):
        con = comp.GetChildren()
        if not con:
            ket_qua.append(comp)
        for c in con:
            thu_la(c, ket_qua)
    
    def bom_phang(root):
        la = []
        for c in root.GetChildren():
            thu_la(c, la)
        dem = Counter()
        tham_chieu = {}
        for c in la:
            p = c.Prototype
            khoa = p.FullPath if p is not None else "(chưa nạp) " + c.DisplayName
            dem[khoa] += 1
            tham_chieu[khoa] = p.Leaf if p is not None else c.DisplayName
        return dem, tham_chieu
    
    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:
            lw.WriteLine("Không phải assembly")
            return
        dem, ten = bom_phang(root)
        lw.WriteLine("%-4s %-28s %s" % ("SL", "Tên part", "Đường dẫn"))
        for khoa in sorted(dem, key=lambda k: ten[k].lower()):
            lw.WriteLine("%-4d %-28s %s" % (dem[khoa], ten[khoa][:28], khoa))
        lw.WriteLine("Tổng số loại: %d, tổng số chi tiết: %d" % (len(dem), sum(dem.values())))
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • Component 'lá' là component không có con, tức chi tiết đơn; assembly con chỉ là nhóm nên không đếm riêng.
    • Khóa gom nhóm là đường dẫn đầy đủ để hai file cùng tên ở thư mục khác nhau không bị gộp nhầm.
    • Component chưa nạp được gom theo tên hiển thị để vẫn xuất hiện trong báo cáo.

    Lỗi thường gặp

    • Component có số lượng khai báo riêng (quantity) không phản ánh trong cách đếm này; dùng GetIntegerQuantity nếu cần.
    • BOM theo cấu hình (arrangement) hoặc suppress khác nhau; kiểm tra IsSuppressed để loại component đang bị tắt.

    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.