Fix tests for macros with no variables.

All AM*Primitive classes now handles float for all but the code
modifiers. This simplifies the reading/parsing.
This commit is contained in:
Paulo Henrique Silva 2015-03-05 14:43:30 -03:00
parent 670d3fbbd7
commit a13b981c1c
5 changed files with 45 additions and 33 deletions

View file

@ -32,6 +32,7 @@ class Token:
LEFT_PARENS = "("
RIGHT_PARENS = ")"
EQUALS = "="
EOF = "EOF"
def token_to_opcode(token):
@ -71,7 +72,8 @@ class Scanner:
def peek(self):
if not self.eof():
return self.buff[self.n]
return ""
return Token.EOF
def ungetc(self):
if self.n > 0:
@ -104,6 +106,11 @@ class Scanner:
return s.strip()
def print_instructions(instructions):
for opcode, argument in instructions:
print "%s %s" % (OpCode.str(opcode), str(argument) if argument is not None else "")
def read_macro(macro):
instructions = []
@ -185,9 +192,10 @@ def read_macro(macro):
elif c == "0":
if is_primitive and not found_primitive_code:
instructions.append((OpCode.PUSH, scanner.readstr("*")))
found_primitive_code = True
else:
# decimal or integer disambiguation
if scanner.peek() not in '.':
if scanner.peek() not in '.' or scanner.peek() == Token.EOF:
instructions.append((OpCode.PUSH, 0))
elif c in "123456789.":
@ -207,7 +215,7 @@ def read_macro(macro):
instructions.append((token_to_opcode(pop()), None))
# at end, we either have a primitive or a equation
if is_primitive:
if is_primitive and found_primitive_code:
instructions.append((OpCode.PRIM, primitive_code))
if is_equation:
@ -221,8 +229,7 @@ if __name__ == '__main__':
instructions = read_macro(sys.argv[1])
print "insructions:"
for opcode, argument in instructions:
print "%s %s" % (OpCode.str(opcode), str(argument) if argument is not None else "")
print_instructions(instructions)
print "eval:"
for primitive in eval_macro(instructions):

View file

@ -160,7 +160,7 @@ class AMCirclePrimitive(AMPrimitive):
def from_gerber(cls, primitive):
modifiers = primitive.strip(' *').split(',')
code = int(modifiers[0])
exposure = 'on' if modifiers[1].strip() == '1' else 'off'
exposure = 'on' if float(modifiers[1]) == 1 else 'off'
diameter = float(modifiers[2])
position = (float(modifiers[3]), float(modifiers[4]))
return cls(code, exposure, diameter, position)
@ -233,7 +233,7 @@ class AMVectorLinePrimitive(AMPrimitive):
def from_gerber(cls, primitive):
modifiers = primitive.strip(' *').split(',')
code = int(modifiers[0])
exposure = 'on' if modifiers[1].strip() == '1' else 'off'
exposure = 'on' if float(modifiers[1]) == 1 else 'off'
width = float(modifiers[2])
start = (float(modifiers[3]), float(modifiers[4]))
end = (float(modifiers[5]), float(modifiers[6]))
@ -318,8 +318,8 @@ class AMOutlinePrimitive(AMPrimitive):
modifiers = primitive.strip(' *').split(",")
code = int(modifiers[0])
exposure = "on" if modifiers[1].strip() == "1" else "off"
n = int(modifiers[2])
exposure = "on" if float(modifiers[1]) == 1 else "off"
n = int(float(modifiers[2]))
start_point = (float(modifiers[3]), float(modifiers[4]))
points = []
for i in range(n):
@ -405,7 +405,7 @@ class AMPolygonPrimitive(AMPrimitive):
def from_gerber(cls, primitive):
modifiers = primitive.strip(' *').split(",")
code = int(modifiers[0])
exposure = "on" if modifiers[1].strip() == "1" else "off"
exposure = "on" if float(modifiers[1]) == 1 else "off"
vertices = int(float(modifiers[2]))
position = (float(modifiers[3]), float(modifiers[4]))
try:
@ -508,7 +508,7 @@ class AMMoirePrimitive(AMPrimitive):
diameter = float(modifiers[3])
ring_thickness = float(modifiers[4])
gap = float(modifiers[5])
max_rings = int(modifiers[6])
max_rings = int(float(modifiers[6]))
crosshair_thickness = float(modifiers[7])
crosshair_length = float(modifiers[8])
rotation = float(modifiers[9])
@ -690,7 +690,7 @@ class AMCenterLinePrimitive(AMPrimitive):
def from_gerber(cls, primitive):
modifiers = primitive.strip(' *').split(",")
code = int(modifiers[0])
exposure = 'on' if modifiers[1].strip() == '1' else 'off'
exposure = 'on' if float(modifiers[1]) == 1 else 'off'
width = float(modifiers[2])
height = float(modifiers[3])
center= (float(modifiers[4]), float(modifiers[5]))
@ -772,7 +772,7 @@ class AMLowerLeftLinePrimitive(AMPrimitive):
def from_gerber(cls, primitive):
modifiers = primitive.strip(' *').split(",")
code = int(modifiers[0])
exposure = 'on' if modifiers[1].strip() == '1' else 'off'
exposure = 'on' if float(modifiers[1]) == 1 else 'off'
width = float(modifiers[2])
height = float(modifiers[3])
lower_left = (float(modifiers[4]), float(modifiers[5]))

View file

@ -350,31 +350,30 @@ class AMParamStmt(ParamStmt):
def read(self, macro):
return read_macro(macro)
def evaluate(self, modifiers=[]):
primitives = []
def build(self, modifiers=[[]]):
self.primitives = []
for primitive in eval_macro(self.instructions, modifiers[0]):
if primitive[0] == '0':
primitives.append(AMCommentPrimitive.from_gerber(primitive))
self.primitives.append(AMCommentPrimitive.from_gerber(primitive))
elif primitive[0] == '1':
primitives.append(AMCirclePrimitive.from_gerber(primitive))
self.primitives.append(AMCirclePrimitive.from_gerber(primitive))
elif primitive[0:2] in ('2,', '20'):
primitives.append(AMVectorLinePrimitive.from_gerber(primitive))
self.primitives.append(AMVectorLinePrimitive.from_gerber(primitive))
elif primitive[0:2] == '21':
primitives.append(AMCenterLinePrimitive.from_gerber(primitive))
self.primitives.append(AMCenterLinePrimitive.from_gerber(primitive))
elif primitive[0:2] == '22':
primitives.append(AMLowerLeftLinePrimitive.from_gerber(primitive))
self.primitives.append(AMLowerLeftLinePrimitive.from_gerber(primitive))
elif primitive[0] == '4':
primitives.append(AMOutlinePrimitive.from_gerber(primitive))
self.primitives.append(AMOutlinePrimitive.from_gerber(primitive))
elif primitive[0] == '5':
primitives.append(AMPolygonPrimitive.from_gerber(primitive))
self.primitives.append(AMPolygonPrimitive.from_gerber(primitive))
elif primitive[0] =='6':
primitives.append(AMMoirePrimitive.from_gerber(primitive))
self.primitives.append(AMMoirePrimitive.from_gerber(primitive))
elif primitive[0] == '7':
primitives.append(AMThermalPrimitive.from_gerber(primitive))
self.primitives.append(AMThermalPrimitive.from_gerber(primitive))
else:
primitives.append(AMUnsupportPrimitive.from_gerber(primitive))
return primitives
self.primitives.append(AMUnsupportPrimitive.from_gerber(primitive))
def to_inch(self):
for primitive in self.primitives:

View file

@ -397,7 +397,7 @@ class GerberParser(object):
# FIXME: not supported yet?
pass
else:
aperture = self.macros[shape].evaluate(modifiers)
aperture = self.macros[shape].build(modifiers)
self.apertures[d] = aperture

View file

@ -333,6 +333,7 @@ def test_AMParamStmt_factory():
8,THIS IS AN UNSUPPORTED PRIMITIVE*
''')
s = AMParamStmt.from_dict({'param': 'AM', 'name': name, 'macro': macro })
s.build()
assert_equal(len(s.primitives), 10)
assert_true(isinstance(s.primitives[0], AMCommentPrimitive))
assert_true(isinstance(s.primitives[1], AMCirclePrimitive))
@ -347,29 +348,34 @@ def test_AMParamStmt_factory():
def testAMParamStmt_conversion():
name = 'POLYGON'
macro = '5,1,8,25.4,25.4,25.4,0*%'
macro = '5,1,8,25.4,25.4,25.4,0*'
s = AMParamStmt.from_dict({'param': 'AM', 'name': name, 'macro': macro })
s.build()
s.to_inch()
assert_equal(s.primitives[0].position, (1., 1.))
assert_equal(s.primitives[0].diameter, 1.)
macro = '5,1,8,1,1,1,0*%'
macro = '5,1,8,1,1,1,0*'
s = AMParamStmt.from_dict({'param': 'AM', 'name': name, 'macro': macro })
s.build()
s.to_metric()
assert_equal(s.primitives[0].position, (25.4, 25.4))
assert_equal(s.primitives[0].diameter, 25.4)
def test_AMParamStmt_dump():
name = 'POLYGON'
macro = '5,1,8,25.4,25.4,25.4,0*%'
macro = '5,1,8,25.4,25.4,25.4,0*'
s = AMParamStmt.from_dict({'param': 'AM', 'name': name, 'macro': macro })
s.build()
assert_equal(s.to_gerber(), '%AMPOLYGON*5,1,8,25.4,25.4,25.4,0.0*%')
def test_AMParamStmt_string():
name = 'POLYGON'
macro = '5,1,8,25.4,25.4,25.4,0*%'
macro = '5,1,8,25.4,25.4,25.4,0*'
s = AMParamStmt.from_dict({'param': 'AM', 'name': name, 'macro': macro })
assert_equal(str(s), '<Aperture Macro POLYGON: 5,1,8,25.4,25.4,25.4,0*%>')
s.build()
assert_equal(str(s), '<Aperture Macro POLYGON: 5,1,8,25.4,25.4,25.4,0*>')
def test_ASParamStmt_factory():
stmt = {'param': 'AS', 'mode': 'AXBY'}