NX Lab

Kiểm kê thuộc tính của cả thư mục .prt ra CSV: mỗi file một dòng, mỗi thuộc tính một cột

#Python#Attribute#CSV1 lượt xem

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

    Câu hỏi ·

    Biết toàn bộ kho bản vẽ đang thiếu mã vật tư nào, vật liệu nào là bước nền của dọn dữ liệu. Script này quét thư mục, mở từng part, đọc thuộc tính cần quan tâm và ghi một bảng CSV.

    Kiểm kê thuộc tính của cả thư mục .prt ra… Kiểm kê thuộc tính của cả thư mục .prt ra…

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

    1. Định nghĩa cột. Danh sách thuộc tính cần xuất.
    2. Quét thư mục. os.walk lấy file .prt.
    3. Mở part không hiển thị. Parts.Open.
    4. Đọc thuộc tính. Dict tên -> giá trị.
    5. Ghi CSV và đóng part. Một dòng cho mỗi file.

    Code tham khảo (Python)

    import csv
    import os
    import NXOpen
    
    COT = ["MA_VAT_TU", "VAT_LIEU", "NGUOI_THIET_KE", "REV", "KHOI_LUONG"]
    
    def doc_dict(part):
        kq = {}
        for a in part.GetUserAttributes():
            if a.Type == NXOpen.NXObject.AttributeType.Real:
                kq[a.Title.upper()] = a.RealValue
            elif a.Type == NXOpen.NXObject.AttributeType.Integer:
                kq[a.Title.upper()] = a.IntegerValue
            else:
                kq[a.Title.upper()] = a.StringValue
        return kq
    
    def main(thu_muc="D:/Du_an/ban_ve", ra="D:/NXLab_xuat/kiem_ke_thuoc_tinh.csv"):
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        os.makedirs(os.path.dirname(ra), exist_ok=True)
        so_file = so_thieu = 0
        with open(ra, "w", newline="", encoding="utf-8-sig") as f:
            w = csv.writer(f)
            w.writerow(["file"] + COT + ["ghi_chu"])
            for goc, thu_muc_con, files in os.walk(thu_muc):
                thu_muc_con[:] = [d for d in thu_muc_con if d.lower() not in ("backup", "old")]
                for ten in sorted(files):
                    if not ten.lower().endswith(".prt"):
                        continue
                    duong_dan = os.path.join(goc, ten).replace("\\", "/")
                    part = None
                    try:
                        part, st = session.Parts.Open(duong_dan)
                        st.Dispose()
                        tt = doc_dict(part)
                        thieu = [c for c in COT[:3] if not tt.get(c)]
                        w.writerow([duong_dan] + [tt.get(c, "") for c in COT] + [("thiếu: " + ", ".join(thieu)) if thieu else ""])
                        so_thieu += 1 if thieu else 0
                    except Exception as ex:
                        w.writerow([duong_dan] + [""] * len(COT) + ["LỖI: %s" % ex])
                    finally:
                        if part is not None:
                            part.Close(NXOpen.BasePart.CloseWholeTree.TrueValue,
                                       NXOpen.BasePart.CloseModified.CloseModified, None)
                    so_file += 1
        lw.WriteLine("Đã kiểm kê %d file, %d file thiếu thuộc tính chính. Kết quả: %s" % (so_file, so_thieu, ra))
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • Tên thuộc tính chuyển thành chữ hoa để so khớp không phân biệt hoa thường.
    • Cột ghi_chu ghi những thuộc tính chính còn thiếu hoặc lỗi mở file.
    • Part được đóng ngay sau khi đọc để không dồn bộ nhớ khi quét hàng trăm file.

    Lỗi thường gặp

    • File từ Teamcenter hoặc đã bị khóa mở chế độ chỉ đọc; vẫn đọc được thuộc tính nhưng không lưu được.
    • Mở file lớn chỉ để đọc thuộc tính là lãng phí; nếu có thể, đọc từ hệ thống PDM thay vì mở từng file.

    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.