NX Lab

Xuất STEP hàng loạt cho cả thư mục .prt: mở, xuất, đóng và ghi báo cáo thành công/lỗi

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

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

    Câu hỏi ·

    Gửi toàn bộ bộ chi tiết cho đối tác nghĩa là xuất hàng trăm file STEP. Khung xử lý hàng loạt: quét thư mục, xuất từng file có bắt lỗi, ghi CSV kết quả.

    Xuất STEP hàng loạt cho cả thư mục .prt Xuất STEP hàng loạt cho cả thư mục .prt

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

    1. Quét thư mục. Lấy mọi .prt, bỏ thư mục sao lưu.
    2. Xuất từng file. Step214Creator với ExistingPart (không cần mở file).
    3. Bắt lỗi. Ghi lỗi nhưng tiếp tục.
    4. Đo thời gian. Mỗi file.
    5. Ghi báo cáo CSV. Trạng thái, kích thước, thời gian.

    Code tham khảo (Python)

    import csv
    import os
    import time
    import NXOpen
    
    def xuat_mot_file(session, prt, stp, cau_hinh):
        c = session.DexManager.CreateStep214Creator()
        try:
            c.ExportFrom = NXOpen.Step214Creator.ExportFromOption.ExistingPart
            c.InputFile = prt
            c.OutputFile = stp
            c.SettingsFile = cau_hinh
            c.FileSaveFlag = False
            c.Commit()
        finally:
            c.Destroy()
    
    def main(thu_muc_nguon="D:/Du_an/ban_ve", thu_muc_ra="D:/NXLab_xuat/step"):
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        cau_hinh = os.path.join(session.GetEnvironmentVariableValue("UGII_BASE_DIR"), "step214ug", "ugstep214.def")
        os.makedirs(thu_muc_ra, exist_ok=True)
        nhat_ky = os.path.join(thu_muc_ra, "bao_cao_step.csv")
        ok = loi = 0
        with open(nhat_ky, "w", newline="", encoding="utf-8-sig") as f:
            w = csv.writer(f)
            w.writerow(["file", "trang_thai", "kb", "giay", "loi"])
            for goc, thu_muc_con, files in os.walk(thu_muc_nguon):
                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
                    prt = os.path.join(goc, ten).replace("\\", "/")
                    stp = os.path.join(thu_muc_ra, os.path.splitext(ten)[0] + ".stp").replace("\\", "/")
                    t0 = time.perf_counter()
                    try:
                        xuat_mot_file(session, prt, stp, cau_hinh)
                        kb = os.path.getsize(stp) // 1024
                        w.writerow([prt, "OK", kb, "%.1f" % (time.perf_counter() - t0), ""])
                        ok += 1
                    except Exception as ex:
                        w.writerow([prt, "LOI", "", "%.1f" % (time.perf_counter() - t0), str(ex)])
                        loi += 1
                    lw.WriteLine("%s: %s" % ("OK " if os.path.isfile(stp) else "LỖI", ten))
        lw.WriteLine("Xong: %d thành công, %d lỗi. Báo cáo: %s" % (ok, loi, nhat_ky))
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • Dùng ExistingPart nên không phải mở từng file vào phiên làm việc, tiết kiệm bộ nhớ.
    • Mỗi file có try/except riêng nên một file lỗi không làm dừng cả lô.
    • Báo cáo CSV ghi cả thời gian từng file để phát hiện file nặng.

    Lỗi thường gặp

    • File .prt thuộc assembly cần đủ component khi xuất; thiếu file cho STEP không đầy đủ.
    • Chạy hàng nghìn file nên chia thành nhiều lần chạy để dễ khôi phục khi gặp sự cố.

    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.