NX Lab

Bảng thiết kế (design table) bằng CSV: ánh xạ cột sang expression và cập nhật mô hình từ Excel

#Python#Tham số#CSV1 lượt xem

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

    Câu hỏi ·

    Kỹ sư quen làm việc với bảng Excel. Cho phép họ sửa bảng thông số rồi một nút bấm đẩy các giá trị vào mô hình giúp thiết kế tham số tiếp cận được với người không lập trình.

    Bảng thiết kế (design table) bằng CSV Bảng thiết kế (design table) bằng CSV

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

    1. Thiết kế bảng. Hai cột: tên expression, giá trị.
    2. Đọc bảng. CSV UTF-8.
    3. Kiểm tra. Expression tồn tại, giá trị là số hợp lệ trong khoảng.
    4. Áp dụng. Edit từng expression, DoUpdate một lần.
    5. Báo cáo thay đổi. Giá trị cũ -> mới.

    Code tham khảo (Python)

    import csv
    import NXOpen
    
    GIOI_HAN = {"dai": (10.0, 500.0), "rong": (10.0, 300.0), "cao": (1.0, 100.0)}   # khoảng hợp lệ
    
    def doc_bang(duong_dan):
        with open(duong_dan, "r", newline="", encoding="utf-8-sig") as f:
            return [(d["ten"].strip(), d["gia_tri"].strip()) for d in csv.DictReader(f) if d.get("ten")]
    
    def kiem_tra(part, bang):
        loi, hop_le = [], []
        for ten, gt in bang:
            try:
                exp = part.Expressions.FindObject(ten)
            except NXOpen.NXException:
                loi.append("Không có expression '%s'" % ten)
                continue
            try:
                so = float(gt.replace(",", "."))
            except ValueError:
                loi.append("%s: giá trị '%s' không phải số" % (ten, gt))
                continue
            lo, hi = GIOI_HAN.get(ten, (float("-inf"), float("inf")))
            if not (lo <= so <= hi):
                loi.append("%s = %g ngoài khoảng [%g, %g]" % (ten, so, lo, hi))
                continue
            hop_le.append((exp, so))
        return hop_le, loi
    
    def main(duong_dan="D:/NXLab_nhap/bang_thiet_ke.csv"):
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Work
        if part is None:
            return
        hop_le, loi = kiem_tra(part, doc_bang(duong_dan))
        for l in loi:
            lw.WriteLine("[BỎ QUA] " + l)
        if not hop_le:
            lw.WriteLine("Không có thay đổi hợp lệ")
            return
        mark = session.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "Bang thiet ke")
        try:
            for exp, so in hop_le:
                cu = exp.RightHandSide
                part.Expressions.Edit(exp, "%g" % so)
                lw.WriteLine("%-10s %s -> %g" % (exp.Name, cu, so))
            ma = session.UpdateManager.DoUpdate(mark)
            if ma != 0:
                raise RuntimeError("DoUpdate lỗi %d" % ma)
        except Exception as ex:
            session.UndoToMark(mark, "Bang thiet ke")
            lw.WriteLine("Đã hoàn tác vì lỗi: %s" % ex)
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • gt.replace(",", ".") chấp nhận dấu phẩy thập phân kiểu Việt Nam do Excel xuất ra.
    • GIOI_HAN chặn giá trị vô lý (kích thước âm, quá lớn) trước khi chạm vào mô hình.
    • Toàn bộ thay đổi nằm trong một Undo Mark nên lỗi giữa chừng được hoàn tác sạch.

    Lỗi thường gặp

    • Giới hạn nên lấy từ file cấu hình thay vì viết cứng; mỗi họ chi tiết có khoảng hợp lệ riêng.
    • Thay đổi nhiều expression có quan hệ với nhau cùng lúc có thể vi phạm ràng buộc trung gian; đảm bảo bộ giá trị cuối hợp lệ.

    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.