NX Lab

Tạo báo cáo thống kê đối tượng theo loại và theo layer, ghi ra CSV

#Python#CSV#Báo cáo1 lượt xem

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

    Câu hỏi ·

    Kiểm kê nhanh một file: bao nhiêu điểm, đường, cung, body, trên layer nào. Báo cáo này hữu ích khi nhận file từ bên ngoài hay dọn dữ liệu.

    Tạo báo cáo thống kê đối tượng theo loại… Tạo báo cáo thống kê đối tượng theo loại…

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

    1. Duyệt các collection. Points, Lines, Arcs, Splines, Bodies, Sketches.
    2. Đọc layer. obj.Layer cho mỗi đối tượng.
    3. Gom nhóm. Dict (loại, layer) -> số lượng.
    4. Ghi CSV. Cột loại, layer, số lượng.
    5. In tổng. Tổng đối tượng và số layer đang dùng.

    Code tham khảo (Python)

    import csv
    import os
    from collections import Counter
    import NXOpen
    
    def thu_thap(part):
        nhom = Counter()
        for ten, tap in (("Điểm", part.Points), ("Đường thẳng", part.Lines), ("Cung tròn", part.Arcs),
                         ("Spline", part.Splines), ("Body", part.Bodies), ("Sketch", part.Sketches)):
            for o in tap:
                layer = getattr(o, "Layer", 0)
                nhom[(ten, layer)] += 1
        return nhom
    
    def ghi_csv(nhom, duong_dan):
        os.makedirs(os.path.dirname(duong_dan), exist_ok=True)
        with open(duong_dan, "w", newline="", encoding="utf-8-sig") as f:
            w = csv.writer(f)
            w.writerow(["loai", "layer", "so_luong"])
            for (ten, layer), n in sorted(nhom.items()):
                w.writerow([ten, layer, n])
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Work
        if part is None:
            return
        nhom = thu_thap(part)
        duong_dan = "D:/NXLab_xuat/thong_ke_%s.csv" % part.Leaf
        ghi_csv(nhom, duong_dan)
        tong = sum(nhom.values())
        layers = sorted({l for (_, l) in nhom})
        lw.WriteLine("Tổng %d đối tượng trên %d layer: %s" % (tong, len(layers), layers))
        lw.WriteLine("Đã ghi: " + duong_dan)
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • getattr(o, "Layer", 0) an toàn khi đối tượng không có thuộc tính Layer (ví dụ Sketch).
    • Counter với khóa tuple (loại, layer) cho thống kê hai chiều.
    • Ghi CSV với utf-8-sig để Excel hiển thị đúng chữ Việt.

    Lỗi thường gặp

    • Tên file có ký tự đặc biệt (dấu cách, ngoặc) trong part.Leaf có thể gây lỗi khi ghi; chuẩn hóa tên trước khi dùng.
    • Sketch có thể không có Layer; dòng báo cáo sẽ hiện layer 0.

    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.