NX Lab

Phân loại mặt theo hướng mở khuôn: mặt cavity, mặt core và mặt có nguy cơ undercut

#Python#Khuôn#Hình học1 lượt xem

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

    Câu hỏi ·

    Bước đầu của thiết kế khuôn là biết mặt nào thuộc nửa trên (cavity), nửa dưới (core) và mặt nào gần vuông góc hướng mở khuôn. Phân loại theo góc giữa pháp tuyến mặt và hướng mở khuôn.

    Phân loại mặt theo hướng mở khuôn Phân loại mặt theo hướng mở khuôn

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

    1. Đặt hướng mở khuôn. Thường là +Z.
    2. Tính pháp tuyến mặt phẳng. Từ ba đỉnh không thẳng hàng.
    3. Tính góc với hướng mở. Dùng tích vô hướng.
    4. Phân loại. Góc nhỏ: cavity; góc gần 180 độ: core; gần 90 độ: mặt đứng.
    5. Thống kê. Số mặt mỗi loại và diện tích.

    Code tham khảo (Python)

    import math
    import NXOpen
    
    HUONG_MO = (0.0, 0.0, 1.0)
    NGUONG_DUNG = 5.0      # độ: |góc - 90| nhỏ hơn ngưỡng coi là mặt đứng
    
    def phap_tuyen(face):
        diem = []
        for e in face.GetEdges():
            for p in e.GetVertices():
                if all(abs(p.X - q[0]) + abs(p.Y - q[1]) + abs(p.Z - q[2]) > 1e-6 for q in diem):
                    diem.append((p.X, p.Y, p.Z))
            if len(diem) >= 3:
                break
        if len(diem) < 3:
            return None
        a, b, c = diem[:3]
        u = (b[0] - a[0], b[1] - a[1], b[2] - a[2])
        v = (c[0] - a[0], c[1] - a[1], c[2] - a[2])
        n = (u[1] * v[2] - u[2] * v[1], u[2] * v[0] - u[0] * v[2], u[0] * v[1] - u[1] * v[0])
        d = math.sqrt(sum(x * x for x in n))
        return None if d < 1e-9 else tuple(x / d for x in n)
    
    def goc_voi_huong_mo(n):
        c = sum(n[i] * HUONG_MO[i] for i in range(3))
        return math.degrees(math.acos(max(-1.0, min(1.0, c))))
    
    def phan_loai(goc):
        if abs(goc - 90.0) <= NGUONG_DUNG:
            return "DUNG"
        return "CAVITY" if goc < 90.0 else "CORE"
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Work
        solids = [b for b in part.Bodies if b.IsSolidBody] if part else []
        if not solids:
            return
        dem = {"CAVITY": 0, "CORE": 0, "DUNG": 0, "KHAC": 0}
        for f in solids[0].GetFaces():
            if f.SolidFaceType != NXOpen.Face.FaceType.Planar:
                dem["KHAC"] += 1
                continue
            n = phap_tuyen(f)
            if n is None:
                dem["KHAC"] += 1
                continue
            dem[phan_loai(goc_voi_huong_mo(n))] += 1
        lw.WriteLine("Phân loại mặt phẳng theo hướng mở khuôn +Z: " + str(dem))
        lw.WriteLine("Lưu ý: dấu pháp tuyến phụ thuộc thứ tự cạnh; hãy kiểm tra bằng khối đơn giản trước.")
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • Mặt có pháp tuyến cùng hướng mở khuôn thuộc cavity, ngược hướng thuộc core, vuông góc là mặt đứng cần góc thoát.
    • Ngưỡng NGUONG_DUNG quyết định độ dung sai khi xem một mặt là 'đứng'.
    • Mặt cong (trụ, nón, cầu) cần xét pháp tuyến tại từng điểm; ví dụ này chỉ xử lý mặt phẳng.

    Lỗi thường gặp

    • Pháp tuyến tính từ ba đỉnh có thể ngược chiều so với pháp tuyến hướng ra ngoài; thử với khối chữ nhật đơn giản để kiểm chứng và đảo dấu nếu cần.
    • Đây là bước sàng lọc nhanh, không thay cho công cụ phân tích hướng mở khuôn (Draft Analysis) của NX.

    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.