
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
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…Các bước thực hiện
- Tính thông số. Đường kính chia, đỉnh, chân, cơ sở từ z và m.
- Tính đường thân khai. Công thức tọa độ theo tham số góc.
- Lấy đối xứng và xoay. Tạo hai sườn của một răng.
- Nhân bản quanh tâm. z lần.
- 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.