NX Lab

Thuộc tính trên body và mặt: đánh dấu bề mặt cần gia công và tô màu theo thuộc tính

#Python#Attribute#Hình học1 lượt xem

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

    Câu hỏi ·

    Thuộc tính không chỉ gắn lên part mà còn lên body, mặt, cạnh. Ví dụ đánh dấu những mặt có độ nhám Ra 0.8 để chương trình CAM hay báo cáo sau này nhận ra chúng.

    Thuộc tính trên body và mặt Thuộc tính trên body và mặt

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

    1. Chọn mặt. Các mặt phẳng hướng +Z.
    2. Gắn thuộc tính. face.SetUserAttribute("DO_NHAM", -1, giá trị, Now).
    3. Đọc lại bằng duyệt mặt. Lọc những mặt có thuộc tính.
    4. Tô màu theo thuộc tính. Màu riêng cho mặt có độ nhám cao.
    5. Tổng kết. Số mặt đánh dấu.

    Code tham khảo (Python)

    import NXOpen
    
    KIEU = NXOpen.NXObject.AttributeType
    NGAY = NXOpen.Update.Option.Now
    MAU = {"Ra0.8": 186, "Ra1.6": 6, "Ra3.2": 211}
    
    def danh_dau_mat(face, nhan):
        face.SetUserAttribute("DO_NHAM", -1, nhan, NGAY)
        face.Color = MAU.get(nhan, 31)
        face.RedisplayObject()
    
    def mat_co_thuoc_tinh(body, ten="DO_NHAM"):
        ket_qua = []
        for f in body.GetFaces():
            if f.HasUserAttribute(ten, KIEU.String, -1):
                ket_qua.append((f, f.GetUserAttributeAsString(ten, KIEU.String, -1)))
        return ket_qua
    
    def mat_tren_cung(body):
        toa_do = [(f, max(v.Z for e in f.GetEdges() for v in e.GetVertices()))
                  for f in body.GetFaces() if f.SolidFaceType == NXOpen.Face.FaceType.Planar]
        if not toa_do:
            return None
        return max(toa_do, key=lambda x: x[1])[0]
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Work
        solids = [b for b in part.Bodies if b.IsSolidBody] if part else []
        if not solids:
            return
        session.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "Danh dau mat")
        mat = mat_tren_cung(solids[0])
        if mat is not None:
            danh_dau_mat(mat, "Ra0.8")
        for f, v in mat_co_thuoc_tinh(solids[0]):
            lw.WriteLine("Mặt loại %s có DO_NHAM = %s" % (f.SolidFaceType, v))
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • Face, Edge, Body đều là NXObject nên có đủ các hàm thuộc tính như Part.
    • Thuộc tính trên mặt là thuộc tính hình học; nó mất khi mặt bị xóa hoặc tạo lại do thay đổi mô hình.
    • max(..., key=...) chọn mặt có độ cao Z lớn nhất.

    Lỗi thường gặp

    • Thuộc tính trên mặt có thể không bền khi mô hình tham số cập nhật lại; nếu cần bền, gắn lên feature hay đặt theo quy tắc nhận dạng lại.
    • Màu sắc chỉ là hiển thị, không thay cho thuộc tính khi chuyển dữ liệu sang hệ thống khá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.