[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: gEDA-user: Want to Use TI's symbols, footprints



I have done a fair amount of work on translating entire PADs ASCII file
format projects into PCB file format.

This includes translating the embedded foot prints.

The attached python script does a translation minus three points
( thermals, netlist, pin numbers are numerically listed and not the
alpha numeric that devices such as BGAs use)

Also, it generates multiple overlapping vias that PCB complains about
and then eliminates all but one.

You might try to use it to translate the TI foot prints. Or if you like
modify it to translate the TI foot prints.

Steve Meier
#!/usr/bin/python

# package.py
# Copyright (C) 2008 Stephen Meier
# Converts PAD projects to PCB projects

# The GPL applies only to the python scripts.
# the output of the program belong to the user, their employer or their customer
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

#------------------------------------------------------------------

import sys
import re

#------------------------------------------------------------------
# Global values

my_board = 0
use_polygons = True

#------------------------------------------------------------------

def lineSplit(line):
    my_re = re.compile('([\s]+)')
    line = my_re.sub(" ", line)
    return line.split(" ")

#------------------------------------------------------------------
# 2/3 nM per base unit
# 38100 base units per 100th mill

def ascii2pcb(value):
    #tmp = ((((float(value) * 2.0) / 3.0) * 0.000000001) / 0.000000254)
    tmp = int(value) / 381
    return int(tmp)

#------------------------------------------------------------------

class cSilk:

    def __init__(self, type, width):
        self.points = []
        self.width = width
        self.type = type


    def add_point(self, x, y):
        self.points.append([x, y])

    def mprint(self):
        print "Silk Type: " + self.type

        for point in self.points:
            print "  x: " + point[0] + " Y: " + point[1]

    def pcb_write(self, rotation, file):
        #print ("silk write start")
        first_point = []
        second_point = []

        width = ascii2pcb(self.width)

        for point in self.points:
            if self.type == "CLOSED" or self.type == "OPEN":
                first_point = second_point
                second_point = point

                if len(first_point):
                    
                    x1 = ascii2pcb(first_point[0])
                    y1 = -ascii2pcb(first_point[1])
                    x2 = ascii2pcb(second_point[0])
                    y2 = -ascii2pcb(second_point[1])

                    #print ("silk write x1: " + str(x1) + " y1: " + str(y1) + " x2: " + str(x2) + " y2: " + str(y2))

                    if rotation == 90.0:
                        tmp = x1
                        x1 = y1
                        y1 = -tmp
                        tmp = x2
                        x2 = y2
                        y2 = -tmp
                    elif rotation == 180.0:
                        x1 = -x1
                        y1 = -y1
                        x2 = -x2
                        y2 = -y2
                    elif rotation == 270.0:
                        tmp = x1
                        x1 = -y1
                        y1 = tmp
                        tmp = x2
                        x2 = -y2
                        y2 = tmp
                        
                    file.write( "ElementLine [" + str(x1) + " " + str(y1) + " " + str(x2) + " " + str(y2) + " " + str(width) + "]\n")
                    
            elif self.type == "CIRCLE":
                first_point = second_point
                second_point = point

                
                if len(first_point):
          
                    x1 = ascii2pcb(first_point[0])
                    y1 = -ascii2pcb(first_point[1])
                    x2 = ascii2pcb(second_point[0])
                    y2 = -ascii2pcb(second_point[1])

                    if rotation == 90.0:
                        tmp = x1
                        x1 = y1
                        y1 = -tmp
                        tmp = x2
                        x2 = y2
                        y2 = -tmp
                    elif rotation == 180.0:
                        x1 = -x1
                        y1 = -y1
                        x2 = -x2
                        y2 = -y2
                    elif rotation == 270.0:
                        tmp = x1
                        x1 = -y1
                        y1 = tmp
                        tmp = x2
                        x2 = -y2
                        y2 = tmp

                    center_x = (x1 + x2) / 2
                    center_y = (y1 + y2) / 2

                    if abs(x2 - x1) > abs(y2 -y1):
                        diameter = abs(x2 - x1)/2
                    else:
                        diameter = abs(y2 - y1)/2
                
                    file.write( "ElementArc [" + str(center_x) + " " + str(center_y) + " " + str(diameter) + " " + str(diameter) + " 90 360 300 ]\n")
#------------------------------------------------------------------

class cText:

    def __init__(self, x, y, visible, mirrored, rotation):
        self.x = x
        self.y = y
        self.visible = visible
        self.mirrored = mirrored
        self.rotation = rotation
        self.string = ""


    def add_string(self, in_str):
        self.string = in_str

    def mprint(self):
        print "Text: " + self.string + " x: " + self.x + " y: " + self.y
    


    
#------------------------------------------------------------------

class cPolygon:

    def __init__(self, LEVEL):
        self.level = LEVEL
        self.corners = []
        self.PinNumber = 0

    def add_corner(self, x, y):
        self.corners.append([x, y])

    def SetPinNumber(self, pinnumber):
        self.PinNumber = pinnumber
        
    def pcb_write(self, level, file):

        if int(self.level) != int(level):
            return

        file.write("Polygon(\"clearpoly\")\n(\n")

        count = 0

        for corner in self.corners:

            x = ascii2pcb(corner[0])
            y = -ascii2pcb(corner[1])

            file.write("[" + str(x) + " " + str(y) + "]")

            if count == 3:
                file.write("\n")
                count = 0
            else:
                count += 1
                file.write(" ")

        if count != 0:
            file.write("\n")
        
        file.write(")\n")

    
#------------------------------------------------------------------

class cPieces:

    def __init__(self, PIECETYPE, WIDTHHGHT, LEVEL):
        self.PIECETYPE = PIECETYPE
        self.WIDTHHGHT = WIDTHHGHT
        self.level = LEVEL
        self.corners = []

    def add_corner(self, x, y):
        self.corners.append([x, y])

    def mprint(self):
        print "Piece: " + self.PIECETYPE

        for corner in self.corners:
            print "   Corner: x: " + str(corner[0]) + " y: " + str(corner[1])

    def pcb_write(self, level, x_offset, y_offset, file):
        #print("Piece TYPE: " + self.PIECETYPE + " Piece Level: " + str(self.level) + " level: " + str(level))

        if int(self.level) != int(level):
            return
        
        #print("found piece for this level")
        
        
        first_point = []
        second_point = []

        width = ascii2pcb(self.WIDTHHGHT)

        for corner in self.corners:
            if self.PIECETYPE == "CLOSED" or self.PIECETYPE == "OPEN":
                first_point = second_point
                second_point = corner

                if len(first_point):
                    
                    x1 = ascii2pcb(first_point[0] + x_offset)
                    y1 = -ascii2pcb(first_point[1] + y_offset)
                    x2 = ascii2pcb(second_point[0] + x_offset)
                    y2 = -ascii2pcb(second_point[1] + y_offset)

                    #print ("silk write x1: " + str(x1) + " y1: " + str(y1) + " x2: " + str(x2) + " y2: " + str(y2))
                    
                    #if width == 0:
                        #print ( "ZERO Line [" + str(x1) + " " + str(y1) + " " + str(x2) + " " + str(y2) + " " + str(width) + " " + str(width) + " \"\"]\n")
                    file.write( "Line [" + str(x1) + " " + str(y1) + " " + str(x2) + " " + str(y2) + " " + str(width) + " " + str(width) + " \"\"]\n")

        
#------------------------------------------------------------------

class cLine:

    def __init__(self, NAME, TYPE, XLOC, YLOC):
        self.NAME = NAME
        self.TYPE = TYPE
        self.XLOC = XLOC
        self.YLOC = YLOC
        self.pieces = []
        self.text = []

    def add_piece(self, piece):
        self.pieces.append(piece)

    def add_text(self, text):
        self.text.append(text)
        
    def mprint(self):
        print "Line: " + self.NAME + " Type: " + self.TYPE + " x: " + self.XLOC + " y: " + self.YLOC
        
        for text in self.text:
            text.mprint()

        for piece in self.pieces:
            piece.mprint()
            
    def pcb_write(self, level, file):
        #print("Line TYPE: " + self.TYPE + " Level: " + str(level))
        
        if self.TYPE == "LINES" or self.TYPE == "TRACE":
            for piece in self.pieces:
                piece.pcb_write(level, int(self.XLOC), int(self.YLOC), file)
        

            
#------------------------------------------------------------------

class cPin:

    def __init__(self, pin_number, x, y, height, width, offset, shape, rotation, drill_size, part):
        self.pin_number = pin_number
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.offset = offset
        self.shape = shape
        self.rotation = rotation
        self.drill_size = drill_size
        self.part = part

    def applyPinDef(self, pin_def):
        if (pin_def.pin_number == self.pin_number) or (pin_def.pin_number == "0"):
            self.width = pin_def.width
            self.height = pin_def.height
            self.offset = pin_def.offset
            self.shape = pin_def.shape
            self.rotation = pin_def.rotation
            self.drill_size = pin_def.drill_size

    def SetPart(self, part):
        self.part = part

    def mprint(self):
        print "Pin: Number: " + self.pin_number + " x: " + str(self.x) + " y: " + str(self.y) + " width: " + str(self.width) + " height: "\
              + str(self.height) + " shape: " + self.shape + " rotation " + str(self.rotation)
        
#------------------------------------------------------------------

class cPart:

    def __init__(self, decal_name, num_pins, x, y):
        self.name = ""
        self.decal_name = decal_name
        self.num_pins = num_pins
        self.x = x
        self.y = y
        self.pin_defs = []
        self.pins = []
        self.silk = []
        self.text = []
        self.polygons = []

    def addSilk(self, silk):
        self.silk.append(silk)
    
    def addText(self, text):
        self.text.append(text)

    def addPolygon(self, polygon):
        self.polygons.append(polygon)
    
    def addPin(self, pin):
        self.pins.append(pin)
    
    def addPinDef(self, pindef):
        self.pin_defs.append(pindef)

    def addName(self, name):
        self.name = name

    def copy(self):
        new_part = cPart( self.decal_name, self.num_pins, self.x, self.y)
        new_part.pin_defs = self.pin_defs

        for pin in self.pins:
            new_pin = cPin(pin.pin_number, pin.x, pin.y, pin.height, pin.width, pin.offset, pin.shape, pin.rotation, pin.drill_size, new_part);
            new_part.pins.append(new_pin)
        
        new_part.silk = self.silk
        new_part.text = self.text
        new_part.polygons = self.polygons
        return new_part

    def applyPinDef(self, pin_def):
        for pin in self.pins:
            pin.applyPinDef(pin_def)

    # A pin starts with a pin number which is just the count of where
    # it was in the ascii file with respect to the part header

    # some parts though will have pin numbers which are alpha numerical
    # e.g. AA32

    # this method finds the pin associated with the original pin number and
    # replaces it with the alpha numeric value

    def applyPinNumber(self, position, value):
        for pin in self.pins:
            
            if pin.pin_number == position:
                pin.pin_number = value

    def reCenter(self):
        max_x = -99999
        min_x =  99999
        max_y = -99999
        min_y =  99999
        
        for pin in self.pins:
            x = int(pin.x)
            y = int(pin.y)
            
            if x > max_x:
                max_x = x

            if x < min_x:
                min_x = x

            if y > max_y:
                max_y = y

            if y < min_y:
                min_y = y

        off_center_x = (max_x + min_x)/2

        off_center_y = (max_y + min_y)/2

        if off_center_x or off_center_y:
            for pin in self.pins:
                pin.x = str(int(pin.x) - off_center_x)
                pin.y = str(int(pin.y) - off_center_y)


    def mprint(self):
        print "PART: Name: " + self.name + " Decal Name: " + self.decal_name + " pin count: " + str(self.num_pins) + " x: " + str(self.x) + " y: " + str(self.y)

        for pin in self.pins:
            pin.mprint()

        print "----------------------------------------"
        print " pin defs "

        for pin in self.pin_defs:
            pin.mprint()

        for silk in self.silk:
            silk.mprint()

        #for text in self.text:
        #    text.mprint()


    def pcb_write(self, rotation, file):
        for silk in self.silk:
            silk.pcb_write(rotation, file)

#------------------------------------------------------------------

class cComponent:

    def __init__(self, refdes, part, x, y, rotation, mirrored):
        self.refdes = refdes
        self.part = part
        self.x = x
        self.y = y
        self.rotation = rotation
        self.mirrored = mirrored
        self.text = []

    def add_text(self, text):
        self.text.append(text)

    def mprint(self):
        print "Component: refdes: " + self.refdes + " x: " + str(self.x) + " y: " + str(self.y) + " mirrored: " + self.mirrored

        self.part.mprint()

        for text in self.text:
            text.mprint()

    def pcb_write(self, file):
        self.part.pcb_write(self.rotation, file)

#------------------------------------------------------------------

class cTrace:

    def __init__(self, x1, y1, x2, y2, width):
        self.x1 = x1
        self.y1 = y1
        self.x2 = x2
        self.y2 = y2
        self.width = width

    def mprint(self):
        print "Trace: x1: " + self.x1 + " y1: " + self.y1 + " x2: " + self.x2 + " y2: " + self.y2 + " width: " + self.width

#------------------------------------------------------------------

class cVia_Def:

    def __init__(self, name, drill_diameter, pad_shape, pad_size, copper_clearence, soldermask_clearence):
        self.name = name
        self.drill_diameter = drill_diameter
        self.pad_shape = pad_shape
        self.pad_size = pad_size
        self.copper_clearence = copper_clearence
        self.soldermask_clearence = soldermask_clearence

    def test_via_name(self, name):
        if self.name == name:
            return True
        else:
            return False

    def get_name(self):
        return self.name

    def mprint(self):
        print "Via Type: Name: " + self.name + " Drill Diameter: " + self.drill_diameter + " Pad Shape: " + self.pad_shape +\
              " Copper Clearence: " + self.copper_clearence + " Soldermask Clearence: " + self.soldermask_clearence

    def output(self, file_ptr):
        drill_diameter = ascii2pcb(self.drill_diameter)
        pad_size = ascii2pcb(self.pad_size)
        copper_clearence = ascii2pcb(self.copper_clearence)
        soldermask_clearence = ascii2pcb(self.soldermask_clearence)
        file_ptr.write(str(drill_diameter) + " " + str(pad_size) + " " + str(copper_clearence) + " " + str(soldermask_clearence))


#------------------------------------------------------------------

class cVia:

    def __init__(self, via_deff, x, y):
        self.via_deff = via_deff
        self.x = x
        self.y = y

    def output(self, file_ptr):
        x = ascii2pcb(self.x)
        y = -ascii2pcb(self.y)

        file_ptr.write("Via[ " + str(x) + " " + str(y) + " ")
        self.via_deff.output(file_ptr)
        file_ptr.write(" \"\" \"\" ]\n")
        

#------------------------------------------------------------------

class cLayer:

    def __init__(self, name, layer_number):
        self.name = name
        self.number = layer_number
        self.trace_list = []

    def append_trace(self, trace):
        self.trace_list.append(trace)

    def output_traces(self, file_ptr):
        file_ptr.write()

    def mprint(self):
        print "Layer Name: " + self.name + " Number: " + self.number

        for trace in self.trace_list:
            trace.mprint()

#------------------------------------------------------------------

class cNet:
    
    def __init__(self):
        self.name = ""
        self.pins = []

    def SetName(self, name):
        self.name = name

    def NameTest(self, name):
        if self.name == name:
            return True
        else:
            return False

    def addPin(self, pin):
        self.pins.append(pin)

    

#------------------------------------------------------------------

class cBoard:

    def __init__(self):
        self.max_layers = 0
        self.top_layer = 0
        self.bottom_layer = 0
        self.layers = []
        self.parts = []
        self.lines = []
        self.components = []
        self.polygons = []
        self.via_defs = []
        self.vias = []
        self.originX = 0
        self.originY = 0
        self.drill_plated_oversize = 0   # add this to the drill width for plated holes
        self.copper_clearence = 0        # seperation between copper pad or trace and copper polygon
        self.soldermask_clearence = 0    # distance from edge of pad or drill hole to soldermask
        self.pad_annular_thickness = 0   # add to drill to make pad for plated hole
        self.nets = []

    def add_Net(self, net):
        self.nets.append(net)

    def net_exists(self, net_name):
        for net = self.nets:
            if net.name = net_name:
                return True
        return False

    def get_via_def_names(self):
        result = []
        for via_def in self.via_defs:
            result.append(via_def.get_name())
        return result

    def set_drill_plated_oversize(self, oversize):
        self.drill_plated_oversize = oversize

    def get_drill_plated_oversize(self):
        return self.drill_plated_oversize

    def set_pad_annular_thickness(self, thickness):
        self.pad_annular_thickness = thickness

    def get_pad_annular_thickness(self):
        return self.pad_annular_thickness

    def set_copper_clearence(self, clearence):
        self.copper_clearence = clearence

    def get_copper_clearence(self):
        return self.copper_clearence

    def set_soldermask_clearence(self, clearence):
        self.soldermask_clearence = clearence

    def get_soldermask_clearence(self):
        return self.soldermask_clearence

    def set_origin(self, x, y):
        self.originX = x
        self.originY = y

    def add_layer(self, layer):
        self.layers.append(layer)

    def set_max_layers(self, max_layers):
        self.max_layers = max_layers

    def add_part(self, part):
        self.parts.append(part)

    def get_part(self, part_name):
        for part in self.parts:
            if part.name == part_name:
                return part

        print "part_get failed for " + part_name
        return 0

    def get_part_by_decal_name(self, decal_name):
        for part in self.parts:
            if part.decal_name == decal_name:
                return part

        print "part_get_by_decal_name failed for " + decal_name
        return 0

    def add_line(self, line):
        self.lines.append(line)

    def add_component(self, component):
        self.components.append(component)

    def add_via_def(self, via_def):
        self.via_defs.append(via_def)

    def find_via_def(self, name):
        for via_def in self.via_defs:
            if via_def.test_via_name(name):
                return via_def

        return 0

    def add_via(self, via):
        self.vias.append(via)

    def add_polygon(self, polygon):
        self.polygons.append(polygon)

    def mprint(self):
        print "BOARD: max layers: " + str(self.max_layers) + " top layer: " + str(self.top_layer) + " bottom layer: " + str(self.bottom_layer)

        for layer in self.layers:
            layer.mprint()

        for part in self.parts:
            part.mprint()

        for component in self.components:
            component.mprint()

        #    for line in self.lines:
        #    line.mprint()
        
        
#------------------------------------------------------------------



"""Finite state machine, featuring transition actions."""
 
FSMError = 'Invalid input to finite state machine'
 
class FSM:
    
    """Finite state machine, featuring transition actions.
    
    The class stores a dictionary of (state, input) keys,
    and (state, action) values.
   
    When a (state, input) search is performed:
    * an exact match is checked first,
    * (state, None) is checked next.
   
    The action is of the following form:
    * function(current_state, input)
    """
   
    def __init__(self):
        self.states = {}
        self.state = None
        self.old_state = None
        self.dbg = None
        self.state_lst = []
  
    def add(self, state, input, newstate, action):
        """Add a transition to the FSM."""
        self.states[(state, input)] = (newstate, action)
  
    def execute(self, input, state_line):
        """Perform a transition and execute action."""
        si = (self.state, input)
        sn = (self.state, None)

        #print "execute from: " + self.state + "  to: " + input + "\n"
        
        # exact state match?
        if self.states.has_key(si):
            self.old_state = self.state
            newstate, action = self.states[si]
            
        # no, how about a None (catch-all) match?
        elif self.states.has_key(sn):
            newstate, action = self.states[sn]
            
            if self.dbg != None:
                self.dbg.write('State: %s / Input: %s /'
                           'Next State: %s / Action: %s\n' %
                              (self.state, input, newstate, action))
        else:
            print "No Transition from " + self.state + " to " + input
            exit()

        self.state_lst.append(self.state)
        self.old_state = self.state
        self.state = newstate
        line = action(self.old_state, input, state_line)
        self.state = self.state_lst.pop()
        return line
   
    def start(self, state):
        """Define the start state.
   
        Actually, this just resets the current state.
        """
        self.state = state
   
    def debug(self, out):
        """Assign a writable file to log transitions."""
        self.dbg = out

#------------------------------------------------------------------

def ready_action(state, input, state_line):

    line = input_file.readline()
    line = input_file.readline()

    while 1:
        line = line.strip()
        
        while line == "":
            line = input_file.readline()

        for event in events:
            if line.find(event)!=-1:
                line = fsm.execute(event, line)
                break

    return ""

#------------------------------------------------------------------

def remark_action(state, input, state_line):

    line = state_line
    
    while 1:
        line = input_file.readline()

        my_list = line.split(" ")
        
        if my_list[0] != "*REMARK*":
            break
        
    return line

#------------------------------------------------------------------

def pcb_action(state, input, state_line):
    
    global my_board

    while 1:
        line = input_file.readline()

        if not line:
            break

        # strip whitespace
        line = line.strip()
        
        if line == "":
            continue

        for event in events:
            if line.find("*REMARK*")!=-1:
                fsm.execute("*REMARK*", line)
            elif line.find(event)!=-1:
                return line

        my_list = lineSplit(line)

        if my_list[0] == "MAXIMUMLAYER":
            my_board.set_max_layers(int(my_list[1]))

        if my_list[0] == "ORIGIN":
            print my_list[1] + " " + my_list[2]
            my_board.set_origin(int(my_list[1]), int(my_list[2]))

        if my_list[0] == "ARPTOM":
            print "board soldermask clearence: " + my_list[1]
            my_board.set_soldermask_clearence(int(my_list[1]))

        if my_list[0] == "PLNSEPGAP":
            my_board.set_copper_clearence(int(my_list[1]))

        if my_list[0] == "DRLOVERSIZE":
            my_board.set_drill_plated_oversize(int(my_list[1]))

        if my_list[0] == "ARDTOP":
            my_board.set_pad_annular_thickness(int(my_list[1]))



    return ""

#------------------------------------------------------------------
    
def text_action(state, input, state_line):
    line = state_line
    
    while 1:
        
        line = input_file.readline()

        if not line:
            break

        # strip whitespace
        line = line.strip()
        
        if line == "":
            continue

        for event in events:
            if line.find("*REMARK*")!=-1:
                line = fsm.execute("*REMARK*", line)
            elif line.find(event)!=-1:
                return line
        
    return ""

#------------------------------------------------------------------
    
def reuse_action(state, input, state_line):
    return ""
    
#------------------------------------------------------------------

def lines_action(state, input, state_line):
    global my_board
    
    while 1:
        line = input_file.readline()

        if not line:
            break

        # strip whitespace
        line = line.strip()
        
        if line == "":
            continue

        for event in events:
            if line.find("*REMARK*")!=-1:
                line = fsm.execute("*REMARK*", line)
            elif line.find(event)!=-1:
                #print "leave lines_action"
                return line

        # strip whitespace
        line = line.strip()
        
        if line == "":
            continue

        my_list = lineSplit(line)

        name = my_list[0]
        type = my_list[1]
        xloc = my_list[2]
        yloc = my_list[3]
        pieces = int(my_list[4])

        if len(my_list) > 5:
            if my_list[5].isdigit():
                text = int(my_list[5])
            else:        
                SIGSTR = my_list[5]
        else:
            text = 0

        my_line = cLine(name, type, xloc, yloc)

        for count in range(pieces):
            line = input_file.readline()

            line = line.strip()

            my_list = lineSplit(line)

            PIECETYPE = my_list[0]
            corners = int(my_list[1])
            WIDTHHGHT = my_list[2]
            LEVEL = my_list[3]

            if (WIDTHHGHT == 0):
                print ("ZERO WIDTHHGHT")

            my_piece = cPieces(PIECETYPE, WIDTHHGHT, LEVEL)

            for count2 in range(corners):
                line = input_file.readline()

                line = line.strip()

                my_list = lineSplit(line)

                my_piece.add_corner(int(my_list[0]) + my_board.originX, int(my_list[1]) - my_board.originY)

            my_line.add_piece(my_piece)

        for count in range(text):
            line = input_file.readline()

            line = line.strip()

            my_list = lineSplit(line)

            my_text = cText(my_list[5], my_list[6], my_list[1], my_list[7], my_list[3])

            line = input_file.readline()
            
            my_text.add_string(line)

            my_line.add_text(my_text)

        my_board.add_line(my_line)
        
    return ""
    
#------------------------------------------------------------------

def cluster_action(state, input, state_line):
    while 1:
        line = input_file.readline()

        if not line:
            break

        # strip whitespace
        line = line.strip()
        
        if line == "":
            continue

        for event in events:
            if line.find("*REMARK*")!=-1:
                line = fsm.execute("*REMARK*", line)
            elif line.find(event)!=-1:
                #print "leave cluster_action"
                return line

        # strip whitespace
        line = line.strip()
        
        if line == "":
            continue

        my_list = lineSplit(line)

    return ""
    
#------------------------------------------------------------------

def partdecal_action(state, input, state_line):
    
    global my_board
    
    while 1:
        line = input_file.readline()

        if not line:
            break

        # strip whitespace
        line = line.strip()
        
        if line == "":
            continue

        for event in events:
            if line.find("*REMARK*")!=-1:
                line = fsm.execute("*REMARK*", line)
            elif line.find(event)!=-1:
                #print "leave partdecal_action"
                return line

        # strip whitespace
        line = line.strip()
        
        if line == "":
            continue

        my_list = lineSplit(line)

        #print "partdecal_action: " + my_list[0]

        name = my_list[0]
        origin_x = int(my_list[2])
        origin_y = int(my_list[3])
        silk_count = int(my_list[4])
        pin_count = int(my_list[5])
        pin_def_count = int(my_list[6])
        text1_count = int(my_list[7])
        text2_count = int(my_list[8])
        
        my_part = cPart(name, pin_count, origin_x, origin_y)
        
        my_board.add_part(my_part)

        #------------------------------------------------
        # silk screen

        for count in range(silk_count):

            hide = 1
            
            line = input_file.readline()

            #print "line: " + line
            
            my_list = lineSplit(line)

            #if len(my_list) > 3:
            #    if my_list[3] == "20":
            #        hide = 0

            if my_list[0] == "COPCLS":
                my_polygon = cPolygon(my_list[3])

                my_polygon.SetPinNumber(my_list[4])
                
                my_part.addPolygon(my_polygon)
                
                my_length = int(my_list[1])
            
                for second_count in range(my_length):
                    line = input_file.readline()
                    #if hide != 0:
                    my_list = lineSplit(line)
                    my_polygon.add_corner(my_list[0], my_list[1])

            if my_list[0] == "COPCIR":
                #my_polygon = cPolygon(my_list[3])

                #my_polygon.SetPinNumber(my_list[4])
                
                #my_part.addPolygon(my_polygon)
                
                #my_length = int(my_list[1])
            
                for second_count in range(my_length):
                    line = input_file.readline()
                    #if hide != 0:
                    my_list = lineSplit(line)
                    #my_polygon.add_corner(my_list[0], my_list[1])

            elif my_list[0] == "CIRCLE":
                
                my_silk = cSilk(my_list[0], my_list[2])

                if my_list[3] != "20":
                    my_part.addSilk(my_silk)
                        
                my_length = int(my_list[1])
            
                for second_count in range(my_length):
                    line = input_file.readline()
                    #if hide != 0:
                    my_list = lineSplit(line)
                    my_silk.add_point(my_list[0], my_list[1])
                
            elif my_list[0] == "CLOSED":

                my_silk = cSilk(my_list[0], my_list[2])
            
                if my_list[3] != "20":
                    my_part.addSilk(my_silk)
                        
                my_length = int(my_list[1])
            
                for second_count in range(my_length):
                    line = input_file.readline()
                    #if hide != 0:
                    my_list = lineSplit(line)
                    my_silk.add_point(my_list[0], my_list[1])
                
            elif my_list[0] == "OPEN":
           
                my_silk = cSilk(my_list[0], my_list[2])
            
                if my_list[3] != "20":
                    my_part.addSilk(my_silk)
                        
                my_length = int(my_list[1])
            
                for second_count in range(my_length):
                    line = input_file.readline()
                    #if hide != 0:
                    my_list = lineSplit(line)
                    my_silk.add_point(my_list[0], my_list[1])
                
        #------------------------------------------------
        # Silk screen text first
        
        for count in range(text1_count):
            
            line = input_file.readline()
                
            my_list = lineSplit(line)

            my_text = cText(my_list[5], my_list[6], my_list[1], my_list[7], my_list[3])
            
            line = input_file.readline()
            
            my_text.add_string(line)
                
            my_part.addText(my_text)

        #------------------------------------------------
        # Silk screen text second
               
        for count in range(text2_count):
            
            line = input_file.readline()
                
            my_list = lineSplit(line)

            my_text = cText(my_list[5], my_list[6], my_list[1], my_list[7], my_list[3])
            
            line = input_file.readline()
            
            my_text.add_string(line)
                
            my_part.addText(my_text)

        #------------------------------------------------
        # pins

        for count in range(pin_count):
            
            line = input_file.readline()

            line = line.strip("T")
        
            my_list = lineSplit(line)

            x = my_list[0]
            y = my_list[1]
            height = 0
            width = 0
            offset = 0
            shape = ""
            rotation = 0.0
            drill_size = 0

            my_pin = cPin(str(count+1), x, y, height, width, offset, shape, rotation, drill_size, my_part)
            
            my_part.addPin(my_pin)

        #------------------------------------------------
        # pin definitions

        #print "pin_def_count: " + str(pin_def_count)

        for count in range(pin_def_count):

            x = 0

            y = 0
            
            line = input_file.readline()
            
            my_list = lineSplit(line)

            my_length = int(my_list[2])

            pin_number = my_list[1]

            for second_count in range(my_length):
                line = input_file.readline()

                my_list = lineSplit(line)

                if second_count < 1:
                    shape = my_list[2]
                    
                    if shape == 'R':
                        width = int(my_list[1])
                        height = 0

                    elif shape == "S":
                        width = int(my_list[1])
                        height = 0

                    else:
                        rotation = float(my_list[3])
                        width = int(my_list[1])
                        height = int(my_list[4])
                        offset = int(my_list[5])
                    
                    if (len(my_list) > 3) and my_list[2].find("F")== -1:
                        drill_size = my_list[3]
                    else:
                        drill_size = 0

            my_pin = cPin(pin_number, x, y, height, width, offset, shape, rotation, drill_size)
            
            my_part.addPinDef(my_pin)

            # assuming that the default pin_def is always the first one we read

            my_part.applyPinDef(my_pin)


    return ""
    
#------------------------------------------------------------------

def parttype_action(state, input, state_line):

    global my_board

    while 1:
        line = input_file.readline()

        if not line:
            break

        # strip whitespace
        line = line.strip()
        
        if line == "":
            continue

        for event in events:
            if line.find("*REMARK*")!=-1:
                line = fsm.execute("*REMARK*", line)
            elif line.find(event)!=-1:
                #print "leave partdecal_action"
                return line

        # strip whitespace
        line = line.strip()
        
        if line == "":
            continue

        my_list = lineSplit(line)


        if (my_list[1].rfind(":") > -1):
            tmp_str = my_list[1].split(":")
            my_list[1] = tmp_str[0]
        

        my_part = my_board.get_part_by_decal_name(my_list[1])

        if my_part == 0:
            continue

        if my_part.name == "":
            my_part = my_part.copy()
            my_board.add_part(my_part)

        my_part.addName(my_list[0])

        pin_count = int(my_list[6])

        if pin_count > 0:
            count = 0

            while count < pin_count:

                line = input_file.readline()

                line = line.strip()

                my_list = lineSplit(line)

                for my_pin in my_list:
                    my_part.applyPinNumber(count, my_pin)
                    count = count + 1
    
    return ""
    
#------------------------------------------------------------------

def part_action(state, input, state_line):
    global my_board
    
    while 1:
        line = input_file.readline()

        if not line:
            break

        # strip whitespace
        line = line.strip()
        
        if line == "":
            continue

        for event in events:
            if line.find("*REMARK*")!=-1:
                line = fsm.execute("*REMARK*", line)
            elif line.find(event)!=-1:
                #print "leave part_action"
                #my_board.mprint()
                return line

        # strip whitespace
        line = line.strip()
        
        if line == "":
            continue

        my_list = lineSplit(line)

        
        if (my_list[1].rfind("@") > -1):
            #print  "found @: " + str(my_list)
            tmp_str = my_list[1].split("@")
            my_list[1] = tmp_str[0]
            #print  "      @: " + str(my_list)
            tmp_part = my_board.get_part_by_decal_name(tmp_str[1])
        else:
            tmp_part = 0

        if tmp_part:
            my_part =  tmp_part
        else:
            my_part = my_board.get_part(my_list[1])

        text_count = int(my_list[11])

        my_component = cComponent(my_list[0], my_part, int(my_list[2]), int(my_list[3]), float(my_list[4]), my_list[6])

        for count in range(text_count):
            line = input_file.readline()
                
            my_list = lineSplit(line)

            my_text = cText(my_list[5], my_list[6], my_list[1], my_list[7], my_list[3])
            
            line = input_file.readline()
            
            my_text.add_string(line)
                
            my_component.add_text(my_text)

        my_board.add_component(my_component)

    return ""
    
#------------------------------------------------------------------

def route_action(state, input, state_line):
    #print "route_action"


    while 1:
        line = input_file.readline()

        if not line:
            break

        # strip whitespace
        line = line.strip()
        
        if line == "":
            continue

        #print "route line: " + line

        for event in events:
            if line.find("*REMARK*")!=-1:
                line = fsm.execute("*REMARK*", line)
            elif line.find(event)!=-1:
                #print "route_action end: " + line
                return line
            
    return ""

    
#------------------------------------------------------------------

def teardrop_test(my_list, my_char, my_string):
    result = False

    my_offset = 0
    list_count = -1

    for el in my_list:
        list_count += 1
        #print "el: " + el
        if el.isalpha():
            my_offset = list_count  

            if my_list[my_offset] == my_char:
                result = True

    return result

#------------------------------------------------------------------

def signal_action(state, input, state_line):
    line = " "
    previous_line = " "
    next_line = " "

    my_list = lineSplit(input)

    if !my_board.net_exists(my_list[1]):
        new_net = cNet()
        new_net.SetName(my_list[1])
        my_board_add_Net(new_net)

    new_piece = 0

    via_def_names = my_board.get_via_def_names()

    while 1:
        if (line != " "):
            previous_line = line

        if (next_line != " "):
            line = next_line

        next_line = input_file.readline()
        
        # strip whitespace
        next_line = next_line.strip()
        
        # strip whitespace
        next_line = next_line.strip()
            
        my_list = lineSplit(line)

        my_next_list = lineSplit(next_line);

        my_previous_list = lineSplit(previous_line);

        while len(my_list) < 6:
            my_list.append("");


        #print ("-----------------------------------------------------------------")
        #print ("previous line: " + previous_line)
        #print ("line: " + line)
        #print ("next line: " + next_line)

        if line != "" and line != " ":

            for via_def_name in via_def_names:
                if line.find(via_def_name) != -1:
                    via_def = my_board.find_via_def(via_def_name)
                    new_via = cVia(via_def, int(my_list[0]) + my_board.originX, int(my_list[1]) - my_board.originY )
                    my_board.add_via(new_via)

            if line[0].isalpha() and line != " ":
                #print ("isalpha: " + line)
                new_line = cLine("", "TRACE", 0, 0)
                previous_line = " "
                line = " "
                my_list = []
                my_next_list = []
                my_previous_list = []
                piece_start = False
            elif not piece_start and my_list[4] == "1792":
                junk = "1792"
                #print "what?"
            elif not piece_start and my_list[4]:
                #print ("start a new piece")
                my_board.add_line(new_line)
                piece_start = True
                new_piece = cPieces("OPEN", my_list[3], -1)
                new_line.add_piece(new_piece)
                new_piece.level = my_list[2]
                new_piece.add_corner(int(my_list[0]) + my_board.originX, int(my_list[1]) - my_board.originY)

                if teardrop_test(my_list, "N", my_list[5]):
                    #print("next teardrop")
                    new_piece.add_corner(int(my_next_list[0]) + my_board.originX, int(my_next_list[1]) - my_board.originY)                    
            else:
                #print ("new_piece")
                if not teardrop_test(my_list, "P", my_list[5]) and not teardrop_test(my_list, "N", my_list[5]):
                    if my_list[2] == new_piece.level and my_list[2] != "65":
                        #print("not a teardrop add corner to existing piece")
                        new_piece.add_corner(int(my_list[0]) + my_board.originX, int(my_list[1]) - my_board.originY)
                    else:
                        #print("not a teardrop add corner to new piece")
                        new_piece = cPieces("OPEN", my_list[3], -1)
                        new_line.add_piece(new_piece)
                        new_piece.level = my_list[2]
                        new_piece.add_corner(int(my_list[0]) + my_board.originX, int(my_list[1]) - my_board.originY)
                        new_piece.add_corner(int(my_previous_list[0]) + my_board.originX, int(my_previous_list[1]) - my_board.originY)
                        

                if teardrop_test(my_list, "P", my_list[5]):
                    #print("previous teardrop")
                    new_piece = cPieces("OPEN", my_list[3], -1)
                    new_line.add_piece(new_piece)
                    new_piece.level = my_previous_list[2]
                    new_piece.add_corner(int(my_list[0]) + my_board.originX, int(my_list[1]) - my_board.originY)
                    new_piece.add_corner(int(my_previous_list[0]) + my_board.originX, int(my_previous_list[1]) - my_board.originY)
                if teardrop_test(my_list, "N", my_list[5]):
                    #print("next teardrop")
                    new_piece = cPieces("OPEN", my_list[3], -1)
                    new_line.add_piece(new_piece)
                    new_piece.level = my_list[2]
                    new_piece.add_corner(int(my_list[0]) + my_board.originX, int(my_list[1]) - my_board.originY)
                    new_piece.add_corner(int(my_next_list[0]) + my_board.originX, int(my_next_list[1]) - my_board.originY)

        #if new_piece:
            #new_piece.mprint()

        for event in events:
            if next_line.find("*REMARK*")!=-1:
                line = fsm.execute("*REMARK*", line)
            elif next_line.find(event)!=-1:
                return next_line
            
    return ""
    
#------------------------------------------------------------------

def pour_action(state, input, state_line):
    
    poly_start = False
    
    while 1:
        line = input_file.readline()
        
        if not line:
            break
        
        # strip whitespace
        line = line.strip()
        
        if line == "":
            continue
        
        for event in events:
            if line.find("*REMARK*")!=-1:
                line = fsm.execute("*REMARK*", line)
            elif line.find(event)!=-1:
                return line
            
        # strip whitespace
        line = line.strip()
            
        if line == "":
            continue

        my_list = lineSplit(line)

        if not poly_start and line[0].isalpha() and line != " ":
            x_offset = int(my_list[2])
            y_offset = int(my_list[3])
            poly_start = True
            
        elif (my_list[0] == "POLY"):
            new_polygon = cPolygon(my_list[4])
            my_board.add_polygon(new_polygon)
            number_points = my_list[1]

            for count in range(int(number_points)):
                
                line = input_file.readline()
                
                if not line:
                    break
                
                # strip whitespace
                line = line.strip()
                
                if line == "":
                    continue

                my_list = lineSplit(line)

                new_polygon.add_corner(int(my_list[0]) + my_board.originX + x_offset, int(my_list[1]) - my_board.originY + y_offset)
            
            poly_start = False

    return ""

#------------------------------------------------------------------

def misc_action(state, input, state_line):
    global my_board
    
    global layer_name
    global top_layer
    global bottom_layer

    #print "misc_action"

    layer_data = 0
    layer_depth = 0
    in_layer = 0

    while 1:
        line = input_file.readline()

        #print "line: " + line

        if not line:
            break

        # strip whitespace
        line = line.strip()
        
        if line == "":
            continue

        for event in events:
            if line.find("*REMARK*")!=-1:
                line = fsm.execute("*REMARK*", line)
                break
            elif line.find(event)!=-1:
                return line

        if layer_data == 1:    

            if line.find("{")!=-1 :
                layer_depth = layer_depth + 1
                
            if line.find("}")!=-1 :
                layer_depth = layer_depth - 1

            if layer_depth == 0:
                layer_data = 0

            if layer_depth == 1:
                if line.find("LAYER ") != -1:
                    in_layer = 1
                    my_list = line.split(" ")
                    layer_number = int(my_list[1])

            if layer_depth == 2 and in_layer:
                if line.find("LAYER_NAME") != -1:
                    my_list = line.split(" ")
                    
                    layer_name = my_list[1]

                    new_layer = cLayer(layer_name, layer_number)

                    my_board.add_layer(new_layer)

                if line.find("COMPONENT Y")!=-1:
                    if my_board.top_layer == 0:
                        my_board.top_layer = layer_number
                    elif my_board.bottom_layer == 0:
                        my_board.bottom_layer = layer_number

        if line.find("LAYER DATA") != -1:
            layer_data = 1

    return ""

#------------------------------------------------------------------

def via_action(state, input, state_line):
    while 1:
        line = input_file.readline()

        if not line:
            break

        # strip whitespace
        line = line.strip()
        
        if line == "":
            continue

        for event in events:
            if line.find("*REMARK*")!=-1:
                line = fsm.execute("*REMARK*", line)
            elif line.find(event)!=-1:
                #print "leave via_action"
                return line

        # strip whitespace
        line = line.strip()
        
        if line == "":
            continue

        my_list = lineSplit(line)

        if line[0].isalpha():
            drill_size = int(my_list[1]) + my_board.get_drill_plated_oversize()
            pad_size = my_board.get_pad_annular_thickness() + drill_size
            copper_clearence = my_board.get_copper_clearence()
            soldermask_clearence = drill_size + my_board.get_soldermask_clearence()
            via_def = cVia_Def(my_list[0], drill_size, "R", pad_size, copper_clearence, soldermask_clearence)
            
            my_board.add_via_def(via_def)

            for count in range(int(my_list[2])):

                line = input_file.readline()

                # strip whitespace
                line = line.strip()
                
                if line == "":
                    continue


    return ""
 
#------------------------------------------------------------------

def end_action(state, input, state_line):

    global my_board
    
    output_file.write("# release: pcb 1.99x\n")
    output_file.write("# date:    Tue May 27 15:42:40 2008\n")
    output_file.write("# user:    steve (Steve Meier)\n")
    output_file.write("# host:    linux-imkq.site\n\n")
    output_file.write("# To read pcb files, the pcb version (or the cvs source date) must be >= the file version\n")
    output_file.write("FileVersion[20070407]\n\n")
    
    output_file.write("PCB[\"\" 4000000 4000000]\n\n")
    
    output_file.write("Grid[196.000000 0 0 0]\n")
    output_file.write("Cursor[0 0 0.000000]\n")
    output_file.write("PolyArea[200000000.000000]\n")
    output_file.write("Thermal[0.500000]\n")
    output_file.write("DRC[500 400 450 200 800 500]\n")
    output_file.write("Flags(\"shownumber,nameonpcb,uniquename,clearnew,thindrawpoly\")\n")
    
    output_file.write("Groups(\"")

    for count in range(1, my_board.max_layers+1):
        #print "count: " + str(count) + " top_layer: " + str(my_board.top_layer) + " bottom_layer: " + str(my_board.bottom_layer)
        output_file.write(str(count))
        if count == my_board.top_layer:
            output_file.write(",c")
        if count == my_board.bottom_layer:
            output_file.write(",s")
        if count < my_board.max_layers:
            output_file.write(":")

                
    output_file.write("\")\n")
        
    output_file.write("Styles[\"Signal,1000,3600,2000,1000:Power,2500,6000,3500,1000:Fat,4000,6000,3500,1000:Skinny,500,2200,1000,500\"]\n\n")
    
    output_file.write("Symbol(' ' 18)\n")
    output_file.write("(\n")
    output_file.write(")\n")
    output_file.write("Symbol('!' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 45 0 50 8)\n")
    output_file.write("	SymbolLine(0 10 0 35 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('\"' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 0 20 8)\n")
    output_file.write("	SymbolLine(10 10 10 20 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('#' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 35 20 35 8)\n")
    output_file.write("	SymbolLine(0 25 20 25 8)\n")
    output_file.write("	SymbolLine(15 20 15 40 8)\n")
    output_file.write("	SymbolLine(5 20 5 40 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('$' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(15 15 20 20 8)\n")
    output_file.write("	SymbolLine(5 15 15 15 8)\n")
    output_file.write("	SymbolLine(0 20 5 15 8)\n")
    output_file.write("	SymbolLine(0 20 0 25 8)\n")
    output_file.write("	SymbolLine(0 25 5 30 8)\n")
    output_file.write("	SymbolLine(5 30 15 30 8)\n")
    output_file.write("	SymbolLine(15 30 20 35 8)\n")
    output_file.write("	SymbolLine(20 35 20 40 8)\n")
    output_file.write("	SymbolLine(15 45 20 40 8)\n")
    output_file.write("	SymbolLine(5 45 15 45 8)\n")
    output_file.write("	SymbolLine(0 40 5 45 8)\n")
    output_file.write("	SymbolLine(10 10 10 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('%' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 15 0 20 8)\n")
    output_file.write("	SymbolLine(0 15 5 10 8)\n")
    output_file.write("	SymbolLine(5 10 10 10 8)\n")
    output_file.write("	SymbolLine(10 10 15 15 8)\n")
    output_file.write("	SymbolLine(15 15 15 20 8)\n")
    output_file.write("	SymbolLine(10 25 15 20 8)\n")
    output_file.write("	SymbolLine(5 25 10 25 8)\n")
    output_file.write("	SymbolLine(0 20 5 25 8)\n")
    output_file.write("	SymbolLine(0 50 40 10 8)\n")
    output_file.write("	SymbolLine(35 50 40 45 8)\n")
    output_file.write("	SymbolLine(40 40 40 45 8)\n")
    output_file.write("	SymbolLine(35 35 40 40 8)\n")
    output_file.write("	SymbolLine(30 35 35 35 8)\n")
    output_file.write("	SymbolLine(25 40 30 35 8)\n")
    output_file.write("	SymbolLine(25 40 25 45 8)\n")
    output_file.write("	SymbolLine(25 45 30 50 8)\n")
    output_file.write("	SymbolLine(30 50 35 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('&' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write("	SymbolLine(0 15 0 25 8)\n")
    output_file.write("	SymbolLine(0 15 5 10 8)\n")
    output_file.write("	SymbolLine(0 35 15 20 8)\n")
    output_file.write("	SymbolLine(5 50 10 50 8)\n")
    output_file.write("	SymbolLine(10 50 20 40 8)\n")
    output_file.write("	SymbolLine(0 25 25 50 8)\n")
    output_file.write("	SymbolLine(5 10 10 10 8)\n")
    output_file.write("	SymbolLine(10 10 15 15 8)\n")
    output_file.write("	SymbolLine(15 15 15 20 8)\n")
    output_file.write("	SymbolLine(0 35 0 45 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol(''' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 20 10 10 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('(' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write("	SymbolLine(0 15 5 10 8)\n")
    output_file.write("	SymbolLine(0 15 0 45 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol(')' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 5 15 8)\n")
    output_file.write("	SymbolLine(5 15 5 45 8)\n")
    output_file.write("	SymbolLine(0 50 5 45 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('*' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 20 20 40 8)\n")
    output_file.write("	SymbolLine(0 40 20 20 8)\n")
    output_file.write("	SymbolLine(0 30 20 30 8)\n")
    output_file.write("	SymbolLine(10 20 10 40 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('+' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 30 20 30 8)\n")
    output_file.write("	SymbolLine(10 20 10 40 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol(',' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 60 10 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('-' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 30 20 30 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('.' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 50 5 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('/' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 45 30 15 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('0' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write("	SymbolLine(0 15 0 45 8)\n")
    output_file.write("	SymbolLine(0 15 5 10 8)\n")
    output_file.write("	SymbolLine(5 10 15 10 8)\n")
    output_file.write("	SymbolLine(15 10 20 15 8)\n")
    output_file.write("	SymbolLine(20 15 20 45 8)\n")
    output_file.write("	SymbolLine(15 50 20 45 8)\n")
    output_file.write("	SymbolLine(5 50 15 50 8)\n")
    output_file.write("	SymbolLine(0 40 20 20 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('1' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(5 50 15 50 8)\n")
    output_file.write("	SymbolLine(10 10 10 50 8)\n")
    output_file.write("	SymbolLine(0 20 10 10 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('2' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 15 5 10 8)\n")
    output_file.write("	SymbolLine(5 10 20 10 8)\n")
    output_file.write("	SymbolLine(20 10 25 15 8)\n")
    output_file.write("	SymbolLine(25 15 25 25 8)\n")
    output_file.write("	SymbolLine(0 50 25 25 8)\n")
    output_file.write("	SymbolLine(0 50 25 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('3' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 15 5 10 8)\n")
    output_file.write("	SymbolLine(5 10 15 10 8)\n")
    output_file.write("	SymbolLine(15 10 20 15 8)\n")
    output_file.write("	SymbolLine(20 15 20 45 8)\n")
    output_file.write("	SymbolLine(15 50 20 45 8)\n")
    output_file.write("	SymbolLine(5 50 15 50 8)\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write("	SymbolLine(5 30 20 30 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('4' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 30 20 10 8)\n")
    output_file.write("	SymbolLine(0 30 25 30 8)\n")
    output_file.write("	SymbolLine(20 10 20 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('5' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 20 10 8)\n")
    output_file.write("	SymbolLine(0 10 0 30 8)\n")
    output_file.write("	SymbolLine(0 30 5 25 8)\n")
    output_file.write("	SymbolLine(5 25 15 25 8)\n")
    output_file.write("	SymbolLine(15 25 20 30 8)\n")
    output_file.write("	SymbolLine(20 30 20 45 8)\n")
    output_file.write("	SymbolLine(15 50 20 45 8)\n")
    output_file.write("	SymbolLine(5 50 15 50 8)\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('6' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(15 10 20 15 8)\n")
    output_file.write("	SymbolLine(5 10 15 10 8)\n")
    output_file.write("	SymbolLine(0 15 5 10 8)\n")
    output_file.write("	SymbolLine(0 15 0 45 8)\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write("	SymbolLine(15 30 20 35 8)\n")
    output_file.write("	SymbolLine(0 30 15 30 8)\n")
    output_file.write("	SymbolLine(5 50 15 50 8)\n")
    output_file.write("	SymbolLine(15 50 20 45 8)\n")
    output_file.write("	SymbolLine(20 35 20 45 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('7' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 50 25 25 8)\n")
    output_file.write("	SymbolLine(25 10 25 25 8)\n")
    output_file.write("	SymbolLine(0 10 25 10 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('8' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write("	SymbolLine(0 35 0 45 8)\n")
    output_file.write("	SymbolLine(0 35 5 30 8)\n")
    output_file.write("	SymbolLine(5 30 15 30 8)\n")
    output_file.write("	SymbolLine(15 30 20 35 8)\n")
    output_file.write("	SymbolLine(20 35 20 45 8)\n")
    output_file.write("	SymbolLine(15 50 20 45 8)\n")
    output_file.write("	SymbolLine(5 50 15 50 8)\n")
    output_file.write("	SymbolLine(0 25 5 30 8)\n")
    output_file.write("	SymbolLine(0 15 0 25 8)\n")
    output_file.write("	SymbolLine(0 15 5 10 8)\n")
    output_file.write("	SymbolLine(5 10 15 10 8)\n")
    output_file.write("	SymbolLine(15 10 20 15 8)\n")
    output_file.write("	SymbolLine(20 15 20 25 8)\n")
    output_file.write("	SymbolLine(15 30 20 25 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('9' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 50 20 30 8)\n")
    output_file.write("	SymbolLine(20 15 20 30 8)\n")
    output_file.write("	SymbolLine(15 10 20 15 8)\n")
    output_file.write("	SymbolLine(5 10 15 10 8)\n")
    output_file.write("	SymbolLine(0 15 5 10 8)\n")
    output_file.write("	SymbolLine(0 15 0 25 8)\n")
    output_file.write("	SymbolLine(0 25 5 30 8)\n")
    output_file.write("	SymbolLine(5 30 20 30 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol(':' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 25 5 25 8)\n")
    output_file.write("	SymbolLine(0 35 5 35 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol(';' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 50 10 40 8)\n")
    output_file.write("	SymbolLine(10 25 10 30 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('<' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 30 10 20 8)\n")
    output_file.write("	SymbolLine(0 30 10 40 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('=' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 25 20 25 8)\n")
    output_file.write("	SymbolLine(0 35 20 35 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('>' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 20 10 30 8)\n")
    output_file.write("	SymbolLine(0 40 10 30 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('?' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(10 30 10 35 8)\n")
    output_file.write("	SymbolLine(10 45 10 50 8)\n")
    output_file.write("	SymbolLine(0 15 0 20 8)\n")
    output_file.write("	SymbolLine(0 15 5 10 8)\n")
    output_file.write("	SymbolLine(5 10 15 10 8)\n")
    output_file.write("	SymbolLine(15 10 20 15 8)\n")
    output_file.write("	SymbolLine(20 15 20 20 8)\n")
    output_file.write("	SymbolLine(10 30 20 20 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('@' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 0 40 8)\n")
    output_file.write("	SymbolLine(0 40 10 50 8)\n")
    output_file.write("	SymbolLine(10 50 40 50 8)\n")
    output_file.write("	SymbolLine(50 35 50 10 8)\n")
    output_file.write("	SymbolLine(50 10 40 0 8)\n")
    output_file.write("	SymbolLine(40 0 10 0 8)\n")
    output_file.write("	SymbolLine(10 0 0 10 8)\n")
    output_file.write("	SymbolLine(15 20 15 30 8)\n")
    output_file.write("	SymbolLine(15 30 20 35 8)\n")
    output_file.write("	SymbolLine(20 35 30 35 8)\n")
    output_file.write("	SymbolLine(30 35 35 30 8)\n")
    output_file.write("	SymbolLine(35 30 40 35 8)\n")
    output_file.write("	SymbolLine(35 30 35 15 8)\n")
    output_file.write("	SymbolLine(35 20 30 15 8)\n")
    output_file.write("	SymbolLine(20 15 30 15 8)\n")
    output_file.write("	SymbolLine(20 15 15 20 8)\n")
    output_file.write("	SymbolLine(40 35 50 35 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('A' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 15 0 50 8)\n")
    output_file.write("	SymbolLine(0 15 5 10 8)\n")
    output_file.write("	SymbolLine(5 10 20 10 8)\n")
    output_file.write("	SymbolLine(20 10 25 15 8)\n")
    output_file.write("	SymbolLine(25 15 25 50 8)\n")
    output_file.write("	SymbolLine(0 30 25 30 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('B' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 50 20 50 8)\n")
    output_file.write("	SymbolLine(20 50 25 45 8)\n")
    output_file.write("	SymbolLine(25 35 25 45 8)\n")
    output_file.write("	SymbolLine(20 30 25 35 8)\n")
    output_file.write("	SymbolLine(5 30 20 30 8)\n")
    output_file.write("	SymbolLine(5 10 5 50 8)\n")
    output_file.write("	SymbolLine(0 10 20 10 8)\n")
    output_file.write("	SymbolLine(20 10 25 15 8)\n")
    output_file.write("	SymbolLine(25 15 25 25 8)\n")
    output_file.write("	SymbolLine(20 30 25 25 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('C' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(5 50 20 50 8)\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write("	SymbolLine(0 15 0 45 8)\n")
    output_file.write("	SymbolLine(0 15 5 10 8)\n")
    output_file.write("	SymbolLine(5 10 20 10 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('D' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(5 10 5 50 8)\n")
    output_file.write("	SymbolLine(20 10 25 15 8)\n")
    output_file.write("	SymbolLine(25 15 25 45 8)\n")
    output_file.write("	SymbolLine(20 50 25 45 8)\n")
    output_file.write("	SymbolLine(0 50 20 50 8)\n")
    output_file.write("	SymbolLine(0 10 20 10 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('E' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 30 15 30 8)\n")
    output_file.write("	SymbolLine(0 50 20 50 8)\n")
    output_file.write("	SymbolLine(0 10 0 50 8)\n")
    output_file.write("	SymbolLine(0 10 20 10 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('F' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 0 50 8)\n")
    output_file.write("	SymbolLine(0 10 20 10 8)\n")
    output_file.write("	SymbolLine(0 30 15 30 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('G' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(20 10 25 15 8)\n")
    output_file.write("	SymbolLine(5 10 20 10 8)\n")
    output_file.write("	SymbolLine(0 15 5 10 8)\n")
    output_file.write("	SymbolLine(0 15 0 45 8)\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write("	SymbolLine(5 50 20 50 8)\n")
    output_file.write("	SymbolLine(20 50 25 45 8)\n")
    output_file.write("	SymbolLine(25 35 25 45 8)\n")
    output_file.write("	SymbolLine(20 30 25 35 8)\n")
    output_file.write("	SymbolLine(10 30 20 30 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('H' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 0 50 8)\n")
    output_file.write("	SymbolLine(25 10 25 50 8)\n")
    output_file.write("	SymbolLine(0 30 25 30 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('I' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 10 10 8)\n")
    output_file.write("	SymbolLine(5 10 5 50 8)\n")
    output_file.write("	SymbolLine(0 50 10 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('J' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 15 10 8)\n")
    output_file.write("	SymbolLine(15 10 15 45 8)\n")
    output_file.write("	SymbolLine(10 50 15 45 8)\n")
    output_file.write("	SymbolLine(5 50 10 50 8)\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('K' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 0 50 8)\n")
    output_file.write("	SymbolLine(0 30 20 10 8)\n")
    output_file.write("	SymbolLine(0 30 20 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('L' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 0 50 8)\n")
    output_file.write("	SymbolLine(0 50 20 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('M' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 0 50 8)\n")
    output_file.write("	SymbolLine(0 10 15 25 8)\n")
    output_file.write("	SymbolLine(15 25 30 10 8)\n")
    output_file.write("	SymbolLine(30 10 30 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('N' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 0 50 8)\n")
    output_file.write("	SymbolLine(0 10 0 15 8)\n")
    output_file.write("	SymbolLine(0 15 25 40 8)\n")
    output_file.write("	SymbolLine(25 10 25 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('O' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 15 0 45 8)\n")
    output_file.write("	SymbolLine(0 15 5 10 8)\n")
    output_file.write("	SymbolLine(5 10 15 10 8)\n")
    output_file.write("	SymbolLine(15 10 20 15 8)\n")
    output_file.write("	SymbolLine(20 15 20 45 8)\n")
    output_file.write("	SymbolLine(15 50 20 45 8)\n")
    output_file.write("	SymbolLine(5 50 15 50 8)\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('P' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(5 10 5 50 8)\n")
    output_file.write("	SymbolLine(0 10 20 10 8)\n")
    output_file.write("	SymbolLine(20 10 25 15 8)\n")
    output_file.write("	SymbolLine(25 15 25 25 8)\n")
    output_file.write("	SymbolLine(20 30 25 25 8)\n")
    output_file.write("	SymbolLine(5 30 20 30 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('Q' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 15 0 45 8)\n")
    output_file.write("	SymbolLine(0 15 5 10 8)\n")
    output_file.write("	SymbolLine(5 10 15 10 8)\n")
    output_file.write("	SymbolLine(15 10 20 15 8)\n")
    output_file.write("	SymbolLine(20 15 20 45 8)\n")
    output_file.write("	SymbolLine(15 50 20 45 8)\n")
    output_file.write("	SymbolLine(5 50 15 50 8)\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write("	SymbolLine(10 40 20 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('R' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 20 10 8)\n")
    output_file.write("	SymbolLine(20 10 25 15 8)\n")
    output_file.write("	SymbolLine(25 15 25 25 8)\n")
    output_file.write("	SymbolLine(20 30 25 25 8)\n")
    output_file.write("	SymbolLine(5 30 20 30 8)\n")
    output_file.write("	SymbolLine(5 10 5 50 8)\n")
    output_file.write("	SymbolLine(5 30 25 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('S' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(20 10 25 15 8)\n")
    output_file.write("	SymbolLine(5 10 20 10 8)\n")
    output_file.write("	SymbolLine(0 15 5 10 8)\n")
    output_file.write("	SymbolLine(0 15 0 25 8)\n")
    output_file.write("	SymbolLine(0 25 5 30 8)\n")
    output_file.write("	SymbolLine(5 30 20 30 8)\n")
    output_file.write("	SymbolLine(20 30 25 35 8)\n")
    output_file.write("	SymbolLine(25 35 25 45 8)\n")
    output_file.write("	SymbolLine(20 50 25 45 8)\n")
    output_file.write("	SymbolLine(5 50 20 50 8)\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('T' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 20 10 8)\n")
    output_file.write("	SymbolLine(10 10 10 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('U' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 0 45 8)\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write("	SymbolLine(5 50 15 50 8)\n")
    output_file.write("	SymbolLine(15 50 20 45 8)\n")
    output_file.write("	SymbolLine(20 10 20 45 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('V' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 0 40 8)\n")
    output_file.write("	SymbolLine(0 40 10 50 8)\n")
    output_file.write("	SymbolLine(10 50 20 40 8)\n")
    output_file.write("	SymbolLine(20 10 20 40 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('W' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 0 50 8)\n")
    output_file.write("	SymbolLine(0 50 15 35 8)\n")
    output_file.write("	SymbolLine(15 35 30 50 8)\n")
    output_file.write("	SymbolLine(30 10 30 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('X' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 0 15 8)\n")
    output_file.write("	SymbolLine(0 15 25 40 8)\n")
    output_file.write("	SymbolLine(25 40 25 50 8)\n")
    output_file.write("	SymbolLine(0 40 0 50 8)\n")
    output_file.write("	SymbolLine(0 40 25 15 8)\n")
    output_file.write("	SymbolLine(25 10 25 15 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('Y' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 0 15 8)\n")
    output_file.write("	SymbolLine(0 15 10 25 8)\n")
    output_file.write("	SymbolLine(10 25 20 15 8)\n")
    output_file.write("	SymbolLine(20 10 20 15 8)\n")
    output_file.write("	SymbolLine(10 25 10 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('Z' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 25 10 8)\n")
    output_file.write("	SymbolLine(25 10 25 15 8)\n")
    output_file.write("	SymbolLine(0 40 25 15 8)\n")
    output_file.write("	SymbolLine(0 40 0 50 8)\n")
    output_file.write("	SymbolLine(0 50 25 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('[' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 5 10 8)\n")
    output_file.write("	SymbolLine(0 10 0 50 8)\n")
    output_file.write("	SymbolLine(0 50 5 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('\\' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 15 30 45 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol(']' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 5 10 8)\n")
    output_file.write("	SymbolLine(5 10 5 50 8)\n")
    output_file.write("	SymbolLine(0 50 5 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('^' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 15 5 10 8)\n")
    output_file.write("	SymbolLine(5 10 10 15 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('_' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 50 20 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('a' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(15 30 20 35 8)\n")
    output_file.write("	SymbolLine(5 30 15 30 8)\n")
    output_file.write("	SymbolLine(0 35 5 30 8)\n")
    output_file.write("	SymbolLine(0 35 0 45 8)\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write("	SymbolLine(20 30 20 45 8)\n")
    output_file.write("	SymbolLine(20 45 25 50 8)\n")
    output_file.write("	SymbolLine(5 50 15 50 8)\n")
    output_file.write("	SymbolLine(15 50 20 45 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('b' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 0 50 8)\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write("	SymbolLine(5 50 15 50 8)\n")
    output_file.write("	SymbolLine(15 50 20 45 8)\n")
    output_file.write("	SymbolLine(20 35 20 45 8)\n")
    output_file.write("	SymbolLine(15 30 20 35 8)\n")
    output_file.write("	SymbolLine(5 30 15 30 8)\n")
    output_file.write("	SymbolLine(0 35 5 30 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('c' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(5 30 20 30 8)\n")
    output_file.write("	SymbolLine(0 35 5 30 8)\n")
    output_file.write("	SymbolLine(0 35 0 45 8)\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write("	SymbolLine(5 50 20 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('d' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(20 10 20 50 8)\n")
    output_file.write("	SymbolLine(15 50 20 45 8)\n")
    output_file.write("	SymbolLine(5 50 15 50 8)\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write("	SymbolLine(0 35 0 45 8)\n")
    output_file.write("	SymbolLine(0 35 5 30 8)\n")
    output_file.write("	SymbolLine(5 30 15 30 8)\n")
    output_file.write("	SymbolLine(15 30 20 35 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('e' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(5 50 20 50 8)\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write("	SymbolLine(0 35 0 45 8)\n")
    output_file.write("	SymbolLine(0 35 5 30 8)\n")
    output_file.write("	SymbolLine(5 30 15 30 8)\n")
    output_file.write("	SymbolLine(15 30 20 35 8)\n")
    output_file.write("	SymbolLine(0 40 20 40 8)\n")
    output_file.write("	SymbolLine(20 40 20 35 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('f' 10)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(5 15 5 50 8)\n")
    output_file.write("	SymbolLine(5 15 10 10 8)\n")
    output_file.write("	SymbolLine(10 10 15 10 8)\n")
    output_file.write("	SymbolLine(0 30 10 30 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('g' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(15 30 20 35 8)\n")
    output_file.write("	SymbolLine(5 30 15 30 8)\n")
    output_file.write("	SymbolLine(0 35 5 30 8)\n")
    output_file.write("	SymbolLine(0 35 0 45 8)\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write("	SymbolLine(5 50 15 50 8)\n")
    output_file.write("	SymbolLine(15 50 20 45 8)\n")
    output_file.write("	SymbolLine(0 60 5 65 8)\n")
    output_file.write("	SymbolLine(5 65 15 65 8)\n")
    output_file.write("	SymbolLine(15 65 20 60 8)\n")
    output_file.write("	SymbolLine(20 30 20 60 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('h' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 0 50 8)\n")
    output_file.write("	SymbolLine(0 35 5 30 8)\n")
    output_file.write("	SymbolLine(5 30 15 30 8)\n")
    output_file.write("	SymbolLine(15 30 20 35 8)\n")
    output_file.write("	SymbolLine(20 35 20 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('i' 10)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 20 0 25 8)\n")
    output_file.write("	SymbolLine(0 35 0 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('j' 10)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(5 20 5 25 8)\n")
    output_file.write("	SymbolLine(5 35 5 60 8)\n")
    output_file.write("	SymbolLine(0 65 5 60 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('k' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 0 50 8)\n")
    output_file.write("	SymbolLine(0 35 15 50 8)\n")
    output_file.write("	SymbolLine(0 35 10 25 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('l' 10)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 0 45 8)\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('m' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(5 35 5 50 8)\n")
    output_file.write("	SymbolLine(5 35 10 30 8)\n")
    output_file.write("	SymbolLine(10 30 15 30 8)\n")
    output_file.write("	SymbolLine(15 30 20 35 8)\n")
    output_file.write("	SymbolLine(20 35 20 50 8)\n")
    output_file.write("	SymbolLine(20 35 25 30 8)\n")
    output_file.write("	SymbolLine(25 30 30 30 8)\n")
    output_file.write("	SymbolLine(30 30 35 35 8)\n")
    output_file.write("	SymbolLine(35 35 35 50 8)\n")
    output_file.write("	SymbolLine(0 30 5 35 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('n' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(5 35 5 50 8)\n")
    output_file.write("	SymbolLine(5 35 10 30 8)\n")
    output_file.write("	SymbolLine(10 30 15 30 8)\n")
    output_file.write("	SymbolLine(15 30 20 35 8)\n")
    output_file.write("	SymbolLine(20 35 20 50 8)\n")
    output_file.write("	SymbolLine(0 30 5 35 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('o' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 35 0 45 8)\n")
    output_file.write("	SymbolLine(0 35 5 30 8)\n")
    output_file.write("	SymbolLine(5 30 15 30 8)\n")
    output_file.write("	SymbolLine(15 30 20 35 8)\n")
    output_file.write("	SymbolLine(20 35 20 45 8)\n")
    output_file.write("	SymbolLine(15 50 20 45 8)\n")
    output_file.write("	SymbolLine(5 50 15 50 8)\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('p' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(5 35 5 65 8)\n")
    output_file.write("	SymbolLine(0 30 5 35 8)\n")
    output_file.write("	SymbolLine(5 35 10 30 8)\n")
    output_file.write("	SymbolLine(10 30 20 30 8)\n")
    output_file.write("	SymbolLine(20 30 25 35 8)\n")
    output_file.write("	SymbolLine(25 35 25 45 8)\n")
    output_file.write("	SymbolLine(20 50 25 45 8)\n")
    output_file.write("	SymbolLine(10 50 20 50 8)\n")
    output_file.write("	SymbolLine(5 45 10 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('q' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(20 35 20 65 8)\n")
    output_file.write("	SymbolLine(15 30 20 35 8)\n")
    output_file.write("	SymbolLine(5 30 15 30 8)\n")
    output_file.write("	SymbolLine(0 35 5 30 8)\n")
    output_file.write("	SymbolLine(0 35 0 45 8)\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write("	SymbolLine(5 50 15 50 8)\n")
    output_file.write("	SymbolLine(15 50 20 45 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('r' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(5 35 5 50 8)\n")
    output_file.write("	SymbolLine(5 35 10 30 8)\n")
    output_file.write("	SymbolLine(10 30 20 30 8)\n")
    output_file.write("	SymbolLine(0 30 5 35 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('s' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(5 50 20 50 8)\n")
    output_file.write("	SymbolLine(20 50 25 45 8)\n")
    output_file.write("	SymbolLine(20 40 25 45 8)\n")
    output_file.write("	SymbolLine(5 40 20 40 8)\n")
    output_file.write("	SymbolLine(0 35 5 40 8)\n")
    output_file.write("	SymbolLine(0 35 5 30 8)\n")
    output_file.write("	SymbolLine(5 30 20 30 8)\n")
    output_file.write("	SymbolLine(20 30 25 35 8)\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('t' 10)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(5 10 5 45 8)\n")
    output_file.write("	SymbolLine(5 45 10 50 8)\n")
    output_file.write("	SymbolLine(0 25 10 25 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('u' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 30 0 45 8)\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write("	SymbolLine(5 50 15 50 8)\n")
    output_file.write("	SymbolLine(15 50 20 45 8)\n")
    output_file.write("	SymbolLine(20 30 20 45 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('v' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 30 0 40 8)\n")
    output_file.write("	SymbolLine(0 40 10 50 8)\n")
    output_file.write("	SymbolLine(10 50 20 40 8)\n")
    output_file.write("	SymbolLine(20 30 20 40 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('w' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 30 0 45 8)\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write("	SymbolLine(5 50 10 50 8)\n")
    output_file.write("	SymbolLine(10 50 15 45 8)\n")
    output_file.write("	SymbolLine(15 30 15 45 8)\n")
    output_file.write("	SymbolLine(15 45 20 50 8)\n")
    output_file.write("	SymbolLine(20 50 25 50 8)\n")
    output_file.write("	SymbolLine(25 50 30 45 8)\n")
    output_file.write("	SymbolLine(30 30 30 45 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('x' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 30 20 50 8)\n")
    output_file.write("	SymbolLine(0 50 20 30 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('y' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 30 0 45 8)\n")
    output_file.write("	SymbolLine(0 45 5 50 8)\n")
    output_file.write("	SymbolLine(20 30 20 60 8)\n")
    output_file.write("	SymbolLine(15 65 20 60 8)\n")
    output_file.write("	SymbolLine(5 65 15 65 8)\n")
    output_file.write("	SymbolLine(0 60 5 65 8)\n")
    output_file.write("	SymbolLine(5 50 15 50 8)\n")
    output_file.write("	SymbolLine(15 50 20 45 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('z' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 30 20 30 8)\n")
    output_file.write("	SymbolLine(0 50 20 30 8)\n")
    output_file.write("	SymbolLine(0 50 20 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('{' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(5 15 10 10 8)\n")
    output_file.write("	SymbolLine(5 15 5 25 8)\n")
    output_file.write("	SymbolLine(0 30 5 25 8)\n")
    output_file.write("	SymbolLine(0 30 5 35 8)\n")
    output_file.write("	SymbolLine(5 35 5 45 8)\n")
    output_file.write("	SymbolLine(5 45 10 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('|' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 0 50 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('}' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 10 5 15 8)\n")
    output_file.write("	SymbolLine(5 15 5 25 8)\n")
    output_file.write("	SymbolLine(5 25 10 30 8)\n")
    output_file.write("	SymbolLine(5 35 10 30 8)\n")
    output_file.write("	SymbolLine(5 35 5 45 8)\n")
    output_file.write("	SymbolLine(0 50 5 45 8)\n")
    output_file.write(")\n")
    output_file.write("Symbol('~' 12)\n")
    output_file.write("(\n")
    output_file.write("	SymbolLine(0 35 5 30 8)\n")
    output_file.write("	SymbolLine(5 30 10 30 8)\n")
    output_file.write("	SymbolLine(10 30 15 35 8)\n")
    output_file.write("	SymbolLine(15 35 20 35 8)\n")
    output_file.write("	SymbolLine(20 35 25 30 8)\n")
    output_file.write(")\n")


    for via in my_board.vias:
        via.output(output_file)

    origin_x = ascii2pcb(my_board.originX)
    origin_y = ascii2pcb(my_board.originY)

    for component in my_board.components:

        comp_x = ascii2pcb(component.x)
        comp_y = -ascii2pcb(component.y)

        if component.mirrored == 'M':
            onsolder_str = "onsolder"
        else:
            onsolder_str = ""

        
        output_file.write( "Element[ \"" + onsolder_str + "\" \"\" \"" + component.refdes + "\" \"\" " + str(comp_x + origin_x))
        output_file.write( " " + str(comp_y + origin_y) + " 0 0 0 0 \"\"]\n")
        output_file.write( "(\n" )


        component.pcb_write(output_file)

        for pin in component.part.pins:
           
            width = ascii2pcb(pin.width)
            
            height = abs(ascii2pcb(pin.height))

            clearence = ascii2pcb(my_board.copper_clearence)
            mask = ascii2pcb(my_board.soldermask_clearence)

            offset = ascii2pcb(pin.offset)

            if height != 0:

                if width > height:
                    #   pin.rotation = pin.rotation + 90.0
                    
                    #if pin.rotation >= 360:
                    #    pin.rotation = pin.rotation - 360.0

                    tmp_x = width
                    width = height
                    height = tmp_x

                height = height/2 - width/2

            pin_x = ascii2pcb(pin.x)
            pin_y = -ascii2pcb(pin.y)

            rotation = component.rotation + pin.rotation

            if rotation >= 360.0:
                rotation = rotation - 360.0

            if component.rotation == 0.0:
                x1 = pin_x
                x2 = pin_x
                y1 = pin_y
                y2 = pin_y
            if component.rotation == 270.0:
                y1 = pin_x
                y2 = pin_x
                x1 = -pin_y
                x2 = -pin_y
            if component.rotation == 180.0:
                x1 = -pin_x
                x2 = -pin_x
                y1 = -pin_y
                y2 = -pin_y
            if component.rotation == 90.0:
                x1 =  pin_y
                x2 =  pin_y
                y1 =  -pin_x
                y2 =  -pin_x

            if rotation == 0.0:
                x1 = x1 - height + offset
                x2 = x2 + height + offset
                y1 = y1
                y2 = y2
            elif rotation == 270.0:
                x1 = x1
                x2 = x2
                y1 = y1 - height + offset
                y2 = y2 + height + offset
            elif rotation == 180.0:
                x1 = x1 - height + offset 
                x2 = x2 + height + offset
                y1 = y1
                y2 = y2
            else:
                x1 = x1
                x2 = x2
                y1 = y1 - height + offset 
                y2 = y2 + height + offset

            if pin.shape == "R":
                shape_flag = ""
            else:
                shape_flag = "square"

            if shape_flag == "square" and onsolder_str == "onsolder":
                shape_flag = "square,"

            if pin.drill_size == 0:
                output_file.write("Pad[" + str(x1) + " " + str(y1) + " " + str(x2) + " " + str(y2) +\
                                  " " + str(width) + " " + str(clearence) + " " + str(mask) + " \"" + pin.pin_number + "\" "\
                                  + " \"" + pin.pin_number + "\" \"" + shape_flag + onsolder_str + "\"]\n")
            else:
                output_file.write("Pin[" + str(x1) + " " + str(y1) + " " +\
                                  " " + str(width) + " " + str(clearence) + " " + str(mask) + " " + str(ascii2pcb(pin.drill_size)) + " \"" + pin.pin_number + "\" "\
                                  + " \"" + pin.pin_number + "\" \"" + shape_flag + onsolder_str + "\"]\n")
                

        for polygon in component.part.polygons:
            corner = polygon.corners[0]
            
            x1 = ascii2pcb(corner[0])
            y1 = -ascii2pcb(corner[1])

            corner = polygon.corners[2]
            
            x2 = ascii2pcb(corner[0])
            y2 = -ascii2pcb(corner[1])

            print "pre x1: " + str(x1) + " y1: " + str(y1) + " x2: " + str(x2) + " y2: " + str(y2)
            print "x dir: " + str(abs(x2-x1)) + " y dir: " + str(abs(y2 - y1))
            
            rotation = component.rotation

            if abs(x2 - x1) > abs(y2 - y1):
                length = abs(x2-x1)
                width = abs(y2-y1)
                length -= width
                avg = (x2 + x1)/2
                x2 = avg + length/2
                x1 = avg - length/2
                y1 = (y2 + y1)/2
                y2 = y1
            else:
                length = abs(y2-y1)
                width = abs(x2-x1)
                length -= width
                avg = (y2 + y1)/2
                y2 = avg + length/2
                y1 = avg - length/2
                x1 = (x2 + x1)/2
                x2 = x1

            print "post x1: " + str(x1) + " y1: " + str(y1) + " x2: " + str(x2) + " y2: " + str(y2) + " length: " + str(length) + " width: " + str(width)

            shape_flag = "square"

            if shape_flag == "square" and onsolder_str == "onsolder":
                shape_flag = "square,"

            output_file.write("Pad[" + str(x1) + " " + str(y1) + " " + str(x2) + " " + str(y2) +\
                              " " + str(width) + " " + str(clearence) + " " + str(mask) + " \"" + polygon.PinNumber + "\" "\
                              + " \"" + polygon.PinNumber + "\" \"" + shape_flag + onsolder_str + "\"]\n")
                
                
        output_file.write( ")\n" )



    p_count = 0
            
    for count in range(1, my_board.max_layers+1):
        output_file.write( "Layer(" + str(count) + " \"")

        for layer in my_board.layers:
            if layer.number == count:
                output_file.write(layer.name)
                break
                           
        output_file.write( "\")\n")
        output_file.write( "(\n")
        
        for line in my_board.lines:
            line.pcb_write(count, output_file);

        if use_polygons:
            for polygon in my_board.polygons:
                polygon.pcb_write(count, output_file)

        output_file.write( ")\n")

    # solder silkscreen
    output_file.write( "Layer(" + str(my_board.max_layers+1) + " \"silk\")\n")
    output_file.write( "(\n")
    for line in my_board.lines:
        line.pcb_write(29, output_file);
    for line in my_board.lines:
        line.pcb_write(28, output_file);
    output_file.write( ")\n")

    # component silkscreen
    output_file.write( "Layer(" + str(my_board.max_layers+2) + " \"silk\")\n")
    output_file.write( "(\n")
    for line in my_board.lines:
        line.pcb_write(26, output_file);
    for line in my_board.lines:
        line.pcb_write(28, output_file);
    output_file.write( ")\n")

    exit()

    return ""

#------------------------------------------------------------------

def usage():
    print "Usage: ascii2pcb infile.asc outfile.pcb [options]"
    print "options are a - followed by n"
    print "  option n means do not include polygons for layers"

#------------------------------------------------------------------

if sys.argv[1:]:
    try:
        input_file = open(sys.argv[1], 'r')
    except IOError, msg:
        print 'Can\'t open "%s":' % sys.argv[1], msg
        sys.exit(1)
else:
    usage()
    exit()

if sys.argv[2:]:
    try:
        output_file = open(sys.argv[2], 'w')
    except IOError, msg:
        print 'Can\'t open "%s":' % sys.argv[1], msg
        sys.exit(1)
else:
    usage()
    exit()


print sys.argv

if sys.argv[3] == "-n":
    use_polygons = False
else:
    use_polygons = True

my_board = cBoard();

events = ["*CLUSTER*", "*ITEMS*", "*LINES*", "*MISC*", "*PARTDECAL*", "*PART*", "*PARTTYPE*", "*PCB*", \
          "*POUR*", "*REMARK*", "*REUSE*", "*ROUTE*", "*SIGNAL*", "*TEXT*",  "*VIA*", \
          "*END*"]

fsm = FSM()


fsm.start("start")

fsm.add("start", "ready", "ready", ready_action)
fsm.add("ready", "*REMARK*", "*REMARK*", remark_action)
fsm.add("ready", "*PCB*", "*PCB*", pcb_action)
fsm.add("*PCB*", "*REMARK*", "*REMARK*", remark_action)
fsm.add("ready", "*TEXT*", "*TEXT*", text_action)
fsm.add("*TEXT*", "*REMARK*", "*REMARK*", remark_action)
fsm.add("ready", "*REUSE*", "*REUSE*", reuse_action)
fsm.add("*REUSE*", "*REMARK*", "*REMARK*", remark_action)
fsm.add("ready", "*LINES*", "*LINES*", lines_action)
fsm.add("*LINES*", "*REMARK*", "*REMARK*", remark_action)
fsm.add("ready", "*CLUSTER*", "*CLUSTER*", cluster_action)
fsm.add("*CLUSTER*", "*REMARK*", "*REMARK*", remark_action)
fsm.add("ready", "*VIA*", "*VIA*", via_action)
fsm.add("*VIA*", "*REMARK*", "*REMARK*", remark_action)
fsm.add("ready", "*PARTDECAL*", "*PARTDECAL*", partdecal_action)
fsm.add("*PARTDECAL*", "*REMARK*", "*REMARK*", remark_action)
fsm.add("ready", "*PARTTYPE*", "*PARTTYPE*", parttype_action)
fsm.add("*PARTTYPE*", "*REMARK*", "*REMARK*", remark_action)
fsm.add("ready", "*PART*", "*PART*", part_action)
fsm.add("*PART*", "*REMARK*", "*REMARK*", remark_action)
fsm.add("ready", "*ROUTE*", "*ROUTE*", route_action)
fsm.add("*ROUTE*", "*REMARK*", "*REMARK*", remark_action)
fsm.add("ready", "*SIGNAL*", "*SIGNAL*", signal_action)
fsm.add("*SIGNAL*", "*REMARK*", "*REMARK*", remark_action)
fsm.add("ready", "*POUR*", "*POUR*", pour_action)
fsm.add("*POUR*", "*REMARK*", "*REMARK*", remark_action)
fsm.add("ready", "*MISC*", "*MISC*", misc_action)
fsm.add("*MISC*", "*REMARK*", "*REMARK*", remark_action)
fsm.add("ready", "*END*", "*END*", end_action)

fsm.execute("ready", "")

output_file.close()
input_file.close()

_______________________________________________
geda-user mailing list
geda-user@xxxxxxxxxxxxxx
http://www.seul.org/cgi-bin/mailman/listinfo/geda-user