$fn=60; l1=[48,24,8]; l2=[30,20,5]; treads(n=5,link_size=l2); module treads(n, link_size){ tread_link(link_size); for(i=[1:1:(n-1)]){ translate([(link_size[1]-link_size[2])*i,0,0]) tread_link(link_size); translate([(link_size[1]-link_size[2])*(i),0,0]) pin(link_size); } } module master_pin(){ } module pin(s){ pin_diameter = floor(s[2]/2); union(){ cylinder(h=s[0],r=pin_diameter/2); cylinder(h=s[2]/2,r=s[2]/2); translate([0,0,0]) cube([pin_diameter,pin_diameter,s[2]/2]); } } module tread_link(s, gap=0.2){ pin_diameter = floor(s[2]/2); echo("Pin diameter: ", pin_diameter); difference(){ union(){ tread_base(s); translate([(s[1]*1)-s[1],s[2]/2,s[0]/2]) rotate([0,0,90]) chevron(1,s[0]*0.52,135); translate([s[1]*0.25,s[2]/2,s[0]/2]) rotate([0,0,90]) chevron(1,s[0]*0.52,135); } pin_holes(pin_diameter, s, gap); insets(s, gap); tooth_hole(s); } } module tread_base(s){ union(){ linear_extrude(s[0]) hull(){ circle(r=s[2]/2); translate([s[1]-s[2],0,0]) circle(r=s[2]/2); } } } module pin_holes(d, s,gap){ cylinder(h=s[0], r=(d+gap)/2); translate([s[1]-s[2],0,0]) cylinder(h=s[0], r=(d+gap)/2); } module insets(s,gap){ i_d=s[0]*0.25; rear_inset(s,i_d,gap); translate([0,0,s[0]-i_d]) rear_inset(s,i_d,gap); front_inset(s,i_d,gap); } module rear_inset(s,i_d,gap){ translate([-s[2]/2,-(s[2]*2)/2,-gap]) cube([s[2]+gap,s[2]*2,i_d+gap*2]); } module front_inset(s,i_d,gap){ translate([(s[1]-s[2])-(s[2]/2)-gap,-(s[2]*2)/2,i_d]) cube([s[2]+gap,s[2]*2,s[0]-(2*i_d)]); translate([(s[1]-s[2])-(s[2]/2)-gap,-s[2]/2,-(s[2]/2)+gap]) cube([s[2]+gap,s[2],s[2]]); translate([(s[1]-s[2])-(s[2]/2)-gap,-s[2]/2,s[0]-(s[2]/2)-gap]) cube([s[2]+gap,s[2],s[2]]); } module tooth_hole(s){ w=s[0]*0.5; d=s[1]*0.25; translate([s[1]*0.25,-(s[2]*2)/2,(s[0]-w)/2]) cube([d,s[2]*2,w]); } module chevron(s,l,a){ union(){ rotate([-(90-(a/2)),0,0]) translate([s/2,-s/2,-l/2]) cube([s+0.1,s,l],center=true); rotate([90-(a/2),0,0]) translate([s/2,-s/2,l/2]) cube([s+.1,s,l],center=true); } }