
Xoay component quanh trục: dựng Matrix3x3 từ góc quay Rz và áp dụng MoveComponent
#Python#Assembly#Toán1 lượt xem
Quản trị viênQuản trị· 0 điểm
Câu hỏi ·
NX Open không có hàm xoay sẵn kiểu 'quay 90 độ quanh Z', bạn phải dựng ma trận quay. Bài này viết ba hàm Rx, Ry, Rz rồi dùng chúng để xoay component.
Xoay component quanh trụcCác bước thực hiện
- Dựng ma trận quay. Theo công thức lượng giác cho từng trục.
- Chuyển sang Matrix3x3. Gán 9 thành phần đúng thứ tự.
- Gọi MoveComponent. Truyền vectơ tịnh tiến bằng 0 và ma trận quay.
- Xoay tích lũy. Gọi nhiều lần để xoay theo nhiều trục.
- Kiểm tra. Đọc ma trận định hướng sau khi xoay.
Code tham khảo (Python)
import math import NXOpen def ma_tran(a): """a: 3x3 lồng nhau theo hàng -> NXOpen.Matrix3x3 (ba hàng là ba trục X, Y, Z).""" m = NXOpen.Matrix3x3() m.Xx, m.Xy, m.Xz = a[0] m.Yx, m.Yy, m.Yz = a[1] m.Zx, m.Zy, m.Zz = a[2] return m def quay_x(do): c, s = math.cos(math.radians(do)), math.sin(math.radians(do)) return ma_tran([[1, 0, 0], [0, c, s], [0, -s, c]]) def quay_y(do): c, s = math.cos(math.radians(do)), math.sin(math.radians(do)) return ma_tran([[c, 0, -s], [0, 1, 0], [s, 0, c]]) def quay_z(do): c, s = math.cos(math.radians(do)), math.sin(math.radians(do)) return ma_tran([[c, s, 0], [-s, c, 0], [0, 0, 1]]) def xoay_component(part, comp, truc, do): ham = {"x": quay_x, "y": quay_y, "z": quay_z}[truc.lower()] part.ComponentAssembly.MoveComponent(comp, NXOpen.Vector3d(0, 0, 0), ham(do)) 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 or not root.GetChildren(): lw.WriteLine("Assembly chưa có component") return comp = root.GetChildren()[0] session.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "Xoay component") xoay_component(part, comp, "z", 90.0) _, mt = comp.GetPosition() lw.WriteLine("Trục X của component: (%.3f, %.3f, %.3f)" % (mt.Xx, mt.Xy, mt.Xz)) if __name__ == "__main__": main()Giải thích code
- Mỗi hàng của
Matrix3x3là một trục của hệ tọa độ (X, Y, Z), không phải quy ước cột như nhiều thư viện đồ họa. - Đổi dấu
sgiữa các hàm theo công thức xoay quanh từng trục; thử với 90 độ để chắc chắn hướng quay đúng ý. MoveComponentquay quanh gốc của assembly, không phải quanh tâm component; muốn quay quanh tâm hãy tịnh tiến về gốc, quay, rồi tịnh tiến lại.
Lỗi thường gặp
- Chiều quay (thuận/nghịch) phụ thuộc quy ước ma trận; luôn thử một góc nhỏ và quan sát trên mô hình thật.
- Ma trận không trực chuẩn do làm tròn nhiều lần có thể bị NX từ chối; tính từ góc gốc mỗi lần thay vì nhân dồn.
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.