渐开线函数为,
inv(α) = tan(α) - α
其中,inv(α)表示渐开线上某点的展角(弧度),该值随压力角 α(弧度)的增大而增大。
import mathfrom abaqus import *from abaqusConstants import *import partimport sketchimport assemblydef calculate_gear_base_geometry(m, z, alpha_deg=20.0, ha_star=1.0, c_star=0.25, rf_star=0.38, num_inv=40):"""计算直齿轮基本几何参数及单齿轮廓点集"""alpha_rad = math.radians(alpha_deg) # 压力角 (弧度)r = (m * z) / 2.0 # 分度圆半径rb = r * math.cos(alpha_rad) # 基圆半径ra = r + ha_star * m # 齿顶圆半径rf = r - (ha_star + c_star) * m # 齿根圆半径r_k = rf_star * m # 齿根圆角半径inv_alpha = math.tan(alpha_rad) - alpha_rad # 渐开线函数theta_0 = math.pi / (2.0 * z) # 半齿厚角r_start_inv = max(rb, rf) # 渐开线起点半径# 1. 右侧渐开线节点计算 (从 r_start_inv 到 ra)right_inv = []for i in range(num_inv):R = r_start_inv + (ra - r_start_inv) * i / float(num_inv - 1)phi_R = math.acos(rb / R)inv_phi_R = math.tan(phi_R) - phi_Rtheta_R = theta_0 + inv_alpha - inv_phi_Rx = R * math.cos(theta_R)y = R * math.sin(theta_R)right_inv.append((x, y))theta_flank_right = theta_0 + inv_alpha # 右侧齿侧切线极角r_tangent = math.sqrt(rf**2 + 2.0 * rf * r_k) # 切点极径# 2. 齿根圆角解析特征几何参数 (右侧)delta_theta = math.asin(r_k / (rf + r_k))theta_C_right = theta_flank_right + delta_theta# 右圆角圆心与切点C_R0 = ((rf + r_k) * math.cos(theta_C_right), (rf + r_k) * math.sin(theta_C_right))P_root_R0 = (rf * math.cos(theta_C_right), rf * math.sin(theta_C_right))P_flank_R0 = (r_tangent * math.cos(theta_flank_right), r_tangent * math.sin(theta_flank_right))# 渐开线起点点位 (右/左)P_inv_start_R0 = (r_start_inv * math.cos(theta_flank_right), r_start_inv * math.sin(theta_flank_right))P_inv_start_L0 = (r_start_inv * math.cos(-theta_flank_right), r_start_inv * math.sin(-theta_flank_right))# 左侧镜像参数 (关于 X 轴对称)C_L0 = (C_R0[0], -C_R0[1])P_root_L0 = (P_root_R0[0], -P_root_R0[1])P_flank_L0 = (P_flank_R0[0], -P_flank_R0[1])left_inv = [(x, -y) for (x, y) in right_inv]geom_info = {'m': m, 'z': z, 'r': r, 'rb': rb, 'ra': ra, 'rf': rf, 'r_k': r_k,'r_tangent': r_tangent, 'r_start_inv': r_start_inv,'C_R0': C_R0, 'P_root_R0': P_root_R0, 'P_flank_R0': P_flank_R0, 'P_inv_start_R0': P_inv_start_R0, 'right_inv': right_inv,'C_L0': C_L0, 'P_root_L0': P_root_L0, 'P_flank_L0': P_flank_L0, 'P_inv_start_L0': P_inv_start_L0, 'left_inv': left_inv}return geom_info
def create_spur_gear_part(model_name, part_name, m, z, width, alpha_deg=20.0, ha_star=1.0, c_star=0.25, rf_star=0.38, num_inv=40):"""在 Abaqus 中创建直齿轮 Part (通过基圆柱 + 单齿阵列 + 布尔合并)"""if model_name in mdb.models:model = mdb.models[model_name]else:model = mdb.Model(name=model_name)g = calculate_gear_base_geometry(m, z, alpha_deg, ha_star, c_star, rf_star, num_inv)# 计算草图尺寸 (基于齿顶圆半径)sketch_size = g['ra'] * 3.0# =========================================================================# 步骤 1:创建齿根圆柱临时 Part# =========================================================================s_base = model.ConstrainedSketch(name=part_name + '_Base_Sketch', sheetSize=sketch_size)s_base.CircleByCenterPerimeter(center=(0.0, 0.0), point1=(g['rf'], 0.0))part_base = model.Part(name=part_name + '_Base', dimensionality=THREE_D, type=DEFORMABLE_BODY)part_base.BaseSolidExtrude(sketch=s_base, depth=width)del s_base# =========================================================================# 步骤 2:创建单个轮廓齿Part# =========================================================================s_tooth = model.ConstrainedSketch(name=part_name + '_Tooth_Sketch', sheetSize=sketch_size)# 1) 左侧齿根圆角解析弧s_tooth.ArcByCenterEnds(center=g['C_L0'], point1=g['P_root_L0'], point2=g['P_flank_L0'], direction=CLOCKWISE)# 2) 左侧齿侧 (Line + Spline)if g['r_tangent'] < g['r_start_inv']:s_tooth.Line(point1=g['P_flank_L0'], point2=g['P_inv_start_L0'])s_tooth.Spline(points=tuple(g['left_inv']))else:s_tooth.Spline(points=tuple([g['P_flank_L0']] + g['left_inv']))# 3) 齿顶圆弧s_tooth.ArcByCenterEnds(center=(0.0, 0.0), point1=g['left_inv'][-1], point2=g['right_inv'][-1], direction=COUNTERCLOCKWISE)# 4) 右侧齿侧 (Spline + Line)right_inv_reversed = list(reversed(g['right_inv']))if g['r_tangent'] < g['r_start_inv']:s_tooth.Spline(points=tuple(right_inv_reversed))s_tooth.Line(point1=g['P_inv_start_R0'], point2=g['P_flank_R0'])else:s_tooth.Spline(points=tuple(right_inv_reversed + [g['P_flank_R0']]))# 5) 右侧齿根圆角解析弧s_tooth.ArcByCenterEnds(center=g['C_R0'], point1=g['P_flank_R0'], point2=g['P_root_R0'], direction=CLOCKWISE)# 6) 封闭底部圆弧s_tooth.ArcByCenterEnds(center=(0.0, 0.0), point1=g['P_root_R0'], point2=g['P_root_L0'], direction=CLOCKWISE)part_tooth = model.Part(name=part_name + '_SingleTooth', dimensionality=THREE_D, type=DEFORMABLE_BODY)part_tooth.BaseSolidExtrude(sketch=s_tooth, depth=width)del s_tooth# =========================================================================# 步骤 3:在 Assembly 中进行周向阵列与布尔合并# =========================================================================asm = model.rootAssemblyinst_base = asm.Instance(name='Inst-Base', part=part_base, dependent=ON)inst_tooth = asm.Instance(name='Inst-Tooth-0', part=part_tooth, dependent=ON)# 默认Z轴为旋转轴,周向阵列单齿 Instanceif z > 1:asm.RadialInstancePattern(instanceList=('Inst-Tooth-0',),number=z,totalAngle=360.0)# 获取所有装配实例进行布尔合并all_insts = [asm.instances[inst_name] for inst_name in asm.instances.keys()]gear_part = asm.InstanceFromBooleanMerge(name=part_name, # 合并后生成的新 Part 名称instances=tuple(all_insts), # 参与合并的所有实体 Instancedomain=GEOMETRY # 针对几何实体进行布尔合并)return gear_part
# testif __name__ == "__main__":create_spur_gear_part("gear","g1",1,23,12)