NX Lab

Kiểm tra quy tắc thiết kế (design rules) giữa các expression: lỗ ≥ 2 lần thành, bo ≤ nửa thành, v.v.

#Python#Quy tắc#Expression1 lượt xem

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

    Câu hỏi ·

    Nhiều lỗi thiết kế là vi phạm quan hệ giữa các kích thước. Mô tả quan hệ thành danh sách quy tắc (biểu thức Python) rồi kiểm tra tự động mỗi khi mô hình thay đổi giúp bắt lỗi sớm.

    Kiểm tra quy tắc thiết kế (design rules)… Kiểm tra quy tắc thiết kế (design rules)…

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

    1. Mô tả quy tắc. Tên, biểu thức điều kiện, thông điệp.
    2. Lấy giá trị expression. Dict tên -> số.
    3. Đánh giá điều kiện. Với eval hạn chế hoặc bộ phân tích riêng.
    4. Báo vi phạm. Mức độ lỗi hay cảnh báo.
    5. Chạy tự động. Gắn vào script cập nhật.

    Code tham khảo (Python)

    import NXOpen
    
    QUY_TAC = [
        ("Đường kính lỗ tối thiểu theo độ dày", lambda v: v["lo_d"] >= 0.8 * v["day"], "Lỗ quá nhỏ so với độ dày: khó gia công"),
        ("Khoảng cách tâm lỗ tới biên", lambda v: v["lo_cach_bien"] >= 1.5 * v["lo_d"], "Lỗ sát biên: nguy cơ rách"),
        ("Bán kính bo", lambda v: v["bo"] <= 0.5 * v["day"], "Bán kính bo lớn hơn nửa độ dày"),
        ("Độ dày tối thiểu", lambda v: v["day"] >= 2.0, "Thành mỏng hơn 2 mm"),
    ]
    
    def lay_gia_tri(part, ten_can):
        kq, thieu = {}, []
        for ten in ten_can:
            try:
                kq[ten] = part.Expressions.FindObject(ten).Value
            except NXOpen.NXException:
                thieu.append(ten)
        return kq, thieu
    
    def kiem_tra(part):
        can = {"lo_d", "lo_cach_bien", "bo", "day"}
        v, thieu = lay_gia_tri(part, can)
        ket_qua = []
        for ten, dk, thong_diep in QUY_TAC:
            try:
                if not dk(v):
                    ket_qua.append(("VI PHẠM", ten, thong_diep))
            except KeyError as ex:
                ket_qua.append(("BỎ QUA", ten, "thiếu expression " + str(ex)))
        return ket_qua, thieu
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Work
        if part is None:
            return
        ket_qua, thieu = kiem_tra(part)
        for muc, ten, tb in ket_qua:
            lw.WriteLine("[%s] %s: %s" % (muc, ten, tb))
        lw.WriteLine("Kết luận: " + ("ĐẠT quy tắc thiết kế" if not any(k[0] == "VI PHẠM" for k in ket_qua) else "CÓ VI PHẠM"))
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • Mỗi quy tắc là một hàm nhận dict giá trị, trả True nếu thỏa mãn; thêm quy tắc chỉ cần thêm một dòng.
    • Hệ số như 0.8, 1.5, 2.0 là ví dụ; thay bằng quy phạm thiết kế của công ty.
    • Quy tắc thiếu expression được báo 'BỎ QUA' thay vì làm script lỗi.

    Lỗi thường gặp

    • Dùng lambda trong danh sách quy tắc tiện cho code nội bộ; nếu muốn người dùng sửa quy tắc bằng file, cần bộ phân tích biểu thức an toàn (không eval chuỗi tùy ý).
    • Quy tắc đúng với một họ chi tiết có thể sai với họ khác; tách bộ quy tắc theo họ.

    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.