NX Lab

Đọc vị trí component bằng GetPosition và di chuyển bằng MoveComponent

#Python#Assembly1 lượt xem

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

    Câu hỏi ·

    Biết vị trí hiện tại của component và dịch chuyển nó là thao tác nền của mọi script điều khiển lắp ráp. Vị trí gồm điểm gốc và ma trận định hướng, còn di chuyển nhận vectơ tịnh tiến và ma trận quay.

    Đọc vị trí component bằng GetPosition và… Đọc vị trí component bằng GetPosition và…

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

    1. Đọc vị trí. comp.GetPosition() trả về (điểm, ma trận).
    2. Chuẩn bị chuyển vị. Vectơ tịnh tiến và ma trận quay (đơn vị nếu chỉ dịch chuyển).
    3. Gọi MoveComponent. part.ComponentAssembly.MoveComponent(comp, vectơ, ma trận).
    4. Kiểm tra vị trí mới. Đọc lại GetPosition.
    5. Hoàn tác khi cần. Dùng Undo Mark.

    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_component(part, ten):
        root = part.ComponentAssembly.RootComponent
        if root is None:
            return None
        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 doc_vi_tri(comp):
        vt, mt = comp.GetPosition()
        return vt
    
    def dich_chuyen(part, comp, dx, dy, dz):
        part.ComponentAssembly.MoveComponent(comp, NXOpen.Vector3d(dx, dy, dz), ma_tran_don_vi())
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Work
        comp = tim_component(part, "BU_LONG_01") if part else None
        if comp is None:
            lw.WriteLine("Không thấy component BU_LONG_01")
            return
        cu = doc_vi_tri(comp)
        lw.WriteLine("Vị trí cũ: (%.2f, %.2f, %.2f)" % (cu.X, cu.Y, cu.Z))
        session.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "Di chuyen")
        dich_chuyen(part, comp, 10.0, 0.0, 5.0)
        moi = doc_vi_tri(comp)
        lw.WriteLine("Vị trí mới: (%.2f, %.2f, %.2f)" % (moi.X, moi.Y, moi.Z))
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • GetPosition có hai tham số ra (điểm và ma trận) nên Python trả về tuple hai phần tử.
    • MoveComponent là dịch chuyển tương đối so với vị trí hiện tại, không phải đặt tuyệt đối.
    • Dùng ngăn xếp thay cho đệ quy khi tìm component để tránh tràn ngăn xếp với cây sâu.

    Lỗi thường gặp

    • Component đã bị ràng buộc cố định hay mate thì MoveComponent có thể bị bỏ qua hoặc kéo theo xung đột.
    • Vị trí trả về theo hệ tọa độ tuyệt đối của assembly chứa component.

    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.