=== modified file 'share/extensions/measure.inx' --- share/extensions/measure.inx 2014-04-02 19:22:44 +0000 +++ share/extensions/measure.inx 2015-06-24 07:23:45 +0000 @@ -11,11 +11,36 @@ <_item msgctxt="measure extension" value="area">Area <_item msgctxt="measure extension" value="cofm">Center of Mass - - <_item msgctxt="measure extension" value="textonpath">Text On Path - <_item msgctxt="measure extension" value="angle">Fixed Angle + + + + <_item value="default">Default + <_item value="TaP_start">Text on Path, Start + <_item value="TaP_middle">Text on Path, Middle + <_item value="TaP_end">Text on Path, End + <_item value="FT_start">Fixed Text, Start of Path + <_item value="FT_bbox">Fixed Text, Center of BBox + <_item value="FT_mass">Fixed Text, Center of Mass + + + + custom + 50 + + <_item value="start">Left + <_item value="middle">Center + <_item value="end">Right + + + + + <_item value="start">Start of Path + <_item value="center">Center of BBox + <_item value="mass">Center of Mass + + 0 + - 0 12 -6 2 === modified file 'share/extensions/measure.py' --- share/extensions/measure.py 2015-05-28 10:59:37 +0000 +++ share/extensions/measure.py 2015-06-24 07:23:45 +0000 @@ -5,6 +5,7 @@ Area and Center of Mass calculated using Green's Theorem: http://mathworld.wolfram.com/GreensTheorem.html +Copyright (C) 2015 ~suv Copyright (C) 2010 Alvin Penner Copyright (C) 2006 Georg Wiora Copyright (C) 2006 Nathan Hurst @@ -130,17 +131,37 @@ def __init__(self): inkex.Effect.__init__(self) self.OptionParser.add_option("--type", - action="store", type="string", - dest="type", default="length", + 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", + action="store", type="string", + dest="format_", default="textonpath", help="Text Orientation") + self.OptionParser.add_option("--presetFormat", + action="store", type="string", + dest="presetFormat", default="TaP_start", + help="Preset text layout") + self.OptionParser.add_option("--startOffset", + action="store", type="string", + dest="startOffset", default="custom", + help="Text Offset along Path") + self.OptionParser.add_option("--startOffsetCustom", + action="store", type="int", + dest="startOffsetCustom", default=50, + help="Text Offset along Path") + self.OptionParser.add_option("--anchor", + action="store", type="string", + dest="anchor", default="start", + help="Text Anchor") + self.OptionParser.add_option("--position", + action="store", type="string", + dest="position", default="start", + help="Text Position") self.OptionParser.add_option("--angle", - action="store", type="float", + action="store", type="float", dest="angle", default=0, - help="Angle") + help="Angle") self.OptionParser.add_option("-f", "--fontsize", action="store", type="int", dest="fontsize", default=20, @@ -195,11 +216,11 @@ mat = simpletransform.composeParents(node, [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]) p = cubicsuperpath.parsePath(node.get('d')) simpletransform.applyTransformToPath(mat, p) - if self.options.type == "length": + if self.options.type_ == "length": slengths, stotal = csplength(p) self.group = inkex.etree.SubElement(node.getparent(),inkex.addNS('text','svg')) - elif self.options.type == "area": - stotal = csparea(p)*factor*self.options.scale + elif self.options.type_ == "area": + stotal = abs(csparea(p)*factor*self.options.scale) self.group = inkex.etree.SubElement(node.getparent(),inkex.addNS('text','svg')) else: xc, yc = cspcofm(p) @@ -209,16 +230,59 @@ continue # 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.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) + if self.options.format_ == '"presets"': + self.setPreset() + if self.options.format_ == '"textonpath"': + startOffset = self.options.startOffset + if startOffset == "custom": + startOffset = '{}%'.format(self.options.startOffsetCustom) + if self.options.type_ == "length": + self.addTextOnPath(self.group, 0, 0, lenstr+' '+self.options.unit, id, self.options.anchor, startOffset, self.options.offset) + else: + self.addTextOnPath(self.group, 0, 0, lenstr+' '+self.options.unit+'^2', id, self.options.anchor, startOffset, self.options.offset) + elif self.options.format_ == '"fixedtext"': + if self.options.position == "mass": + tx, ty = cspcofm(p) + anchor = 'middle' + elif self.options.position == "center": + bbox = simpletransform.computeBBox([node]) + tx = bbox[0] + (bbox[1] - bbox[0])/2.0 + ty = bbox[2] + (bbox[3] - bbox[2])/2.0 + anchor = 'middle' + else: # default + tx = p[0][0][1][0] + ty = p[0][0][1][1] + anchor = 'start' + if self.options.type_ == "length": + self.addTextWithTspan(self.group, tx, ty, lenstr+' '+self.options.unit, id, anchor, -int(self.options.angle), self.options.offset + self.options.fontsize/2) + else: + self.addTextWithTspan(self.group, tx, ty, lenstr+' '+self.options.unit+'^2', id, anchor, -int(self.options.angle), -self.options.offset + self.options.fontsize/2) else: - 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.angle), 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.angle), -self.options.offset + self.options.fontsize/2) + # center of mass, no text + pass + + def setPreset(self): + # keep dict in sync with enum in INX file: + preset_dict = { + 'default_length': ['"textonpath"', "50%", "start", None, None], + 'default_area': ['"fixedtext"', None, None, "start", 0.0], + 'default_cofm': [None, None, None, None, None], + 'TaP_start': ['"textonpath"', "0%", "start", None, None], + 'TaP_middle': ['"textonpath"', "50%", "middle", None, None], + 'TaP_end': ['"textonpath"', "100%", "end", None, None], + 'FT_start': ['"fixedtext"', None, None, "start", 0.0], + 'FT_bbox': ['"fixedtext"', None, None, "center", 0.0], + 'FT_mass': ['"fixedtext"', None, None, "mass", 0.0], + } + if self.options.presetFormat == "default": + current_preset = 'default_{}'.format(self.options.type_) + else: + current_preset = self.options.presetFormat + self.options.format_ = preset_dict[current_preset][0] + self.options.startOffset = preset_dict[current_preset][1] + self.options.anchor = preset_dict[current_preset][2] + self.options.position = preset_dict[current_preset][3] + self.options.angle = preset_dict[current_preset][4] def addCross(self, node, x, y, scale): l = 3*scale # 3 pixels in document units