# # hingedGik.cad # Steve Leibman 10/1/2007 # # This file contains functions and other text taken directly # from the "alien.cad" file, which was created by: # # Neil Gershenfeld # CBA MIT 7/29/07 # # (c) Massachusetts Institute of Technology 2007 # Permission granted for experimental and personal use; # license for commercial sale available from MIT. # ################ ## ## *** When machining, remember to adjust the value of w and increase resolution !! *** ## ################ # # define shapes and transformation # # circle(x0, y0, r) # cylinder(x0, y0, z0, z1, r) # cone(x0, y0, z0, h, r0) # sphere(x0, y0, z0, r) # torus(x0, y0, z0, r0, r1) # rectangle(x0, x1, y0, y1) # cube(x0, x1, y0, y1, z0, z1) # pyramid(x0, y0, z0, h, r) # add(part1, part2) # subtract(part1, part2) # intersect(part1, part2) # move(part,dx,dy) # translate(part,dx,dy,dz) # rotate(part, angle) # rotate_90(part) # rotate_180(part) # rotate_270(part) # rotate_x(part, angle) # rotate_y(part, angle) # rotate_z(part, angle) # reflect_x(part) # reflect_y(part) # reflect_z(part) # reflect_xy(part) # reflect_xz(part) # reflect_yz(part) # scale_x(part, x0, sx) # scale_y(part, y0, sy) # scale_z(part, z0, sz) # taper_x_y(part, x0, y0, y1, s0, s1) # taper_x_z(part, x0, z0, z1, s0, s1) # taper_y_z(part, x0, z0, z1, s0, s1) # taper_xy_z(part, x0, y0, z0, z1, s0, s1) # (many more to come) # poly_x(part, x0, z0, z1, a, b, ...) # poly_y(part, y0, z0, z1, a, b, ...) # poly_xy(part, x0, y0, z0, z1, a, b, ...) def circle(x0, y0, r): part = "(((X-x0)**2 + (Y-y0)**2) <= r**2)" part = replace(part,'x0',str(x0)) part = replace(part,'y0',str(y0)) part = replace(part,'r',str(r)) return part def cylinder(x0, y0, z0, z1, r): part = "(((X-x0)**2 + (Y-y0)**2 <= r**2) & (Z >= z0) & (Z <= z1))" part = replace(part,'x0',str(x0)) part = replace(part,'y0',str(y0)) part = replace(part,'z0',str(z0)) part = replace(part,'z1',str(z1)) part = replace(part,'r',str(r)) return part def triangle(x0, y0, x1, y1, x2, y2): # points in clockwise order part = "((((y1-y0)*(X-x0)-(x1-x0)*(Y-y0)) >= 0) & (((y2-y1)*(X-x1)-(x2-x1)*(Y-y1)) >= 0) & (((y0-y2)*(X-x2)-(x0-x2)*(Y-y2)) >= 0))" part = replace(part,'x0',str(x0)) part = replace(part,'y0',str(y0)) part = replace(part,'x1',str(x1)) part = replace(part,'y1',str(y1)) part = replace(part,'x2',str(x2)) part = replace(part,'y2',str(y2)) return part ## def triangle(x0, y0, x1, y1, x2, y2): ## def _triangularLogic(coords,dim0="X",dim1="Y"): ## part = "" ## for i in [0,1,2]: ## a = mod(i,3) ## b = mod(i+1,3) ## c = mod(i+2,3) ## if x[b] == x[a]: ## partX = "(X Xcmp x1)" ## else if (x[c] > x[b] && x[c] > x[a]) || (x[c] < x[b] && x[c] < x[a]): ## partX = "(X Xcmp (Y-y0)*(x1-x0)/(y1-y0)+x0)" ## else: ## partX = "" ## if x[c] > x[b]: ## partX = replace(part,'Xcmp',">=") ## else: ## partX = replace(part,'Xcmp',"<=") ## partX = replace(part,"x0",x[a]) ## partX = replace(part,"x1",x[b]) ## partX = replace(part,"y0",y[a]) ## partX = replace(part,"y1",y[b]) ## partX = replace(part,"X",dim0) ## partX = replace(part,"Y",dim1) ## if i>0: ## part = part + " & " ## part = part + partX ## x = [x0,x1,x2] ## y = [y0,y1,y2] ## part = _triangularLogic(x,dim0="X",dim1="Y") ## part = part + " & " + _triangularLogic(y,dim0="Y",dim1="X") def cone(x0, y0, z0, h, r0): part = "((sqrt((X-x0)**2 + (Y-y0)**2) <= (r0 - (Z-z0)*r0/h)) & (Z >= z0) & (Z <= (z0+h)))" part = replace(part,'x0',str(x0)) part = replace(part,'y0',str(y0)) part = replace(part,'z0',str(z0)) part = replace(part,'r0',str(r0)) part = replace(part,'h',str(h)) return part def sphere(x0, y0, z0, r): part = "(((X-x0)**2 + (Y-y0)**2 + (Z-z0)**2) <= r**2)" part = replace(part,'x0',str(x0)) part = replace(part,'y0',str(y0)) part = replace(part,'z0',str(z0)) part = replace(part,'r',str(r)) return part def torus(x0, y0, z0, r0, r1): part = "(((r0 - sqrt((X-x0)**2 + (Y-y0)**2))**2 + (Z-z0)**2) <= r1**2)" part = replace(part,'x0',str(x0)) part = replace(part,'y0',str(y0)) part = replace(part,'z0',str(z0)) part = replace(part,'r0',str(r0)) part = replace(part,'r1',str(r1)) return part def slot(width, depth, mouthCenterX, mouthCenterY, direction): chamferSize=width/2 slotHole = rectangle(-width/2,0,0,depth) chamfer = triangle(-width/2,0,-width/2-chamferSize,0,-width/2,chamferSize) slotHole = add(slotHole,chamfer) slotHole = add(slotHole,reflect_x(slotHole)) if direction=='up': slotHole = rotate_180(slotHole) elif direction == 'right': slotHole = rotate_270(slotHole) elif direction == 'left': slotHole = rotate_90(slotHole) slotHole = move(slotHole, mouthCenterX, mouthCenterY) return slotHole def rectangle(x0, x1, y0, y1): part = "((X >= x0) & (X <= x1) & (Y >= y0) & (Y <= y1))" part = replace(part,'x0',str(x0)) part = replace(part,'x1',str(x1)) part = replace(part,'y0',str(y0)) part = replace(part,'y1',str(y1)) return part def cube(x0, x1, y0, y1, z0, z1): part = "((X >= x0) & (X <= x1) & (Y >= y0) & (Y <= y1) & (Z >= z0) & (Z <= z1))" part = replace(part,'x0',str(x0)) part = replace(part,'x1',str(x1)) part = replace(part,'y0',str(y0)) part = replace(part,'y1',str(y1)) part = replace(part,'z0',str(z0)) part = replace(part,'z1',str(z1)) return part def pyramid(x0, y0, z0, h, r): part = "((X >= (x0-r*(1-(Z-z0)/h))) & (X <= (x0+r*(1-(Z-z0)/h))) & (Y >= (y0-r*(1-(Z-z0)/h))) & (Y <= (y0+r*(1-(Z-z0)/h))) & (Z >= z0) & (Z <= (z0+h)))" part = replace(part,'x0',str(x0)) part = replace(part,'y0',str(y0)) part = replace(part,'z0',str(z0)) part = replace(part,'r',str(r)) part = replace(part,'h',str(h)) return part def add(part1, part2): part = "(part1) | (part2)" part = replace(part,'part1',part1) part = replace(part,'part2',part2) return part def subtract(part1, part2): part = "(part1) & ~(part2)" part = replace(part,'part1',part1) part = replace(part,'part2',part2) return part def intersect(part1, part2): part = "(part1) & (part2)" part = replace(part,'part1',part1) part = replace(part,'part2',part2) return part def move(part,dx,dy): part = replace(part,'X','(X-'+str(dx)+')') part = replace(part,'Y','(Y-'+str(dy)+')') return part def translate(part,dx,dy,dz): part = replace(part,'X','(X-'+str(dx)+')') part = replace(part,'Y','(Y-'+str(dy)+')') part = replace(part,'Z','(Z-'+str(dz)+')') return part def rotate(part, angle): angle = angle*pi/180 part = replace(part,'X','(cos(angle)*X+sin(angle)*y)') part = replace(part,'Y','(-sin(angle)*X+cos(angle)*y)') part = replace(part,'y','Y') part = replace(part,'angle',str(angle)) return part def rotate_90(part): part = reflect_xy(part) part = reflect_y(part) return part def rotate_180(part): part = reflect_xy(part) part = reflect_y(part) part = reflect_xy(part) part = reflect_y(part) return part def rotate_270(part): part = reflect_xy(part) part = reflect_y(part) part = reflect_xy(part) part = reflect_y(part) part = reflect_xy(part) part = reflect_y(part) return part def rotate_x(part, angle): angle = angle*pi/180 part = replace(part,'Y','(cos(angle)*Y+sin(angle)*z)') part = replace(part,'Z','(-sin(angle)*Y+cos(angle)*z)') part = replace(part,'z','Z') part = replace(part,'angle',str(angle)) return part def rotate_y(part, angle): angle = angle*pi/180 part = replace(part,'X','(cos(angle)*X+sin(angle)*z)') part = replace(part,'Z','(-sin(angle)*X+cos(angle)*z)') part = replace(part,'z','Z') part = replace(part,'angle',str(angle)) return part def rotate_z(part, angle): angle = angle*pi/180 part = replace(part,'X','(cos(angle)*X+sin(angle)*y)') part = replace(part,'Y','(-sin(angle)*X+cos(angle)*y)') part = replace(part,'y','Y') part = replace(part,'angle',str(angle)) return part def reflect_x(part): part = replace(part,'X','-X') return part def reflect_y(part): part = replace(part,'Y','-Y') return part def reflect_z(part): part = replace(part,'Z','-Z') return part def reflect_xy(part): part = replace(part,'X','temp') part = replace(part,'Y','X') part = replace(part,'temp','Y') return part def reflect_xz(part): part = replace(part,'X','temp') part = replace(part,'Z','X') part = replace(part,'temp','Z') return part def reflect_yz(part): part = replace(part,'Y','temp') part = replace(part,'Z','Y') part = replace(part,'temp','Z') return part def scale_x(part, x0, sx): part = replace(part,'X','(x0 + (X-x0)/sx)') part = replace(part,'x0',str(x0)) part = replace(part,'sx',str(sx)) return part def scale_y(part, y0, sy): part = replace(part,'Y','(y0 + (Y-y0)/sy)') part = replace(part,'y0',str(y0)) part = replace(part,'sy',str(sy)) return part def scale_z(part, z0, sz): part = replace(part,'Z','(z0 + (Z-z0)/sz)') part = replace(part,'z0',str(z0)) part = replace(part,'sz',str(sz)) return part def taper_x_y(part, x0, y0, y1, s0, s1): part = replace(part,'X','(x0 + (X-x0)*(y1-y0)/(s1*(Y-y0) + s0*(y1-Y)))') part = replace(part,'x0',str(x0)) part = replace(part,'y0',str(y0)) part = replace(part,'y1',str(y1)) part = replace(part,'s0',str(s0)) part = replace(part,'s1',str(s1)) return part def taper_x_z(part, x0, z0, z1, s0, s1): part = replace(part,'X','(x0 + (X-x0)*(z1-z0)/(s1*(Z-z0) + s0*(z1-Z)))') part = replace(part,'x0',str(x0)) part = replace(part,'z0',str(z0)) part = replace(part,'z1',str(z1)) part = replace(part,'s0',str(s0)) part = replace(part,'s1',str(s1)) return part def taper_y_z(part, y0, z0, z1, s0, s1): part = replace(part,'Y','(y0 + (Y-y0)*(z1-z0)/(s1*(Z-z0) + s0*(z1-Z)))') part = replace(part,'y0',str(y0)) part = replace(part,'z0',str(z0)) part = replace(part,'z1',str(z1)) part = replace(part,'s0',str(s0)) part = replace(part,'s1',str(s1)) return part def taper_xy_z(part, x0, y0, z0, z1, s0, s1): part = replace(part,'X','(x0 + (X-x0)*(z1-z0)/(s1*(Z-z0) + s0*(z1-Z)))') part = replace(part,'Y','(y0 + (Y-y0)*(z1-z0)/(s1*(Z-z0) + s0*(z1-Z)))') part = replace(part,'x0',str(x0)) part = replace(part,'y0',str(y0)) part = replace(part,'z0',str(z0)) part = replace(part,'z1',str(z1)) part = replace(part,'s0',str(s0)) part = replace(part,'s1',str(s1)) return part # # define part # ### Set w to the thickness of the material ### w = 0.132 rBase = w*4 nextPart = w ## Part A partARadius = rBase - w/2 slotDepthA1 = rBase/2 slotDepthA2 = rBase/2 - w/2 slotDepthA3 = slotDepthA2 slotDepthA4 = rBase - w/2 partA = circle(0,0,partARadius) partA = add(partA, rectangle(0, rBase, -partARadius, partARadius)) slotA1 = slot(w, slotDepthA1, -partARadius, 0, 'left') slotA2 = slot(w, slotDepthA2, w/2, -partARadius, 'down') slotA3 = slot(w, slotDepthA3, w/2, partARadius, 'up') slotA4 = slot(w*150/132, slotDepthA4, rBase, 0, 'right') partA = subtract(partA, slotA1) partA = subtract(partA, slotA2) partA = subtract(partA, slotA3) partA = subtract(partA, slotA4) partA = move(partA, partARadius, -nextPart - partARadius) #nextPart = nextPart + partARadius*2+w ## Part B partBRadius = partARadius slotDepthB1 = rBase/2 - w/2 partB = circle(0,0,partBRadius) slotB1 = slot(w, slotDepthB1, -partARadius, 0, 'left') slotB2 = slot(w, slotDepthB1, partARadius, 0, 'right') slotB3 = slot(w, slotDepthB1, 0, -partARadius, 'down') slotB4 = slot(w, slotDepthB1, 0, partARadius, 'up') partB = subtract(partB, slotB1) partB = subtract(partB, slotB2) partB = subtract(partB, slotB3) partB = subtract(partB, slotB4) #nextPart = nextPart + partBRadius partB = move(partB, partBRadius, -nextPart) #nextPart = nextPart + partBRadius ## Part C cLeft = circle(-4*rBase-2*w, 0, rBase) cRight = circle(4*rBase+2*w, 0, rBase) cMiddle = circle(0, 0, 2*rBase) cMiddle = subtract(cMiddle, circle(0, 0, rBase)) partC = add(cLeft, cRight) partC = add(partC, cMiddle) triL = triangle(0, 0, rBase*3, rBase*3*tan(pi/8), rBase*3, -rBase*3*tan(pi/8)) triL = move(triL, -4*rBase-2*w, 0) partC = add(partC, triL) triR = reflect_x(triL) partC = add(partC, triR) rightStopper = rectangle(2*rBase-2*w,2*rBase+w,-(rBase+w),rBase+w) leftStopper = reflect_x(rightStopper) partC = add(partC,rightStopper) partC = add(partC,leftStopper) rightFlange = rectangle(2*rBase,2*rBase+4*w,-(rBase),rBase) rightFlangeCut = triangle(2*rBase+2*w,rBase,2*rBase+4*w,rBase,2*rBase+4*w,rBase-2*w) rightFlangeCut = add(rightFlangeCut,reflect_y(rightFlangeCut)) rightFlange = subtract(rightFlange,rightFlangeCut) leftFlange = reflect_x(rightFlange) partC = add(partC,rightFlange) partC = add(partC,leftFlange) rightStitchSlotTop = slot(w, rBase/2, 2*rBase+w/2, 0, 'down') rightStitchSlotBottom = slot(w, rBase/2, 2*rBase+w/2, 0, 'up') rightStitchSlot = add(rightStitchSlotTop, rightStitchSlotBottom) leftStitchSlot = reflect_x(rightStitchSlot) partC = subtract(partC,rightStitchSlot) partC = subtract(partC,leftStitchSlot) triSlot = triangle(0, 0, -2*rBase, 2*rBase, 2*rBase, 2*rBase) partC = subtract(partC, triSlot) # slotCn slots have a tiny offset to account for the fact that they are on a concave surface slotC1 = slot(w, rBase/2+w/6, -rBase+w/6, 0, 'right') slotC2 = reflect_x(slotC1) slotC3 = slot(w, rBase/2+w/6, 0, -rBase+w/6, 'up') partC = subtract(partC, slotC1) partC = subtract(partC, slotC2) partC = subtract(partC, slotC3) partCOuter = partC partCInner = partC outerMask = rectangle(-(rBase*2+4*w),rBase*2+4*w,-2*rBase,0) partCOuter = subtract(partCOuter, outerMask) partCInner = subtract(partCInner, partCOuter) nextPart = nextPart + rBase*2 partCOuter = move(partCOuter, 6*rBase, -nextPart) partCInner = move(partCInner, 6*rBase, -nextPart-3*w) nextPart = nextPart + 3*rBase + w partD = rectangle(-(rBase+w),rBase+w,-(w/2+w),w/2+w) partDHole = rectangle(-rBase,rBase,-w/2,w/2) partD = subtract(partD,partDHole) partD = move(partD, rBase+2*w,-nextPart) # # define limits and parameters # dx = w*50 dy = w*25 cad.xmin = 0 # min x to render cad.xmax = cad.xmin + dx # max x to render cad.ymin = -dy # min y to render cad.ymax = cad.ymin + dy # max y to render dpi = 500 # low resolution for previewing #dpi = 200 # high resolution for machining nxy = int(dpi*(cad.xmax-cad.xmin)) cad.nx = nxy # x points to render cad.ny = nxy # y points to render cad.inches_per_unit = 1.0 # use inch units cad.view('xy') # show xy view # # assign part to cad.function # parts = add(partA, partB) #dupParts = parts # Make duplicates #for i in [1,2,3,4]: # parts = add(parts, move(dupParts, i*(2*rBase+w), 0)) #dupPartD = partD #for i in [1,2,3]: # partD = add(partD, move(dupPartD, i*(2*rBase+3*w), 0)) parts = add(parts, partD) parts = add(parts, partCInner) parts = add(partCInner, partCOuter) cad.function = parts