NX Lab

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

  1. 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… Lưu và khôi phục bộ giá trị expression…

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

    1. Chọn expression cần lưu. Theo danh sách tên hoặc tiền tố.
    2. Lưu preset. Dict tên -> công thức vào JSON.
    3. Liệt kê preset. Các file trong thư mục preset.
    4. Nạp preset. Sửa từng expression, cập nhật một lần.
    5. 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 FindObject lỗ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.