NX Lab

Dựng biên dạng bánh răng thẳng bằng đường thân khai (involute) xấp xỉ nhiều đoạn thẳng rồi Extrude

#Python#Tham số#Bánh răng1 lượt xem

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

    Câu hỏi ·

    Bánh răng minh họa tốt cho thiết kế tham số: số răng và mô-đun quyết định hình dạng. Bài này tính đường thân khai bằng công thức, xấp xỉ nhiều đoạn thẳng nhỏ để dựng biên dạng một răng, nhân bản quanh tâm, rồi đùn thành bánh răng.

    Dựng biên dạng bánh răng thẳng bằng đường… Dựng biên dạng bánh răng thẳng bằng đường…

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

    1. Tính thông số. Đường kính chia, đỉnh, chân, cơ sở từ z và m.
    2. Tính đường thân khai. Công thức tọa độ theo tham số góc.
    3. Lấy đối xứng và xoay. Tạo hai sườn của một răng.
    4. Nhân bản quanh tâm. z lần.
    5. Extrude. Chiều rộng răng.

    Code tham khảo (Python)

    import math
    import NXOpen
    
    def thong_so(z, m):
        d = m * z                         # đường kính chia
        da = d + 2 * m                    # đỉnh
        df = d - 2.5 * m                  # chân
        db = d * math.cos(math.radians(20.0))   # cơ sở (góc ăn khớp 20 độ)
        return d, da, df, db
    
    def diem_than_khai(rb, ra, so_diem=8):
        """Điểm trên đường thân khai từ vòng cơ sở rb đến vòng đỉnh ra."""
        t_max = math.sqrt((ra / rb) ** 2 - 1.0)
        ds = []
        for i in range(so_diem + 1):
            t = t_max * i / so_diem
            ds.append((rb * (math.cos(t) + t * math.sin(t)), rb * (math.sin(t) - t * math.cos(t))))
        return ds
    
    def bien_dang_mot_rang(z, m):
        d, da, df, db = thong_so(z, m)
        rb, ra, rf = db / 2, da / 2, df / 2
        suon = diem_than_khai(max(rb, rf), ra)
        # độ dày răng trên vòng chia: pi*m/2 -> góc nửa răng tại vòng chia
        t_chia = math.sqrt(max((d / 2 / max(rb, 1e-9)) ** 2 - 1.0, 0.0))
        goc_chia = math.atan2(*reversed(suon[len(suon) // 2])) if suon else 0.0
        nua_rang = (math.pi * m / 2.0) / d
        xoay = nua_rang - (math.atan2(suon[len(suon) // 2][1], suon[len(suon) // 2][0]))
        ben_phai = [(x * math.cos(xoay) - y * math.sin(xoay), x * math.sin(xoay) + y * math.cos(xoay)) for x, y in suon]
        ben_trai = [(x, -y) for x, y in ben_phai]
        return ben_trai, ben_phai
    
    def chuoi_diem_banh_rang(z, m):
        trai, phai = bien_dang_mot_rang(z, m)
        toan_bo = []
        buoc = 2 * math.pi / z
        for k in range(z):
            a = k * buoc
            ca, sa = math.cos(a), math.sin(a)
            rang = list(reversed(trai)) + phai
            toan_bo += [(x * ca - y * sa, x * sa + y * ca) for x, y in rang]
        return toan_bo
    
    def duong_khep_kin(part, diem):
        ds = []
        for i in range(len(diem)):
            a, b = diem[i], diem[(i + 1) % len(diem)]
            if abs(a[0] - b[0]) + abs(a[1] - b[1]) < 1e-9:
                continue
            ds.append(part.Curves.CreateLine(NXOpen.Point3d(a[0], a[1], 0.0), NXOpen.Point3d(b[0], b[1], 0.0)))
        return ds
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Work
        if part is None:
            return
        z, m = 20, 2.0
        d, da, df, db = thong_so(z, m)
        lw.WriteLine("z=%d, m=%g: Ø chia %.2f, Ø đỉnh %.2f, Ø chân %.2f, Ø cơ sở %.2f" % (z, m, d, da, df, db))
        diem = chuoi_diem_banh_rang(z, m)
        session.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "Banh rang")
        ds = duong_khep_kin(part, diem)
        lw.WriteLine("Đã tạo %d đoạn thẳng biên dạng; dùng bài Extrude để đùn thành bánh răng" % len(ds))
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • Công thức thân khai: x = rb(cos t + t sin t), y = rb(sin t − t cos t) với t là tham số góc lăn.
    • Biên dạng này xấp xỉ, bỏ qua bán kính chân răng và vát đỉnh; đủ để minh họa, không dùng cho bánh răng chế tạo thật.
    • Mỗi răng được xoay đi 2π/z để nhân bản quanh tâm.

    Lỗi thường gặp

    • Giữa chân răng và đường cơ sở có đoạn nối chưa xử lý trong ví dụ; bánh răng thật cần biên dạng chân đúng chuẩn.
    • Dùng công cụ GC Toolkit của NX hoặc thư viện chuẩn cho sản xuất; script này để học nguyên 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.