/* Library for Involute Gears, Screws and Racks This library contains the following modules - rack(modul, length, height, width, pressure_angle=20, helix_angle=0) - mountable_rack(modul, length, height, width, pressure_angle=20, helix_angle=0, fastners, profile, head) - herringbone_rack(modul, length, height, width, pressure_angle = 20, helix_angle=45) - mountable_herringbone_rack(modul, length, height, width, pressure_angle=20, helix_angle=45, fastners, profile, head) - spur_gear(modul, tooth_number, width, bore, pressure_angle=20, helix_angle=0, optimized=true) - herringbone_gear(modul, tooth_number, width, bore, pressure_angle=20, helix_angle=0, optimized=true) - rack_and_pinion (modul, rack_length, gear_teeth, rack_height, gear_bore, width, pressure_angle=20, helix_angle=0, together_built=true, optimized=true) - ring_gear(modul, tooth_number, width, rim_width, pressure_angle=20, helix_angle=0) - herringbone_ring_gear(modul, tooth_number, width, rim_width, pressure_angle=20, helix_angle=0) - planetary_gear(modul, sun_teeth, planet_teeth, number_planets, width, rim_width, bore, pressure_angle=20, helix_angle=0, together_built=true, optimized=true) - bevel_gear(modul, tooth_number, partial_cone_angle, tooth_width, bore, pressure_angle=20, helix_angle=0) - bevel_herringbone_gear(modul, tooth_number, partial_cone_angle, tooth_width, bore, pressure_angle=20, helix_angle=0) - bevel_gear_pair(modul, gear_teeth, pinion_teeth, axis_angle=90, tooth_width, bore, pressure_angle = 20, helix_angle=0, together_built=true) - bevel_herringbone_gear_pair(modul, gear_teeth, pinion_teeth, axis_angle=90, tooth_width, bore, pressure_angle = 20, helix_angle=0, together_built=true) - worm(modul, thread_starts, length, bore, pressure_angle=20, lead_angle=10, together_built=true) - worm_gear(modul, tooth_number, thread_starts, width, length, worm_bore, gear_bore, pressure_angle=20, lead_angle=0, optimized=true, together_built=true) Examples of each module are commented out at the end of this file Author: Dr Jörg Janssen Contributions By: Keith Emery, Chris Spencer Last Verified On: 1. June 2018 Version: 2.2 License: Creative Commons - Attribution, Non Commercial, Share Alike Permitted modules according to DIN 780: 0.05 0.06 0.08 0.10 0.12 0.16 0.20 0.25 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.25 1.5 2 2.5 3 4 5 6 8 10 12 16 20 25 32 40 50 60 */ // General Variables pi = 3.14159; rad = 57.29578; clearance = 0.05; // clearance between teeth /* Converts Radians to Degrees */ function grad(pressure_angle) = pressure_angle*rad; /* Converts Degrees to Radians */ function radian(pressure_angle) = pressure_angle/rad; /* Converts 2D Polar Coordinates to Cartesian Format: radius, phi; phi = Angle to x-Axis on xy-Plane */ function polar_to_cartesian(polvect) = [ polvect[0]*cos(polvect[1]), polvect[0]*sin(polvect[1]) ]; /* Circle Involutes-Function: Returns the Polar Coordinates of an Involute Circle r = Radius of the Base Circle rho = Rolling-angle in Degrees */ function ev(r,rho) = [ r/cos(rho), grad(tan(rho)-radian(rho)) ]; /* Sphere-Involutes-Function Returns the Azimuth Angle of an Involute Sphere theta0 = Polar Angle of the Cone, where the Cutting Edge of the Large Sphere unrolls the Involute theta = Polar Angle for which the Azimuth Angle of the Involute is to be calculated */ function sphere_ev(theta0,theta) = 1/sin(theta0)*acos(cos(theta)/cos(theta0))-acos(tan(theta0)/tan(theta)); /* Converts Spherical Coordinates to Cartesian Format: radius, theta, phi; theta = Angle to z-Axis, phi = Angle to x-Axis on xy-Plane */ function sphere_to_cartesian(vect) = [ vect[0]*sin(vect[1])*cos(vect[2]), vect[0]*sin(vect[1])*sin(vect[2]), vect[0]*cos(vect[1]) ]; /* Check if a Number is even = 1, if so = 0, if the Number is not even */ function is_even(number) = (number == floor(number/2)*2) ? 1 : 0; /* greatest common Divisor according to Euclidean Algorithm. Sorting: a must be greater than b */ function ggt(a,b) = a%b == 0 ? b : ggt(b,a%b); /* Polar function with polar angle and two variables */ function spiral(a, r0, phi) = a*phi + r0; /* Copy and rotate a Body */ module copier(vect, number, distance, winkel){ for(i = [0:number-1]){ translate(v=vect*distance*i) rotate(a=i*winkel, v = [0,0,1]) children(0); } } /* rack modul = Height of the Tooth Tip above the Rolling LIne length = Length of the Rack height = Height of the Rack to the Pitch Line width = Width of a Tooth pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°. helix_angle = Helix Angle of the Rack Transverse Axis; 0° = Spur Teeth */ module rack(modul, length, height, width, pressure_angle = 20, helix_angle = 0) { // Dimension Calculations modul=modul*(1-clearance); c = modul / 6; // Tip Clearance mx = modul/cos(helix_angle); // Module Shift by Helix Angle in the X-Direction a = 2*mx*tan(pressure_angle)+c*tan(pressure_angle); // Flank Width b = pi*mx/2-2*mx*tan(pressure_angle); // Tip Width x = width*tan(helix_angle); // Topside Shift by Helix Angle in the X-Direction nz = ceil((length+abs(2*x))/(pi*mx)); // Number of Teeth translate([-pi*mx*(nz-1)/2-a-b/2,-modul,0]){ intersection(){ // Creates a Prism that fits into a Geometric Box copier([1,0,0], nz, pi*mx, 0){ polyhedron( points=[[0,-c,0], [a,2*modul,0], [a+b,2*modul,0], [2*a+b,-c,0], [pi*mx,-c,0], [pi*mx,modul-height,0], [0,modul-height,0], // Underside [0+x,-c,width], [a+x,2*modul,width], [a+b+x,2*modul,width], [2*a+b+x,-c,width], [pi*mx+x,-c,width], [pi*mx+x,modul-height,width], [0+x,modul-height,width]], // Topside faces=[[6,5,4,3,2,1,0], // Underside [1,8,7,0], [9,8,1,2], [10,9,2,3], [11,10,3,4], [12,11,4,5], [13,12,5,6], [7,13,6,0], [7,8,9,10,11,12,13], // Topside ] ); }; translate([abs(x),-height+modul-0.5,-0.5]){ cube([length,height+modul+1,width+1]); // Cuboid which includes the Volume of the Rack } }; }; } /* Mountable-rack; uses module "rack" modul = Height of the Tooth Tip above the Rolling LIne length = Length of the Rack height = Height of the Rack to the Pitch Line width = Width of a Tooth pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°. helix_angle = Helix Angle of the Rack Transverse Axis; 0° = Spur Teeth fastners = Total number of fastners. profile = Metric standard profile for fastners (ISO machine screws), M4 = 4, M6 = 6 etc. head = Style of fastner to accomodate. PH = Pan Head, C = Countersunk, RC = Raised Countersunk, CS = Cap Screw, CSS = Countersunk Socket Screw. */ module mountable_rack(modul, length, height, width, pressure_angle, helix_angle, fastners, profile, head) { difference(){ rack(modul, length, height, width, pressure_angle, helix_angle); offset = (length/fastners); translate([-length/2+(offset/2),0,0]) for(i = [0:fastners-1]){ if (head=="PH"){ translate([i*offset,modul,width/2]) rotate([90,0,0]) cylinder(h=height+modul, d=profile, center=false); translate([i*offset,modul,width/2]) rotate([90,0,0]) cylinder(h=profile*0.6+modul*2.25, d=profile*2, center=false); } if (head=="CS"){ translate([i*offset,modul,width/2]) rotate([90,0,0]) cylinder(h=height+modul, d=profile, center=false); translate([i*offset,modul,width/2]) rotate([90,0,0]) cylinder(h=profile*1.25+modul*2.25, d=profile*1.5, center=false); } if (head=="C"){ translate([i*offset,modul,width/2]) rotate([90,0,0]) cylinder(h=height+modul, d=profile, center=false); translate([i*offset,modul,width/2]) rotate([90,0,0]) cylinder(h=modul*2.25, d=profile*2, center=false); translate([i*offset,-modul*1.25,width/2]) rotate([90,0,0]) cylinder (h=profile/2, d1=profile*2, d2=profile, center=false); } if (head=="RC"){ translate([i*offset,modul,width/2]) rotate([90,0,0]) cylinder(h=height+modul, d=profile, center=false); translate([i*offset,modul,width/2]) rotate([90,0,0]) cylinder(h=modul*2.25+profile/4, d=profile*2, center=false); translate([i*offset,-modul*1.25-profile/4,width/2]) rotate([90,0,0]) cylinder (h=profile/2, d1=profile*2, d2=profile, center=false); } if (head=="CSS"){ translate([i*offset,modul,width/2]) rotate([90,0,0]) cylinder(h=height+modul, d=profile, center=false); translate([i*offset,modul,width/2]) rotate([90,0,0]) cylinder(h=modul*2.25, d=profile*2, center=false); translate([i*offset,-modul*1.25,width/2]) rotate([90,0,0]) cylinder (h=profile*0.6, d1=profile*2, d2=profile, center=false); } } } } /* Spur gear modul = Height of the Tooth Tip beyond the Pitch Circle tooth_number = Number of Gear Teeth width = tooth_width bore = Diameter of the Center Hole pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°. helix_angle = Helix Angle to the Axis of Rotation; 0° = Spur Teeth optimized = Create holes for Material-/Weight-Saving or Surface Enhancements where Geometry allows */ module spur_gear(modul, tooth_number, width, bore, pressure_angle = 20, helix_angle = 0, optimized = true, no_bore=false) { // Dimension Calculations d = modul * tooth_number; // Pitch Circle Diameter r = d / 2; // Pitch Circle Radius alpha_spur = atan(tan(pressure_angle)/cos(helix_angle));// Helix Angle in Transverse Section db = d * cos(alpha_spur); // Base Circle Diameter rb = db / 2; // Base Circle Radius da = (modul <1)? d + modul * 2.2 : d + modul * 2; // Tip Diameter according to DIN 58400 or DIN 867 ra = da / 2; // Tip Circle Radius c = (tooth_number <3)? 0 : modul/6; // Tip Clearance df = d - 2 * (modul + c); // Root Circle Diameter rf = df / 2; // Root Radius rho_ra = acos(rb/ra); // Maximum Rolling Angle; // Involute begins on the Base Circle and ends at the Tip Circle rho_r = acos(rb/r); // Rolling Angle at Pitch Circle; // Involute begins on the Base Circle and ends at the Tip Circle phi_r = grad(tan(rho_r)-radian(rho_r)); // Angle to Point of Involute on Pitch Circle gamma = rad*width/(r*tan(90-helix_angle)); // Torsion Angle for Extrusion step = rho_ra/16; // Involute is divided into 16 pieces tau = 360/tooth_number; // Pitch Angle r_hole = (2*rf - bore)/8; // Radius of Holes for Material-/Weight-Saving rm = bore/2+2*r_hole; // Distance of the Axes of the Holes from the Main Axis z_hole = floor(2*pi*rm/(3*r_hole)); // Number of Holes for Material-/Weight-Saving optimized = (optimized && r >= width*1.5 && d > 2*bore); // is Optimization useful? // Drawing union(){ rotate([0,0,-phi_r-90*(1-clearance)/tooth_number]){ // Center Tooth on X-Axis; // Makes Alignment with other Gears easier linear_extrude(height = width, convexity = 10, twist = gamma){ difference(){ union(){ tooth_width = (180*(1-clearance))/tooth_number+2*phi_r; circle(rf); // Root Circle for (rot = [0:tau:360]){ rotate (rot){ // Copy and Rotate "Number of Teeth" polygon(concat( // Tooth [[0,0]], // Tooth Segment starts and ends at Origin [for (rho = [0:step:rho_ra]) // From zero Degrees (Base Circle) // To Maximum Involute Angle (Tip Circle) polar_to_cartesian(ev(rb,rho))], // First Involute Flank [polar_to_cartesian(ev(rb,rho_ra))], // Point of Involute on Tip Circle [for (rho = [rho_ra:-step:0]) // of Maximum Involute Angle (Tip Circle) // to zero Degrees (Base Circle) polar_to_cartesian([ev(rb,rho)[0], tooth_width-ev(rb,rho)[1]])] // Second Involute Flank // (180*(1-clearance)) instead of 180 Degrees, // to allow clearance of the Flanks ) ); } } } circle(r = rm+r_hole*1.49); // "bore" } } } // with Material Savings if (optimized) { linear_extrude(height = width, convexity = 10){ if(no_bore){ circle(r = (bore+r_hole)/2); }else{ difference(){ circle(r = (bore+r_hole)/2); circle(r = bore/2); // bore } } } linear_extrude(height = (width-r_hole/2 < width*2/3) ? width*2/3 : width-r_hole/2, convexity = 10){ difference(){ circle(r=rm+r_hole*1.51); union(){ circle(r=(bore+r_hole)/2); for (i = [0:1:z_hole]){ translate(sphere_to_cartesian([rm,90,i*360/z_hole])) circle(r = r_hole); } } } } } // without Material Savings else { linear_extrude(height = width, convexity = 10){ difference(){ circle(r = rm+r_hole*1.51); circle(r = bore/2); } } } } } /* Herringbone_rack; uses the module "rack" modul = Height of the Tooth Tip above the Rolling LIne length = Length of the Rack height = Height of the Rack to the Pitch Line width = Width of a Tooth pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°. helix_angle = Helix Angle of the Rack Transverse Axis; 0° = Spur Teeth */ module herringbone_rack(modul, length, height, width, pressure_angle = 20, helix_angle) { width = width/2; translate([0,0,width]){ union(){ rack(modul, length, height, width, pressure_angle, helix_angle); // bottom Half mirror([0,0,1]){ rack(modul, length, height, width, pressure_angle, helix_angle); // top Half } } } } /* Mountable_herringbone_rack; uses module "herringbone_rack" modul = Height of the Tooth Tip above the Rolling LIne length = Length of the Rack height = Height of the Rack to the Pitch Line width = Width of a Tooth pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°. helix_angle = Helix Angle of the Rack Transverse Axis; 0° = Spur Teeth fastners = Total number of fastners. profile = Metric standard profile for fastners (ISO machine screws), M4 = 4, M6 = 6 etc. head = Style of fastner to accomodate. PH = Pan Head, C = Countersunk, RC = Raised Countersunk, CS = Cap Screw, CSS = Countersunk Socket Screw. */ module mountable_herringbone_rack(modul, length, height, width, pressure_angle, helix_angle, fastners, profile, head) { difference(){ herringbone_rack(modul, length, height, width, pressure_angle, helix_angle); offset = (length/fastners); translate([-length/2+(offset/2),0,0]) for(i = [0:fastners-1]){ if (head=="PH"){ translate([i*offset,modul,width/2]) rotate([90,0,0]) cylinder(h=height+modul, d=profile, center=false); translate([i*offset,modul,width/2]) rotate([90,0,0]) cylinder(h=profile*0.6+modul*2.25, d=profile*2, center=false); } if (head=="CS"){ translate([i*offset,modul,width/2]) rotate([90,0,0]) cylinder(h=height+modul, d=profile, center=false); translate([i*offset,modul,width/2]) rotate([90,0,0]) cylinder(h=profile*1.25+modul*2.25, d=profile*1.5, center=false); } if (head=="C"){ translate([i*offset,modul,width/2]) rotate([90,0,0]) cylinder(h=height+modul, d=profile, center=false); translate([i*offset,modul,width/2]) rotate([90,0,0]) cylinder(h=modul*2.25, d=profile*2, center=false); translate([i*offset,-modul*1.25,width/2]) rotate([90,0,0]) cylinder (h=profile/2, d1=profile*2, d2=profile, center=false); } if (head=="RC"){ translate([i*offset,modul,width/2]) rotate([90,0,0]) cylinder(h=height+modul, d=profile, center=false); translate([i*offset,modul,width/2]) rotate([90,0,0]) cylinder(h=modul*2.25+profile/4, d=profile*2, center=false); translate([i*offset,-modul*1.25-profile/4,width/2]) rotate([90,0,0]) cylinder (h=profile/2, d1=profile*2, d2=profile, center=false); } if (head=="CSS"){ translate([i*offset,modul,width/2]) rotate([90,0,0]) cylinder(h=height+modul, d=profile, center=false); translate([i*offset,modul,width/2]) rotate([90,0,0]) cylinder(h=modul*2.25, d=profile*2, center=false); translate([i*offset,-modul*1.25,width/2]) rotate([90,0,0]) cylinder (h=profile*0.6, d1=profile*2, d2=profile, center=false); } } } } /* Herringbone_gear; uses the module "spur_gear" modul = Height of the Tooth Tip beyond the Pitch Circle tooth_number = Number of Gear Teeth width = tooth_width bore = Diameter of the Center Hole pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°. helix_angle = Helix Angle to the Axis of Rotation, Standard = 0° (Spur Teeth) optimized = Holes for Material-/Weight-Saving */ module herringbone_gear(modul, tooth_number, width, bore, pressure_angle = 20, helix_angle=0, optimized=true){ width = width/2; d = modul * tooth_number; // Pitch Circle Diameter r = d / 2; // Pitch Circle Radius c = (tooth_number <3)? 0 : modul/6; // Tip Clearance df = d - 2 * (modul + c); // Root Circle Diameter rf = df / 2; // Root Radius r_hole = (2*rf - bore)/8; // Radius of Holes for Material-/Weight-Saving rm = bore/2+2*r_hole; // Distance of the Axes of the Holes from the Main Axis z_hole = floor(2*pi*rm/(3*r_hole)); // Number of Holes for Material-/Weight-Saving optimized = (optimized && r >= width*3 && d > 2*bore); // is Optimization useful? translate([0,0,width]){ union(){ spur_gear(modul, tooth_number, width, 2*(rm+r_hole*1.49), pressure_angle, helix_angle, false); // bottom Half mirror([0,0,1]){ spur_gear(modul, tooth_number, width, 2*(rm+r_hole*1.49), pressure_angle, helix_angle, false); // top Half } } } // with Material Savings if (optimized) { linear_extrude(height = width*2){ difference(){ circle(r = (bore+r_hole)/2); circle(r = bore/2); // bore } } linear_extrude(height = (2*width-r_hole/2 < 1.33*width) ? 1.33*width : 2*width-r_hole/2){ //width*4/3 difference(){ circle(r=rm+r_hole*1.51); union(){ circle(r=(bore+r_hole)/2); for (i = [0:1:z_hole]){ translate(sphere_to_cartesian([rm,90,i*360/z_hole])) circle(r = r_hole); } } } } } // without Material Savings else { linear_extrude(height = width*2){ difference(){ circle(r = rm+r_hole*1.51); circle(r = bore/2); } } } } /* Rack and Pinion modul = Height of the Tooth Tip beyond the Pitch Circle rack_length = Length of the Rack gear_teeth = Number of Gear Teeth rack_height = Height of the Rack to the Pitch Line gear_bore = Diameter of the Center Hole of the Spur Gear width = Width of a Tooth pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°. helix_angle = Helix Angle to the Axis of Rotation, Standard = 0° (Spur Teeth) */ module rack_and_pinion (modul, rack_length, gear_teeth, rack_height, gear_bore, width, pressure_angle=20, helix_angle=0, together_built=true, optimized=true) { distance = together_built? modul*gear_teeth/2 : modul*gear_teeth; rack(modul, rack_length, rack_height, width, pressure_angle, -helix_angle); translate([0,distance,0]) rotate(a=360/gear_teeth) spur_gear (modul, gear_teeth, width, gear_bore, pressure_angle, helix_angle, optimized); } /* Ring gear modul = Height of the Tooth Tip beyond the Pitch Circle tooth_number = Number of Gear Teeth width = tooth_width rim_width = Width of the Rim from the Root Circle bore = Diameter of the Center Hole pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°. helix_angle = Helix Angle to the Axis of Rotation, Standard = 0° (Spur Teeth) */ module ring_gear(modul, tooth_number, width, rim_width, pressure_angle = 20, helix_angle = 0) { // Dimension Calculations ha = (tooth_number >= 20) ? 0.02 * atan((tooth_number/15)/pi) : 0.6; // Shortening Factor of Tooth Head Height d = modul * tooth_number; // Pitch Circle Diameter r = d / 2; // Pitch Circle Radius alpha_spur = atan(tan(pressure_angle)/cos(helix_angle));// Helix Angle in Transverse Section db = d * cos(alpha_spur); // Base Circle Diameter rb = db / 2; // Base Circle Radius c = modul / 6; // Tip Clearance da = (modul <1)? d + (modul+c) * 2.2 : d + (modul+c) * 2; // Tip Diameter ra = da / 2; // Tip Circle Radius df = d - 2 * modul * ha; // Root Circle Diameter rf = df / 2; // Root Radius rho_ra = acos(rb/ra); // Maximum Involute Angle; // Involute begins on the Base Circle and ends at the Tip Circle rho_r = acos(rb/r); // Involute Angle at Pitch Circle; // Involute begins on the Base Circle and ends at the Tip Circle phi_r = grad(tan(rho_r)-radian(rho_r)); // Angle to Point of Involute on Pitch Circle gamma = rad*width/(r*tan(90-helix_angle)); // Torsion Angle for Extrusion step = rho_ra/16; // Involute is divided into 16 pieces tau = 360/tooth_number; // Pitch Angle // Drawing rotate([0,0,-phi_r-90*(1+clearance)/tooth_number]) // Center Tooth on X-Axis; // Makes Alignment with other Gears easier linear_extrude(height = width, twist = gamma){ difference(){ circle(r = ra + rim_width); // Outer Circle union(){ tooth_width = (180*(1+clearance))/tooth_number+2*phi_r; circle(rf); // Root Circle for (rot = [0:tau:360]){ rotate (rot) { // Copy and Rotate "Number of Teeth" polygon( concat( [[0,0]], [for (rho = [0:step:rho_ra]) // From zero Degrees (Base Circle) // to Maximum Involute Angle (Tip Circle) polar_to_cartesian(ev(rb,rho))], [polar_to_cartesian(ev(rb,rho_ra))], [for (rho = [rho_ra:-step:0]) // von Maximum Involute Angle (Kopfkreis) // to zero Degrees (Base Circle) polar_to_cartesian([ev(rb,rho)[0], tooth_width-ev(rb,rho)[1]])] // (180*(1+clearance)) statt 180, // to allow clearance of the Flanks ) ); } } } } } echo("Ring Gear Outer Diamater = ", 2*(ra + rim_width)); } /* Herringbone Ring Gear; uses the Module "ring_gear" modul = Height of the Tooth Tip over the Partial Cone tooth_number = Number of Gear Teeth width = tooth_width bore = Diameter of the Center Hole pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°. helix_angle = Helix Angle to the Axis of Rotation, Standard = 0° (Spur Teeth) */ module herringbone_ring_gear(modul, tooth_number, width, rim_width, pressure_angle = 20, helix_angle = 0) { width = width / 2; translate([0,0,width]) union(){ ring_gear(modul, tooth_number, width, rim_width, pressure_angle, helix_angle); // bottom Half mirror([0,0,1]) ring_gear(modul, tooth_number, width, rim_width, pressure_angle, helix_angle); // top Half } } /* Planetary Gear; uses the Modules "herringbone_gear" and "herringbone_ring_gear" modul = Height of the Tooth Tip over the Partial Cone sun_teeth = Number of Teeth of the Sun Gear planet_teeth = Number of Teeth of a Planet Gear number_planets = Number of Planet Gears. If null, the Function will calculate the Minimum Number width = tooth_width rim_width = Width of the Rim from the Root Circle bore = Diameter of the Center Hole pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°. helix_angle = Helix Angle to the Axis of Rotation, Standard = 0° (Spur Teeth) together_built = optimized = Create holes for Material-/Weight-Saving or Surface Enhancements where Geometry allows together_built = Components assembled for Construction or separated for 3D-Printing */ module planetary_gear(modul, sun_teeth, planet_teeth, number_planets, width, rim_width, bore, pressure_angle=20, helix_angle=0, together_built=true, optimized=true){ // Dimension Calculations d_sun = modul*sun_teeth; // Sun Pitch Circle Diameter d_planet = modul*planet_teeth; // Planet Pitch Circle Diameter center_distance = modul*(sun_teeth + planet_teeth) / 2; // Distance from Sun- or Ring-Gear Axis to Planet Axis ring_teeth = sun_teeth + 2*planet_teeth; // Number of Teeth of the Ring Gear d_ring = modul*ring_teeth; // Ring Pitch Circle Diameter rotate = is_even(planet_teeth); // Does the Sun Gear need to be rotated? n_max = floor(180/asin(modul*(planet_teeth)/(modul*(sun_teeth + planet_teeth)))); // Number of Planet Gears: at most as many as possible without overlap // Drawing rotate([0,0,180/sun_teeth*rotate]){ herringbone_gear (modul, sun_teeth, width, bore, pressure_angle, -helix_angle, optimized); // Sun Gear } if (together_built){ if(number_planets==0){ list = [ for (n=[2 : 1 : n_max]) if ((((ring_teeth+sun_teeth)/n)==floor((ring_teeth+sun_teeth)/n))) n]; number_planets = list[0]; // Determine Number of Planet Gears center_distance = modul*(sun_teeth + planet_teeth)/2; // Distance from Sun- / Ring-Gear Axis for(n=[0:1:number_planets-1]){ translate(sphere_to_cartesian([center_distance,90,360/number_planets*n])) rotate([0,0,n*360*d_sun/d_planet]) herringbone_gear (modul, planet_teeth, width, bore, pressure_angle, helix_angle); // Planet Gears } } else{ center_distance = modul*(sun_teeth + planet_teeth)/2; // Distance from Sun- / Ring-Gear Axis for(n=[0:1:number_planets-1]){ translate(sphere_to_cartesian([center_distance,90,360/number_planets*n])) rotate([0,0,n*360*d_sun/(d_planet)]) herringbone_gear (modul, planet_teeth, width, bore, pressure_angle, helix_angle); // Planet Gears } } } else{ planet_distance = ring_teeth*modul/2+rim_width+d_planet; // Distance between Planets for(i=[-(number_planets-1):2:(number_planets-1)]){ translate([planet_distance, d_planet*i,0]) herringbone_gear (modul, planet_teeth, width, bore, pressure_angle, helix_angle); // Planet Gears } } herringbone_ring_gear (modul, ring_teeth, width, rim_width, pressure_angle, helix_angle); // Ring Gear } /* Bevel Gear modul = Height of the Tooth Tip over the Partial Cone; Specification for the Outside of the Cone tooth_number = Number of Gear Teeth partial_cone_angle = (Half)angle of the Cone on which the other Ring Gear rolls tooth_width = Width of the Teeth from the Outside toward the apex of the Cone bore = Diameter of the Center Hole pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°. helix_angle = Helix Angle, Standard = 0° */ module bevel_gear(modul, tooth_number, partial_cone_angle, tooth_width, bore, pressure_angle = 20, helix_angle=0) { // Dimension Calculations d_outside = modul * tooth_number; // Part Cone Diameter at the Cone Base, // corresponds to the Chord in a Spherical Section r_outside = d_outside / 2; // Part Cone Radius at the Cone Base rg_outside = r_outside/sin(partial_cone_angle); // Large-Cone Radius for Outside-Tooth, corresponds to the Length of the Cone-Flank; rg_inside = rg_outside - tooth_width; // Large-Cone Radius for Inside-Tooth r_inside = r_outside*rg_inside/rg_outside; alpha_spur = atan(tan(pressure_angle)/cos(helix_angle));// Helix Angle in Transverse Section delta_b = asin(cos(alpha_spur)*sin(partial_cone_angle)); // Base Cone Angle da_outside = (modul <1)? d_outside + (modul * 2.2) * cos(partial_cone_angle): d_outside + modul * 2 * cos(partial_cone_angle); ra_outside = da_outside / 2; delta_a = asin(ra_outside/rg_outside); c = modul / 6; // Tip Clearance df_outside = d_outside - (modul +c) * 2 * cos(partial_cone_angle); rf_outside = df_outside / 2; delta_f = asin(rf_outside/rg_outside); rkf = rg_outside*sin(delta_f); // Radius of the Cone Foot height_f = rg_outside*cos(delta_f); // Height of the Cone from the Root Cone echo("Part Cone Diameter at the Cone Base = ", d_outside); // Sizes for Complementary Truncated Cone height_k = (rg_outside-tooth_width)/cos(partial_cone_angle); // Height of the Complementary Cone for corrected Tooth Length rk = (rg_outside-tooth_width)/sin(partial_cone_angle); // Foot Radius of the Complementary Cone rfk = rk*height_k*tan(delta_f)/(rk+height_k*tan(delta_f)); // Tip Radius of the Cylinders for // Complementary Truncated Cone height_fk = rk*height_k/(height_k*tan(delta_f)+rk); // height of the Complementary Truncated Cones echo("Bevel Gear Height = ", height_f-height_fk); phi_r = sphere_ev(delta_b, partial_cone_angle); // Angle to Point of Involute on Partial Cone // Torsion Angle gamma from Helix Angle gamma_g = 2*atan(tooth_width*tan(helix_angle)/(2*rg_outside-tooth_width)); gamma = 2*asin(rg_outside/r_outside*sin(gamma_g/2)); step = (delta_a - delta_b)/16; tau = 360/tooth_number; // Pitch Angle start = (delta_b > delta_f) ? delta_b : delta_f; mirrpoint = (180*(1-clearance))/tooth_number+2*phi_r; // Drawing rotate([0,0,phi_r+90*(1-clearance)/tooth_number]){ // Center Tooth on X-Axis; // Makes Alignment with other Gears easier translate([0,0,height_f]) rotate(a=[0,180,0]){ union(){ translate([0,0,height_f]) rotate(a=[0,180,0]){ // Truncated Cone difference(){ linear_extrude(height=height_f-height_fk, scale=rfk/rkf) circle(rkf*1.001); // 1 permille Overlap with Tooth Root translate([0,0,-1]){ cylinder(h = height_f-height_fk+2, r = bore/2); // bore } } } for (rot = [0:tau:360]){ rotate (rot) { // Copy and Rotate "Number of Teeth" union(){ if (delta_b > delta_f){ // Tooth Root flankpoint_under = 1*mirrpoint; flankpoint_over = sphere_ev(delta_f, start); polyhedron( points = [ sphere_to_cartesian([rg_outside, start*1.001, flankpoint_under]), // 1 permille Overlap with Tooth sphere_to_cartesian([rg_inside, start*1.001, flankpoint_under+gamma]), sphere_to_cartesian([rg_inside, start*1.001, mirrpoint-flankpoint_under+gamma]), sphere_to_cartesian([rg_outside, start*1.001, mirrpoint-flankpoint_under]), sphere_to_cartesian([rg_outside, delta_f, flankpoint_under]), sphere_to_cartesian([rg_inside, delta_f, flankpoint_under+gamma]), sphere_to_cartesian([rg_inside, delta_f, mirrpoint-flankpoint_under+gamma]), sphere_to_cartesian([rg_outside, delta_f, mirrpoint-flankpoint_under]) ], faces = [[0,1,2],[0,2,3],[0,4,1],[1,4,5],[1,5,2],[2,5,6],[2,6,3],[3,6,7],[0,3,7],[0,7,4],[4,6,5],[4,7,6]], convexity =1 ); } // Tooth for (delta = [start:step:delta_a-step]){ flankpoint_under = sphere_ev(delta_b, delta); flankpoint_over = sphere_ev(delta_b, delta+step); polyhedron( points = [ sphere_to_cartesian([rg_outside, delta, flankpoint_under]), sphere_to_cartesian([rg_inside, delta, flankpoint_under+gamma]), sphere_to_cartesian([rg_inside, delta, mirrpoint-flankpoint_under+gamma]), sphere_to_cartesian([rg_outside, delta, mirrpoint-flankpoint_under]), sphere_to_cartesian([rg_outside, delta+step, flankpoint_over]), sphere_to_cartesian([rg_inside, delta+step, flankpoint_over+gamma]), sphere_to_cartesian([rg_inside, delta+step, mirrpoint-flankpoint_over+gamma]), sphere_to_cartesian([rg_outside, delta+step, mirrpoint-flankpoint_over]) ], faces = [[0,1,2],[0,2,3],[0,4,1],[1,4,5],[1,5,2],[2,5,6],[2,6,3],[3,6,7],[0,3,7],[0,7,4],[4,6,5],[4,7,6]], convexity =1 ); } } } } } } } } /* Bevel Herringbone Gear; uses the Module "bevel_gear" modul = Height of the Tooth Tip beyond the Pitch Circle tooth_number = Number of Gear Teeth partial_cone_angle, tooth_width bore = Diameter of the Center Hole pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°. helix_angle = Helix Angle, Standard = 0° */ module bevel_herringbone_gear(modul, tooth_number, partial_cone_angle, tooth_width, bore, pressure_angle = 20, helix_angle=0){ // Dimension Calculations tooth_width = tooth_width / 2; d_outside = modul * tooth_number; // Part Cone Diameter at the Cone Base, // corresponds to the Chord in a Spherical Section r_outside = d_outside / 2; // Part Cone Radius at the Cone Base rg_outside = r_outside/sin(partial_cone_angle); // Large-Cone Radius, corresponds to the Length of the Cone-Flank; c = modul / 6; // Tip Clearance df_outside = d_outside - (modul +c) * 2 * cos(partial_cone_angle); rf_outside = df_outside / 2; delta_f = asin(rf_outside/rg_outside); height_f = rg_outside*cos(delta_f); // Height of the Cone from the Root Cone // Torsion Angle gamma from Helix Angle gamma_g = 2*atan(tooth_width*tan(helix_angle)/(2*rg_outside-tooth_width)); gamma = 2*asin(rg_outside/r_outside*sin(gamma_g/2)); echo("Part Cone Diameter at the Cone Base = ", d_outside); // Sizes for Complementary Truncated Cone height_k = (rg_outside-tooth_width)/cos(partial_cone_angle); // Height of the Complementary Cone for corrected Tooth Length rk = (rg_outside-tooth_width)/sin(partial_cone_angle); // Foot Radius of the Complementary Cone rfk = rk*height_k*tan(delta_f)/(rk+height_k*tan(delta_f)); // Tip Radius of the Cylinders for // Complementary Truncated Cone height_fk = rk*height_k/(height_k*tan(delta_f)+rk); // height of the Complementary Truncated Cones modul_inside = modul*(1-tooth_width/rg_outside); union(){ bevel_gear(modul, tooth_number, partial_cone_angle, tooth_width, bore, pressure_angle, helix_angle); // bottom Half translate([0,0,height_f-height_fk]) rotate(a=-gamma,v=[0,0,1]) bevel_gear(modul_inside, tooth_number, partial_cone_angle, tooth_width, bore, pressure_angle, -helix_angle); // top Half } } /* Spiral Bevel Gear; uses the Module "bevel_gear" modul = Height of the Tooth Tip beyond the Pitch Circle tooth_number = Number of Gear Teeth height = Height of Gear Teeth bore = Diameter of the Center Hole pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°. helix_angle = Helix Angle, Standard = 0° */ module spiral_bevel_gear(modul, tooth_number, partial_cone_angle, tooth_width, bore, pressure_angle = 20, helix_angle=30){ steps = 16; // Dimension Calculations b = tooth_width / steps; d_outside = modul * tooth_number; // Part Cone Diameter at the Cone Base, // corresponds to the Chord in a Spherical Section r_outside = d_outside / 2; // Part Cone Radius at the Cone Base rg_outside = r_outside/sin(partial_cone_angle); // Large-Cone Radius, corresponds to the Length of the Cone-Flank; rg_center = rg_outside-tooth_width/2; echo("Part Cone Diameter at the Cone Base = ", d_outside); a=tan(helix_angle)/rg_center; union(){ for(i=[0:1:steps-1]){ r = rg_outside-i*b; helix_angle = a*r; modul_r = modul-b*i/rg_outside; translate([0,0,b*cos(partial_cone_angle)*i]) rotate(a=-helix_angle*i,v=[0,0,1]) bevel_gear(modul_r, tooth_number, partial_cone_angle, b, bore, pressure_angle, helix_angle); // top Half } } } /* Bevel Gear Pair with any axis_angle; uses the Module "bevel_gear" modul = Height of the Tooth Tip over the Partial Cone; Specification for the Outside of the Cone gear_teeth = Number of Gear Teeth on the Gear pinion_teeth = Number of Gear Teeth on the Pinion axis_angle = Angle between the Axles of the Gear and Pinion tooth_width = Width of the Teeth from the Outside toward the apex of the Cone gear_bore = Diameter of the Center Hole of the Gear pinion_bore = Diameter of the Center Bore of the Gear pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°. helix_angle = Helix Angle, Standard = 0° together_built = Components assembled for Construction or separated for 3D-Printing */ module bevel_gear_pair(modul, gear_teeth, pinion_teeth, axis_angle=90, tooth_width, gear_bore, pinion_bore, pressure_angle=20, helix_angle=0, together_built=true){ // Dimension Calculations r_gear = modul*gear_teeth/2; // Cone Radius of the Gear delta_gear = atan(sin(axis_angle)/(pinion_teeth/gear_teeth+cos(axis_angle))); // Cone Angle of the Gear delta_pinion = atan(sin(axis_angle)/(gear_teeth/pinion_teeth+cos(axis_angle)));// Cone Angle of the Pinion rg = r_gear/sin(delta_gear); // Radius of the Large Sphere c = modul / 6; // Tip Clearance df_pinion = pi*rg*delta_pinion/90 - 2 * (modul + c); // Bevel Diameter on the Large Sphere rf_pinion = df_pinion / 2; // Root Cone Radius on the Large Sphere delta_f_pinion = rf_pinion/(pi*rg) * 180; // Tip Cone Angle rkf_pinion = rg*sin(delta_f_pinion); // Radius of the Cone Foot height_f_pinion = rg*cos(delta_f_pinion); // Height of the Cone from the Root Cone echo("Cone Angle Gear = ", delta_gear); echo("Cone Angle Pinion = ", delta_pinion); df_gear = pi*rg*delta_gear/90 - 2 * (modul + c); // Bevel Diameter on the Large Sphere rf_gear = df_gear / 2; // Root Cone Radius on the Large Sphere delta_f_gear = rf_gear/(pi*rg) * 180; // Tip Cone Angle rkf_gear = rg*sin(delta_f_gear); // Radius of the Cone Foot height_f_gear = rg*cos(delta_f_gear); // Height of the Cone from the Root Cone echo("Gear Height = ", height_f_gear); echo("Pinion Height = ", height_f_pinion); rotate = is_even(pinion_teeth); // Drawing // Rad rotate([0,0,180*(1-clearance)/gear_teeth*rotate]) bevel_gear(modul, gear_teeth, delta_gear, tooth_width, gear_bore, pressure_angle, helix_angle); // Ritzel if (together_built) translate([-height_f_pinion*cos(90-axis_angle),0,height_f_gear-height_f_pinion*sin(90-axis_angle)]) rotate([0,axis_angle,0]) bevel_gear(modul, pinion_teeth, delta_pinion, tooth_width, pinion_bore, pressure_angle, -helix_angle); else translate([rkf_pinion*2+modul+rkf_gear,0,0]) bevel_gear(modul, pinion_teeth, delta_pinion, tooth_width, pinion_bore, pressure_angle, -helix_angle); } /* Herringbone Bevel Gear Pair with arbitrary axis_angle; uses the Module "bevel_herringbone_gear" modul = Height of the Tooth Tip over the Partial Cone; Specification for the Outside of the Cone gear_teeth = Number of Gear Teeth on the Gear pinion_teeth = Number of Gear Teeth on the Pinion axis_angle = Angle between the Axles of the Gear and Pinion tooth_width = Width of the Teeth from the Outside toward the apex of the Cone gear_bore = Diameter of the Center Hole of the Gear pinion_bore = Diameter of the Center Bore of the Gear pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°. helix_angle = Helix Angle, Standard = 0° together_built = Components assembled for Construction or separated for 3D-Printing */ module bevel_herringbone_gear_pair(modul, gear_teeth, pinion_teeth, axis_angle=90, tooth_width, gear_bore, pinion_bore, pressure_angle = 20, helix_angle=10, together_built=true){ r_gear = modul*gear_teeth/2; // Cone Radius of the Gear delta_gear = atan(sin(axis_angle)/(pinion_teeth/gear_teeth+cos(axis_angle))); // Cone Angle of the Gear delta_pinion = atan(sin(axis_angle)/(gear_teeth/pinion_teeth+cos(axis_angle)));// Cone Angle of the Pinion rg = r_gear/sin(delta_gear); // Radius of the Large Sphere c = modul / 6; // Tip Clearance df_pinion = pi*rg*delta_pinion/90 - 2 * (modul + c); // Bevel Diameter on the Large Sphere rf_pinion = df_pinion / 2; // Root Cone Radius on the Large Sphere delta_f_pinion = rf_pinion/(pi*rg) * 180; // Tip Cone Angle rkf_pinion = rg*sin(delta_f_pinion); // Radius of the Cone Foot height_f_pinion = rg*cos(delta_f_pinion); // Height of the Cone from the Root Cone echo("Cone Angle Gear = ", delta_gear); echo("Cone Angle Pinion = ", delta_pinion); df_gear = pi*rg*delta_gear/90 - 2 * (modul + c); // Bevel Diameter on the Large Sphere rf_gear = df_gear / 2; // Root Cone Radius on the Large Sphere delta_f_gear = rf_gear/(pi*rg) * 180; // Tip Cone Angle rkf_gear = rg*sin(delta_f_gear); // Radius of the Cone Foot height_f_gear = rg*cos(delta_f_gear); // Height of the Cone from the Root Cone echo("Gear Height = ", height_f_gear); echo("Pinion Height = ", height_f_pinion); rotate = is_even(pinion_teeth); // Gear rotate([0,0,180*(1-clearance)/gear_teeth*rotate]) bevel_herringbone_gear(modul, gear_teeth, delta_gear, tooth_width, gear_bore, pressure_angle, helix_angle); // Pinion if (together_built) translate([-height_f_pinion*cos(90-axis_angle),0,height_f_gear-height_f_pinion*sin(90-axis_angle)]) rotate([0,axis_angle,0]) bevel_herringbone_gear(modul, pinion_teeth, delta_pinion, tooth_width, pinion_bore, pressure_angle, -helix_angle); else translate([rkf_pinion*2+modul+rkf_gear,0,0]) bevel_herringbone_gear(modul, pinion_teeth, delta_pinion, tooth_width, pinion_bore, pressure_angle, -helix_angle); } /* Archimedean screw. modul = Height of the Screw Head over the Part Cylinder thread_starts = Number of Starts (Threads) of the Worm length = Length of the Worm bore = Diameter of the Center Hole pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°. lead_angle = Lead Angle of the Worm, corresponds to 90° minus Helix Angle. Positive Lead Angle = clockwise. together_built = Components assembled for Construction or separated for 3D-Printing */ module worm(modul, thread_starts, length, bore, pressure_angle=20, lead_angle, together_built=true){ // Dimension Calculations c = modul / 6; // Tip Clearance r = modul*thread_starts/(2*sin(lead_angle)); // Part-Cylinder Radius rf = r - modul - c; // Root-Cylinder Radius a = modul*thread_starts/(90*tan(pressure_angle)); // Spiralparameter tau_max = 180/thread_starts*tan(pressure_angle); // Angle from Foot to Tip in the Normal Plane gamma = -rad*length/((rf+modul+c)*tan(lead_angle)); // Torsion Angle for Extrusion step = tau_max/16; // Drawing: Extrude with a Twist a Surface enclosed by two Archimedean Spirals if (together_built) { rotate([0,0,tau_max]){ linear_extrude(height = length, center = false, convexity = 10, twist = gamma){ difference(){ union(){ for(i=[0:1:thread_starts-1]){ polygon( concat( [[0,0]], // rising Tooth Flank [for (tau = [0:step:tau_max]) polar_to_cartesian([spiral(a, rf, tau), tau+i*(360/thread_starts)])], // Tooth Tip [for (tau = [tau_max:step:180/thread_starts]) polar_to_cartesian([spiral(a, rf, tau_max), tau+i*(360/thread_starts)])], // descending Tooth Flank [for (tau = [180/thread_starts:step:(180/thread_starts+tau_max)]) polar_to_cartesian([spiral(a, rf, 180/thread_starts+tau_max-tau), tau+i*(360/thread_starts)])] ) ); } circle(rf); } circle(bore/2); // Mittelbohrung } } } } else { difference(){ union(){ translate([1,r*1.5,0]){ rotate([90,0,90]) worm(modul, thread_starts, length, bore, pressure_angle, lead_angle, together_built=true); } translate([length+1,-r*1.5,0]){ rotate([90,0,-90]) worm(modul, thread_starts, length, bore, pressure_angle, lead_angle, together_built=true); } } translate([length/2+1,0,-(r+modul+1)/2]){ cube([length+2,3*r+2*(r+modul+1),r+modul+1], center = true); } } } } /* Calculates a worm wheel set. The worm wheel is an ordinary spur gear without globoidgeometry. modul = Height of the screw head above the partial cylinder or the tooth head above the pitch circle tooth_number = Number of wheel teeth thread_starts = Number of gears (teeth) of the screw width = tooth_width length = Length of the Worm worm_bore = Diameter of the Center Hole of the Worm gear_bore = Diameter of the Center Hole of the Spur Gear pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°. lead_angle = Pitch angle of the worm corresponds to 90 ° bevel angle. Positive slope angle = clockwise. optimized = Holes for material / weight savings together_built = Components assembled for construction or apart for 3D printing */ module worm_gear(modul, tooth_number, thread_starts, width, length, worm_bore, gear_bore, pressure_angle=20, lead_angle, optimized=true, together_built=true, show_spur=1, show_worm=1){ c = modul / 6; // Tip Clearance r_worm = modul*thread_starts/(2*sin(lead_angle)); // Worm Part-Cylinder Radius r_gear = modul*tooth_number/2; // Spur Gear Part-Cone Radius rf_worm = r_worm - modul - c; // Root-Cylinder Radius gamma = -90*width*sin(lead_angle)/(pi*r_gear); // Spur Gear Rotation Angle tooth_distance = modul*pi/cos(lead_angle); // Tooth Spacing in Transverse Section x = is_even(thread_starts)? 0.5 : 1; if (together_built) { if(show_worm) translate([r_worm,(ceil(length/(2*tooth_distance))-x)*tooth_distance,0]) rotate([90,180/thread_starts,0]) worm(modul, thread_starts, length, worm_bore, pressure_angle, lead_angle, together_built); if(show_spur) translate([-r_gear,0,-width/2]) rotate([0,0,gamma]) spur_gear (modul, tooth_number, width, gear_bore, pressure_angle, -lead_angle, optimized); } else { if(show_worm) worm(modul, thread_starts, length, worm_bore, pressure_angle, lead_angle, together_built); if(show_spur) translate([-2*r_gear,0,0]) spur_gear (modul, tooth_number, width, gear_bore, pressure_angle, -lead_angle, optimized); } } //rack(modul=1, length=60, height=5, width=20, pressure_angle=20, helix_angle=0); //mountable_rack(modul=1, length=60, height=5, width=20, pressure_angle=20, helix_angle=0, profile=3, head="PH",fastners=3); //herringbone_rack(modul=1, length=60, height=5, width=20, pressure_angle=20, helix_angle=45); //mountable_herringbone_rack(modul=1, length=60, height=5, width=20, pressure_angle=20, helix_angle=45, profile=3, head="PH",fastners=3); //spur_gear (modul=1, tooth_number=30, width=5, bore=4, pressure_angle=20, helix_angle=20, optimized=true); //herringbone_gear (modul=1, tooth_number=30, width=5, bore=4, pressure_angle=20, helix_angle=30, optimized=true); //rack_and_pinion (modul=1, rack_length=50, gear_teeth=30, rack_height=4, gear_bore=4, width=5, pressure_angle=20, helix_angle=0, together_built=true, optimized=true); ring_gear (modul=1, tooth_number=30, width=5, rim_width=3, pressure_angle=20, helix_angle=20); //herringbone_ring_gear (modul=1, tooth_number=30, width=5, rim_width=3, pressure_angle=20, helix_angle=30); //planetary_gear(modul=1, sun_teeth=16, planet_teeth=9, number_planets=5, width=5, rim_width=3, bore=4, pressure_angle=20, helix_angle=30, together_built=true, optimized=true); //bevel_gear(modul=1, tooth_number=30, partial_cone_angle=45, tooth_width=5, bore=4, pressure_angle=20, helix_angle=20); //bevel_herringbone_gear(modul=1, tooth_number=30, partial_cone_angle=45, tooth_width=5, bore=4, pressure_angle=20, helix_angle=30); //bevel_gear_pair(modul=1, gear_teeth=30, pinion_teeth=11, axis_angle=100, tooth_width=5, gear_bore=4, pinion_bore=4, pressure_angle = 20, helix_angle=20, together_built=true); //bevel_herringbone_gear_pair(modul=1, gear_teeth=30, pinion_teeth=11, axis_angle=100, tooth_width=5, gear_bore=4, pinion_bore=4, pressure_angle = 20, helix_angle=30, together_built=true); //worm(modul=1, thread_starts=2, length=15, bore=4, pressure_angle=20, lead_angle=10, together_built=true); //worm_gear(modul=1, tooth_number=30, thread_starts=2, width=8, length=20, worm_bore=4, gear_bore=4, pressure_angle=20, lead_angle=10, optimized=1, together_built=1, show_spur=1, show_worm=1);