index 8eacd40c602f245105e085502c9858437a6f099b..147027fb6d8b971f747af3919554cad1a67505b8 100644 (file)
It adds a text to the selected path containing the length in a
given unit.
+Copyright (C) 2010 Alvin Penner
Copyright (C) 2006 Georg Wiora
Copyright (C) 2006 Nathan Hurst
Copyright (C) 2005 Aaron Spike, aaron@ekips.org
lengths[-1].append(l)
total += l
return lengths, total
+def csparea(csp):
+ area = 0.0
+ n0 = 0.0
+ x0 = 0.0
+ y0 = 0.0
+ for sp in csp:
+ for i in range(len(sp)): # calculate polygon area
+ area += 0.5*sp[i-1][1][0]*(sp[i][1][1] - sp[i-2][1][1])
+ if abs(sp[i-1][1][0]-sp[i][1][0]) > 0.001 or abs(sp[i-1][1][1]-sp[i][1][1]) > 0.001:
+ n0 += 1.0
+ x0 += sp[i][1][0]
+ y0 += sp[i][1][1]
+ for i in range(1, len(sp)): # add contribution from cubic Bezier
+ bezarea = ( 0.0*sp[i-1][1][1] + 2.0*sp[i-1][2][1] + 1.0*sp[i][0][1] - 3.0*sp[i][1][1])*sp[i-1][1][0]
+ bezarea += (-2.0*sp[i-1][1][1] + 0.0*sp[i-1][2][1] + 1.0*sp[i][0][1] + 1.0*sp[i][1][1])*sp[i-1][2][0]
+ bezarea += (-1.0*sp[i-1][1][1] - 1.0*sp[i-1][2][1] + 0.0*sp[i][0][1] + 2.0*sp[i][1][1])*sp[i][0][0]
+ bezarea += ( 3.0*sp[i-1][1][1] - 1.0*sp[i-1][2][1] - 2.0*sp[i][0][1] + 0.0*sp[i][1][1])*sp[i][1][0]
+ area += 0.15*bezarea
+ return abs(area), x0/n0, y0/n0
class Length(inkex.Effect):
def __init__(self):
inkex.Effect.__init__(self)
+ self.OptionParser.add_option("--type",
+ action="store", type="string",
+ dest="type", default="length",
+ help="Type of measurement")
self.OptionParser.add_option("-f", "--fontsize",
action="store", type="int",
dest="fontsize", default=20,
a =[]
p = cubicsuperpath.parsePath(node.get('d'))
num = 1
- slengths, stotal = csplength(p)
- ''' Wio: Umrechnung in unit '''
- if self.options.unit=="mm":
- factor=25.4/90.0 # px->mm
- elif self.options.unit=="pt":
- factor=0.80 # px->pt
- elif self.options.unit=="cm":
- factor=25.4/900.0 # px->cm
- elif self.options.unit=="m":
- factor=25.4/90000.0 # px->m
- elif self.options.unit=="km":
- factor=25.4/90000000.0 # px->km
- elif self.options.unit=="in":
- factor=1.0/90.0 # px->in
- elif self.options.unit=="ft":
- factor=1.0/90.0/12.0 # px->ft
- elif self.options.unit=="yd":
- factor=1.0/90.0/36.0 # px->yd
- else :
- ''' Default unit is px'''
- factor=1
- self.options.unit="px"
-
+ factor = 1.0/inkex.unittouu('1'+self.options.unit)
+ if self.options.type == "length":
+ slengths, stotal = csplength(p)
+ else:
+ stotal,x0,y0 = csparea(p)
+ stotal *= factor*self.options.scale
# Format the length as string
lenstr = locale.format("%(len)25."+str(prec)+"f",{'len':round(stotal*factor*self.options.scale,prec)}).strip()
- self.addTextOnPath(self.group,0, 0,lenstr+' '+self.options.unit, id, self.options.offset)
+ if self.options.type == "length":
+ self.addTextOnPath(self.group,0, 0,lenstr+' '+self.options.unit, id, self.options.offset)
+ else:
+ self.addTextWithTspan(self.group,x0,y0,lenstr+' '+self.options.unit+'^2', id, self.options.offset)
def addTextOnPath(self,node,x,y,text, id,dy=0):
node.set('x', str(x))
node.set('y', str(y))
+ def addTextWithTspan(self,node,x,y,text,id,dy=0):
+ new = inkex.etree.SubElement(node,inkex.addNS('tspan','svg'), {inkex.addNS('role','sodipodi'): 'line'})
+ s = {'text-align': 'center', 'vertical-align': 'bottom',
+ 'text-anchor': 'middle', 'font-size': str(self.options.fontsize),
+ 'fill-opacity': '1.0', 'stroke': 'none',
+ 'font-weight': 'normal', 'font-style': 'normal', 'fill': '#000000'}
+ new.set('style', simplestyle.formatStyle(s))
+ new.set(inkex.addNS('href','xlink'), '#'+id)
+ new.set('startOffset', "50%")
+ new.set('dy', str(dy))
+ new.text = str(text)
+ node.set('x', str(x))
+ node.set('y', str(y))
+
if __name__ == '__main__':
e = Length()
e.affect()
-# vim: expandtab shiftwidth=4 tabstop=8 softtabstop=4 encoding=utf-8 textwidth=99
+# vim: expandtab shiftwidth=4 tabstop=8 softtabstop=4 fileencoding=utf-8 textwidth=99