# # sled.cad # # # define limits and parameters # cad_units = 'in' # coordinates units cad_bit_depth = '1' # bit depth cad_npts = 500 cad_nx = cad_npts # x points to render cad_ny = cad_npts # y points to render # # define shapes and transformation # # circle(x0, y0, r) # cylinder(x0, y0, z0, z1, r) # sphere(x0, y0, z0, r) # torus(x0, y0, z0, r0, r1) # rectangle(x0, x1, y0, y1) # cube(x0, x1, y0, y1, z0, z1) # add(part1, part2) # intersect(part1, part2) # subtract(part1, part2) # move(part,dx,dy) # rotate(part, theta) # rotate_x(part, theta) # rotate_y(part, theta) # rotate_z(part, theta) # reflect_x(part, x0) # reflect_y(part, y0) # reflect_z(part, z0) # reflect_xy(part) # reflect_xz(part) # reflect_yz(part) # scale_x(part, sx) # scale_y(part, sy) # scale_z(part, sz) # (many more to come) 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 cone(x0, y0, z0, r0, h): 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 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 add(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 subtract(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 rotate(part, theta): part = replace(part,'X','(cos(theta)*X+sin(theta)*y)') part = replace(part,'Y','(-sin(theta)*X+cos(theta)*y)') part = replace(part,'y','Y') part = replace(part,'theta',str(theta)) return part def rotate_x(part, theta): part = replace(part,'Y','(cos(theta)*Y+sin(theta)*z)') part = replace(part,'Z','(-sin(theta)*Y+cos(theta)*z)') part = replace(part,'z','Z') part = replace(part,'theta',str(theta)) return part def rotate_y(part, theta): part = replace(part,'X','(cos(theta)*X+sin(theta)*z)') part = replace(part,'Z','(-sin(theta)*X+cos(theta)*z)') part = replace(part,'z','Z') part = replace(part,'theta',str(theta)) return part def rotate_z(part, theta): part = replace(part,'X','(cos(theta)*X+sin(theta)*y)') part = replace(part,'Y','(-sin(theta)*X+cos(theta)*y)') part = replace(part,'y','Y') part = replace(part,'theta',str(theta)) return part def reflect_x(part, x0): part = replace(part,'X','(x0-X)') part = replace(part,'x0',str(x0)) return part def reflect_y(part, y0): part = replace(part,'Y','(y0-Y)') part = replace(part,'y0',str(y0)) return part def reflect_z(part, z0): part = replace(part,'Z','(z0-Z)') part = replace(part,'z0',str(z0)) 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, sx): part = replace(part,'X','(X/sx)') part = replace(part,'sx',str(sx)) return part def scale_y(part, sy): part = replace(part,'Y','(Y/sy)') part = replace(part,'sy',str(sy)) return part def scale_z(part, sz): part = replace(part,'Z','(Z/sz)') part = replace(part,'sz',str(sz)) return part # # define part # t = .4 l = 4.5 runner = rectangle(-l/2,l/2,0,t) front = circle(l/2,t,t) front = subtract(front,circle(l/2,2*t,t)) front = subtract(front,rectangle(-10,l/2,-10,10)) runner = add(runner,front) slot_width = .14 slot_depth = t/2. slot = rectangle(-slot_width/2,slot_width/2,-slot_depth,0) chamfer = rectangle(0,1,0,1) chamfer = rotate_z(chamfer,pi/4) chamfer = move(chamfer,0,-slot_depth/2) slot = add(slot,chamfer) slot = subtract(slot,rectangle(-10,10,0,10)) runner = subtract(runner,move(slot,-l/3.,t)) runner = subtract(runner,move(slot,0,t)) runner = subtract(runner,move(slot,l/3,t)) runner1 = move(runner,0,1.5*t) runner2 = move(runner,0,3*t) sled = runner sled = add(sled,runner1) sled = add(sled,runner2) lc = .6*l cross = rectangle(-lc/2,lc/2,0,t) cross = subtract(cross,move(slot,-lc/3,t)) cross = subtract(cross,move(slot,0,t)) cross = subtract(cross,move(slot,lc/3,t)) cross = move(cross,0,-1.5*t) cross1 = move(cross,0,-1.5*t) cross2 = move(cross1,0,-1.5*t) sled = add(sled,cross) sled = add(sled,cross1) sled = add(sled,cross2) cad_xmin = -.55*l d = 1.2*l cad_xmax = cad_xmin + d cad_ymin = -.45*l cad_ymax = cad_ymin + d # # assign part to SAT_function # SAT_function = sled