# # Copyright (c) 2004 Art Haas # # This file is part of PythonCAD. # # PythonCAD 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. # # PythonCAD 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 PythonCAD; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # import time from PythonCAD.Generic import plotfile from PythonCAD.Generic import units papersizes = { # see 'gs_statd.ps' from Ghostscript 'letter' : (612, 792), 'legal' : (612, 1008), 'tabloid' : (792, 1224), 'csheet' : (1224, 1584), 'dsheet' : (1584, 2448), 'esheet' : (2448, 3168), 'a0' : (2384, 3370), 'a1' : (1684, 2384), 'a2' : (1191, 1684), 'a3' : (842, 1191), 'a4' : (595, 842), 'a5' : (420, 595), 'b0' : (2835, 4008), 'b1' : (2004, 2835), 'b2' : (1417, 2004), 'b3' : (1001, 1417), 'b4' : (709, 1001), 'b5' : (499, 709), 'b6' : (354, 499), 'jisb0' : (2920, 4127), 'jisb1' : (2064, 2920), 'jisb2' : (1460, 2064), 'jisb3' : (1032, 1460), 'jisb4' : (729, 1032), 'jisb5' : (516, 729), 'jisb6' : (363, 516), 'c0' : (2599, 3677), 'c1' : (1837, 2599), 'c2' : (1298, 1837), 'c3' : (918, 1298), 'c4' : (649, 918), 'c5' : (459, 649), 'c6' : (323, 459), 'archE' : (2592, 3456), 'archD' : (1728, 2592), 'archC' : (1296, 1728), 'archB' : (864, 1296), 'archA' : (648, 864), } class PSPlot(object): """A class for generating PostScript output """ # # all papersizes below are defined for portrait printing # # some sizes taken from 'gs_statd.ps' Ghostscript file # __papersizes = { 'exact' : (0, 0), 'letter' : (612, 792), 'legal' : (612, 1008), 'tabloid' : (792, 1224), 'csheet' : (1224, 1584), 'dsheet' : (1584, 2448), 'esheet' : (2448, 3168), 'a0' : (2384, 3370), 'a1' : (1684, 2384), 'a2' : (1191, 1684), 'a3' : (842, 1191), 'a4' : (595, 842), 'a5' : (420, 595), 'b0' : (2835, 4008), 'b1' : (2004, 2835), 'b2' : (1417, 2004), 'b3' : (1001, 1417), 'b4' : (709, 1001), 'b5' : (499, 709), 'b6' : (354, 499), 'jisb0' : (2920, 4127), 'jisb1' : (2064, 2920), 'jisb2' : (1460, 2064), 'jisb3' : (1032, 1460), 'jisb4' : (729, 1032), 'jisb5' : (516, 729), 'jisb6' : (363, 516), 'c0' : (2599, 3677), 'c1' : (1837, 2599), 'c2' : (1298, 1837), 'c3' : (918, 1298), 'c4' : (649, 918), 'c5' : (459, 649), 'c6' : (323, 459), 'archE' : (2592, 3456), 'archD' : (1728, 2592), 'archC' : (1296, 1728), 'archB' : (864, 1296), 'archA' : (648, 864), } # # PostScript units are points : 72 points per inch # # note: 25.4 mm/inch __scale = { units.MILLIMETERS : '72 25.4 div', units.MICROMETERS : '72 25.4 1000 mul div', units.METERS : '72 25.4 1000 div div', units.KILOMETERS : '72 25.4 1000 1000 mul mul div', units.INCHES : '72', units.FEET : '72 12 mul', units.YARDS : '72 36 mul', units.MILES : '72 12 5280 mul mul' } def __init__(self, plot): if not isinstance(plot, plotfile.Plot): raise TypeError, "Invalid Plot object: " + `plot` self.__plot = plot self.__bounds = None self.__size = None self.__scale = None self.__factor = None def finish(self): self.__plot = None def _getBounds(self): if self.__bounds is not None: return _bounds = self.__plot.getBounds() if _bounds is None: raise ValueError, "Plot boundary not defined." self.__bounds = _bounds def setSize(self, size): if self.__size is not None: return if not isinstance(size, str): raise TypeError, "Invalid plot size string: " + `size` if size not in PSPlot.__papersizes: raise KeyError, "Invalid plot size: %s" % size self.__size = size def getPaperSizes(self): return PSPlot.__papersizes.keys() def getPaperSize(self): if self.__size is None: raise ValueError, "Paper size not defined." return PSPlot.__papersizes[self.__size] def _calcScale(self): if self.__scale is not None: return if self.__size is None: raise ValueError, "Paper size not defined." _plot = self.__plot _bounds = self.__bounds if _bounds is None: _bounds = _plot.getBounds() if _bounds is None: raise ValueError, "Plot boundary not defined." _xmin, _ymin, _xmax, _ymax = _bounds # print "xmin: %g" % _xmin # print "ymin: %g" % _ymin # print "xmax: %g" % _xmax # print "ymax: %g" % _ymax _w, _h = PSPlot.__papersizes[self.__size] if _plot.getLandscapeMode(): _w, _h = _h, _w # print "w: %d; h: %d" % (_w, _h) _units = _plot.getUnits() # print "units: %d" % _units if _units == units.MILLIMETERS: _fac = 72.0/25.4 elif _units == units.MICROMETERS: _fac = 72.0/(25.4 * 1000.0) elif _units == units.METERS: _fac = 72.0/(25.4/1000.0) elif _units == units.INCHES: _fac = 72.0 elif _units == units.FEET: _fac = 72.0 * 12 elif _units == units.YARDS: _fac = 72.0 * 36 elif _units == units.MILES: _fac = 72.0 * 12 * 5280 else: raise ValueError, "Unexpected unit: %s" % _units self.__factor = _fac # print "factor: %g" % _fac if _w == 0 and _h == 0: _ymin = 0 _xmin = 0 _s = 1 else: _xs = _fac * ((_xmax - _xmin)/float(_w)) _ys = _fac * ((_ymax - _ymin)/float(_h)) # print "xs: %g; ys: %g" % (_xs, _ys) _s = 1.0/max(_xs, _ys) self.__scale = _s # print "scale: %g" % self.__scale self.__matrix = ((_s * _fac), -(_xmin * _s * _fac), -(_ymin * _s * _fac)) # print "matrix: " + str(self.__matrix) def write(self, f): if False and not isinstance(f, file): raise TypeError, "Invalid file object: " + `f` if self.__size is None: raise ValueError, "Plot size not defined" self._getBounds() _xmin, _ymin, _xmax, _ymax = self.__bounds self._calcScale() _w, _h = PSPlot.__papersizes[self.__size] _plot = self.__plot if _plot.getLandscapeMode(): _w, _h = _h, _w # # header # f.write("%!PS-Adobe-1.0\n") f.write("%%Creator: PythonCAD\n") f.write("%%CreationDate: %s\n" % time.asctime()) f.write("%%BoundingBox: 0 0 %d %d\n" % (_w, _h)) f.write("%%EndComments\n") # add in Prologue _funcs = """% /m {transform round exch round exch itransform moveto} bind def /l {transform round exch round exch itransform lineto} bind def % /ljust { 0 begin /s exch def /y exch def /x exch def x y m s show end } def /ljust load 0 3 dict put % /cjust { 0 begin /s exch def /w exch def /y exch def /x exch def /dx {w s stringwidth pop 2 div sub} def x dx add y m s show end } def /cjust load 0 5 dict put % /rjust { 0 begin /s exch def /w exch def /y exch def /x exch def /dx {w s stringwidth pop sub} def x dx add y m s show end } def /rjust load 0 5 dict put """ f.write("%s" % _funcs) f.write("%\n% Plot specs\n%\n") f.write("%% (xmin, ymin): (%g, %g)\n" % (_xmin, _ymin)) f.write("%% (xmax, ymax): (%g, %g)\n" % (_xmax, _ymax)) f.write("%%\n%% unit scale factor: %g\n" % self.__factor) f.write("%% fit factor: %g\n" % self.__scale) f.write("%%EndProlog\n") f.write("%\n% Line defaults\n%\n") f.write("1 setlinecap\n") f.write("1 setlinejoin\n") if _plot.getLandscapeMode(): f.write("%\n% Landscape mode transformation\n%\n") f.write("90 rotate\n0 -%d translate\n" % _h) # # draw entities # if 'segments' in _plot: self._write_segments(f, _plot) if 'circles' in _plot: self._write_circles(f, _plot) if 'arcs' in _plot: self._write_arcs(f, _plot) if 'leaders' in _plot: self._write_leaders(f, _plot) if 'polylines' in _plot: self._write_polylines(f, _plot) if 'chamfers' in _plot: self._write_chamfers(f, _plot) if 'fillets' in _plot: self._write_fillets(f, _plot) if 'textblocks' in _plot: self._write_textblocks(f, _plot) if 'ldims' in _plot: self._write_ldims(f, _plot) if 'rdims' in _plot: self._write_rdims(f, _plot) if 'adims' in _plot: self._write_adims(f, _plot) f.write("showpage\n") f.flush() def _write_graphic_data(self, f, c, l, t): if c is not None: if not isinstance(c, tuple): raise TypeError, "Color argument not a tuple: " + str(c) if len(c) != 3: raise ValueError, "Unexpected color tuple length: " + str(c) if c[0] != 0 or c[1] != 0 or c[2] != 0: _r = c[0]/255.0 _g = c[1]/255.0 _b = c[2]/255.0 f.write("%.06f %.06f %.06f setrgbcolor\n" % (_r, _g, _b)) if l is not None: if not isinstance(l, list): raise TypeError, "Linetype argument not a list: " + str(l) f.write("[") for _i in l: if not isinstance(_i, int): raise TypeError, "Invalid dash list type: " + str(_i) f.write(" %d " % _i) f.write("] 0 setdash\n") _th = int(t * self.__factor * self.__scale) if _th < 1: _th = 1 f.write("%d setlinewidth\n" % _th) def _write_segments(self, f, plot): f.write("%\n% segments\n%\n") _sf, _dx, _dy = self.__matrix for _s in plot.getPlotEntities('segments'): _x1, _y1, _x2, _y2, _c, _lt, _t = _s f.write("%\n% data:\n") f.write("%% (x1, y1): (%g, %g)\n" % (_x1, _y1)) f.write("%% (x2, y2): (%g, %g)\n" % (_x2, _y2)) f.write("gsave\n") self._write_graphic_data(f, _c, _lt, _t) _xt = (_x1 * _sf) + _dx _yt = (_y1 * _sf) + _dy f.write("%g %g m\n" % (_xt, _yt)) _xt = (_x2 * _sf) + _dx _yt = (_y2 * _sf) + _dy f.write("%g %g l\n" % (_xt, _yt)) f.write("stroke\ngrestore\n") def _write_circles(self, f, plot): f.write("%\n% circles\n%\n") _sf, _dx, _dy = self.__matrix for _c in plot.getPlotEntities('circles'): _x, _y, _r, _c, _lt, _t = _c f.write("%\n% data:\n") f.write("%% (xc, yc): (%g, %g)\n" % (_x, _y)) f.write("%% radius: %g\n" % _r) f.write("gsave\n") self._write_graphic_data(f, _c, _lt, _t) _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy _rt = _r * _sf f.write("%g %g %g 0 360 arc\n" % (_xt, _yt, _rt)) f.write("stroke\ngrestore\n") def _write_arcs(self, f, plot): f.write("%\n% arcs\n%\n") _sf, _dx, _dy = self.__matrix for _a in plot.getPlotEntities('arcs'): _x, _y, _r, _sa, _ea, _c, _lt, _t = _a f.write("%\n% data:\n") f.write("%% (xc, yc): (%g, %g)\n" % (_x, _y)) f.write("%% radius: %g\n" % _r) f.write("%% start angle: %g\n" % _sa) f.write("%% end angle: %g\n" % _ea) f.write("gsave\n") self._write_graphic_data(f, _c, _lt, _t) _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy _rt = _r * _sf f.write("%g %g %g %g %g arc\n" % (_xt, _yt, _rt, _sa, _ea)) f.write("stroke\ngrestore\n") def _write_leaders(self, f, plot): f.write("%\n% leaders\n%\n") _sf, _dx, _dy = self.__matrix for _l in plot.getPlotEntities('leaders'): _x1, _y1, _x2, _y2, _x3, _y3, _ax1, _ay1, _ax2, _ay2, _c, _lt, _t = _l f.write("%\n% data:\n") f.write("%% (x1, y1): (%g, %g)\n" % (_x1, _y1)) f.write("%% (x2, y2): (%g, %g)\n" % (_x2, _y2)) f.write("%% (x3, y3): (%g, %g)\n" % (_x3, _y3)) f.write("%\n% arrow pts:%\n") f.write("%% (x1, y1): (%g, %g)\n" % (_ax1, _ay1)) f.write("%% (x2, y2): (%g, %g)\n" % (_ax2, _ay2)) f.write("gsave\n") self._write_graphic_data(f, _c, _lt, _t) _xt = (_x1 * _sf) + _dx _yt = (_y1 * _sf) + _dy f.write("%g %g m\n" % (_xt, _yt)) _xt = (_x2 * _sf) + _dx _yt = (_y2 * _sf) + _dy f.write("%g %g l\n" % (_xt, _yt)) _xt = (_x3 * _sf) + _dx _yt = (_y3 * _sf) + _dy f.write("%g %g l\n" % (_xt, _yt)) f.write("currentpoint\nstroke\nmoveto\n") _xt = (_ax1 * _sf) + _dx _yt = (_ay1 * _sf) + _dy f.write("%g %g l\n" % (_xt, _yt)) _xt = (_ax2 * _sf) + _dx _yt = (_ay2 * _sf) + _dy f.write("%g %g l\n" % (_xt, _yt)) f.write("closepath\nfill\ngrestore\n") def _write_polylines(self, f, plot): f.write("%\n% polylines\n%\n") _sf, _dx, _dy = self.__matrix for _p in plot.getPlotEntities('polylines'): _pts, _c, _lt, _t = _p f.write("%\n% data:\n") f.write("%% length: %d\n" % len(_pts)) for _pt in _pts: f.write("%% (x, y): (%g, %g)\n" % (_pt[0], _pt[1])) f.write("gsave\n") self._write_graphic_data(f, _c, _lt, _t) _x, _y = _pts[0] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g m\n" % (_xt, _yt)) for _t in _pts[1:]: _x, _y = _t _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g l\n" % (_xt, _yt)) f.write("stroke\ngrestore\n") def _write_chamfers(self, f, plot): f.write("%\n% chamfers\n%\n") _sf, _dx, _dy = self.__matrix for _c in plot.getPlotEntities('chamfers'): _x1, _y1, _x2, _y2, _c, _lt, _t = _c f.write("%\n% data:\n") f.write("%% (x1, y1): (%g, %g)\n" % (_x1, _y1)) f.write("%% (x2, y2): (%g, %g)\n" % (_x2, _y2)) f.write("gsave\n") self._write_graphic_data(f, _c, _lt, _t) _xt = (_x1 * _sf) + _dx _yt = (_y1 * _sf) + _dy f.write("%g %g m\n" % (_xt, _yt)) _xt = (_x2 * _sf) + _dx _yt = (_y2 * _sf) + _dy f.write("%g %g l\n" % (_xt, _yt)) f.write("stroke\ngrestore\n") def _write_fillets(self, f, plot): f.write("%\n% fillets\n%\n") _sf, _dx, _dy = self.__matrix for _f in plot.getPlotEntities('fillets'): _x, _y, _r, _sa, _ea, _c, _lt, _t = _f f.write("%\n% data:\n") f.write("%% (xc, yc): (%g, %g)\n" % (_x, _y)) f.write("%% radius: %g\n" % _r) f.write("%% start angle: %g\n" % _sa) f.write("%% end angle: %g\n" % _ea) f.write("gsave\n") self._write_graphic_data(f, _c, _lt, _t) _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy _rt = _r * _sf f.write("%g %g %g %g %g arc\n" % (_xt, _yt, _rt, _sa, _ea)) f.write("stroke\ngrestore\n") def _write_tblock(self, f, tbdata): _sf, _dx, _dy = self.__matrix _font = tbdata['font'] _size = tbdata['size'] _fontsize = _size * _sf f.write("/%s findfont %g scalefont setfont\n" % (_font, _fontsize)) _c = tbdata['color'] if _c is not None: if not isinstance(_c, tuple): raise TypeError, "Color argument not a tuple: " + str(_c) if len(_c) != 3: raise ValueError, "Unexpected color tuple length: " + str(_c) if _c[0] != 0 or _c[1] != 0 or _c[2] != 0: _r = _c[0]/255.0 _g = _c[1]/255.0 _b = _c[2]/255.0 f.write("%.06f %.06f %.06f setrgbcolor\n" % (_r, _g, _b)) _text = tbdata['text'] _align = tbdata['align'] _x, _y = tbdata['location'] _xt = (_x * _sf) + _dx _i = 1 if len(_text) == 1 or _align == 'left': for _t in _text: _yt = ((_y - (_i * _size)) * _sf) + _dy f.write("%g %g (%s) ljust\n" % (_xt, _yt, _t)) _i = _i + 1 else: _w, _h = tbdata['bounds'] _pw = _w * _sf # bounds width in points for _t in _text: _yt = ((_y - (_i * _size)) * _sf) + _dy if _align == 'center': f.write("%g %g %g (%s) cjust\n" % (_xt, _yt, _pw, _t)) else: f.write("%g %g %g (%s) rjust\n" % (_xt, _yt, _pw, _t)) _i = _i + 1 def _write_textblocks(self, f, plot): f.write("%\n% textblocks\n%\n") _sf, _dx, _dy = self.__matrix for _tbdata in plot.getPlotEntities('textblocks'): f.write("%\n% TextBlock:\n") f.write("%% (x, y): %s\n" % str(_tbdata['location'])) f.write("%% bounds: %s\n" % str(_tbdata['bounds'])) f.write("%% font: %s\n" % _tbdata['font']) f.write("%% color: %s\n" % str(_tbdata['color'])) f.write("%% alignment: %s\n" % _tbdata['align']) f.write("%% size: %g\n" % _tbdata['size']) f.write("%% text\n") for _t in _tbdata['text']: f.write("%%\t%s\n" % _t) f.write("%\n") f.write("gsave\n") self._write_tblock(f, _tbdata) f.write("grestore\n") def _write_dim_markers(self, f, mdata): _mtype = mdata['type'] _sf, _dx, _dy = self.__matrix if _mtype is not None: # # if 'rdim' is in the mdata dictionary, then the data # is for a RadialDimension and only the second marker # should be printed # _rdim = mdata.get('rdim') f.write("%%\n%% marker: %s\n" % _mtype) if _mtype == 'arrow': f.write("%% p1: %s\n" % str(mdata['p1'])) f.write("%% p2: %s\n" % str(mdata['p2'])) f.write("%% v1: %s\n" % str(mdata['v1'])) f.write("%% p3: %s\n" % str(mdata['p3'])) f.write("%% p4: %s\n" % str(mdata['p4'])) f.write("%% v2: %s\n" % str(mdata['v2'])) if _rdim is None: _x, _y = mdata['p1'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g m\n" % (_xt, _yt)) _x, _y = mdata['v1'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g l\n" % (_xt, _yt)) _x, _y = mdata['p2'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g l\nstroke\n" % (_xt, _yt)) # _x, _y = mdata['p3'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g m\n" % (_xt, _yt)) _x, _y = mdata['v2'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g l\n" % (_xt, _yt)) _x, _y = mdata['p4'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g l\nstroke\n" % (_xt, _yt)) elif _mtype == 'filled_arrow': f.write("%% p1: %s\n" % str(mdata['p1'])) f.write("%% p2: %s\n" % str(mdata['p2'])) f.write("%% v1: %s\n" % str(mdata['v1'])) f.write("%% p3: %s\n" % str(mdata['p3'])) f.write("%% p4: %s\n" % str(mdata['p4'])) f.write("%% v2: %s\n" % str(mdata['v2'])) if _rdim is None: _x, _y = mdata['p1'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g m\n" % (_xt, _yt)) _x, _y = mdata['p2'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g l\n" % (_xt, _yt)) _x, _y = mdata['v1'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g l\nclosepath\nfill\n" % (_xt, _yt)) # _x, _y = mdata['p3'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g m\n" % (_xt, _yt)) _x, _y = mdata['p4'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g l\n" % (_xt, _yt)) _x, _y = mdata['v2'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g l\nclosepath\nfill\n" % (_xt, _yt)) elif _mtype == 'slash': f.write("%% p1: %s\n" % str(mdata['p1'])) f.write("%% p2: %s\n" % str(mdata['p2'])) f.write("%% p3: %s\n" % str(mdata['p3'])) f.write("%% p4: %s\n" % str(mdata['p4'])) if _rdim is None: _x, _y = mdata['p1'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g m\n" % (_xt, _yt)) _x, _y = mdata['p2'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g l\nstroke\n" % (_xt, _yt)) # _x, _y = mdata['p3'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g m\n" % (_xt, _yt)) _x, _y = mdata['p4'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g l\nstroke\n" % (_xt, _yt)) elif _mtype == 'circle': f.write("%% radius: %g\n" % mdata['radius']) f.write("%% c1: %s\n" % str(mdata['c1'])) f.write("%% c2: %s\n" % str(mdata['c2'])) _r = mdata['radius'] if _rdim is None: _x, _y = mdata['c1'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy _rt = _r * _sf f.write("%g %g %g 0 360 arc\nfill\n" % (_xt, _yt, _rt)) # _x, _y = mdata['c2'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy _rt = _r * _sf f.write("%g %g %g 0 360 arc\nfill\n" % (_xt, _yt, _rt)) else: raise ValueError, "Unexpected marker type: %s" % _mtype def _write_dimstrings(self, f, dimdata): _sf, _dx, _dy = self.__matrix # # erase where the dim text will go # f.write("gsave\n") _tb1 = dimdata['ds1'] _tb2 = dimdata.get('ds2') _x, _y = _tb1['location'] _w, _h = _tb1['bounds'] if _tb2 is None: _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy _pw = _w * _sf _ph = _h * _sf f.write("%g %g m\n" % (_xt, _yt)) f.write("0 -%g rlineto\n" % _ph) f.write("%g 0 rlineto\n" % _pw) f.write("0 %g rlineto\n" % _ph) else: _x2, _y2 = _tb2['location'] _w2, _h2 = _tb2['bounds'] _xmin = min(_x, _x2) _xmax = max((_x + _w), (_x2 + _w2)) _ymin = _y2 - _h2 _ymax = _y _xt = (_xmin * _sf) + _dx _yt = (_ymin * _sf) + _dy f.write("%g %g m\n" % (_xt, _yt)) _xt = (_xmax * _sf) + _dx _yt = (_ymin * _sf) + _dy f.write("%g %g l\n" % (_xt, _yt)) _xt = (_xmax * _sf) + _dx _yt = (_ymax * _sf) + _dy f.write("%g %g l\n" % (_xt, _yt)) _xt = (_xmin * _sf) + _dx _yt = (_ymax * _sf) + _dy f.write("%g %g l\n" % (_xt, _yt)) f.write("closepath\n1 setgray fill\ngrestore\n") # # print ds1 dimension # f.write("%\n% DimString 1:\n") f.write("%% (x, y): %s\n" % str(_tb1['location'])) f.write("%% bounds: %s\n" % str(_tb1['bounds'])) f.write("%% font: %s\n" % _tb1['font']) f.write("%% color: %s\n" % str(_tb1['color'])) f.write("%% alignment: %s\n" % _tb1['align']) f.write("%% size: %g\n" % _tb1['size']) f.write("%% text\n") for _t in _tb1['text']: f.write("%%\t%s\n" % _t) f.write("gsave\n") self._write_tblock(f, _tb1) f.write("grestore\n") if _tb2 is not None: f.write("%\n% DimString 2:\n") f.write("%% (x, y): %s\n" % str(_tb2['location'])) f.write("%% bounds: %s\n" % str(_tb2['bounds'])) f.write("%% font: %s\n" % _tb2['font']) f.write("%% color: %s\n" % str(_tb2['color'])) f.write("%% alignment: %s\n" % _tb2['align']) f.write("%% size: %g\n" % _tb2['size']) f.write("%% text\n") for _t in _tb1['text']: f.write("%%\t%s\n" % _t) f.write("gsave\n") self._write_tblock(f, _tb2) f.write("grestore\n") def _write_ldims(self, f, plot): f.write("%\n% linear dimensions\n%\n") _sf, _dx, _dy = self.__matrix for _dimdata in plot.getPlotEntities('ldims'): f.write("%\n% data:\n") f.write("% first dimbar:\n") f.write("%% (x1, y1): %s\n" % str(_dimdata['ep1'])) f.write("%% (x2, y2): %s\n" % str(_dimdata['ep2'])) f.write("% second dimbar:\n") f.write("%% (x1, y1): %s\n" % str(_dimdata['ep3'])) f.write("%% (x2, y2): %s\n" % str(_dimdata['ep4'])) f.write("% crossbar:\n") f.write("%% (x1, y1): %s\n" % str(_dimdata['ep5'])) f.write("%% (x2, y2): %s\n" % str(_dimdata['ep6'])) f.write("gsave\n") _c = _dimdata['color'] _t = _dimdata['thickness'] self._write_graphic_data(f, _c, None, _t) _x, _y = _dimdata['ep1'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g m\n" % (_xt, _yt)) _x, _y = _dimdata['ep2'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g l\nstroke\n" % (_xt, _yt)) _x, _y = _dimdata['ep3'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g m\n" % (_xt, _yt)) _x, _y = _dimdata['ep4'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g l\nstroke\n" % (_xt, _yt)) _x, _y = _dimdata['ep5'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g m\n" % (_xt, _yt)) _x, _y = _dimdata['ep6'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g l\nstroke\n" % (_xt, _yt)) self._write_dim_markers(f, _dimdata['markers']) f.write("grestore\n") self._write_dimstrings(f, _dimdata) def _write_rdims(self, f, plot): f.write("%\n% radial dimensions\n%\n") _sf, _dx, _dy = self.__matrix for _dimdata in plot.getPlotEntities('rdims'): f.write("%\n% data:\n") f.write("% dimbar:\n") f.write("%% (x1, y1): %s)\n" % str(_dimdata['ep1'])) f.write("%% (x2, y2): %s)\n" % str(_dimdata['ep2'])) f.write("gsave\n") _c = _dimdata['color'] _t = _dimdata['thickness'] self._write_graphic_data(f, _c, None, _t) _x, _y = _dimdata['ep1'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g m\n" % (_xt, _yt)) _x, _y = _dimdata['ep2'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g l\nstroke\n" % (_xt, _yt)) self._write_dim_markers(f, _dimdata['markers']) f.write("grestore\n") self._write_dimstrings(f, _dimdata) def _write_adims(self, f, plot): f.write("%\n% angular dimensions\n%\n") _sf, _dx, _dy = self.__matrix for _dimdata in plot.getPlotEntities('adims'): f.write("%\n% data:\n") f.write("% first dimbar:\n") f.write("%% (x1, y1): %s\n" % str(_dimdata['ep1'])) f.write("%% (x2, y2): %s\n" % str(_dimdata['ep2'])) f.write("% second dimbar:\n") f.write("%% (x1, y1): %s\n" % str(_dimdata['ep3'])) f.write("%% (x2, y2): %s\n" % str(_dimdata['ep4'])) f.write("% crossarc:\n") f.write("%% (xc, yc): %s\n" % str(_dimdata['vp'])) f.write("%% radius: %g\n" % _dimdata['r']) f.write("%% start angle: %g\n" % _dimdata['sa']) f.write("%% end angle: %g\n" % _dimdata['ea']) f.write("gsave\n") _c = _dimdata['color'] _t = _dimdata['thickness'] self._write_graphic_data(f, _c, None, _t) _x, _y = _dimdata['ep1'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g m\n" % (_xt, _yt)) _x, _y = _dimdata['ep2'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g l\nstroke\n" % (_xt, _yt)) _x, _y = _dimdata['ep3'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g m\n" % (_xt, _yt)) _x, _y = _dimdata['ep4'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy f.write("%g %g l\nstroke\n" % (_xt, _yt)) _x, _y = _dimdata['vp'] _xt = (_x * _sf) + _dx _yt = (_y * _sf) + _dy _r = _dimdata['r'] _rt = _r * _sf _sa = _dimdata['sa'] _ea = _dimdata['ea'] f.write("%g %g %g %g %g arc\nstroke\n" % (_xt, _yt, _rt, _sa, _ea)) self._write_dim_markers(f, _dimdata['markers']) f.write("grestore\n") self._write_dimstrings(f, _dimdata)