from koko.lib.shapes import * def filleted_rectangle(x0,x1,y0,y1,r): rect = rectangle(x0,x1,y0,y1) rect = rect - (rectangle(x0,x0+r,y0,y0+r) - circle(x0+r,y0+r,r)) rect = rect - (rectangle(x0,x0+r,y1-r,y1) - circle(x0+r,y1-r,r)) rect = rect - (rectangle(x1-r,x1,y0,y0+r) - circle(x1-r,y0+r,r)) rect = rect - (rectangle(x1-r,x1,y1-r,y1) - circle(x1-r,y1-r,r)) return rect def dogboned_rectangle(x0,x1,y0,y1,r): rect = rectangle(x0,x1,y0,y1) db = circle(x0+.66*r,y0+.66*r,r) db += reflect_x(db,.5*(x0+x1)) db += reflect_y(db,.5*(y0+y1)) return rect+db bit = .125 #1/8 end mill mat_thick = .5 #material thickness #snap params snap_base_w = .25 snap_cut_w = bit+.005 backcut = .25 #distance to cut back into material to increase flexure backcut_w = bit+.005 #width of backcut snap_tooth = .0625 index_w =.22 snap_index_sep = .3 pull = .03 insert_overshoot = .05 snap_fillet = .125/2 tot_snap_w = index_w + 2*snap_index_sep + 2*snap_base_w + 2*snap_tooth def snap_female(x,y,r=0): rad = .5*(bit+.005) index = dogboned_rectangle(-.5*index_w,.5*index_w,-.5*mat_thick,.5*mat_thick,rad) snap_hole = dogboned_rectangle(-snap_tooth,snap_base_w,-.5*mat_thick,.5*mat_thick,rad) snap_hole = move(snap_hole,.5*index_w+snap_index_sep,0) snap_hole += reflect_x(snap_hole) snap_hole = rotate(index+snap_hole,r) return move(snap_hole,x,y) def snap_male(x,y,r=0): snap = rectangle(-.5*snap_base_w,.5*snap_base_w,0,mat_thick) snap += rectangle(-.5*snap_base_w,.5*snap_base_w+snap_tooth,mat_thick,mat_thick+2*snap_tooth) snap -= triangle(.5*snap_base_w-insert_overshoot,mat_thick+2*snap_tooth,.5*snap_base_w+snap_tooth,mat_thick+2*snap_tooth,.5*snap_base_w+snap_tooth,mat_thick+snap_tooth) snap += triangle(.5*snap_base_w,mat_thick-pull,.5*snap_base_w,mat_thick,.5*snap_base_w+snap_tooth,mat_thick) snap = move(snap,.5*snap_base_w+.5*index_w+snap_index_sep,0) snap += reflect_x(snap) index = filleted_rectangle(-.5*index_w,.5*index_w,-.0625,mat_thick,snap_fillet) snap += index snap = move(rotate(snap,r),x,y) cut = filleted_rectangle(-.5*snap_cut_w,.5*snap_cut_w,-backcut,mat_thick,snap_fillet) cut2 = filleted_rectangle(0,backcut_w,-backcut,.5*mat_thick,snap_fillet) cut2 = move(cut2,.5*snap_base_w,0) cut2 += reflect_x(cut2) cut += cut2 cut = move(cut,.5*snap_base_w+.5*index_w+snap_index_sep,0) cut += circle(.5*index_w+.5*(bit+.005),0,.5*(bit+.005)) cut += reflect_x(cut) cut = move(rotate(cut,r),x,y) return (snap,cut) #stuff for creepy crawler #gives colors show_rollers = 0 pack = 1 check_collisions = 0 xx = 11 #length fabric_y = 3.25 #height of fabric throat = .5 #height of throat width = .924 #width between plates cattle = 3 #cattle gaurd extension sx = 5.5 rrd = 45/25.4 - .02 #diameter of rear rollers sy = fabric_y - .5*rrd #coords of rear shaft shaft_diam = 1/4.+.001 #naked shaft diam bd = .696 #bearing diam clearance = 1/16. #how much clearance for fabric around rear roller smush = .02 #how much to smush the rollers together ssx = 8 frd = 1.25 -.01 #diam of front roller ssy = fabric_y - .5*frd #coords of front shaft rect = filleted_rectangle(0, xx, 0, 2*fabric_y, 0.125) rect -= filleted_rectangle(1.5, xx+1, fabric_y - .5*throat, fabric_y+.5*throat, 0.25) rect += triangle(xx-.25,0,xx,fabric_y-.5*throat,xx+cattle,0) fil = rectangle(xx-.25,xx,fabric_y-.5*throat-.25,fabric_y-.5*throat) - circle(xx-.25,fabric_y-.5*throat-.25,.25) fil = reflect_y(fil,fabric_y) r = .5*(fabric_y)/cattle fil += rectangle(xx+cattle-.5,xx+cattle,0,r) - circle(xx+cattle-.58,.5*r,.52*r) rect -= fil bearing = circle(0,0,.5*bd) bearing = bearing bearing = move(bearing,sx,sy+.5*smush) bearing += reflect_y(bearing,sy+.5*rrd) stepper_d = 1.69 + .06 stepper = dogboned_rectangle(-.5*stepper_d,.5*stepper_d,-.5*stepper_d,.5*stepper_d,.5*(bit+.005)) stepper -= circle(0,0,.5*.86) dh = circle(.5*1.22,.5*1.22,.5*bit+.005) #drill holes dh += reflect_x(dh) dh += reflect_y(dh) stepper -= dh stepper = move(stepper,1.9,1.95) rect -= stepper rect = rect - bearing#+housing-beltcut-beltRect-attachBeltTop-arch rrollers = circle(sx,sy+.5*smush,.5*rrd) rrollers += reflect_y(rrollers,sy+.5*rrd) frollers = circle(ssx,ssy+.5*smush,.5*frd) frollers += reflect_y(frollers,ssy+.5*frd) rollers = frollers + rrollers #servo stuff servo_l = .91 servo_w = .472 servo_h = .79 servo_offset = 1.75 servo_bias = servo_l/2. - .38 #servo servo = rectangle(-.5*servo_l,.5*servo_l,-.5*servo_h,.5*servo_h) servo += rectangle(-.5*mat_thick+servo_bias,.5*mat_thick+servo_bias,.5*servo_h,.5*servo_h+servo_offset) servo = move(servo,ssx-servo_bias,ssy+.5*smush-servo_offset-.5*servo_h) servo += reflect_y(servo,fabric_y) cutout = filleted_rectangle(-.5*frd,.5*frd,-servo_offset,4*mat_thick,.25) cutout = move(cutout,ssx,ssy+2*mat_thick) cutout += reflect_y(cutout,fabric_y) rect = rect - cutout #snaps cross_back = filleted_rectangle(-.5*width,.5*width,1.85*mat_thick,2*fabric_y-1.85*mat_thick,.125) cross_back = move(cross_back,-.5*width-2*mat_thick,0) s = snap_male(-2*mat_thick,2.5*mat_thick+.5*tot_snap_w,-90) s = map(lambda x: x+reflect_y(x,fabric_y),s) s = map(lambda x: x+reflect_x(x,-2*mat_thick-.5*width),s) cross_back = cross_back + s[0] - s[1] cross_bottom = filleted_rectangle(mat_thick,.9*(xx+cattle)-mat_thick,-width,0,.125) cross_bottom = move(cross_bottom,0,-2*mat_thick) s = snap_male(2*mat_thick+.5*tot_snap_w,-2*mat_thick,0) s = map(lambda x: x+reflect_x(x,.45*(xx+cattle)),s) s = map(lambda x: x+reflect_y(x,-2*mat_thick-.5*width),s) servo_cut = dogboned_rectangle(-.5*servo_l,.5*servo_l, -.5*servo_w,.5*servo_w,.5*(bit+.005)) servo_cut = move(servo_cut,ssx-servo_bias,-.5*width-2*mat_thick) cross_bottom = cross_bottom + s[0] - s[1] - servo_cut cross_top = filleted_rectangle(.5*mat_thick,xx-.5*mat_thick,-width,0,.125) cross_top = move(cross_top ,0,-2*mat_thick-width-4*mat_thick) s = snap_male(1.5*mat_thick+.5*tot_snap_w,-2*mat_thick-width-4*mat_thick,0) s = map(lambda x: x+reflect_x(x,.5*xx),s) s = map(lambda x: x+reflect_y(x,-6*mat_thick-1.5*width),s) servo_cut = dogboned_rectangle(-.5*servo_l,.5*servo_l, -.5*servo_w,.5*servo_w,.5*(bit+.005)) servo_cut = move(servo_cut,ssx-servo_bias,-1.5*width-6*mat_thick) cross_top = cross_top + s[0] - s[1] - servo_cut mid_x = .5*(sx+ssx) cross_mid = filleted_rectangle(mid_x-.5*width,mid_x+.5*width,1.85*mat_thick,fabric_y-.5*throat-.25*mat_thick,.125) s = snap_male(mid_x+.5*width,.5*(fabric_y-.5*throat)+.75*mat_thick,-90) s = map(lambda x: x+reflect_x(x,mid_x),s) cross_mid = cross_mid + s[0] - s[1] cross_mid += reflect_x(cross_mid,ssx) cross_mid += reflect_y(cross_mid,fabric_y) cross_mid = move(cross_mid,xx-mid_x+2*width,2*width) bottom_y = fabric_y + .5*smush - servo_offset - .5*frd - .5*mat_thick top_y = fabric_y -.5*smush + servo_offset + .5*frd + .5*mat_thick #sanity check if check_collisions: cross_back = move(cross_back,3.5*mat_thick,0) cross_bottom = move(cross_bottom,0,2.5*mat_thick+bottom_y) cross_top = move(cross_top,0,top_y+2*width+5.5*mat_thick) cross_mid = move(cross_mid,-xx+mid_x-2*width,-2*width) cross = cross_back + cross_bottom + cross_top + cross_mid back_holes = snap_female(mat_thick,2.5*mat_thick+.5*tot_snap_w,-90) back_holes += reflect_y(back_holes,fabric_y) bottom_holes = snap_female(2*mat_thick+.5*tot_snap_w,bottom_y,0) bottom_holes += reflect_x(bottom_holes,.45*(xx+cattle)) top_holes = snap_female(1.5*mat_thick+.5*tot_snap_w, top_y,0) top_holes += reflect_x(top_holes,.5*xx) mid_holes = snap_female(mid_x,.5*(fabric_y-.5*throat)+.75*mat_thick,-90) mid_holes += reflect_y(mid_holes,fabric_y) mid_holes += reflect_x(mid_holes,ssx) holes = back_holes + bottom_holes + top_holes + mid_holes rect -=holes rect += reflect_y(rect,2*fabric_y+.5*mat_thick) if show_rollers: cad.function = color(blue,rect) + color(red,rollers) +color(green,servo) + color(yellow,cross) cad.type="RGB" else: cad.function = rect + cross #boundaries cad.xmin = -5#-width-8*mat_thick cad.xmax = 20#xx+mat_thick cad.ymin = -7#-mat_thick cad.ymax = 15#4*fabric_y+4*mat_thick cad.mm_per_unit = 25.4 # inch units