
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
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…Các bước thực hiện
- Thu thập thông tin chung. Tên, đơn vị, số body, số feature.
- Tính hộp bao. Chiều dài, rộng, cao.
- Tính khối lượng. Qua MeasureManager với mật độ cho trước.
- Đếm lỗ. Theo đường kính.
- 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.