NX Lab

Quét tham số (parameter sweep): thay đổi một kích thước theo từng bước và ghi bảng khối lượng, thể tích

#Python#Tham số#CSV1 lượt xem

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

    Câu hỏi ·

    Khảo sát ảnh hưởng của một kích thước tới khối lượng hay thể tích là việc thường gặp trong thiết kế. Quét từ giá trị nhỏ đến lớn theo bước cố định, đo mỗi điểm và ghi CSV để vẽ đồ thị trong Excel.

    Quét tham số (parameter sweep) Quét tham số (parameter sweep)

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

    1. Chọn expression và khoảng. Từ, đến, bước.
    2. Lặp qua các giá trị. Sửa expression, cập nhật.
    3. Đo kết quả. Khối lượng, thể tích, diện tích.
    4. Ghi CSV. Mỗi dòng một điểm.
    5. Khôi phục. Đặt lại giá trị gốc cuối cùng.

    Code tham khảo (Python)

    import csv
    import os
    import NXOpen
    
    def do_chi_tieu(part):
        bodies = [b for b in part.Bodies if b.IsSolidBody]
        for b in bodies:
            if b.Density <= 0:
                b.Density = 7.85e-6
        uc = part.UnitCollection
        don_vi = [uc.FindObject("SquareMilliMeter"), uc.FindObject("CubicMilliMeter"),
                  uc.FindObject("Kilogram"), uc.FindObject("MilliMeter"), uc.FindObject("Kilogram")]
        r = part.MeasureManager.NewMassProperties(don_vi, 0.99, bodies)
        return r.Area, r.Volume, r.Mass
    
    def khoang(tu, den, buoc):
        n = int(round((den - tu) / buoc))
        return [tu + i * buoc for i in range(n + 1)]
    
    def quet(session, part, ten_exp, tu, den, buoc, lw):
        exp = part.Expressions.FindObject(ten_exp)
        cu = exp.RightHandSide
        ket_qua = []
        try:
            for gt in khoang(tu, den, buoc):
                mark = session.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "Quet")
                part.Expressions.Edit(exp, "%.4f" % gt)
                ma = session.UpdateManager.DoUpdate(mark)
                session.DeleteUndoMark(mark, "Quet")
                if ma != 0:
                    lw.WriteLine("Bỏ qua %g (DoUpdate lỗi %d)" % (gt, ma))
                    continue
                dien_tich, the_tich, khoi_luong = do_chi_tieu(part)
                ket_qua.append((gt, dien_tich, the_tich, khoi_luong))
        finally:
            part.Expressions.Edit(exp, cu)
            session.UpdateManager.DoUpdate(session.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "Khoi phuc"))
        return ket_qua
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Work
        if part is None:
            return
        kq = quet(session, part, "day", 2.0, 12.0, 1.0, lw)
        ra = "D:/NXLab_xuat/quet_day.csv"
        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(["day_mm", "dien_tich_mm2", "the_tich_mm3", "khoi_luong_kg"])
            w.writerows([("%.3f" % a, "%.1f" % b, "%.1f" % c, "%.4f" % d) for a, b, c, d in kq])
        lw.WriteLine("Đã quét %d điểm -> %s" % (len(kq), ra))
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • khoang dùng số bước nguyên để tránh sai số cộng dồn của số thực.
    • Khôi phục giá trị gốc trong finally đảm bảo mô hình trở lại như ban đầu dù lỗi xảy ra.
    • File CSV mở thẳng trong Excel để vẽ đồ thị quan hệ độ dày - khối lượng.

    Lỗi thường gặp

    • Quét nhiều điểm trên mô hình nặng rất lâu; đo thời gian một điểm trước khi chọn bước.
    • Giá trị làm mô hình lỗi (độ dày lớn hơn khoảng hở) bị bỏ qua nhưng vẫn chiếm thời gian; giới hạn khoảng quét hợp lý.

    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.