--- /usr/local/lib/sketch-0.6.14/Plugins/Filters/cgmloader.py 2002-10-24 14:18:44.000000000 +0200 +++ cgmloader.py 2002-11-08 13:28:46.000000000 +0100 @@ -16,7 +16,8 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # -# $Id: cgmloader.py,v 1.1.2.1 2002/08/31 19:21:30 bherzog Exp $ +# $Id: cgmloader.py,v 1.1.4.4 2002/11/08 12:18:42 apardon Exp apardon $ +################################################################################ ###Sketch Config @@ -148,7 +149,35 @@ cp = copy.deepcopy fntlst = map(lambda l: l[0], Sketch.Graphics.font.fontlist) +#print fntlst +fntalias = { + 'AvantGarde' : () , + 'Bookman' : ('Brooklyn',) , + 'Courier' : ('Fixed',) , + 'Helvetica' : ('Arial' , 'Swiss' , 'Switzerland' , 'Monospace') , + 'NewCenturySchlbk' : ('NewBrunswick' , 'NewCenturion') , + 'Palatino' : ('PalmSprings' , 'Zapf Calligraphic') , + 'Times' : ('Dutch' , 'Times New Roman') , + 'Symbol' : ('GreekMathSYmbols',) , + 'ZapfChancery' : ('ZurichCalligraphic',) , + 'ZapfDingbats' : ('Dixieland',) , + 'URWGothicL' : ('Block',) , + 'CenturySchL' : ('NewBrunswick' , 'WordPerfect' , 'Centurion') , + 'URWBookmanL' : () , + 'Dingbats' : () , + 'NimbusSanL' : () , + 'NimbusRomNo9L' : () , + 'NimbusMonL' : () , + 'URWPalladioL' : () , + 'StandardSymL' : () , + 'URWChanceryL' : () , + 'Utopia' : ('Univers' , ) , + 'CharterBT' : ('Bernhard Modern BT' , 'Blackletter' , 'Brush' , + 'GeometricSlabSerif' , 'Humanist' , 'Onyx') +} + + class cgminfo: def __init__(self): pass @@ -213,6 +242,50 @@ Table[i] = (red / mc, grn / mc, blu / mc) return Table +def strmatch(s1, s2): + + s1 = list(s1.lower()) + s2 = list(s2.lower()) + len1 = len(s1) + len2 = len(s2) + for i in range(len1): + if not s1[i].isalnum(): + s1[i] = ' ' + for i in range(len2): + if not s2[i].isalnum(): + s2[i] = ' ' + mat = (len1 + 1) * [0] + for i in range(len1 + 1): + mat[i] = (len2 + 1) * [0] + for i in range(len1 + 1): + mat[i][0] = i + for i in range(len2 + 1): + mat[0][i] = i + for i in range(1, len1 + 1): + for j in range(1 , len2 + 1): + t = min(mat[i - 1][j] , mat[i][j - 1]) + 1 + if s1[i - 1] == s2[j - 1]: + t = min(t , mat[i - 1][j - 1]) + mat[i][j] = t + x = len1 + y = len2 + dx = 0 + dy = 0 + while x * y != 0: + if s1[x - 1] == s2[y - 1]: + x = x - 1 + y = y - 1 + else: + if mat[x - 1][y] < mat[x][y - 1]: + x = x - 1 + dx = dx + 1 + else: + y = y - 1 + dy = dy + 1 + dx = x + dx + dy = y + dy + return dx + dy + init = cgminfo() dflt = cgminfo() curr = cgminfo() @@ -285,7 +358,7 @@ def __init__(self, file, filename, match): GenericLoader.__init__(self, file, filename, match) self.file = file - self.verbosity = 1 + self.verbosity = 15 self.IntF = (self.i8, self.i16, self.i24, self.i32) self.CardF = (self.u8, self.u16, self.u24, self.u32) self.FloatF = (self.flp32, self.flp64) @@ -293,8 +366,8 @@ self.RealF = self.FixedF + self.FloatF self.VDCF = (self.IntF, self.RealF) - def _print(self, format, *args, **kw): - if self.verbosity: + def _print(self, pl , format, *args, **kw): + if pl <= self.verbosity: try: if kw: text = format % kw @@ -386,12 +459,13 @@ # 0x0020: def BEGMF(self, size): - print '---------------------------------------------------------' + self._print(10 , '======= 0.1 =======') global dflt, reff dflt = cp(init) reff = dflt self.document() self.fntmap = range(78) + self.fntmap.insert(0,0) # 0x0040: def ENDMF(self, size): @@ -552,16 +626,36 @@ # 0x1180: def mfdfltrpl(self, size): - print size self.interpret(size) # 0x11a0: def fontlist(self, size): tot = 0 + fntinx = 1 while tot < size: fontname = self.getstr() + bsteval = 100 + bstinx = 0 + for inx in range(len(fntlst)): + fntname = fntlst[inx] + baseinx = fntname.find('-') + if baseinx == -1: + baseinx = len(fntname) + basename = fntname[0:baseinx] + postfix = fntname[baseinx:] + self._print(20 , "fontname = %s; basename = %s; postfix = %s\n" , fntname , basename , postfix) + self._print(30 , "base = %s; baselst = %s\n" , basename , fntalias.get(basename , ())) + baselst = (basename,) + fntalias.get(basename , ()) + for suffix in ["" , "-Roman" , "-Regular" , "-Book"]: + for base in baselst: + score = strmatch(fontname + suffix , base + postfix) + if score < bsteval: + bsteval = score + bstinx = inx + self.fntmap[fntinx] = bstinx tot = tot + len(fontname) + 1 - print 'font =>' , fontname + self._print(10 , 'font[%d]: %s => %s = %s\n' , fntinx , fontname , fntlst[bstinx] , fntlst[self.fntmap[fntinx]]) + fntinx = fntinx + 1 # 0x2020: 'scalemode', @@ -572,7 +666,7 @@ else: reff.scale.metric = self.flp32() if reff.scale.mode == 1 and reff.scale.metric == 0: - print "Scale metric set to zero; mode set back to absolute" + self._print(10 , "Scale metric set to zero; mode set back to absolute") reff.scale.mode = 0 # 0x2040: @@ -606,7 +700,6 @@ height = 1 sc = reff.scale.metric * 72 / 25.4 self.Scale = sc - print "Scale = ", sc self.trafo = Scale(sign(width)*sc , sign(height)*sc)(Translation(-left , -bottom)) # 0x20c0: @@ -703,7 +796,7 @@ Px = Point(reff.text.orientation[1]).normalized() B = transform_base(Point(0.0, 0.0) , reff.text.expansion * Px , Py) self.style = basestyle.Duplicate() - self.style.font = GetFont(fntlst[reff.text.fontindex]) + self.style.font = GetFont(fntlst[self.fntmap[reff.text.fontindex]]) self.style.font_size = reff.text.height * self.Scale self.style.fill_pattern = SolidPattern(apply(CreateRGBColor , reff.text.color)) O = text.SimpleText(text = S, trafo = T(B), @@ -898,6 +991,11 @@ def markercolr(self, size): reff.marker.color = self.getcol() +# 0x5140: 'textfontindex', + def textfontindex(self, size): + reff.text.fontindex = self.Inx() + self._print(10 , 'font[%d]: => %s\n' , reff.text.fontindex , fntlst[self.fntmap[reff.text.fontindex]]) + # 0x5180: 'charexpan', def charexpan(self,size): reff.text.expansion = self.Real() @@ -968,9 +1066,9 @@ size = self.u16() hdsz = 4 pdsz = ((size + 1) / 2) * 2 - # self._print('%4x at %5d) %5d(%5d): %4x: %s' % (head, pos, size, pdsz, Id, CGM_ID.get(Id, ''))) + self._print(20 , '%4x at %5d) %5d(%5d): %4x: %s' , head, pos, size, pdsz, Id, CGM_ID.get(Id, '')) if hasattr(self, CGM_ID.get(Id, '')): - # self._print('Calling %s' % (CGM_ID.get(Id, ''))) + self._print(30 , 'Calling %s' % (CGM_ID.get(Id, ''))) getattr(self, CGM_ID[Id])(size) else: if Id: @@ -978,13 +1076,13 @@ name = CGM_ID.get(Id, '') Class = Id >> 12 Elem = (Id & 0x0fff) >> 5 - self._print('*** unimplemented: %4x; class = %d, element = %2d %s' - % (Id , Class , Elem, name)) + self._print(2, '*** unimplemented: %4x; class = %d, element = %2d %s' + , Id , Class , Elem, name) pos = pos + hdsz + pdsz if tell() < pos: self.file.read(pos - tell()) elif tell() > pos: - self._print('read too many bytes') + self._print(2, 'read too many bytes') self.file.seek(pos - tell(), 1) if pos != tell(): raise SketchLoadError("Lost position in File")