Skip to content
Snippets Groups Projects
Select Git revision
  • a7aaa45ec4c3f415bf6073a5cc016635d5ecf77d
  • master default protected
  • LUFA-170418
  • LUFA-151115
  • LUFA-140928
  • LUFA-140302
  • LUFA-130901
  • LUFA-130901-BETA
  • LUFA-130303
  • LUFA-120730
  • LUFA-120730-BETA
  • LUFA-120219
  • LUFA-120219-BETA
  • LUFA-111009
  • LUFA-111009-BETA
  • LUFA-110528
  • LUFA-110528-BETA
17 results

BootloaderMIDI.h

Blame
  • alien.cad 35.87 KiB
    #
    # alien.cad
    #
    # 2D parametric .cad example
    #
    # Neil Gershenfeld
    # CBA MIT 3/9/11
    #
    # (c) Massachusetts Institute of Technology 2007
    # Permission granted for experimental and personal use;
    # license for commercial sale available from MIT.
    #
    
    taper = .75 # vary from -1 to 1
    
    #
    # define shapes and transformations
    #
    
    # color(color,part)
    # circle(x0, y0, r)
    # cylinder(x0, y0, z0, z1, r)
    # cone(x0, y0, z0, z1, r0)
    # sphere(x0, y0, z0, r)
    # torus(x0, y0, z0, r0, r1)
    # rectangle(x0, x1, y0, y1)
    # cube(x0, x1, y0, y1, z0, z1)
    # right_triangle(x0, y0, h)
    # triangle(x0, y0, x1, y1, x2, y2) (points in clockwise order)
    # pyramid(x0, x1, y0, y1, z0, z1)
    # function(Z_of_XY)
    # functions(upper_Z_of_XY,lower_Z_of_XY)
    # add(part1, part2)
    # subtract(part1, part2)
    # intersect(part1, part2)
    # move(part,dx,dy)
    # translate(part,dx,dy,dz)
    # rotate(part, angle)
    # rotate_x(part, angle)
    # rotate_y(part, angle)
    # rotate_z(part, angle)
    # rotate_90(part)
    # rotate_180(part)
    # rotate_270(part)
    # reflect_x(part,x0)
    # reflect_y(part,y0)
    # reflect_z(part,z0)
    # reflect_xy(part)
    # reflect_xz(part)
    # reflect_yz(part)
    # scale_x(part, x0, sx)
    # scale_y(part, y0, sy)
    # scale_z(part, z0, sz)
    # scale_xy(part, x0, y0, sxy)
    # scale_xyz(part, x0, y0, z0, sxyz)
    # coscale_x_y(part, x0, y0, y1, angle0, angle1, amplitude, offset)
    # coscale_x_z(part, x0, z0, z1, angle0, angle1, amplitude, offset)
    # coscale_xy_z(part, x0, y0, z0, z1, angle0, angle1, amplitude, offset)
    # taper_x_y(part, x0, y0, y1, s0, s1)
    # taper_x_z(part, x0, z0, z1, s0, s1)
    # taper_xy_z(part, x0, y0, z0, z1, s0, s1)
    # shear_x_y(part, y0, y1, dx0, dx1)
    # shear_x_z(part, z0, z1, dx0, dx1)
    
    True = "1"
    False = "0"
    
    def color(color, part):
       part = '('+str(color)+'*(('+part+')!=0))'
       return part
    
    Red = (225 << 0)
    Green = (225 << 8)
    Blue = (225 << 16)
    Gray = (128 << 16) + (128 << 8) + (128 << 0)
    White = (255 << 16) + (255 << 8) + (255 << 0)
    Teal = (255 << 16) + (255 << 8)
    Pink = (255 << 16) + (255 << 0)
    Yellow = (255 << 8) + (255 << 0)
    Brown = (45 << 16) + (82 << 8) + (145 << 0)
    Navy = (128 << 16) + (0 << 8) + (0 << 0)
    Tan = (60 << 16) + (90 << 8) + (125 << 0)
    
    def circle(x0, y0, r):
       part = "(((X-(x0))*(X-(x0)) + (Y-(y0))*(Y-(y0))) <= (r*r))"
       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))*(X-(x0)) + (Y-(y0))*(Y-(y0)) <= (r*r)) & (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, z1, r0):
       part = cylinder(x0, y0, z0, z1, r0)
       part = taper_xy_z(part, x0, y0, z0, z1, 1.0, 0.0)
       return part
    
    def sphere(x0, y0, z0, r):
       part = "(((X-(x0))*(X-(x0)) + (Y-(y0))*(Y-(y0)) + (Z-(z0))*(Z-(z0))) <= (r*r))"
       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))*(X-(x0)) + (Y-(y0))*(Y-(y0))))*(r0 - sqrt((X-(x0))*(X-(x0)) + (Y-(y0))*(Y-(y0))) + (Z-(z0))*(Z-(z0))) <= (r1*r1))"
       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 right_triangle(x0, y0, l):
       part = "((X > x0) & (X < x0 + l - (Y-y0)) & (Y > y0))"
       part = replace(part,'x0',str(x0))
       part = replace(part,'y0',str(y0))
       part = replace(part,'l',str(l))
       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 pyramid(x0, x1, y0, y1, z0, z1):
       part = cube(x0, x1, y0, y1, z0, z1)
       part = taper_xy_z(part, (x0+x1)/2., (y0+y1)/2., z0, z1, 1.0, 0.0)
       return part
    
    def function(Z_of_XY):
       part = '(Z <= '+Z_of_XY+')'
       return part
    
    def functions(upper_Z_of_XY,lower_Z_of_XY):
       part = '(Z <= '+upper_Z_of_XY+') & (Z >= '+lower_Z_of_XY+')'
       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_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 rotate_90(part):
       part = reflect_y(part,0)
       part = reflect_xy(part)
       return part
    
    def rotate_180(part):
       part = rotate_90(part)
       part = rotate_90(part)
       return part
    
    def rotate_270(part):
       part = rotate_90(part)
       part = rotate_90(part)
       part = rotate_90(part)
       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, 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 scale_xy(part, x0, y0, sxy):
       part = replace(part,'X','((x0) + (X-(x0))/(sxy))')
       part = replace(part,'Y','((y0) + (Y-(y0))/(sxy))')
       part = replace(part,'x0',str(x0))
       part = replace(part,'y0',str(y0))
       part = replace(part,'sxy',str(sxy))
       return part
    
    def scale_xyz(part, x0, y0, z0, sxyz):
       part = replace(part,'X','((x0) + (X-(x0))/(sxyz))')
       part = replace(part,'Y','((y0) + (Y-(y0))/(sxyz))')
       part = replace(part,'Z','((z0) + (Z-(z0))/(sxyz))')
       part = replace(part,'x0',str(x0))
       part = replace(part,'y0',str(y0))
       part = replace(part,'z0',str(z0))
       part = replace(part,'sxyz',str(sxyz))
       return part
    
    def coscale_x_y(part, x0, y0, y1, angle0, angle1, amplitude, offset):
       phase0 = pi*angle0/180.
       phase1 = pi*angle1/180.
       part = replace(part,'X','((x0) + (X-(x0))/((offset) + (amplitude)*cos((phase0) + ((phase1)-(phase0))*(Y-(y0))/((y1)-(y0)))))')
       part = replace(part,'x0',str(x0))
       part = replace(part,'y0',str(y0))
       part = replace(part,'y1',str(y1))
       part = replace(part,'phase0',str(phase0))
       part = replace(part,'phase1',str(phase1))
       part = replace(part,'amplitude',str(amplitude))
       part = replace(part,'offset',str(offset))
       return part
    
    def coscale_x_z(part, x0, z0, z1, angle0, angle1, amplitude, offset):
       phase0 = pi*angle0/180.
       phase1 = pi*angle1/180.
       part = replace(part,'X','((x0) + (X-(x0))/((offset) + (amplitude)*cos((phase0) + ((phase1)-(phase0))*(Z-(z0))/((z1)-(z0)))))')
       part = replace(part,'x0',str(x0))
       part = replace(part,'z0',str(z0))
       part = replace(part,'z1',str(z1))
       part = replace(part,'phase0',str(phase0))
       part = replace(part,'phase1',str(phase1))
       part = replace(part,'amplitude',str(amplitude))
       part = replace(part,'offset',str(offset))
       return part
    
    def coscale_xy_z(part, x0, y0, z0, z1, angle0, angle1, amplitude, offset):
       phase0 = pi*angle0/180.
       phase1 = pi*angle1/180.
       part = replace(part,'X','((x0) + (X-(x0))/((offset) + (amplitude)*cos((phase0) + ((phase1)-(phase0))*(Z-(z0))/((z1)-(z0)))))')
       part = replace(part,'Y','((y0) + (Y-(y0))/((offset) + (amplitude)*cos((phase0) + ((phase1)-(phase0))*(Z-(z0))/((z1)-(z0)))))')
       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,'phase0',str(phase0))
       part = replace(part,'phase1',str(phase1))
       part = replace(part,'amplitude',str(amplitude))
       part = replace(part,'offset',str(offset))
       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_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
    
    def shear_x_y(part, y0, y1, dx0, dx1):
       part = replace(part,'X','(X - (dx0) - ((dx1)-(dx0))*(Y-(y0))/((y1)-(y0)))')
       part = replace(part,'y0',str(y0))
       part = replace(part,'y1',str(y1))
       part = replace(part,'dx0',str(dx0))
       part = replace(part,'dx1',str(dx1))
       return part
    
    def shear_x_z(part, z0, z1, dx0, dx1):
       part = replace(part,'X','(X - (dx0) - ((dx1)-(dx0))*(Z-(z0))/((z1)-(z0)))')
       part = replace(part,'z0',str(z0))
       part = replace(part,'z1',str(z1))
       part = replace(part,'dx0',str(dx0))
       part = replace(part,'dx1',str(dx1))
       return part
    
    def coshear_x_z(part, z0, z1, angle0, angle1, amplitude, offset):
       phase0 = pi*angle0/180.
       phase1 = pi*angle1/180.
       part = replace(part,'X','(X - (offset) - (amplitude)*cos((phase0) + ((phase1)-(phase0))*(Z-(z0))/((z1)-(z0))))')
       part = replace(part,'z0',str(z0))
       part = replace(part,'z1',str(z1))
       part = replace(part,'phase0',str(phase0))
       part = replace(part,'phase1',str(phase1))
       part = replace(part,'amplitude',str(amplitude))
       part = replace(part,'offset',str(offset))
       return part
    
    #
    # text classes and definitions
    #
    
    class text:
       #
       # text class
       #
       def __init__(self,text,x,y,z,line='',height='',width='',space='',align='CC',color=White,angle=0):
          #
          # parameters
          #
          if (line == ''):
             line = 1
          if (height == ''):
             height = 6*line
          if (width == ''):
             width = 4*line
          if (space == ''):
             space = line/2.0
          self.width = 0
          self.height = 0
          self.text = text
          #
          # construct shape dictionary
          #
          shapes = {}
          shape = triangle(0,0,width/2.0,height,width,0)
          cutout = triangle(0,-2.5*line,width/2.0,height-2.5*line,width,-2.5*line)
          cutout = subtract(cutout,rectangle(0,width,height/4-line/2,height/4+line/2))
          shape = subtract(shape,cutout)
          shapes['A'] = shape
          shape = circle(width/2,width/2,width/2)
          shape = subtract(shape,circle(width/2,width/2,width/4))
          shape = add(shape,rectangle(width-line,width,0,height/3))
          shapes['a'] = shape
          shape = rectangle(0,width-height/4,0,height)
          shape = add(shape,circle(width-height/4,height/4,height/4))
          shape = add(shape,circle(width-height/4,3*height/4,height/4))
          w = height/2-1.5*line
          shape = subtract(shape,rectangle(line,line+w/1.5,height/2+line/2,height-line))
          shape = subtract(shape,circle(line+w/1.5,height/2+line/2+w/2,w/2))
          shape = subtract(shape,rectangle(line,line+w/1.5,line,height/2-line/2))
          shape = subtract(shape,circle(line+w/1.5,height/2-line/2-w/2,w/2))
          shapes['B'] = shape
          shape = circle(width/2,width/2,width/2)
          shape = subtract(shape,circle(width/2,width/2,width/4))
          shape = add(shape,rectangle(0,line,0,height))
          shapes['b'] = shape
          shape = circle(width/2,width/2,width/2)
          shape = add(shape,circle(width/2,height-width/2,width/2))
          shape = add(shape,rectangle(0,width,line+w/2,height-line-w/2))
          w = width-2*line
          shape = subtract(shape,circle(width/2,line+w/2,w/2))
          shape = subtract(shape,circle(width/2,height-line-w/2,w/2))
          shape = subtract(shape,rectangle(line,width,line+w/2,height-line-w/2))
          shapes['C'] = shape
          shape = circle(width/2,width/2,width/2)
          shape = subtract(shape,circle(width/2,width/2,width/4))
          shape = subtract(shape,rectangle(width/2,width,width/2-line/1.5,width/2+line/1.5))
          shapes['c'] = shape
          shape = circle(line,width-line,width-line)
          shape = subtract(shape,circle(line,width-line,width-2*line))
          shape = subtract(shape,rectangle(-width,line,0,height))
          shape = scale_y(shape,0,height/(2*(width-line)))
          shape = add(shape,rectangle(0,line,0,height))
          shapes['D'] = shape
          shape = rectangle(width-line,width,0,height)
          shape = add(shape,circle(width/2,width/2,width/2))
          shape = subtract(shape,circle(width/2,width/2,width/2-line))
          shapes['d'] = shape
          shape = rectangle(0,line,0,height)
          shape = add(shape,rectangle(0,width,height-line,height))
          shape = add(shape,rectangle(0,2*width/3,height/2-line/2,height/2+line/2))
          shape = add(shape,rectangle(0,width,0,line))      
          shapes['E'] = shape
          shape = circle(width/2,width/2,width/2)
          shape = subtract(shape,circle(width/2,width/2,width/2-line))
          shape = subtract(shape,triangle(width,0,width/2,width/2-line/2,width,width/2-line/2))
          shape = add(shape,rectangle(0,width,width/2-line/2,width/2+line/2))
          shapes['e'] = shape
          shape = rectangle(0,line,0,height)
          shape = add(shape,rectangle(0,width,height-line,height))
          shape = add(shape,rectangle(0,2*width/3,height/2-line/2,height/2+line/2))
          shapes['F'] = shape
          shape = circle(width-line/2,height-width/2,width/2)
          shape = subtract(shape,circle(width-line/2,height-width/2,width/2-line))
          shape = subtract(shape,rectangle(0,width-line/2,0,height-width/2))
          shape = subtract(shape,rectangle(width-line/2,2*width,0,height))
          shape = add(shape,rectangle(width/2-line/2,width/2+line/2,0,height-width/2))
          shape = add(shape,rectangle(width/5,4*width/5,height/2-line/2,height/2+line/2))
          shapes['f'] = shape
          shape = circle(width/2,width/2,width/2)
          shape = add(shape,circle(width/2,height-width/2,width/2))
          shape = add(shape,rectangle(0,width,line+w/2,height-line-w/2))
          w = width-2*line
          shape = subtract(shape,circle(width/2,line+w/2,w/2))
          shape = subtract(shape,circle(width/2,height-line-w/2,w/2))
          shape = subtract(shape,rectangle(line,width,line+w/2,height-line-w/2))
          shape = add(shape,rectangle(width/2,width,line+w/2,2*line+w/2))
          shapes['G'] = shape
          shape = circle(width/2,width/2,width/2)
          shape = subtract(shape,circle(width/2,width/2,width/2-line))
          w = height/3-width/2
          shape = add(shape,rectangle(width-line,width,w,width))
          shape = add(shape,subtract(subtract(circle(width/2,w,width/2),circle(width/2,w,width/2-line)),rectangle(0,width,w,height)))
          shapes['g'] = shape
          shape = rectangle(0,line,0,height)
          shape = add(shape,rectangle(width-line,width,0,height))
          shape = add(shape,rectangle(0,width,height/2-line/2,height/2+line/2))
          shapes['H'] = shape
          w = width/2
          shape = circle(width/2,w,width/2)
          shape = subtract(shape,circle(width/2,w,width/2-line))
          shape = subtract(shape,rectangle(0,width,0,w))
          shape = add(shape,rectangle(0,line,0,height))
          shape = add(shape,rectangle(width-line,width,0,w))
          shapes['h'] = shape
          shape = rectangle(width/2-line/2,width/2+line/2,0,height)
          shape = add(shape,rectangle(width/5,4*width/5,0,line))
          shape = add(shape,rectangle(width/5,4*width/5,height-line,height))
          shapes['I'] = shape
          shape = rectangle(width/2-line/2,width/2+line/2,0,height/2)
          shape = add(shape,circle(width/2,3*height/4,.6*line))
          shapes['i'] = shape
          shape = circle(width/2,width/2,width/2)
          shape = subtract(shape,circle(width/2,width/2,width/2-line))
          shape = subtract(shape,rectangle(0,width,width/2,height))
          shape = add(shape,rectangle(width-line,width,width/2,height))
          shapes['J'] = shape
          w = height/3-width/2
          shape = rectangle(width/2-line/2,width/2+line/2,w,height/2)
          shape = add(shape,subtract(subtract(subtract(circle(width/4-line/2,w,width/2),circle(width/4-line/2,w,width/2-line)),rectangle(0,width,w,height)),rectangle(-width,width/4-line/2,-height/3,height)))
          shape = add(shape,circle(width/2,3*height/4,.6*line))
          shapes['j'] = shape
          shape = rectangle(0,width,0,height)
          shape = subtract(shape,triangle(line,height,width-1.1*line,height,line,height/2+.5*line))
          shape = subtract(shape,triangle(width,0,line+0.8*line,height/2,width,height))
          shape = subtract(shape,triangle(line,0,line,height/2-.5*line,width-1.1*line,0))
          shapes['K'] = shape
          shape = rectangle(0,width,0,height)
          shape = subtract(shape,rectangle(line,width,2*height/3,height))
          shape = subtract(shape,triangle(line,2*height/3,width-1.3*line,2*height/3,line,height/3+.5*line))
          shape = subtract(shape,triangle(width,0,line+0.8*line,height/3,width,2*height/3))
          shape = subtract(shape,triangle(line,0,line,height/3-0.5*line,width-1.3*line,0))
          shapes['k'] = shape
          shape = rectangle(0,line,0,height)
          shape = add(shape,rectangle(0,width,0,line))
          shapes['L'] = shape
          shape = rectangle(width/2-line/2,width/2+line/2,0,height)
          shapes['l'] = shape
          shape = rectangle(0,width,0,height)
          shape = subtract(shape,triangle(line,0,line,height-3*line,width/2-line/3,0))
          shape = subtract(shape,triangle(line,height,width-line,height,width/2,1.5*line))
          shape = subtract(shape,triangle(width/2+line/3,0,width-line,height-3*line,width-line,0))
          shapes['M'] = shape
          w = width/2
          l = 1.3*line
          shape = circle(width/2,w,width/2)
          shape = subtract(shape,circle(width/2,w,width/2-l))
          shape = subtract(shape,rectangle(0,width,0,w))
          shape = add(shape,rectangle(width-l,width,0,w))
          shape = add(shape,move(shape,width-l,0))
          shape = add(shape,rectangle(0,l,0,width))
          shape = scale_x(shape,0,width/(2*width-l))
          shapes['m'] = shape
          shape = rectangle(0,width,0,height)
          shape = subtract(shape,triangle(line,height+1.5*line,width-line,height+1.5*line,width-line,1.5*line))
          shape = subtract(shape,triangle(line,-1.5*line,line,height-1.5*line,width-line,-1.5*line))
          shapes['N'] = shape
          w = width/2
          shape = circle(width/2,w,width/2)
          shape = subtract(shape,circle(width/2,w,width/2-line))
          shape = subtract(shape,rectangle(0,width,0,w))
          shape = add(shape,rectangle(0,line,0,width))
          shape = add(shape,rectangle(width-line,width,0,w))
          shapes['n'] = shape
          shape = circle(width/2,width/2,width/2)
          shape = add(shape,circle(width/2,height-width/2,width/2))
          shape = add(shape,rectangle(0,width,line+w/2,height-line-w/2))
          w = width-2*line
          shape = subtract(shape,circle(width/2,line+w/2,w/2))
          shape = subtract(shape,circle(width/2,height-line-w/2,w/2))
          shape = subtract(shape,rectangle(line,width-line,line+w/2,height-line-w/2))
          shapes['O'] = shape
          shape = circle(width/2,width/2,width/2)
          shape = subtract(shape,circle(width/2,width/2,width/2-line))
          shapes['o'] = shape
          shape = rectangle(0,line,0,height)
          w = 2*height/3
          shape = add(shape,circle(width-w/2,height-w/2,w/2))
          shape = add(shape,rectangle(0,width-w/2,height-w,height))
          shape = subtract(shape,circle(width-w/2,height-w/2,w/2-line))
          shape = subtract(shape,rectangle(line,width-w/2,height-w+line,height-line))
          shapes['P'] = shape
          shape = circle(width/2,width/2,width/2)
          shape = subtract(shape,circle(width/2,width/2,width/4))
          shape = add(shape,rectangle(0,line,-height/3,width))
          shapes['p'] = shape
          shape = subtract(circle(width/2,width/2,width/2),circle(width/2,width/2,width/2-.9*line))
          shape = scale_y(shape,0,height/width)
          shape = add(shape,move(rotate(rectangle(-line/2,line/2,-width/4,width/4),30),3*width/4,width/4))
          shapes['Q'] = shape
          shape = circle(width/2,width/2,width/2)
          shape = subtract(shape,circle(width/2,width/2,width/2-line))
          shape = add(shape,rectangle(width-line,width,-height/3,width))
          shapes['q'] = shape
          shape = rectangle(0,line,0,height)
          w = 2*height/3
          shape = add(shape,circle(width-w/2,height-w/2,w/2))
          shape = add(shape,rectangle(0,width-w/2,height-w,height))
          shape = subtract(shape,circle(width-w/2,height-w/2,w/2-line))
          shape = subtract(shape,rectangle(line,width-w/2,height-w+line,height-line))
          leg = triangle(line,0,line,height,width,0)
          leg = subtract(leg,triangle(line,-2.0*line,line,height-2.0*line,width,-2.0*line))
          leg = subtract(leg,rectangle(0,width,height/3,height))
          shape = add(shape,leg)
          shapes['R'] = shape
          shape = circle(width,0,width)
          shape = subtract(shape,circle(width,0,width-line))
          shape = subtract(shape,rectangle(.8*width,2*width,-height,height))
          shape = subtract(shape,rectangle(0,2*width,-height,0))
          shape = add(shape,rectangle(0,line,0,width))
          shapes['r'] = shape
          shape = circle(width/2,width/2,width/2)
          shape = subtract(shape,circle(width/2,width/2,width/2-line))
          shape = subtract(shape,rectangle(0,width/2,width/2,width))
          shape = add(shape,move(reflect_y(reflect_x(shape,width),width),0,width-line))
          shape = scale_y(shape,0,height/(2*width-line))
          shapes['S'] = shape
          w = width/3
          shape = circle(w,w,w)
          shape = subtract(shape,circle(w,w,w-.9*line))
          shape = subtract(shape,rectangle(0,w,w,2*w))
          shape = add(shape,move(reflect_y(reflect_x(shape,2*w),2*w),0,2*w-.9*line))
          shape = scale_y(shape,0,(2*height/3)/(4*w-.9*line))
          shape = move(shape,(width/2)-w,0)
          shapes['s'] = shape
          shape = rectangle(width/2-line/2,width/2+line/2,0,height)
          shape = add(shape,rectangle(0,width,height-line,height))
          shapes['T'] = shape
          shape = circle(0,3*width/8,3*width/8)
          shape = subtract(shape,circle(0,3*width/8,3*width/8-line))
          shape = subtract(shape,rectangle(-width,width,3*width/8,height))
          shape = subtract(shape,rectangle(0,width,-height,height))
          shape = move(shape,width/2-line/2+3*width/8,0)
          shape = add(shape,rectangle(width/2-line/2,width/2+line/2,width/4,3*height/4))
          shape = add(shape,rectangle(width/5,4*width/5,height/2-line/2,height/2+line/2))
          shapes['t'] = shape
          shape = circle(width/2,width/2,width/2)
          shape = subtract(shape,circle(width/2,width/2,width/2-line))
          shape = subtract(shape,rectangle(0,width,width/2,height))
          shape = add(shape,rectangle(0,line,width/2,height))
          shape = add(shape,rectangle(width-line,width,width/2,height))
          shapes['U'] = shape
          shape = circle(width/2,width/2,width/2)
          shape = subtract(shape,circle(width/2,width/2,width/2-line))
          shape = subtract(shape,rectangle(0,width,width/2,height))
          shape = add(shape,rectangle(0,line,width/2,2*height/3))
          shape = add(shape,rectangle(width-line,width,0,2*height/3))
          shapes['u'] = shape
          shape = triangle(0,height,width,height,width/2,0)
          shape = subtract(shape,triangle(0,height+3*line,width,height+3*line,width/2,3*line))
          shapes['V'] = shape
          w = 2*height/3.0
          shape = triangle(0,w,width,w,width/2,0)
          shape = subtract(shape,triangle(0,w+2*line,width,w+2*line,width/2,2*line))
          shapes['v'] = shape
          shape = triangle(0,height,width,height,width/2,0)
          shape = add(shape,move(shape,.6*width,0))
          cutout = triangle(0,height+4*line,width,height+4*line,width/2,4*line)
          cutout = add(cutout,move(cutout,.6*width,0))
          shape = subtract(shape,cutout)
          shape = scale_x(shape,0,1/1.6)
          shapes['W'] = shape
          shape = scale_y(shapes['W'],0,width/height)
          shapes['w'] = shape
          shape = rectangle(0,width,0,height)
          shape = subtract(shape,triangle(0,0,0,height,width/2-.7*line,height/2))
          shape = subtract(shape,triangle(width,0,width/2+.7*line,height/2,width,height))
          shape = subtract(shape,triangle(1.1*line,height,width-1.1*line,height,width/2,height/2+line))
          shape = subtract(shape,triangle(1.1*line,0,width/2,height/2-line,width-1.1*line,0))
          shapes['X'] = shape
          w = 2*height/3.0
          shape = rectangle(0,width,0,w)
          shape = subtract(shape,triangle(0,0,0,w,width/2-.75*line,w/2))
          shape = subtract(shape,triangle(width,0,width/2+.75*line,w/2,width,w))
          shape = subtract(shape,triangle(1.25*line,0,width/2,w/2-.75*line,width-1.25*line,0))
          shape = subtract(shape,triangle(1.25*line,w,width-1.25*line,w,width/2,w/2+.75*line))
          shapes['x'] = shape
          w = height/2
          shape = rectangle(0,width,w,height)
          shape = subtract(shape,triangle(0,w,0,height,width/2-line/2,w))
          shape = subtract(shape,triangle(width/2+line/2,w,width,height,width,w))
          shape = subtract(shape,triangle(1.1*line,height,width-1.1*line,height,width/2,w+1.1*line))
          shape = add(shape,rectangle(width/2-line/2,width/2+line/2,0,w))
          shapes['Y'] = shape
          shape = rectangle(0,width,-height/3,width)
          shape = subtract(shape,triangle(0,-height/3,0,width,width/2-.9*line,0))
          shape = subtract(shape,triangle(1.1*line,width,width-1.1*line,width,width/2-.2*line,1.6*line))
          shape = subtract(shape,triangle(1.2*line,-height/3,width,width,width,-height/3))
          shapes['y'] = shape
          shape = rectangle(0,width,0,height)
          shape = subtract(shape,triangle(0,line,0,height-line,width-1.4*line,height-line))
          shape = subtract(shape,triangle(1.4*line,line,width,height-line,width,line))
          shapes['Z'] = shape
          w = 2*height/3
          shape = rectangle(0,width,0,w)
          shape = subtract(shape,triangle(0,line,0,w-line,width-1.6*line,w-line))
          shape = subtract(shape,triangle(width,line,1.6*line,line,width,w-line))
          shapes['z'] = shape
          shape = circle(width/2,width/2,width/2)
          shape = subtract(shape,circle(width/2,width/2,width/2-.9*line))
          shape = scale_y(shape,0,height/width)
          shapes['0'] = shape
          shape = rectangle(width/2-line/2,width/2+line/2,0,height)
          w = width/2-line/2
          cutout = circle(0,height,w)
          shape = add(shape,rectangle(0,width/2,height-w-line,height))
          shape = subtract(shape,cutout)
          shape = move(shape,(width/2+line/2)/4,0)
          shapes['1'] = shape
          shape = circle(width/2,height-width/2,width/2)
          shape = subtract(shape,circle(width/2,height-width/2,width/2-line))
          shape = subtract(shape,rectangle(0,width/2,0,height-width/2))
          shape = add(shape,rectangle(0,width,0,height-width/2))
          shape = subtract(shape,triangle(0,line,0,height-width/2,width-line,height-width/2))
          shape = subtract(shape,triangle(1.5*line,line,width,height-width/2-.5*line,width,line))
          shapes['2'] = shape
          shape = circle(width/2,width/2,width/2)
          shape = subtract(shape,circle(width/2,width/2,width/2-line))
          shape = scale_y(shape,0,(height/2+line/2)/width)
          shape = add(shape,move(shape,0,height/2-line/2))
          shape = subtract(shape,rectangle(0,width/2,height/4,3*height/4))
          shapes['3'] = shape
          shape = rectangle(width-line,width,0,height)
          shape = add(shape,triangle(0,height/3,width-line,height,width-line,height/3))
          shape = subtract(shape,triangle(1.75*line,height/3+line,width-line,height-1.5*line,width-line,height/3+line))
          shapes['4'] = shape
          shape = circle(width/2,width/2,width/2)
          shape = subtract(shape,circle(width/2,width/2,width/2-line))
          shape = subtract(shape,rectangle(0,width/2,width/2,width))
          shape = add(shape,rectangle(0,width/2,width-line,width))
          shape = add(shape,rectangle(0,line,width-line,height))
          shape = add(shape,rectangle(0,width,height-line,height))
          shapes['5'] = shape
          shape = circle(width/2,height-width/2,width/2)
          shape = subtract(shape,circle(width/2,height-width/2,width/2-line))
          shape = subtract(shape,rectangle(0,width,0,height-width/2))
          shape = subtract(shape,triangle(width,height,width,height/2,width/2,height/2))
          shape = add(shape,circle(width/2,width/2,width/2))
          shape = subtract(shape,circle(width/2,width/2,width/2-line))
          shape = add(shape,rectangle(0,line,width/2,height-width/2))
          shapes['6'] = shape
          shape = rectangle(0,width,0,height)
          shape = subtract(shape,triangle(0,0,0,height-line,width-line,height-line))
          shape = subtract(shape,triangle(line,0,width,height-line,width,0))
          shapes['7'] = shape
          shape = circle(width/2,width/2,width/2)
          shape = subtract(shape,circle(width/2,width/2,width/2-line))
          shape = scale_y(shape,0,(height/2+line/2)/width)
          shape = add(shape,move(shape,0,height/2-line/2))
          shapes['8'] = shape
          shape = circle(width/2,width/2,width/2)
          shape = subtract(shape,circle(width/2,width/2,width/2-line))
          shape = subtract(shape,rectangle(0,width,width/2,height))
          shape = subtract(shape,triangle(0,0,0,height/2,width/2,height/2))
          shape = add(shape,circle(width/2,height-width/2,width/2))
          shape = subtract(shape,circle(width/2,height-width/2,width/2-line))
          shape = add(shape,rectangle(width-line,width,width/2,height-width/2))
          shapes['9'] = shape
          w = width/2
          shape = circle(w,w,w)
          shape = subtract(shape,circle(w,w,w-line))
          shape = subtract(shape,rectangle(w,width,0,height))
          shape = scale_y(shape,0,height/width)
          shape = move(shape,w/2,0)
          shapes['('] = shape
          shape = reflect_x(shape,width)
          shapes[')'] = shape
          shapes[' '] = False
          shape = rectangle(width/2-width/3,width/2+width/3,height/2-line/2,height/2+line/2)
          shape = add(shape,rectangle(width/2-line/2,width/2+line/2,height/2-width/3,height/2+width/3))
          shapes['+'] = shape
          shape = rectangle(width/2-width/3,width/2+width/3,height/2-line/2,height/2+line/2)
          shapes['-'] = shape
          shape = circle(width/2,line,.75*line)
          shapes['.'] = shape
          shape = rectangle(0,width,0,height)
          d = .8*line
          shape = subtract(shape,triangle(d,0,width,height-d,width,0))
          shape = subtract(shape,triangle(0,d,0,height,width-d,height))
          shapes['/'] = shape
          #
          # to be done
          #
          shapes['~'] = shape
          shapes['!'] = shape
          shapes['@'] = shape
          shapes['#'] = shape
          shapes['$'] = shape
          shapes['%'] = shape
          shapes['^'] = shape
          shapes['&'] = shape
          shapes['&'] = shape
          shapes['_'] = shape
          shapes['='] = shape
          shapes['['] = shape
          shapes['{'] = shape
          shapes[']'] = shape
          shapes['}'] = shape
          shapes[';'] = shape
          shapes[':'] = shape
          shapes["'"] = shape
          shapes['"'] = shape
          shapes[','] = shape
          shapes['<'] = shape
          shapes['>'] = shape
          shapes['?'] = shape
          #
          # add a line to text shape
          #
          def addline(lineshape):
             #
             # LR align
             #
             if (align[0] == 'C'):
                lineshape = move(lineshape,-self.width/2.0,0)
             elif (align[0] == 'R'):
                lineshape = move(lineshape,-self.width,0)
             #
             # add
             #
             self.shape = add(self.shape,lineshape)
          #
          # loop over chars
          #
          dx = 0
          dy = -height
          self.width = -space
          self.height = height
          lineshape = False
          self.shape = False
          for chr in text:
             if (chr == '\n'):
                addline(lineshape)
                dx = 0
                dy -= 1.5*self.height
                self.width = -space
                self.height += 1.5*self.height
                lineshape = False
             else:
                lineshape = add(lineshape,move(shapes[chr],dx,dy))
                self.width += space + width
                dx += width + space
          addline(lineshape)
          #
          # UD align
          #
          if (align[1] == 'C'):
             self.shape = move(self.shape,0,self.height/2.0)
          elif (align[1] == 'B'):
             self.shape = move(self.shape,0,self.height)
          #
          # rotate
          #
          if (angle == 90):
             self.shape = rotate_90(self.shape)
          elif (angle == 180):
             self.shape = rotate_180(self.shape)
          elif ((angle == 270) | (angle == -90)):
             self.shape = rotate_270(self.shape)
          elif (angle != 0):
             self.shape = rotate(self.shape,angle)
          #
          # translate
          #
          self.shape = move(self.shape,x,y)
          #
          # color
          #
          self.shape = '('+str(color)+'*(('+self.shape+')!=0))'
    
    
    #
    # define part
    #
    
    face = circle(0,0,.5)
    
    eye1 = circle(.18,.2,.1)
    face = subtract(face,eye1)
    eye2 = move(eye1,-.36,0)
    face = subtract(face,eye2)
    
    mouth = circle(0,0,.4)
    mouth = subtract(mouth,circle(0,0,.3))
    mouth = subtract(mouth,rectangle(-1,1,-.1,1))
    face = subtract(face,mouth)
    
    face = taper_x_y(face,0,-.5,.5,1-taper,1+taper)
    
    face = move(face,.75,-.75)
    
    #face = color('Red',face)
    
    #
    # define limits and parameters
    #
    dxy = 1.4
    cad.xmin = 0 # min x to render
    cad.xmax = cad.xmin + dxy # max x to render
    cad.ymin = -dxy # min y to render
    cad.ymax = cad.ymin + dxy # max y to render
    cad.mm_per_unit = 25.4 # use inch units
    
    #
    # assign part to cad.function
    #
    
    cad.function = face