NX Lab

Duyệt cây assembly đệ quy: in cấu trúc thụt lề với tên component và file part

#Python#Assembly1 lượt xem

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

    Câu hỏi ·

    Mọi script làm việc với lắp ráp đều bắt đầu bằng việc đi qua cây component. Bài này viết hàm đệ quy duyệt từ RootComponent, in cây thụt lề, và đánh dấu component chưa nạp.

    Duyệt cây assembly đệ quy Duyệt cây assembly đệ quy

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

    1. Lấy root. part.ComponentAssembly.RootComponent (None nếu part không có component).
    2. Duyệt con. component.GetChildren() trả về danh sách con trực tiếp.
    3. Đọc thông tin. DisplayName, ReferenceSet, Prototype (part gốc).
    4. Đệ quy. Gọi lại hàm với mỗi con, tăng mức thụt lề.
    5. Đánh dấu chưa nạp. Prototype là None nếu part chưa được nạp.

    Code tham khảo (Python)

    import NXOpen
    
    def in_cay(comp, lw, muc=0, gioi_han=12):
        if muc > gioi_han:
            lw.WriteLine("  " * muc + "... (quá sâu, dừng)")
            return 0
        proto = comp.Prototype
        ten_file = proto.Leaf if proto is not None else "(CHƯA NẠP)"
        tr = " [suppress]" if comp.IsSuppressed else ""
        lw.WriteLine("%s%s  <%s>  RS=%s%s" % ("  " * muc, comp.DisplayName, ten_file, comp.ReferenceSet, tr))
        dem = 1
        for con in comp.GetChildren():
            dem += in_cay(con, lw, muc + 1, gioi_han)
        return dem
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Display
        if part is None:
            lw.WriteLine("Chưa có part")
            return
        root = part.ComponentAssembly.RootComponent
        if root is None:
            lw.WriteLine("Part %s không phải assembly (không có component)" % part.Leaf)
            return
        tong = in_cay(root, lw)
        lw.WriteLine("Tổng số component (kể cả gốc): %d" % tong)
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • RootComponent là nút gốc đại diện cho chính assembly; các con của nó là component cấp 1.
    • comp.Prototype trả về Part thật của component; nếu part chưa nạp thì giá trị là None.
    • Giới hạn độ sâu bảo vệ script khỏi cây quá sâu hoặc lỗi tham chiếu vòng.

    Lỗi thường gặp

    • Assembly lớn có hàng nghìn component: in toàn bộ sẽ rất lâu; thêm bộ lọc theo tên.
    • Dùng Parts.Display (assembly cấp cao nhất) thay vì Parts.Work để lấy gốc cây đúng.

    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.