NX Lab

Tổng hợp: đọc một file .prt và xuất phiếu thông số (tên, kích thước, khối lượng, lỗ, expression)

#Python#Báo cáo#Tổng hợp1 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 đo đạc: ghép các hàm ở các bài trước để sinh một phiếu thông số kỹ thuật dạng text cho mỗi chi tiết, có thể ghi ra file để gửi bộ phận báo giá.

    Tổng hợp: đọc một file .prt và xuất phiếu… Tổng hợp: đọc một file .prt và xuất phiếu…

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

    1. Thu thập thông tin chung. Tên, đơn vị, số body, số feature.
    2. Tính hộp bao. Chiều dài, rộng, cao.
    3. Tính khối lượng. Qua MeasureManager với mật độ cho trước.
    4. Đếm lỗ. Theo đường kính.
    5. Ghi phiếu. Text UTF-8 trong thư mục báo cáo.

    Code tham khảo (Python)

    import math
    import os
    import time
    from collections import Counter
    import NXOpen
    
    MAT_DO = 7.85e-6   # kg/mm3 (thép)
    
    def hop_bao(body):
        xs, ys, zs = [], [], []
        for e in body.GetEdges():
            for p in e.GetVertices():
                xs.append(p.X); ys.append(p.Y); zs.append(p.Z)
        return [max(xs) - min(xs), max(ys) - min(ys), max(zs) - min(zs)]
    
    def khoi_luong(part, bodies):
        uc = part.UnitCollection
        don_vi = [uc.FindObject("SquareMilliMeter"), uc.FindObject("CubicMilliMeter"),
                  uc.FindObject("Kilogram"), uc.FindObject("MilliMeter"), uc.FindObject("Kilogram")]
        for b in bodies:
            if b.Density <= 0:
                b.Density = MAT_DO
        r = part.MeasureManager.NewMassProperties(don_vi, 0.99, bodies)
        return r.Volume, r.Mass
    
    def dem_lo(bodies):
        c = Counter()
        for b in bodies:
            for e in b.GetEdges():
                if e.SolidEdgeType == NXOpen.Edge.EdgeType.Circular:
                    a, z = e.GetVertices()
                    if abs(a.X - z.X) + abs(a.Y - z.Y) + abs(a.Z - z.Z) < 1e-4:
                        c[round(e.GetLength() / math.pi, 2)] += 1
        return c
    
    def lap_phieu(part):
        bodies = [b for b in part.Bodies if b.IsSolidBody]
        dong = ["PHIẾU THÔNG SỐ - " + part.Leaf, "Ngày: " + time.strftime("%Y-%m-%d %H:%M"), ""]
        dong.append("Số body đặc : %d" % len(bodies))
        dong.append("Số feature : %d" % sum(1 for _ in part.Features))
        if bodies:
            kt = [max(hop_bao(b)[i] for b in bodies) for i in range(3)]
            dong.append("Hộp bao (mm): %.2f x %.2f x %.2f" % tuple(kt))
            v, m = khoi_luong(part, bodies)
            dong.append("Thể tích (mm3): %.1f" % v)
            dong.append("Khối lượng ước tính (kg): %.4f" % m)
            dong.append("Lỗ (đường kính: số cạnh tròn):")
            for d, n in sorted(dem_lo(bodies).items()):
                dong.append("   Ø%.2f : %d" % (d, n))
        dong.append("")
        dong.append("Expression chính:")
        for e in part.Expressions:
            if e.Type == "Number" and not e.Name.startswith("p"):
                dong.append("   %s = %s" % (e.Name, e.RightHandSide))
        return "\n".join(dong)
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Work
        if part is None:
            return
        noi_dung = lap_phieu(part)
        thu_muc = "D:/NXLab_xuat"
        os.makedirs(thu_muc, exist_ok=True)
        duong_dan = "%s/phieu_%s.txt" % (thu_muc, part.Leaf)
        with open(duong_dan, "w", encoding="utf-8") as f:
            f.write(noi_dung)
        lw.WriteLine(noi_dung)
        lw.WriteLine("\nĐã ghi: " + duong_dan)
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • Các hàm nhỏ dùng lại từ các bài trước: hộp bao, khối lượng, nhận dạng lỗ.
    • Phiếu được dựng thành danh sách dòng rồi ghép bằng "\n".join(...), dễ ghi ra file hoặc in lên Listing Window.
    • Mật độ mặc định giả định thép; thay bằng bảng tra vật liệu của bạn.

    Lỗi thường gặp

    • Kết quả hộp bao và lỗ chỉ là ước lượng từ hình học đỉnh/cạnh; chi tiết phức tạp cần phương pháp chính xác hơn.
    • Số lượng cạnh tròn gấp đôi số lỗ thông; điều chỉnh khi trình bày cho người dùng cuối.

    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.