34 def parse(self, data): |
34 def parse(self, data): |
35 self.data = data |
35 self.data = data |
36 self.idx = 0 |
36 self.idx = 0 |
37 self.IN() |
37 self.IN() |
38 while self.idx < len(data): |
38 while self.idx < len(data): |
39 while data[self.idx] in [';','\n','\r', '\a', ' ']: |
39 while data[self.idx] in ';\n\r\a ': |
40 self.idx += 1 |
40 self.idx += 1 |
41 if data[self.idx] == chr(0x03): |
41 if data[self.idx] == chr(0x03): |
42 self.ESC() |
42 self.ESC() |
43 else: |
43 else: |
44 cmd = data[self.idx: self.idx+2].upper() |
44 cmd = data[self.idx: self.idx+2].upper() |
46 try: |
46 try: |
47 getattr(self, cmd)() |
47 getattr(self, cmd)() |
48 except AttributeError: |
48 except AttributeError: |
49 print("WARNING: received unknown command %s" % repr(cmd)) |
49 print("WARNING: received unknown command %s" % repr(cmd)) |
50 |
50 |
51 while self.idx < len(data) and data[self.idx] in [';','\n','\r', '\a', ' ']: |
51 while self.idx < len(data) and data[self.idx] in ';\n\r\a ': |
52 self.idx += 1 |
52 self.idx += 1 |
53 |
53 |
54 def user_to_abs(self, pos): |
54 def user_to_abs(self, pos): |
55 """ |
55 """ |
56 converts a position (x, y) given in user units to absolute |
56 converts a position (x, y) given in user units to absolute |
74 val = self.data[self.idx: idx2] |
74 val = self.data[self.idx: idx2] |
75 self.idx = idx2+1 |
75 self.idx = idx2+1 |
76 return val |
76 return val |
77 |
77 |
78 def polyline(self, values): |
78 def polyline(self, values): |
79 if (len(values)%2) == 1: |
79 if (len(values) % 2) == 1: |
80 # this is a syntax error in the HPGL data |
80 # this is a syntax error in the HPGL data |
81 values = values[:-1] |
81 values = values[:-1] |
82 values = numpy.array(values).reshape(-1, 2) |
82 values = numpy.array(values).reshape(-1, 2) |
83 # TODO use scaling |
83 # TODO use scaling |
84 # do plots |
84 # do plots |
85 values = numpy.r_[[self.pos], values] #add self.pos as 1st value |
85 values = numpy.r_[[self.pos], values] # add self.pos as 1st value |
86 if self.plot_mode == 'relative': |
86 if self.plot_mode == 'relative': |
87 values = values.cumsum(axis=0) |
87 values = values.cumsum(axis=0) |
88 if self.symbol_mode: |
88 if self.symbol_mode: |
89 self.plot_symbols(values[1:]) |
89 self.plot_symbols(values[1:]) |
90 if self.pen_state == "down": |
90 if self.pen_state == "down": |
93 |
93 |
94 def plot_string(self, s): |
94 def plot_string(self, s): |
95 pass |
95 pass |
96 |
96 |
97 def get_window_for_paper(self): |
97 def get_window_for_paper(self): |
98 return 0,100,0,100 |
98 return (0, 100, 0, 100) |
|
99 |
99 def get_scaling_points_for_paper(self): |
100 def get_scaling_points_for_paper(self): |
100 return 0,100,0,100 |
101 return (0, 100, 0, 100) |
101 |
102 |
102 # effective plot methods; to be defined in subclasses (backends) |
103 # effective plot methods; to be defined in subclasses (backends) |
103 def plot_symbols(self, points): |
104 def plot_symbols(self, points): |
104 pass |
105 pass |
|
106 |
105 def plot_lines(self, points): |
107 def plot_lines(self, points): |
106 pass |
108 pass |
107 |
109 |
108 # HPGL-related methods |
110 # HPGL-related methods |
109 def ESC(self): |
111 def ESC(self): |
110 # print "ESC" |
|
111 self.idx += 1 |
112 self.idx += 1 |
112 |
113 |
113 def OE(self): |
114 def OE(self): |
114 """ Output Error """ |
115 """ Output Error """ |
115 pass |
116 pass |
116 |
117 |
117 def EC(self): |
118 def EC(self): |
118 """? what's this """ |
119 """? what's this """ |
119 values = self.extract_value() |
120 # values = self.extract_value() |
|
121 pass |
120 |
122 |
121 def OO(self): |
123 def OO(self): |
122 """idem""" |
124 """idem""" |
123 pass |
125 pass |
124 |
126 |
131 pass |
133 pass |
132 |
134 |
133 def DF(self): |
135 def DF(self): |
134 """ Default """ |
136 """ Default """ |
135 self.pen = 0 |
137 self.pen = 0 |
136 self.pen_width = 1 # 1/300 inch |
138 self.pen_width = 1 # 1/300 inch |
137 self.pos = 0,0 |
139 self.pos = (0, 0) |
138 self.char_set = "std" |
140 self.char_set = "std" |
139 self.plot_mode = 'absolute' |
141 self.plot_mode = 'absolute' |
140 self.char_direction = 1,0 |
142 self.char_direction = (1, 0) |
141 self.line_type = 0 # 'solid' |
143 self.line_type = 0 # 'solid' |
142 self.pattern_len = 4 #percentage |
144 self.pattern_len = 4 # percentage |
143 self.window = self.get_window_for_paper() |
145 self.window = self.get_window_for_paper() |
144 self.char_size = 0.75, 1.5 #percentages |
146 self.char_size = (0.75, 1.5) # percentages |
145 self.symbol_mode = False |
147 self.symbol_mode = False |
146 self.tick_len = 0.5, 0.5 # % |
148 self.tick_len = (0.5, 0.5) # % |
147 self.std_char_set = 0 |
149 self.std_char_set = 0 |
148 self.alt_char_set = 0 |
150 self.alt_char_set = 0 |
149 self.selected_char_set = 0 |
151 self.selected_char_set = 0 |
150 self.char_slant = 0 # degrees |
152 self.char_slant = 0 # degrees |
151 self.scale = None |
153 self.scale = None |
152 self.str_terminator = chr(0x03) |
154 self.str_terminator = chr(0x03) |
153 self.chord_ang = 5 #degrees |
155 self.chord_ang = 5 # degrees |
154 self.fill_type = 'bidirectionnal', 1 |
156 self.fill_type = ('bidirectionnal', 1) |
155 self.fill_distance = 1 # % |
157 self.fill_distance = 1 # % |
156 self.fill_slant = 0 # degrees |
158 self.fill_slant = 0 # degrees |
157 self.pen_thickness = 0.3 # mm |
159 self.pen_thickness = 0.3 # mm |
158 |
160 |
159 def IN(self): |
161 def IN(self): |
160 """ Initialize """ |
162 """ Initialize """ |
161 self.DF() |
163 self.DF() |
162 self.pen_state = "up" |
164 self.pen_state = "up" |
163 self.rotation = 0 #degrees |
165 self.rotation = 0 # degrees |
164 self.scaling_points = self.get_scaling_points_for_paper() |
166 self.scaling_points = self.get_scaling_points_for_paper() |
165 |
167 |
166 def IP(self): |
168 def IP(self): |
167 """ Input Scale Point""" |
169 """ Input Scale Point""" |
168 values = self.extract_value() |
170 values = self.extract_value() |
228 def AA(self): |
230 def AA(self): |
229 """ Arc Absolute """ |
231 """ Arc Absolute """ |
230 values = self.extract_value() |
232 values = self.extract_value() |
231 if len(values) in [3, 4]: |
233 if len(values) in [3, 4]: |
232 x, y, qc = values[:3] |
234 x, y, qc = values[:3] |
233 if len(values)==4: |
235 if len(values) == 4: |
234 qd = values[-1] |
236 qd = values[-1] # noqa |
235 else: |
237 else: |
236 qd = self.chord_ang |
238 qd = self.chord_ang # noqa |
237 # TODO : plot arc |
239 # TODO : plot arc |
238 print("plotting an arc") |
240 # print("plotting an arc") |
|
241 |
239 def AR(self): |
242 def AR(self): |
240 """ Arc Relative """ |
243 """ Arc Relative """ |
241 values = self.extract_value() |
244 # values = self.extract_value() |
242 # TODO |
245 # TODO |
243 |
246 |
244 def CI(self): |
247 def CI(self): |
245 """ Circle Plot""" |
248 """ Circle Plot""" |
246 values = self.extract_value() |
249 # values = self.extract_value() |
247 # TODO |
250 # TODO |
248 |
251 |
249 def EA(self): |
252 def EA(self): |
250 """Edge Rectangle Absolute""" |
253 """Edge Rectangle Absolute""" |
251 values = self.extract_value() |
254 # values = self.extract_value() |
252 # TODO |
255 # TODO |
253 |
256 |
254 def ER(self): |
257 def ER(self): |
255 """Edge Rectangle Relative""" |
258 """Edge Rectangle Relative""" |
256 values = self.extract_value() |
259 # values = self.extract_value() |
257 # TODO |
260 # TODO |
258 |
261 |
259 def EW(self): |
262 def EW(self): |
260 """ Edge Wedge """ |
263 """ Edge Wedge """ |
261 values = self.extract_value() |
264 # values = self.extract_value() |
262 # TODO |
265 # TODO |
263 |
266 |
264 def RA(self): |
267 def RA(self): |
265 """ Fill Rectangle Absolute """ |
268 """ Fill Rectangle Absolute """ |
266 values = self.extract_value() |
269 # values = self.extract_value() |
267 # TODO |
270 # TODO |
268 |
271 |
269 def RR(self): |
272 def RR(self): |
270 """ Fill Rectangle Relative """ |
273 """ Fill Rectangle Relative """ |
271 values = self.extract_value() |
274 # values = self.extract_value() |
272 # TODO |
275 # TODO |
273 |
276 |
274 def WG(self): |
277 def WG(self): |
275 """ Fill Wedge """ |
278 """ Fill Wedge """ |
276 values = self.extract_value() |
279 # values = self.extract_value() |
277 # TODO |
280 # TODO |
278 |
281 |
279 def FT(self): |
282 def FT(self): |
280 """ Fill Type """ |
283 """ Fill Type """ |
281 values = self.extract_value() |
284 # values = self.extract_value() |
282 # TODO |
285 # TODO |
283 |
286 |
284 def LT(self): |
287 def LT(self): |
285 """ Line Type """ |
288 """ Line Type """ |
286 values = self.extract_value() |
289 values = self.extract_value() |
287 |
290 |
288 if len(values)==0: |
291 if len(values) == 0: |
289 self.line_type = 0 #'solid' |
292 self.line_type = 0 # 'solid' |
290 else: |
293 else: |
291 self.line_type = values[0] |
294 self.line_type = values[0] |
292 if len(values)>1: |
295 if len(values) > 1: |
293 self.pattern_len = values[1] |
296 self.pattern_len = values[1] |
294 |
297 |
295 def PW(self): |
298 def PW(self): |
296 """ Pen Width """ |
299 """ Pen Width """ |
297 values = self.extract_value() |
300 values = self.extract_value() |
372 values = self.extract_string() |
377 values = self.extract_string() |
373 self.plot_string(values) |
378 self.plot_string(values) |
374 x, y = self.pos |
379 x, y = self.pos |
375 values = values.split('\n') |
380 values = values.split('\n') |
376 if self.char_size == "absolute": |
381 if self.char_size == "absolute": |
377 x += len(values[-1]) * self.char_width *1016/2.54 |
382 x += len(values[-1]) * self.char_width * 1016 / 2.54 |
378 y += (len(values)-1) * self.char_height *1016/2.54 |
383 y += (len(values)-1) * self.char_height * 1016 / 2.54 |
379 else: |
384 else: |
380 x0, x1, y0, y1 = self.scale |
385 x0, x1, y0, y1 = self.scale |
381 dx = x1-x0 |
386 dx = x1-x0 |
382 dy = y1-y0 |
387 dy = y1-y0 |
383 x += len(values[-1]) * self.char_width / 100.0 * dx |
388 x += len(values[-1]) * self.char_width / 100.0 * dx |
384 y += (len(values)-1) * self.char_height / 100.0 * dy |
389 y += (len(values)-1) * self.char_height / 100.0 * dy |
385 |
390 |
386 #print "LB pos[%s] %s -> %s"%(repr(values), self.pos, (x,y)) |
|
387 self.pos = [x, y] |
391 self.pos = [x, y] |
388 |
392 |
389 def get_char_size(self): |
393 def get_char_size(self): |
390 if self.char_size == "absolute": |
394 if self.char_size == "absolute": |
391 x = self.char_width *1016/2.54 |
395 x = self.char_width * 1016 / 2.54 |
392 y = self.char_height *1016/2.54 |
396 y = self.char_height * 1016 / 2.54 |
393 else: |
397 else: |
394 x0, x1, y0, y1 = self.scale |
398 x0, x1, y0, y1 = self.scale |
395 dx = x1-x0 |
399 dx = x1-x0 |
396 dy = y1-y0 |
400 dy = y1-y0 |
397 x = self.char_width / 100.0 * dx |
401 x = self.char_width / 100.0 * dx |
400 |
404 |
401 def DI(self): |
405 def DI(self): |
402 """ Absolute Direction """ |
406 """ Absolute Direction """ |
403 values = self.extract_value() |
407 values = self.extract_value() |
404 if len(values) == 0: |
408 if len(values) == 0: |
405 self.char_direction = 1.0, 0.0 |
409 self.char_direction = (1.0, 0.0) |
406 elif len(values) == 2: |
410 elif len(values) == 2: |
407 self.char_direction = values |
411 self.char_direction = values |
408 |
412 |
409 def DR(self): |
413 def DR(self): |
410 """ Relative Direction """ |
414 """ Relative Direction """ |
411 values = self.extract_value() |
415 values = self.extract_value() |
412 if len(values) == 0: |
416 if len(values) == 0: |
413 self.char_direction = 1.0, 0.0 |
417 self.char_direction = (1.0, 0.0) |
414 elif len(values) == 2: |
418 elif len(values) == 2: |
415 # TODO : compute as percentages |
419 # TODO : compute as percentages |
416 self.char_direction = values |
420 self.char_direction = values |
417 |
421 |
418 def CP(self): |
422 def CP(self): |
421 # TODO |
425 # TODO |
422 if len(values) == 0: |
426 if len(values) == 0: |
423 values = 0, 1 |
427 values = 0, 1 |
424 x, y = self.pos |
428 x, y = self.pos |
425 if self.char_size == "absolute": |
429 if self.char_size == "absolute": |
426 x += values[0] * self.char_width *1016/2.54 |
430 x += values[0] * self.char_width * 1016 / 2.54 |
427 y += values[1] * self.char_height *1016/2.54 |
431 y += values[1] * self.char_height * 1016 / 2.54 |
428 else: |
432 else: |
429 x0, x1, y0, y1 = self.scale |
433 x0, x1, y0, y1 = self.scale |
430 dx = x1-x0 |
434 dx = x1-x0 |
431 dy = y1-y0 |
435 dy = y1-y0 |
432 x += values[0] * self.char_width / 100.0 * dx |
436 x += values[0] * self.char_width / 100.0 * dx |
433 y += values[1] * self.char_height / 100.0 * dy |
437 y += values[1] * self.char_height / 100.0 * dy |
434 #print "CB pos[%s] %s -> %s"%(repr(values), self.pos, (x,y)) |
|
435 self.pos = [x, y] |
438 self.pos = [x, y] |
436 |
439 |
437 def SI(self): |
440 def SI(self): |
438 """ Set Absolute Character Size """ |
441 """ Set Absolute Character Size """ |
439 values = self.extract_value() |
442 values = self.extract_value() |
440 self.char_size = "absolute" |
443 self.char_size = "absolute" |
441 if len(values) == 0: |
444 if len(values) == 0: |
442 self.char_width = 0.1879 # cm |
445 self.char_width = 0.1879 # cm |
443 self.char_height = 0.2690 # cm |
446 self.char_height = 0.2690 # cm |
444 elif len(values) == 2: |
447 elif len(values) == 2: |
445 self.char_width, self.char_height = values |
448 self.char_width, self.char_height = values |
446 |
449 |
447 def SR(self): |
450 def SR(self): |
448 """ Set Relative Character Size """ |
451 """ Set Relative Character Size """ |
449 values = self.extract_value() |
452 values = self.extract_value() |
450 self.char_size = "relative" |
453 self.char_size = "relative" |
451 if len(values) == 0: |
454 if len(values) == 0: |
452 self.char_width = 0.75 # percentage |
455 self.char_width = 0.75 # percentage |
453 self.char_height = 1.5 # id |
456 self.char_height = 1.5 # id |
454 elif len(values) == 2: |
457 elif len(values) == 2: |
455 self.char_width, self.char_height = values |
458 self.char_width, self.char_height = values |
456 |
459 |
457 def SL(self): |
460 def SL(self): |
458 """ Character Slant """ |
461 """ Character Slant """ |
459 values = self.extract_value() |
462 # values = self.extract_value() |
460 # TODO |
463 # TODO |
|
464 pass |
461 |
465 |
462 def UC(self): |
466 def UC(self): |
463 """ User Defined Character """ |
467 """ User Defined Character """ |
464 values = self.extract_value() |
468 # values = self.extract_value() |
465 # TODO |
469 # TODO |
|
470 pass |
|
471 |
466 |
472 |
467 if __name__ == '__main__': |
473 if __name__ == '__main__': |
468 import sys |
474 import sys |
469 data = open(sys.argv[1]).read() |
475 data = open(sys.argv[1]).read() |
470 |
476 |