NX Lab

Tách logic khỏi giao diện: lớp xử lý thuần dùng chung cho hộp thoại và chạy nền

#Python#Kiến trúc1 lượt xem

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

    Câu hỏi ·

    Nhồi mọi thứ vào callback của hộp thoại khiến code khó test và không dùng lại được khi chạy nền. Tách phần logic thành module thuần nhận tham số, giao diện chỉ thu thập giá trị rồi gọi nó.

    Tách logic khỏi giao diện Tách logic khỏi giao diện

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

    1. Xác định tham số. Gom giá trị đầu vào vào một dict hoặc dataclass.
    2. Viết hàm logic. Nhận part và tham số, trả về kết quả.
    3. Giao diện thu thập. Đọc block thành dict rồi gọi hàm.
    4. Chạy nền. Đọc tham số từ JSON hoặc dòng lệnh rồi gọi cùng hàm.
    5. Kiểm thử. Gọi hàm logic với tham số cố định.

    Code tham khảo (Python)

    import json
    import sys
    import NXOpen
    
    # ---- logic.py : không biết gì về giao diện ----
    def tao_luoi_diem(part, so_cot, so_hang, buoc):
        diem = []
        for i in range(int(so_cot)):
            for j in range(int(so_hang)):
                diem.append(part.Points.CreatePoint(NXOpen.Point3d(i * buoc, j * buoc, 0.0)))
        return diem
    
    def chay(part, tham_so):
        """Trả về chuỗi mô tả kết quả; ném ngoại lệ nếu tham số sai."""
        if tham_so["so_cot"] < 1 or tham_so["so_hang"] < 1 or tham_so["buoc"] <= 0:
            raise ValueError("Tham số không hợp lệ: " + json.dumps(tham_so))
        ds = tao_luoi_diem(part, tham_so["so_cot"], tham_so["so_hang"], tham_so["buoc"])
        return "Đã tạo %d điểm" % len(ds)
    
    # ---- giao diện : chỉ đọc block rồi gọi chay() ----
    def tu_hop_thoai(hop_thoai):
        goc = hop_thoai.TopBlock
        return {
            "so_cot": goc.FindBlock("integer_cot").Value,
            "so_hang": goc.FindBlock("integer_hang").Value,
            "buoc": goc.FindBlock("double_buoc").Value,
        }
    
    # ---- chạy nền : tham số từ JSON ----
    def tu_json(duong_dan):
        with open(duong_dan, "r", encoding="utf-8") as f:
            return json.load(f)
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Work
        if part is None:
            return
        tham_so = tu_json(sys.argv[1]) if len(sys.argv) > 1 else {"so_cot": 3, "so_hang": 3, "buoc": 10.0}
        lw.WriteLine(chay(part, tham_so))
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • Ba phần trong cùng khối chỉ để trình bày; khi dùng thật hãy tách ra các file logic.py, ui.py, chay_nen.py.
    • Hàm chay kiểm tra tham số tập trung, nên mọi đường vào (hộp thoại, JSON, dòng lệnh) đều được bảo vệ như nhau.
    • Test chỉ cần gọi chay với dict cố định, không cần mở hộp thoại.

    Lỗi thường gặp

    • Đừng để logic gọi trực tiếp NXMessageBox; trả kết quả hoặc ném lỗi để lớp ngoài quyết định cách hiển thị.
    • Dict tham số thiếu khóa gây KeyError; có thể thêm bước kiểm tra khóa bắt buộc.

    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.