# # Involute gear tooth generator # # agm/NYCR, 2008 # # curves or line segments? # working angle is expressed in degrees rather than radians... # is that wise? from math import * import rep from writeDxf import writeToDxf # involute conv. functions def involuteLength(alpha): "Length of involute of unit circle with given alpha" return sqrt((alpha**2)+1) def involuteAngle(alpha): "Angle of involute of unit circle at given alpha" return abs(alpha-atan(alpha)) class InvoluteGear: def __init__(self,module,teeth,addendum=None,working_angle=20.0,clearance=None): if not addendum: addendum=module if not clearance: clearance=addendum/8.0 self.module=module self.teeth=teeth self.addendum=addendum self.wa=radians(working_angle) self.clearance=clearance # calculate radii self.r_pitch=module*teeth/2.0 self.r_base=self.r_pitch/involuteLength(self.wa) self.r_addendum=self.r_pitch+addendum self.r_clearance=self.r_pitch-(addendum+clearance) # tooth width self.tooth_width_subtends=pi/teeth # angle at involute intersection with pitch circle (relative to base) self.angle_pitch=involuteAngle(self.wa) # angle at involute intersection with addendum circle (relative to base) self.alpha_addendum=sqrt(((self.r_addendum/self.r_base)**2)-1) self.angle_addendum=involuteAngle(self.alpha_addendum) def drawTeeth(self,path,subdiv=20): theta = 2.0*pi/self.teeth for i in range(self.teeth): path.rotate(rep.Path.Point(0,0),theta) self.drawTooth(path,subdiv) def drawTooth(self,path,subdiv=20): # rising edge of tooth rising_angle=(self.tooth_width_subtends/2.0)+self.angle_pitch path.startAt(rep.Path.Polar(self.r_clearance,rising_angle)) for alpha in [x*self.alpha_addendum/subdiv for x in range(subdiv+1)]: path.lineTo(rep.Path.Polar(involuteLength(alpha)*self.r_base, rising_angle-involuteAngle(alpha))) # top of tooth top_angle=rising_angle-self.angle_addendum arc = rep.Path.Arc(rep.Path.Point(0,0),self.r_addendum,-top_angle,top_angle) path.appendArc(arc) # falling end of tooth path.startAt(rep.Path.Polar(self.r_addendum,-top_angle)) for alpha in [x*self.alpha_addendum/subdiv for x in range(subdiv-1,-1,-1)]: path.lineTo(rep.Path.Polar(involuteLength(alpha)*self.r_base, -rising_angle+involuteAngle(alpha))) path.lineTo(rep.Path.Polar(self.r_clearance,-rising_angle)) # bottom of tooth arc = rep.Path.Arc(rep.Path.Point(0,0),self.r_clearance,rising_angle-2*self.tooth_width_subtends,-rising_angle) path.appendArc(arc) if __name__ == '__main__': print("ten teeth") gear=InvoluteGear(10,80) path = rep.Path() gear.drawTeeth(path) writeToDxf("80.dxf",path)