NX Lab

Sao chép component trong cùng assembly bằng CopyComponents và đổi tên bản sao

#Python#Assembly1 lượt xem

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

    Câu hỏi ·

    Khi cần thêm nhiều bản cùng loại ở nhánh khác, sao chép component có sẵn nhanh hơn việc thêm lại từ file và giữ nguyên reference set, vị trí tương đối.

    Sao chép component trong cùng assembly… Sao chép component trong cùng assembly…

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

    1. Tìm component nguồn. Theo tên.
    2. Gọi CopyComponents. Truyền danh sách component, nhận danh sách bản sao.
    3. Đổi tên bản sao. Dùng SetName hoặc đặt thuộc tính tên instance.
    4. Dịch chuyển bản sao. MoveComponent để tránh trùng vị trí.
    5. Kiểm tra. In danh sách bản sao.

    Code tham khảo (Python)

    import NXOpen
    
    def ma_tran_don_vi():
        m = NXOpen.Matrix3x3()
        m.Xx, m.Xy, m.Xz = 1.0, 0.0, 0.0
        m.Yx, m.Yy, m.Yz = 0.0, 1.0, 0.0
        m.Zx, m.Zy, m.Zz = 0.0, 0.0, 1.0
        return m
    
    def tim(root, ten):
        ngan_xep = list(root.GetChildren())
        while ngan_xep:
            c = ngan_xep.pop()
            if c.DisplayName == ten:
                return c
            ngan_xep.extend(c.GetChildren())
        return None
    
    def nhan_ban(part, nguon, so_ban, buoc_x):
        asm = part.ComponentAssembly
        ket_qua = []
        for i in range(so_ban):
            ban_sao = asm.CopyComponents([nguon])[0]
            asm.MoveComponent(ban_sao, NXOpen.Vector3d((i + 1) * buoc_x, 0.0, 0.0), ma_tran_don_vi())
            ket_qua.append(ban_sao)
        return ket_qua
    
    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:
            return
        nguon = tim(root, "BU_LONG_01")
        if nguon is None:
            lw.WriteLine("Không thấy component nguồn")
            return
        session.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "Nhan ban")
        ban = nhan_ban(part, nguon, so_ban=3, buoc_x=25.0)
        for b in ban:
            lw.WriteLine("Bản sao: " + b.DisplayName)
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • CopyComponents nhận danh sách và trả về danh sách bản sao theo cùng thứ tự.
    • Mỗi bản sao được dịch thêm buoc_x so với bản trước bằng vị trí (i + 1) * buoc_x.
    • Bản sao dùng chung part với bản gốc nên không tăng dung lượng file.

    Lỗi thường gặp

    • Bản sao sinh ra ở cùng vị trí với nguồn; nếu quên dịch chuyển, các bản chồng lên nhau.
    • Component có ràng buộc: bản sao có thể không giữ nguyên ràng buộc; kiểm tra lại sau khi sao chép.

    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.