
Lưu và khôi phục bộ giá trị expression (preset) dưới dạng JSON: cấu hình sản phẩm có thể chia sẻ
#Python#Expression#JSON1 lượt xem
Quản trị viênQuản trị· 0 điểm
Câu hỏi ·
Cùng một mô hình tham số có thể có nhiều cấu hình (nhỏ, vừa, lớn). Lưu bộ giá trị expression thành preset JSON rồi nạp lại bất cứ lúc nào giúp chuyển cấu hình chỉ bằng một lệnh.
Lưu và khôi phục bộ giá trị expression…Các bước thực hiện
- Chọn expression cần lưu. Theo danh sách tên hoặc tiền tố.
- Lưu preset. Dict tên -> công thức vào JSON.
- Liệt kê preset. Các file trong thư mục preset.
- Nạp preset. Sửa từng expression, cập nhật một lần.
- Báo cáo thay đổi. Giá trị cũ -> mới.
Code tham khảo (Python)
import glob import json import os import NXOpen THU_MUC = "D:/NXLab/preset" def luu_preset(part, ten_preset, danh_sach_ten): du_lieu = {} for ten in danh_sach_ten: du_lieu[ten] = part.Expressions.FindObject(ten).RightHandSide os.makedirs(THU_MUC, exist_ok=True) duong_dan = "%s/%s__%s.json" % (THU_MUC, part.Leaf.replace(".prt", ""), ten_preset) with open(duong_dan, "w", encoding="utf-8") as f: json.dump(du_lieu, f, ensure_ascii=False, indent=2) return duong_dan def liet_ke_preset(part): mau = "%s/%s__*.json" % (THU_MUC, part.Leaf.replace(".prt", "")) return sorted(glob.glob(mau)) def nap_preset(session, part, duong_dan): with open(duong_dan, "r", encoding="utf-8") as f: du_lieu = json.load(f) mark = session.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "Nap preset") thay_doi = [] try: for ten, ct in du_lieu.items(): exp = part.Expressions.FindObject(ten) if exp.RightHandSide != ct: thay_doi.append((ten, exp.RightHandSide, ct)) part.Expressions.Edit(exp, ct) ma = session.UpdateManager.DoUpdate(mark) if ma != 0: raise RuntimeError("DoUpdate lỗi %d" % ma) except Exception: session.UndoToMark(mark, "Nap preset") raise return thay_doi def main(): session = NXOpen.Session.GetSession() lw = session.ListingWindow lw.Open() part = session.Parts.Work if part is None: return p = luu_preset(part, "mac_dinh", ["dai", "rong", "cao"]) lw.WriteLine("Đã lưu preset: " + p) for duong_dan in liet_ke_preset(part): lw.WriteLine("Có preset: " + os.path.basename(duong_dan)) thay = nap_preset(session, part, p) lw.WriteLine("Nạp preset: %d expression thay đổi" % len(thay)) if __name__ == "__main__": main()Giải thích code
- Lưu
RightHandSide(công thức) thay vìValueđể giữ được cả quan hệ giữa các expression. - Tên file preset gồm tên part và tên cấu hình, cho phép nhiều cấu hình mỗi part.
- Chỉ sửa expression thật sự khác nên thao tác nhanh hơn và log gọn hơn.
Lỗi thường gặp
- Nạp preset lên part có cấu trúc khác (thiếu expression) làm
FindObjectlỗi và hoàn tác; kiểm tra tên trước. - Thư mục preset trên ổ mạng chia sẻ cần quy ước tên để không ghi đè lẫn nhau.
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.