diff -r c869766e25ff -r 59da528bc470 plotter/hpgl_parser.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plotter/hpgl_parser.py Fri Jan 25 21:00:34 2008 +0100 @@ -0,0 +1,451 @@ +# -*- coding: utf-8 -*- + +import re +import numpy + +vsplitter = re.compile('[ ,]') +vextractor = re.compile('(?P[^;\n\r\aA-DF-Za-df-z]*?)(?P[;\n\r\a]+)', re.S+re.M) + +class HPGLParser(object): + def __init__(self, data=None): + self.str_terminator = chr(0x03) + self.IN() + if data: + self.parse(data) + + def parse(self, data): + self.data = data + self.idx = 0 + self.IN() + while self.idx1: + self.pattern_len = values[1] + + def PW(self): + """ Pen Width """ + values = self.extract_value() + if len(values) == 1: + self.pen_thickness = values[0] + + def SM(self): + """ Symbol Mode """ + values = self.extract_value() + if len(values) == 0: + self.symbol_mode = False + elif len(values) == 1: + self.symbol_mode = values[0] + + def SP(self): + """ Select Pen """ + values = self.extract_value() + if len(values) == 1: + self.pen = values[0] + + def TL(self): + """ Tick Len """ + values = self.extract_value() + # TODO + + def XT(self): + """ X-axis Tick """ + # TODO + print "X ticks" + + def YT(self): + """ X-axis Tick """ + # TODO + print "Y ticks" + + def PT(self): + """ Pen Thickness Select """ + values = self.extract_value() + if len(values) == 0: + self.pen_thickness = 0.3 + elif len(values) == 1: + self.pen_thickness = values[0] + + def CS(self): + """ Standard Character Set """ + values = self.extract_value() + if len(values) == 0: + self.std_char_set = 0 + elif len(values) == 1: + self.std_char_set = values[0] + + def CA(self): + """ Alternate Character Set """ + values = self.extract_value() + if len(values) == 0: + self.alt_char_set = 0 + elif len(values) == 1: + self.alt_char_set = values[0] + + def SS(self): + """ Select Standard Character Set """ + self.char_set = "std" + + def SA(self): + """ Select Alternate Character Set """ + self.char_set = "alt" + + def DT(self): + """ Define Label Terminator """ + values = self.extract_value(raw=True) + if len(values) == 0: + self.str_terminator = chr(0x03) + elif len(values) == 1: + self.str_terminator = values[0] + + def LB(self): + """ Character Plot """ + values = self.extract_string() + self.plot_string(values) + x, y = self.pos + values = values.split('\n') + if self.char_size == "absolute": + x += len(values[-1]) * self.char_width *1016/2.54 + y += (len(values)-1) * self.char_height *1016/2.54 + else: + x0, x1, y0, y1 = self.scale + dx = x1-x0 + dy = y1-y0 + x += len(values[-1]) * self.char_width / 100.0 * dx + y += (len(values)-1) * self.char_height / 100.0 * dy + + #print "LB pos[%s] %s -> %s"%(repr(values), self.pos, (x,y)) + self.pos = [x, y] + + def get_char_size(self): + if self.char_size == "absolute": + x = self.char_width *1016/2.54 + y = self.char_height *1016/2.54 + else: + x0, x1, y0, y1 = self.scale + dx = x1-x0 + dy = y1-y0 + x = self.char_width / 100.0 * dx + y = self.char_height / 100.0 * dy + return x, y + + def DI(self): + """ Absolute Direction """ + values = self.extract_value() + if len(values) == 0: + self.char_direction = 1.0, 0.0 + elif len(values) == 2: + self.char_direction = values + + def DR(self): + """ Relative Direction """ + values = self.extract_value() + if len(values) == 0: + self.char_direction = 1.0, 0.0 + elif len(values) == 2: + # TODO : compute as percentages + self.char_direction = values + + def CP(self): + """ Character Plot """ + values = self.extract_value() + # TODO + if len(values) == 0: + values = 0, 1 + x, y = self.pos + if self.char_size == "absolute": + x += values[0] * self.char_width *1016/2.54 + y += values[1] * self.char_height *1016/2.54 + else: + x0, x1, y0, y1 = self.scale + dx = x1-x0 + dy = y1-y0 + x += values[0] * self.char_width / 100.0 * dx + y += values[1] * self.char_height / 100.0 * dy + #print "CB pos[%s] %s -> %s"%(repr(values), self.pos, (x,y)) + self.pos = [x, y] + + def SI(self): + """ Set Absolute Character Size """ + values = self.extract_value() + self.char_size = "absolute" + if len(values) == 0: + self.char_width = 0.1879 # cm + self.char_height = 0.2690 # cm + elif len(values) == 2: + self.char_width, self.char_height = values + + def SR(self): + """ Set Relative Character Size """ + values = self.extract_value() + self.char_size = "relative" + if len(values) == 0: + self.char_width = 0.75 # percentage + self.char_height = 1.5 # id + elif len(values) == 2: + self.char_width, self.char_height = values + + def SL(self): + """ Character Slant """ + values = self.extract_value() + # TODO + + def UC(self): + """ User Defined Character """ + values = self.extract_value() + # TODO + +if __name__ == '__main__': + import sys + data = open(sys.argv[1]).read() + + p = HPGLParser(data) +