NX Lab

Tính hộp bao (bounding box) của body từ đỉnh cạnh: chiều dài, rộng, cao của phôi

#Python#Hình học#Phôi1 lượt xem

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

    Câu hỏi ·

    Biết kích thước hộp bao của chi tiết là biết cần phôi cỡ nào. Có thể lấy nhanh bằng cách duyệt đỉnh của mọi cạnh và lấy min, max theo ba trục.

    Tính hộp bao (bounding box) của body từ… Tính hộp bao (bounding box) của body từ…

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

    1. Duyệt cạnh. body.GetEdges().
    2. Lấy đỉnh. edge.GetVertices() trả về hai điểm.
    3. Tính min, max. Theo ba trục X, Y, Z.
    4. Thêm lượng dư. Cộng dư gia công cho mỗi phía.
    5. Làm tròn kích thước phôi. Làm tròn lên bội số của 5 mm.

    Code tham khảo (Python)

    import math
    import NXOpen
    
    def hop_bao(body):
        xs, ys, zs = [], [], []
        for e in body.GetEdges():
            a, b = e.GetVertices()
            for p in (a, b):
                xs.append(p.X); ys.append(p.Y); zs.append(p.Z)
        return (min(xs), min(ys), min(zs)), (max(xs), max(ys), max(zs))
    
    def kich_thuoc_phoi(lo, hi, du_moi_phia=2.0, buoc=5.0):
        kich = [hi[i] - lo[i] + 2 * du_moi_phia for i in range(3)]
        return [math.ceil(k / buoc) * buoc for k in kich]
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Work
        if part is None:
            return
        for b in part.Bodies:
            if not b.IsSolidBody:
                continue
            lo, hi = hop_bao(b)
            dai, rong, cao = [hi[i] - lo[i] for i in range(3)]
            lw.WriteLine("Body %s" % b.JournalIdentifier)
            lw.WriteLine("  Hộp bao : %.2f x %.2f x %.2f" % (dai, rong, cao))
            lw.WriteLine("  Phôi đề xuất (dư 2/phía, làm tròn 5): %.0f x %.0f x %.0f" % tuple(kich_thuoc_phoi(lo, hi)))
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • Đỉnh của mọi cạnh nằm trên biên của khối nên min/max đỉnh chính là hộp bao song song trục.
    • Mặt trụ lồi ngoài đỉnh có thể làm hộp bao nhỏ hơn thực tế; chi tiết có cung tròn lớn cần xử lý thêm.
    • math.ceil(k / buoc) * buoc làm tròn lên bội số của buoc.

    Lỗi thường gặp

    • Cạnh tròn khép kín có hai đỉnh trùng nhau, và hộp bao có thể thiếu phần cung giữa; dùng thêm điểm giữa cung nếu cần chính xác.
    • Hộp bao theo trục tuyệt đối; chi tiết xoay nghiêng cho phôi thừa lớ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.