
Phát hiện va chạm gần đúng giữa các component bằng hộp bao (AABB) trước khi kiểm tra chính xác
#Python#Assembly#Va chạm1 lượt xem
Quản trị viênQuản trị· 0 điểm
Câu hỏi ·
Kiểm tra va chạm chính xác giữa mọi cặp chi tiết rất chậm. Cách nhanh là lọc bằng hộp bao song song trục: chỉ những cặp có hộp bao chồng nhau mới cần kiểm tra kỹ.
Phát hiện va chạm gần đúng giữa các…Các bước thực hiện
- Tính hộp bao từng component. Từ đỉnh cạnh của body trong part gốc.
- Đưa về tọa độ assembly. Dùng vị trí component (đơn giản: chỉ tịnh tiến).
- So từng cặp. Chồng nhau nếu các khoảng trên ba trục đều giao nhau.
- Xếp hạng. Theo thể tích chồng lấp ước tính.
- Báo danh sách cặp nghi vấn. Để kiểm tra chính xác bằng Measure.
Code tham khảo (Python)
import NXOpen def hop_bao_part(p): xs, ys, zs = [], [], [] for b in p.Bodies: if not b.IsSolidBody: continue for e in b.GetEdges(): for v in e.GetVertices(): xs.append(v.X); ys.append(v.Y); zs.append(v.Z) if not xs: return None return (min(xs), min(ys), min(zs)), (max(xs), max(ys), max(zs)) def hop_bao_component(c): p = c.Prototype if p is None: return None hb = hop_bao_part(p) if hb is None: return None vt, _ = c.GetPosition() # chỉ xét tịnh tiến; bỏ qua xoay cho đơn giản lo, hi = hb return ((lo[0] + vt.X, lo[1] + vt.Y, lo[2] + vt.Z), (hi[0] + vt.X, hi[1] + vt.Y, hi[2] + vt.Z)) def giao_nhau(a, b): chong = [] for i in range(3): d = min(a[1][i], b[1][i]) - max(a[0][i], b[0][i]) if d <= 0: return 0.0 chong.append(d) return chong[0] * chong[1] * chong[2] def duyet_la(root): ngan_xep = list(root.GetChildren()) while ngan_xep: c = ngan_xep.pop() con = c.GetChildren() if con: ngan_xep.extend(con) else: yield c def main(): session = NXOpen.Session.GetSession() lw = session.ListingWindow lw.Open() part = session.Parts.Display root = part.ComponentAssembly.RootComponent if part else None if root is None: return mang = [(c, hop_bao_component(c)) for c in duyet_la(root)] mang = [(c, h) for c, h in mang if h is not None] nghi_van = [] for i in range(len(mang)): for j in range(i + 1, len(mang)): v = giao_nhau(mang[i][1], mang[j][1]) if v > 0: nghi_van.append((v, mang[i][0].DisplayName, mang[j][0].DisplayName)) nghi_van.sort(reverse=True) lw.WriteLine("Có %d cặp hộp bao chồng nhau (cần kiểm tra chính xác):" % len(nghi_van)) for v, a, b in nghi_van[:20]: lw.WriteLine(" %-20s <-> %-20s chồng ~%.1f mm3" % (a, b, v)) if __name__ == "__main__": main()Giải thích code
- Hộp bao chồng nhau chỉ là điều kiện cần của va chạm thật, nên danh sách này gồm nhiều cặp 'báo động giả'.
- Thể tích chồng lấp của hộp bao để xếp hạng mức nghiêm trọng.
- Bài này bỏ qua phép xoay để đơn giản; muốn chính xác hơn cần áp dụng ma trận định hướng lên các đỉnh.
Lỗi thường gặp
- Chi tiết lắp trong lỗ (bu lông vào lỗ) luôn có hộp bao chồng nhau; đừng coi tất cả là lỗi.
- Độ phức tạp bình phương với số component; với assembly vài nghìn chi tiết nên dùng cấu trúc lưới không gian.
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.