
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
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…Các bước thực hiện
- Định nghĩa cột. Danh sách thuộc tính cần xuất.
- Quét thư mục. os.walk lấy file .prt.
- Mở part không hiển thị. Parts.Open.
- Đọc thuộc tính. Dict tên -> giá trị.
- 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_chughi 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.