NX Lab

So sánh thuộc tính giữa hai phiên bản của một part: thêm, bớt, đổi giá trị

#Python#Attribute#So sánh1 lượt xem

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

    Câu hỏi ·

    Trước khi phát hành revision mới, cần xem thuộc tính nào đã đổi so với bản cũ. Hàm so sánh hai dict thuộc tính trả về danh sách thêm, bớt, đổi giá trị.

    So sánh thuộc tính giữa hai phiên bản của… So sánh thuộc tính giữa hai phiên bản của…

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

    1. Đọc dict hai bản. Từ hai part (hoặc từ part và file JSON lưu trước).
    2. Tìm khóa mới. Có ở mới nhưng không ở cũ.
    3. Tìm khóa bị bỏ. Có ở cũ nhưng không ở mới.
    4. Tìm giá trị đổi. Cùng khóa nhưng khác giá trị.
    5. In báo cáo. Ba nhóm riêng.

    Code tham khảo (Python)

    import json
    import NXOpen
    
    KIEU = NXOpen.NXObject.AttributeType
    
    def doc_dict(part):
        kq = {}
        for a in part.GetUserAttributes():
            kq[a.Title] = (a.RealValue if a.Type == KIEU.Real else a.IntegerValue if a.Type == KIEU.Integer else a.StringValue)
        return kq
    
    def so_sanh(cu, moi):
        them = {k: moi[k] for k in moi.keys() - cu.keys()}
        bot = {k: cu[k] for k in cu.keys() - moi.keys()}
        doi = {k: (cu[k], moi[k]) for k in cu.keys() & moi.keys() if cu[k] != moi[k]}
        return them, bot, doi
    
    def luu_anh_chup(part, duong_dan):
        with open(duong_dan, "w", encoding="utf-8") as f:
            json.dump(doc_dict(part), f, ensure_ascii=False, indent=2)
    
    def nap_anh_chup(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
        file_anh = "D:/NXLab_log/anh_chup_%s.json" % part.Leaf
        moi = doc_dict(part)
        try:
            cu = nap_anh_chup(file_anh)
        except FileNotFoundError:
            luu_anh_chup(part, file_anh)
            lw.WriteLine("Chưa có ảnh chụp cũ; đã lưu ảnh chụp hiện tại: " + file_anh)
            return
        them, bot, doi = so_sanh(cu, moi)
        lw.WriteLine("Thêm: %d, bỏ: %d, đổi: %d" % (len(them), len(bot), len(doi)))
        for k, v in them.items():
            lw.WriteLine("  + %s = %r" % (k, v))
        for k, v in bot.items():
            lw.WriteLine("  - %s (cũ = %r)" % (k, v))
        for k, (a, b) in doi.items():
            lw.WriteLine("  ~ %s: %r -> %r" % (k, a, b))
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • Phép toán trên keys() (hiệu, giao tập) cho ba nhóm khóa chỉ bằng một dòng mỗi nhóm.
    • Ảnh chụp thuộc tính lưu thành JSON để so với lần chạy sau, không cần giữ file .prt cũ.
    • Lần chạy đầu chỉ lưu ảnh chụp; từ lần sau mới có kết quả so sánh.

    Lỗi thường gặp

    • Giá trị số thực so sánh bằng != có thể khác nhau do sai số làm tròn; dùng abs(a-b) < dung_sai.
    • Thư mục D:/NXLab_log phải tồn tại; thêm os.makedirs trước khi ghi file ảnh chụp.

    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.