NX Lab

Xóa component khỏi assembly: RemoveComponent và dọn component chưa nạp được

#Python#Assembly1 lượt xem

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

    Câu hỏi ·

    Dọn assembly trước khi giao hàng thường bao gồm xóa component phụ, component thử nghiệm hay component thiếu file. RemoveComponent làm việc đó, nhưng cần kiểm tra điều kiện trước khi xóa.

    Xóa component khỏi assembly Xóa component khỏi assembly

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

    1. Thu thập component. Duyệt cây, chọn component theo điều kiện.
    2. Xác định điều kiện xóa. Tên có tiền tố TEST_ hoặc part chưa nạp.
    3. Xác nhận. Hiện danh sách và hỏi người dùng.
    4. Gọi RemoveComponent. Cho từng component trong danh sách.
    5. Báo cáo. Số đã xóa và số lỗi.

    Code tham khảo (Python)

    import NXOpen
    
    def tat_ca_component(root):
        kq, ngan_xep = [], list(root.GetChildren())
        while ngan_xep:
            c = ngan_xep.pop()
            kq.append(c)
            ngan_xep.extend(c.GetChildren())
        return kq
    
    def can_xoa(c):
        return c.DisplayName.upper().startswith("TEST_") or c.Prototype is None
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Work
        root = part.ComponentAssembly.RootComponent if part else None
        if root is None:
            lw.WriteLine("Không phải assembly")
            return
        ung_vien = [c for c in tat_ca_component(root) if can_xoa(c)]
        if not ung_vien:
            lw.WriteLine("Không có component nào cần xóa")
            return
        lw.WriteLine("Sẽ xóa %d component:" % len(ung_vien))
        for c in ung_vien:
            lw.WriteLine("  - " + c.DisplayName)
    
        if not session.IsBatch:
            kq = NXOpen.UI.GetUI().NXMessageBox.Show(
                "Xác nhận", NXOpen.NXMessageBox.DialogType.Question,
                "Xóa %d component trên?" % len(ung_vien))
            if kq != 1:
                lw.WriteLine("Đã hủy")
                return
        session.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "Xoa component")
        da_xoa, loi = 0, 0
        for c in ung_vien:
            try:
                part.ComponentAssembly.RemoveComponent(c)
                da_xoa += 1
            except NXOpen.NXException:
                loi += 1
        lw.WriteLine("Đã xóa %d, lỗi %d" % (da_xoa, loi))
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • Xóa component con của một assembly con bị xóa trước có thể làm component sau không còn hợp lệ, nên bắt lỗi từng cái.
    • Hộp thoại xác nhận chỉ hiện khi không chạy nền, tránh script treo chờ người.
    • RemoveComponent chỉ gỡ component khỏi assembly, không xóa file part trên đĩa.

    Lỗi thường gặp

    • Xóa component bị fix hoặc đang được tham chiếu bởi ràng buộc có thể ném lỗi hoặc làm ràng buộc khác mất tác dụng.
    • Component có Prototype là None chưa chắc là lỗi; có thể chỉ chưa nạp. Xác nhận với người dùng trước.

    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.