From cb6a274dca37293697b0e5e8c57ed1d29882df7f Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Mon, 12 Mar 2012 17:57:44 -0400 Subject: extensions. measure path. add option to choose text angle (Bug 946098) Fixed bugs: - https://launchpad.net/bugs/946098 (bzr r11074) --- share/extensions/measure.inx | 22 +++++++++++++++++++++- share/extensions/measure.py | 37 ++++++++++++++++++++++++++----------- 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/share/extensions/measure.inx b/share/extensions/measure.inx index 63a919806..67d44616f 100644 --- a/share/extensions/measure.inx +++ b/share/extensions/measure.inx @@ -10,6 +10,25 @@ <_item value="length">Length <_item msgctxt="measure extension" value="area">Area + + <_item value="textonpath">Text On Path + <_item value="0">Angle 0 + <_item value="30">Angle 30 + <_item value="45">Angle 45 + <_item value="60">Angle 60 + <_item value="90">Angle 90 + <_item value="120">Angle 120 + <_item value="135">Angle 135 + <_item value="150">Angle 150 + <_item value="180">Angle 180 + <_item value="210">Angle 210 + <_item value="225">Angle 225 + <_item value="240">Angle 240 + <_item value="270">Angle 270 + <_item value="300">Angle 300 + <_item value="315">Angle 315 + <_item value="330">Angle 330 + 12 -6 2 @@ -29,8 +48,9 @@ - <_param name="measurehelp" type="description" xml:space="preserve">This effect measures the length, or area, of the selected path and adds it as a text-on-path object with the selected unit. + <_param name="measurehelp" type="description" xml:space="preserve">This effect measures the length, or area, of the selected paths and adds it as a text object with the selected units. + * Display format can be either Text-On-Path, or stand-alone text at a specified angle. * The number of significant digits can be controlled by the Precision field. * The Offset field controls the distance from the text to the path. * The Scale factor can be used to make measurements in scaled drawings. For example, if 1 cm in the drawing equals 2.5 m in the real world, Scale must be set to 250. diff --git a/share/extensions/measure.py b/share/extensions/measure.py index e1f8eab1d..415b21898 100755 --- a/share/extensions/measure.py +++ b/share/extensions/measure.py @@ -91,6 +91,10 @@ class Length(inkex.Effect): action="store", type="string", dest="type", default="length", help="Type of measurement") + self.OptionParser.add_option("--format", + action="store", type="string", + dest="format", default="textonpath", + help="Display Format") self.OptionParser.add_option("-f", "--fontsize", action="store", type="int", dest="fontsize", default=20, @@ -139,14 +143,6 @@ class Length(inkex.Effect): for id, node in self.selected.iteritems(): if node.tag == inkex.addNS('path','svg'): self.group = inkex.etree.SubElement(node.getparent(),inkex.addNS('text','svg')) - - # t = node.get('transform') - # Removed to fix LP #308183 - # (Measure Path text shifted when used with a copied object) - #if t: - # self.group.set('transform', t) - - a =[] mat = simpletransform.composeParents(node, [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]) p = cubicsuperpath.parsePath(node.get('d')) @@ -158,10 +154,16 @@ class Length(inkex.Effect): stotal = csparea(p)*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() - if self.options.type == "length": - self.addTextOnPath(self.group, 0, 0, lenstr+' '+self.options.unit, id, 'start', '50%', self.options.offset) + if self.options.format == 'textonpath': + if self.options.type == "length": + self.addTextOnPath(self.group, 0, 0, lenstr+' '+self.options.unit, id, 'start', '50%', self.options.offset) + else: + self.addTextOnPath(self.group, 0, 0, lenstr+' '+self.options.unit+'^2', id, 'start', '0%', self.options.offset) else: - self.addTextOnPath(self.group, 0, 0, lenstr+' '+self.options.unit+'^2', id, 'start', '0%', self.options.offset) + if self.options.type == "length": + self.addTextWithTspan(self.group, p[0][0][1][0], p[0][0][1][1], lenstr+' '+self.options.unit, id, 'start', -int(self.options.format), self.options.offset + self.options.fontsize/2) + else: + self.addTextWithTspan(self.group, p[0][0][1][0], p[0][0][1][1], lenstr+' '+self.options.unit+'^2', id, 'start', -int(self.options.format), -self.options.offset + self.options.fontsize/2) def addTextOnPath(self, node, x, y, text, id, anchor, startOffset, dy = 0): new = inkex.etree.SubElement(node,inkex.addNS('textPath','svg')) @@ -179,6 +181,19 @@ class Length(inkex.Effect): node.set('x', str(x)) node.set('y', str(y)) + def addTextWithTspan(self, node, x, y, text, id, anchor, angle, 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': anchor, '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('dy', str(dy)) + new.text = str(text) + node.set('x', str(x)) + node.set('y', str(y)) + node.set('transform', 'rotate(%s, %s, %s)' % (angle, x, y)) + if __name__ == '__main__': e = Length() e.affect() -- cgit v1.2.3