NX Lab

Công cụ xuất đa định dạng điều khiển bằng file JSON: chọn định dạng, thư mục, quy tắc tên

#Python#Tổng hợp#Xuất file1 lượt xem

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

    Câu hỏi ·

    Bài tổng hợp nhóm xuất file: một script đọc cấu hình JSON, chạy lần lượt các định dạng được bật (STEP, PDF, DXF) cho part đang mở và ghi báo cáo. Người dùng chỉ sửa JSON, không động tới code.

    Công cụ xuất đa định dạng điều khiển bằng… Công cụ xuất đa định dạng điều khiển bằng…

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

    1. Thiết kế cấu hình. Thư mục ra, định dạng bật, tùy chọn.
    2. Viết bộ xuất. Hàm riêng cho mỗi định dạng.
    3. Bảng ánh xạ. Tên định dạng -> hàm.
    4. Chạy các định dạng đã bật. Có bắt lỗi từng định dạng.
    5. Báo cáo. Thành công hay lỗi mỗi định dạng.

    Code tham khảo (Python)

    import json
    import os
    import NXOpen
    
    CAU_HINH_MAU = {
        "thu_muc_ra": "D:/NXLab_xuat",
        "dinh_dang": {"step": True, "pdf": True, "dxf": False},
    }
    
    def doc_cau_hinh(duong_dan):
        if os.path.isfile(duong_dan):
            with open(duong_dan, "r", encoding="utf-8") as f:
                return json.load(f)
        os.makedirs(os.path.dirname(duong_dan), exist_ok=True)
        with open(duong_dan, "w", encoding="utf-8") as f:
            json.dump(CAU_HINH_MAU, f, ensure_ascii=False, indent=2)
        return dict(CAU_HINH_MAU)
    
    def xuat_step(session, part, ra):
        cau_hinh = os.path.join(session.GetEnvironmentVariableValue("UGII_BASE_DIR"), "step214ug", "ugstep214.def")
        c = session.DexManager.CreateStep214Creator()
        try:
            c.ExportFrom = NXOpen.Step214Creator.ExportFromOption.ExistingPart
            c.InputFile, c.OutputFile, c.SettingsFile = part.FullPath, ra + ".stp", cau_hinh
            c.FileSaveFlag = False
            c.Commit()
        finally:
            c.Destroy()
    
    def xuat_pdf(session, part, ra):
        sheets = list(part.DrawingSheets)
        if not sheets:
            raise RuntimeError("Không có sheet bản vẽ")
        b = part.PlotManager.CreatePrintPdfbuilder()
        try:
            b.SourceBuilder.SetSheets(sheets)
            b.Filename = ra + ".pdf"
            b.Action = NXOpen.PrintPDFBuilder.ActionOption.Overwrite
            b.Commit()
        finally:
            b.Destroy()
    
    def xuat_dxf(session, part, ra):
        c = session.DexManager.CreateDxfdwgCreator()
        try:
            c.ExportFrom = NXOpen.DxfdwgCreator.ExportFromOption.ExistingPart
            c.InputFile, c.OutputFile = part.FullPath, ra + ".dxf"
            c.OutputFileType = NXOpen.DxfdwgCreator.OutputFileTypeOption.Dxf
            c.FileSaveFlag = False
            c.Commit()
        finally:
            c.Destroy()
    
    BO_XUAT = {"step": xuat_step, "pdf": xuat_pdf, "dxf": xuat_dxf}
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Work
        if part is None:
            lw.WriteLine("Chưa có part")
            return
        cfg = doc_cau_hinh("D:/NXLab_cau_hinh/xuat.json")
        os.makedirs(cfg["thu_muc_ra"], exist_ok=True)
        ra = "%s/%s" % (cfg["thu_muc_ra"].rstrip("/"), os.path.splitext(part.Leaf)[0])
        for ten, bat in cfg["dinh_dang"].items():
            if not bat:
                continue
            try:
                BO_XUAT[ten](session, part, ra)
                lw.WriteLine("[OK ] " + ten)
            except Exception as ex:
                lw.WriteLine("[LỖI] %s: %s" % (ten, ex))
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • BO_XUAT là bảng ánh xạ tên định dạng với hàm; thêm định dạng mới chỉ cần viết hàm và thêm một dòng.
    • Mỗi định dạng có try/except riêng nên một định dạng lỗi không chặn các định dạng khác.
    • Lần đầu chạy script tự tạo file JSON mẫu để người dùng chỉnh.

    Lỗi thường gặp

    • File cấu hình sai tên định dạng gây KeyError; kiểm tra tên trước khi gọi.
    • Part chưa lưu có FullPath cũ hoặc rỗng; hãy lưu trước khi xuất theo ExistingPart.

    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.