NX Lab

Duyệt toàn bộ thư mục .prt: mở, xử lý, đóng và ghi báo cáo CSV

#Python#Hàng loạt1 lượt xem

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

    Câu hỏi ·

    Đây là khung chuẩn của mọi tác vụ hàng loạt: quét thư mục, mở từng file, làm một việc, đóng lại và ghi kết quả. Khi đã có khung này, bạn chỉ thay phần 'làm một việc'.

    Duyệt toàn bộ thư mục .prt Duyệt toàn bộ thư mục .prt

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

    1. Quét thư mục. os.walk lấy mọi file .prt, bỏ qua thư mục sao lưu.
    2. Mở từng file. Dùng Parts.Open (không hiển thị) cho nhanh.
    3. Gọi hàm xử lý. Hàm nhận part và trả về dict kết quả.
    4. Đóng ngay. Close sau mỗi file để giữ bộ nhớ ổn định.
    5. Ghi CSV. Mỗi file một dòng, có cột trạng thái và lỗi.

    Code tham khảo (Python)

    import csv
    import os
    import NXOpen
    
    def xu_ly(part):
        """Việc cần làm cho mỗi part. Thay phần này theo nhu cầu."""
        return {
            "so_feature": sum(1 for _ in part.Features),
            "so_body": sum(1 for _ in part.Bodies),
        }
    
    def quet_prt(thu_muc):
        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 f in sorted(files):
                if f.lower().endswith(".prt"):
                    yield os.path.join(goc, f).replace("\\", "/")
    
    def main(thu_muc="D:/Du_an/ban_ve", ra="D:/NXLab_xuat/bao_cao.csv"):
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        os.makedirs(os.path.dirname(ra), exist_ok=True)
        with open(ra, "w", newline="", encoding="utf-8-sig") as f:
            w = csv.writer(f)
            w.writerow(["file", "trang_thai", "so_feature", "so_body", "loi"])
            for duong_dan in quet_prt(thu_muc):
                part = None
                try:
                    part, st = session.Parts.Open(duong_dan)
                    st.Dispose()
                    kq = xu_ly(part)
                    w.writerow([duong_dan, "OK", kq["so_feature"], kq["so_body"], ""])
                except Exception as ex:
                    w.writerow([duong_dan, "LOI", "", "", str(ex)])
                finally:
                    if part is not None:
                        part.Close(NXOpen.BasePart.CloseWholeTree.TrueValue,
                                   NXOpen.BasePart.CloseModified.CloseModified, None)
                lw.WriteLine("Đã xử lý: " + duong_dan)
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • utf-8-sig giúp Excel đọc đúng tiếng Việt khi mở file CSV.
    • thu_muc_con[:] = ... sửa danh sách tại chỗ để os.walk bỏ qua thư mục không mong muốn.
    • Truyền None làm bộ phản hồi khi đóng là cách ngắn gọn khi không cần xử lý hộp thoại.

    Lỗi thường gặp

    • Quên Close làm NX giữ hàng trăm part trong bộ nhớ và chậm dần rồi treo.
    • File assembly mở theo cây; cần quyết định có xử lý các component con hay không.

    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.