NX Lab

Sinh mã chi tiết tự động theo quy tắc (loại-năm-số thứ tự) và ghi vào thuộc tính, tránh trùng

#Python#Attribute#Mã chi tiết1 lượt xem

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

    Câu hỏi ·

    Mã chi tiết do con người đặt dễ trùng và lộn xộn. Sinh mã bằng script theo quy tắc có số thứ tự cuối cùng lưu trong file đếm cho phép đảm bảo duy nhất, kể cả khi nhiều người dùng chung.

    Sinh mã chi tiết tự động theo quy tắc… Sinh mã chi tiết tự động theo quy tắc…

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

    1. Thiết kế quy tắc. Ví dụ CT-26-0001: loại, năm, số thứ tự 4 chữ số.
    2. Lưu bộ đếm. File JSON chia sẻ trên ổ mạng.
    3. Khóa file khi cập nhật. Tránh hai người cùng lấy một số.
    4. Sinh và ghi mã. Ghi vào MA_CHI_TIET nếu chưa có.
    5. Tránh đổi mã đã có. Không cấp lại cho part đã có mã.

    Code tham khảo (Python)

    import json
    import os
    import time
    import NXOpen
    
    NGAY = NXOpen.Update.Option.Now
    FILE_DEM = "D:/NXLab_cau_hinh/bo_dem_ma.json"
    KHOA = FILE_DEM + ".lock"
    
    class Khoa:
        """Khóa đơn giản bằng file; đủ dùng cho vài người, không thay cho cơ sở dữ liệu."""
        def __enter__(self):
            for _ in range(50):
                try:
                    self.fd = os.open(KHOA, os.O_CREAT | os.O_EXCL | os.O_WRONLY)
                    return self
                except FileExistsError:
                    time.sleep(0.1)
            raise TimeoutError("Không lấy được khóa bộ đếm: " + KHOA)
        def __exit__(self, *a):
            os.close(self.fd)
            os.remove(KHOA)
    
    def cap_ma(loai="CT"):
        os.makedirs(os.path.dirname(FILE_DEM), exist_ok=True)
        nam = time.strftime("%y")
        with Khoa():
            dem = {}
            if os.path.isfile(FILE_DEM):
                with open(FILE_DEM, "r", encoding="utf-8") as f:
                    dem = json.load(f)
            khoa = "%s-%s" % (loai, nam)
            so = dem.get(khoa, 0) + 1
            dem[khoa] = so
            with open(FILE_DEM, "w", encoding="utf-8") as f:
                json.dump(dem, f, indent=2)
        return "%s-%s-%04d" % (loai, nam, so)
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Work
        if part is None:
            return
        kieu = NXOpen.NXObject.AttributeType.String
        if part.HasUserAttribute("MA_CHI_TIET", kieu, -1):
            lw.WriteLine("Part đã có mã: " + part.GetUserAttributeAsString("MA_CHI_TIET", kieu, -1))
            return
        ma = cap_ma("CT")
        part.SetUserAttribute("MA_CHI_TIET", -1, ma, NGAY)
        lw.WriteLine("Đã cấp mã mới: " + ma)
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • os.O_CREAT | os.O_EXCL tạo file khóa nguyên tử; nếu đã có người giữ khóa thì báo FileExistsError và ta thử lại.
    • Bộ đếm theo cặp (loại, năm) để số thứ tự quay lại 0001 mỗi năm mới.
    • Không bao giờ cấp lại mã cho part đã có mã, để tránh làm lệch tham chiếu.

    Lỗi thường gặp

    • File khóa treo (script chết giữa chừng) làm người khác chờ mãi; thêm cơ chế xóa khóa quá cũ.
    • Với nhiều người dùng đồng thời nên dùng PDM/CSDL cấp mã thay vì file chia sẻ.

    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.