NX Lab

Mô hình tham số hóa bằng expression: tạo khối hộp có ba kích thước điều khiển được

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

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

    Câu hỏi ·

    Mô hình tham số tốt đổi kích thước bằng cách sửa một con số. Cách dựng đúng: tạo expression trước, rồi cho feature tham chiếu tên expression thay vì số cố định.

    Mô hình tham số hóa bằng expression Mô hình tham số hóa bằng expression

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

    1. Tạo expression kích thước. dai, rong, cao kèm đơn vị mm.
    2. Dựng feature tham chiếu tên. Truyền chuỗi tên expression vào SetOriginAndLengths.
    3. Sửa expression. Edit rồi cập nhật mô hình.
    4. Kiểm tra hộp bao mới. Đo lại kích thước.
    5. Khôi phục. Đặt lại kích thước ban đầu.

    Code tham khảo (Python)

    import NXOpen
    
    def tao_expression(part, ten, gia_tri):
        mm = part.UnitCollection.FindObject("MilliMeter")
        return part.Expressions.CreateWithUnits("%s = %g" % (ten, gia_tri), mm)
    
    def tao_khoi_tham_so(part):
        tao_expression(part, "dai", 100.0)
        tao_expression(part, "rong", 60.0)
        tao_expression(part, "cao", 25.0)
        b = part.Features.CreateBlockFeatureBuilder(NXOpen.Features.Feature.Null)
        try:
            b.Type = NXOpen.Features.BlockFeatureBuilder.Types.OriginAndEdgeLengths
            b.SetOriginAndLengths(NXOpen.Point3d(0, 0, 0), "dai", "rong", "cao")   # tên expression, không phải số
            return b.CommitFeature()
        finally:
            b.Destroy()
    
    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 sua_kich_thuoc(session, part, ten, gia_tri):
        mark = session.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "Sua " + ten)
        part.Expressions.Edit(part.Expressions.FindObject(ten), str(gia_tri))
        loi = session.UpdateManager.DoUpdate(mark)
        session.DeleteUndoMark(mark, "Sua " + ten)
        return loi
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Work
        if part is None:
            return
        session.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "Khoi tham so")
        tao_khoi_tham_so(part)
        body = [b for b in part.Bodies if b.IsSolidBody][-1]
        lw.WriteLine("Ban đầu : %.1f x %.1f x %.1f" % hop_bao(body))
        sua_kich_thuoc(session, part, "dai", 150)
        sua_kich_thuoc(session, part, "cao", 40)
        lw.WriteLine("Sau khi sửa: %.1f x %.1f x %.1f" % hop_bao(body))
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • Truyền chuỗi "dai" thay vì "100" biến độ dài của khối thành tham chiếu tới expression.
    • Sau Edit + DoUpdate, khối tự thay đổi kích thước; không phải tạo lại feature.
    • Đọc hộp bao trước và sau để xác nhận mô hình đã cập nhật thật.

    Lỗi thường gặp

    • Tạo expression trùng tên báo lỗi; kiểm tra FindObject trước hoặc dùng tên có tiền tố duy nhất.
    • Tên expression không được chứa ký tự đặc biệt hay dấu cách; dùng chữ không dấu và gạch dướ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.