NX Lab

Lập bảng lỗ khoan (hole table) từ mô hình: gom theo đường kính, đếm số lượng, vị trí tâm gần đúng

#Python#Gia công#CSV1 lượt xem

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

    Câu hỏi ·

    Bảng lỗ gồm đường kính, số lượng và vị trí là tài liệu đi kèm bản vẽ gia công. Từ các cạnh tròn khép kín trong mô hình, gom theo đường kính và xuất bảng CSV.

    Lập bảng lỗ khoan (hole table) từ mô hình Lập bảng lỗ khoan (hole table) từ mô hình

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

    1. Tìm cạnh tròn khép kín. Chu vi chia pi cho đường kính.
    2. Gom theo đường kính. Làm tròn 0.01 mm.
    3. Ghép hai cạnh của lỗ thông. Cạnh có cùng đường kính và cùng trục.
    4. Xuất bảng. Đường kính, số cạnh, ví dụ vị trí.
    5. Ghi CSV. UTF-8 có BOM.

    Code tham khảo (Python)

    import csv
    import math
    import os
    from collections import defaultdict
    import NXOpen
    
    def canh_tron_kin(body):
        for e in body.GetEdges():
            if e.SolidEdgeType != NXOpen.Edge.EdgeType.Circular:
                continue
            a, b = e.GetVertices()
            if abs(a.X - b.X) + abs(a.Y - b.Y) + abs(a.Z - b.Z) < 1e-4:
                yield e, a
    
    def bang_lo(body):
        nhom = defaultdict(list)
        for e, diem in canh_tron_kin(body):
            duong_kinh = round(e.GetLength() / math.pi, 2)
            nhom[duong_kinh].append((round(diem.X, 2), round(diem.Y, 2), round(diem.Z, 2)))
        return nhom
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Work
        solids = [b for b in part.Bodies if b.IsSolidBody] if part else []
        if not solids:
            lw.WriteLine("Không có body đặc")
            return
        nhom = bang_lo(solids[0])
        ra = "D:/NXLab_xuat/bang_lo_%s.csv" % part.Leaf
        os.makedirs(os.path.dirname(ra), exist_ok=True)
        with open(ra, "w", newline="", encoding="utf-8-sig") as f:
            w = csv.writer(f)
            w.writerow(["Duong_kinh", "So_canh_tron", "Vi_tri_vi_du_X", "Y", "Z"])
            for d in sorted(nhom):
                vt = nhom[d][0]
                w.writerow(["%.2f" % d, len(nhom[d]), vt[0], vt[1], vt[2]])
                lw.WriteLine("Ø%.2f : %d cạnh tròn" % (d, len(nhom[d])))
        lw.WriteLine("Đã ghi: " + ra)
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • Điểm lấy được là một điểm trên vòng tròn, không phải tâm; tâm cần tính thêm từ nhiều điểm hoặc từ mặt trụ.
    • Lỗ thông có hai cạnh tròn (hai đầu) nên 'số cạnh tròn' gấp đôi số lỗ.
    • Bảng này là điểm xuất phát để lập bảng lỗ hoàn chỉnh trong bản vẽ.

    Lỗi thường gặp

    • Lỗ bậc, lỗ côn và ren cho nhiều cạnh tròn với đường kính khác nhau; cần phân loại theo mặt trụ để biết đó là một lỗ.
    • Trục tròn (mặt trụ lồi) cũng cho cạnh tròn; phân biệt lỗ và trục bằng chiều pháp tuyến mặt trụ.

    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.