NX Lab

Đặt tên file xuất theo quy tắc: mã chi tiết, revision, ngày và loại file

#Python#Quy ước#Xuất file1 lượt xem

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

    Câu hỏi ·

    Tên file lộn xộn là nguồn nhầm lẫn lớn. Gói quy tắc đặt tên vào một hàm: mã chi tiết, revision, ngày tháng, đuôi file, và dọn ký tự không hợp lệ.

    Đặt tên file xuất theo quy tắc Đặt tên file xuất theo quy tắc

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

    1. Lấy mã chi tiết. Từ tên part hoặc thuộc tính.
    2. Lấy revision. Từ thuộc tính REV, mặc định A.
    3. Chuẩn hóa ký tự. Bỏ dấu, thay ký tự cấm bằng gạch dưới.
    4. Ghép tên. Mã_Rev_Ngày.đuôi.
    5. Tránh trùng. Thêm số thứ tự nếu file đã tồn tại.

    Code tham khảo (Python)

    import os
    import re
    import time
    import unicodedata
    import NXOpen
    
    def bo_dau(s):
        s = unicodedata.normalize("NFD", s)
        s = "".join(c for c in s if unicodedata.category(c) != "Mn")
        return s.replace("đ", "d").replace("Đ", "D")
    
    def lam_sach(s):
        s = bo_dau(s)
        s = re.sub(r"[^A-Za-z0-9._-]+", "_", s).strip("_")
        return s or "KHONG_TEN"
    
    def doc_thuoc_tinh(part, ten, mac_dinh=""):
        for a in part.GetUserAttributes():
            if a.Title.upper() == ten:
                return a.StringValue
        return mac_dinh
    
    def ten_file_xuat(part, duoi, thu_muc):
        ma = lam_sach(doc_thuoc_tinh(part, "MA_CHI_TIET", os.path.splitext(part.Leaf)[0]))
        rev = lam_sach(doc_thuoc_tinh(part, "REV", "A"))
        ngay = time.strftime("%Y%m%d")
        goc = "%s_REV%s_%s" % (ma, rev, ngay)
        duong_dan = "%s/%s.%s" % (thu_muc.rstrip("/"), goc, duoi.lstrip("."))
        i = 2
        while os.path.exists(duong_dan):
            duong_dan = "%s/%s_%d.%s" % (thu_muc.rstrip("/"), goc, i, duoi.lstrip("."))
            i += 1
        return duong_dan
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Work
        if part is None:
            return
        for duoi in ("stp", "pdf", "dxf"):
            lw.WriteLine("%-4s -> %s" % (duoi, ten_file_xuat(part, duoi, "D:/NXLab_xuat")))
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • unicodedata.normalize("NFD") tách dấu khỏi chữ, rồi bỏ các ký tự dấu (nhóm Mn), đổi riêng chữ đ.
    • Biểu thức chính quy thay mọi ký tự ngoài chữ-số-gạch bằng dấu gạch dưới.
    • Vòng while thêm hậu tố số thứ tự để không ghi đè file đã có.

    Lỗi thường gặp

    • Windows giới hạn 260 ký tự đường dẫn; giữ tên ngắn gọn.
    • Revision trong thuộc tính có thể do người nhập; luôn làm sạch trước khi dùng trong tên 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.