NX Lab

Bố trí chốt đẩy (ejector pin) theo lưới trên mặt phẳng và loại bỏ vị trí gần biên hoặc gần lỗ

#Python#Khuôn#Hình học1 lượt xem

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

    Câu hỏi ·

    Chốt đẩy đặt đều trên mặt đáy sản phẩm nhưng phải tránh sát biên và sát lỗ. Hàm sinh lưới điểm rồi lọc theo khoảng cách tối thiểu tới biên và các lỗ, cho danh sách vị trí hợp lệ.

    Bố trí chốt đẩy (ejector pin) theo lưới… Bố trí chốt đẩy (ejector pin) theo lưới…

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

    1. Định nghĩa vùng. Hình chữ nhật đáy sản phẩm.
    2. Sinh lưới. Bước theo hai trục.
    3. Lọc theo biên. Cách biên tối thiểu.
    4. Lọc theo lỗ. Cách tâm lỗ lớn hơn bán kính cộng khoảng an toàn.
    5. Tạo điểm trong NX. CreatePoint cho từng vị trí đạt.

    Code tham khảo (Python)

    import math
    import NXOpen
    
    def sinh_luoi(x0, y0, x1, y1, buoc):
        xs, x = [], x0
        while x <= x1 + 1e-9:
            xs.append(x)
            x += buoc
        ys, y = [], y0
        while y <= y1 + 1e-9:
            ys.append(y)
            y += buoc
        return [(x, y) for x in xs for y in ys]
    
    def loc_vi_tri(diem, vung, cach_bien, lo):
        """vung = (x0, y0, x1, y1); lo = [(x, y, ban_kinh)]; trả danh sách vị trí hợp lệ."""
        x0, y0, x1, y1 = vung
        kq = []
        for (x, y) in diem:
            if x - x0 < cach_bien or x1 - x < cach_bien or y - y0 < cach_bien or y1 - y < cach_bien:
                continue
            if any(math.hypot(x - lx, y - ly) < lr + cach_bien for lx, ly, lr in lo):
                continue
            kq.append((x, y))
        return kq
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Work
        if part is None:
            return
        vung = (0.0, 0.0, 120.0, 80.0)
        lo = [(30.0, 40.0, 6.0), (90.0, 40.0, 6.0)]           # lỗ: x, y, bán kính
        luoi = sinh_luoi(10.0, 10.0, 110.0, 70.0, 20.0)
        hop_le = loc_vi_tri(luoi, vung, cach_bien=8.0, lo=lo)
        lw.WriteLine("Lưới %d điểm, hợp lệ %d điểm" % (len(luoi), len(hop_le)))
        session.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "Chot day")
        for i, (x, y) in enumerate(hop_le, 1):
            p = part.Points.CreatePoint(NXOpen.Point3d(x, y, 0.0))
            p.SetName("CHOT_DAY_%02d" % i)
        lw.WriteLine("Đã tạo %d điểm chốt đẩy (đặt tên CHOT_DAY_xx)" % len(hop_le))
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • Vòng while dùng + 1e-9 để tránh bỏ sót điểm cuối do sai số số thực.
    • Mỗi điểm hợp lệ được đặt tên CHOT_DAY_xx, thuận lợi để các script sau tìm lại và tạo chốt thật.
    • Tách hàm lọc (thuần Python) khỏi phần tạo điểm trong NX nên test được ngoài NX.

    Lỗi thường gặp

    • Vị trí chốt đẩy thật phải xét thêm gân, lực đẩy, rãnh làm mát; script chỉ gợi ý phân bố đều.
    • Lưới theo đáy chữ nhật không phù hợp với đáy cong hay có bậc; cần lấy hình dạng thật của mặt.

    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.