NX Lab

Tính thể tích, diện tích, khối lượng và trọng tâm bằng MeasureManager.NewMassProperties

#Python#Đo đạc1 lượt xem

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

    Câu hỏi ·

    Khối lượng chi tiết là số liệu quan trọng cho báo giá và kiểm tra thiết kế. NX tính chính xác bằng MeasureManager, bạn chỉ cần đưa đúng danh sách đơn vị.

    Tính thể tích, diện tích, khối lượng và… Tính thể tích, diện tích, khối lượng và…

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

    1. Chuẩn bị đơn vị. Diện tích, thể tích, khối lượng, độ dài, và các đơn vị tiếp theo.
    2. Đặt mật độ. body.Density (kg/mm³ theo đơn vị part) trước khi đo nếu cần khối lượng.
    3. Gọi NewMassProperties. Nhận danh sách đơn vị, độ chính xác và các body.
    4. Đọc kết quả. Area, Volume, Mass, Centroid.
    5. Hủy đối tượng đo. Đối tượng đo là tạm, có thể bỏ qua.

    Code tham khảo (Python)

    import NXOpen
    
    def do_khoi_luong(part, bodies, do_chinh_xac=0.99):
        uc = part.UnitCollection
        don_vi = [
            uc.FindObject("SquareMilliMeter"),    # diện tích
            uc.FindObject("CubicMilliMeter"),     # thể tích
            uc.FindObject("Kilogram"),            # khối lượng
            uc.FindObject("MilliMeter"),          # độ dài
            uc.FindObject("Kilogram"),            # (dự phòng cho các trường khối lượng khác)
        ]
        kq = part.MeasureManager.NewMassProperties(don_vi, do_chinh_xac, bodies)
        try:
            return {
                "dien_tich_mm2": kq.Area,
                "the_tich_mm3": kq.Volume,
                "khoi_luong_kg": kq.Mass,
                "trong_tam": (kq.Centroid.X, kq.Centroid.Y, kq.Centroid.Z),
            }
        finally:
            kq.Dispose() if hasattr(kq, "Dispose") else None
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Work
        if part is None:
            return
        bodies = [b for b in part.Bodies if b.IsSolidBody]
        if not bodies:
            lw.WriteLine("Không có body đặc")
            return
        # Đặt mật độ thép 7.85e-6 kg/mm3 nếu body chưa có
        for b in bodies:
            if b.Density <= 0:
                b.Density = 7.85e-6
        r = do_khoi_luong(part, bodies)
        lw.WriteLine("Diện tích  : %.1f mm2" % r["dien_tich_mm2"])
        lw.WriteLine("Thể tích   : %.1f mm3" % r["the_tich_mm3"])
        lw.WriteLine("Khối lượng : %.4f kg" % r["khoi_luong_kg"])
        lw.WriteLine("Trọng tâm  : (%.2f, %.2f, %.2f)" % r["trong_tam"])
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • Mảng đơn vị có thứ tự cố định; nếu thiếu đơn vị NX sẽ báo lỗi, nên truyền đủ và đúng thứ tự như trong journal ghi sẵn.
    • Density của body theo đơn vị khối lượng trên đơn vị thể tích của part; thép khoảng 7.85e-6 kg/mm³.
    • Độ chính xác 0.99 là mặc định phổ biến; tăng gần 1 để chính xác hơn nhưng chậm hơn.

    Lỗi thường gặp

    • Thứ tự và số lượng đơn vị truyền vào có thể khác nhau giữa các phiên bản; hãy so với journal NX ghi ở máy bạn.
    • Body chưa gán vật liệu có Density bằng 0 nên khối lượng bằng 0; gán mật độ trước.

    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.