From d4a7cc1659ad0d4b5dfdbc4a2e7ba049634fa6c0 Mon Sep 17 00:00:00 2001 From: Maren Hachmann Date: Tue, 3 Oct 2017 03:16:14 +0000 Subject: Add some help texts, improve structure --- share/extensions/interp_att_g.inx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'share/extensions') diff --git a/share/extensions/interp_att_g.inx b/share/extensions/interp_att_g.inx index 7a0ef1d5c..5f6c3d7a4 100644 --- a/share/extensions/interp_att_g.inx +++ b/share/extensions/interp_att_g.inx @@ -16,8 +16,10 @@ <_item value="opacity">Opacity <_item value="other">Other - <_param name="other-info" type="description">If you select "Other", you must know the SVG attributes to identify here this "other". - + + <_param name="other-header" type="description" appearance="header">Other Attribute + <_param name="other-info" type="description">If you selected "Other" above, you must specify the details for this "other" here. + <_item value="color">Color <_item value="int">Integer Number @@ -28,9 +30,10 @@ <_item value="style">Style <_item value="transform">Transformation - <_param name="sep" type="description">•••••••••••••••••••••••••••••••••••••••••••••••• - - + + <_param name="numbers" type="description" appearance="header">Values + + <_item value="none">No Unit <_item value="color">Color -- cgit v1.2.3 From e1f313146f99a605f28e1d19313f159b779482ee Mon Sep 17 00:00:00 2001 From: Maren Hachmann Date: Tue, 3 Oct 2017 03:25:26 +0000 Subject: Can now interpolate namespaced attributes, uses previously unused units field, improved whitespace, removes some duplication, can now use different color formats for start and end value, allows comma as decimal separator, fixes crash of extension when Other attribute is not specified. --- share/extensions/interp_att_g.py | 293 ++++++++++++++++++++------------------- 1 file changed, 152 insertions(+), 141 deletions(-) (limited to 'share/extensions') diff --git a/share/extensions/interp_att_g.py b/share/extensions/interp_att_g.py index 8718caf41..ec6abbf47 100755 --- a/share/extensions/interp_att_g.py +++ b/share/extensions/interp_att_g.py @@ -17,6 +17,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ''' # standard library +import sys import math import re import string @@ -68,158 +69,168 @@ class InterpAttG(inkex.Effect): help="The selected UI-tab when OK was pressed") def getColorValues(self): - sv = string.replace( self.options.start_val, '#', '' ) - ev = string.replace( self.options.end_val, '#', '' ) - if re.search('\s|,', sv): - # There are separators. That must be a integer RGB color definition. - sv = re.split( '[\s,]+', sv ) - ev = re.split( '[\s,]+', ev ) - self.R_ini = int( sv[0] ) - self.G_ini = int( sv[1] ) - self.B_ini = int( sv[2] ) - self.R_end = int( ev[0] ) - self.G_end = int( ev[1] ) - self.B_end = int( ev[2] ) - else: - # There is no separator. That must be a Hex RGB color definition. - if len(sv) == 3: - self.R_ini = int( sv[0] + sv[0], 16 ) - self.G_ini = int( sv[1] + sv[1], 16 ) - self.B_ini = int( sv[2] + sv[2], 16 ) - self.R_end = int( ev[0] + ev[0], 16 ) - self.G_end = int( ev[1] + ev[1], 16 ) - self.B_end = int( ev[2] + ev[2], 16 ) - else: #the len must be 6 - self.R_ini = int( sv[0] + sv[1], 16 ) - self.G_ini = int( sv[2] + sv[3], 16 ) - self.B_ini = int( sv[4] + sv[5], 16 ) - self.R_end = int( ev[0] + ev[1], 16 ) - self.G_end = int( ev[2] + ev[3], 16 ) - self.B_end = int( ev[4] + ev[5], 16 ) - self.R_inc = ( self.R_end - self.R_ini ) / float( self.tot_el - 1 ) - self.G_inc = ( self.G_end - self.G_ini ) / float( self.tot_el - 1 ) - self.B_inc = ( self.B_end - self.B_ini ) / float( self.tot_el - 1 ) - self.R_cur = self.R_ini - self.G_cur = self.G_ini - self.B_cur = self.B_ini + sv = string.replace( self.options.start_val, '#', '' ) + ev = string.replace( self.options.end_val, '#', '' ) + + # index 0: start color, index 1: end color + self.R, self.G, self.B = [0,0],[0,0],[0,0] + raw_colors = [sv, ev] + + for i in [0,1]: + if re.search('\s|,', raw_colors[i]): + # There are separators. That must be an integer RGB color definition. + raw_colors[i] = re.split( '[\s,]+', raw_colors[i]) + self.R[i] = int(raw_colors[i][0]) + self.G[i] = int(raw_colors[i][1]) + self.B[i] = int(raw_colors[i][2]) + else: + # There is no separator. That must be a Hex RGB color definition. + if len(raw_colors[i]) == 3: + self.R[i] = int(raw_colors[i][0] + raw_colors[i][0], 16) + self.G[i] = int(raw_colors[i][1] + raw_colors[i][1], 16) + self.B[i] = int(raw_colors[i][2] + raw_colors[i][2], 16) + else: # the len must be 6 + self.R[i] = int( raw_colors[i][0] + raw_colors[i][1], 16) + self.G[i] = int( raw_colors[i][2] + raw_colors[i][3], 16) + self.B[i] = int( raw_colors[i][4] + raw_colors[i][5], 16) + + self.R_inc = (self.R[1] - self.R[0]) / float(self.tot_el - 1) + self.G_inc = (self.G[1] - self.G[0]) / float(self.tot_el - 1) + self.B_inc = (self.B[1] - self.B[0]) / float(self.tot_el - 1) + self.R_cur = self.R[0] + self.G_cur = self.G[0] + self.B_cur = self.B[0] def getNumberValues(self): - sv = self.options.start_val - ev = self.options.end_val - if self.inte_att_type and self.inte_att_type != 'none': - sv = self.unittouu( sv + self.inte_att_type ) - ev = self.unittouu( ev + self.inte_att_type ) - self.val_cur = self.val_ini = sv - self.val_end = ev - self.val_inc = ( ev - sv ) / float( self.tot_el - 1 ) + sv = self.options.start_val.replace(",", ".") + ev = self.options.end_val.replace(",", ".") + unit = self.options.unit + + if unit != 'none': + sv = self.unittouu(sv + unit) + ev = self.unittouu(ev + unit) + else: + sv = float(sv) + ev = float(ev) + self.val_cur = self.val_ini = sv + self.val_end = ev + self.val_inc = (ev - sv)/float(self.tot_el - 1) def getTotElements(self): - self.tot_el = 0 - self.collection = None - if len( self.selected ) == 0: - return False - if len( self.selected ) > 1: - # multiple selection - if self.options.zsort: - sorted_ids = zSort(self.document.getroot(),self.selected.keys()) + self.tot_el = 0 + self.collection = None + if len( self.selected ) == 0: + return False + if len( self.selected ) > 1: + # multiple selection + if self.options.zsort: + sorted_ids = zSort(self.document.getroot(),self.selected.keys()) + else: + sorted_ids = self.options.ids + self.collection = list(sorted_ids) + for i in sorted_ids: + path = '//*[@id="%s"]' % i + self.collection[self.tot_el] = self.document.xpath(path, namespaces=inkex.NSS)[0] + self.tot_el += 1 else: - sorted_ids = self.options.ids - self.collection = list(sorted_ids) - for i in sorted_ids: - path = '//*[@id="%s"]' % i - self.collection[self.tot_el] = self.document.xpath(path, namespaces=inkex.NSS)[0] - self.tot_el += 1 - else: - # must be a group - self.collection = self.selected[ self.options.ids[0] ] - for i in self.collection: - self.tot_el += 1 + # must be a group + self.collection = self.selected[ self.options.ids[0] ] + for i in self.collection: + self.tot_el += 1 def effect(self): - if self.options.att == 'other': - self.inte_att = self.options.att_other - self.inte_att_type = self.options.att_other_type - self.where = self.options.att_other_where - else: - self.inte_att = self.options.att - if self.inte_att == 'width': - self.inte_att_type = 'float' - self.where = 'tag' - elif self.inte_att == 'height': - self.inte_att_type = 'float' - self.where = 'tag' - elif self.inte_att == 'scale': - self.inte_att_type = 'float' - self.where = 'transform' - elif self.inte_att == 'trans-x': - self.inte_att_type = 'float' - self.where = 'transform' - elif self.inte_att == 'trans-y': - self.inte_att_type = 'float' - self.where = 'transform' - elif self.inte_att == 'fill': - self.inte_att_type = 'color' - self.where = 'style' - elif self.inte_att == 'opacity': - self.inte_att_type = 'float' - self.where = 'style' - - self.getTotElements() - - if self.inte_att_type == 'color': - self.getColorValues() - else: - self.getNumberValues() - - if self.collection is None: - inkex.errormsg( _('There is no selection to interpolate' )) - return False - - for node in self.collection: - if self.inte_att_type == 'color': - val = 'rgb('+ \ - str(int(round(self.R_cur))) +','+ \ - str(int(round(self.G_cur))) +','+ \ - str(int(round(self.B_cur))) +')' + if self.options.att == 'other': + if self.options.att_other is not None: + self.inte_att = self.options.att_other + else: + inkex.errormsg(_("You selected 'Other'. Please enter an attribute to interpolate.")) + sys.exit(0) + self.inte_att_type = self.options.att_other_type + self.where = self.options.att_other_where else: - if self.inte_att_type == 'float': - val = self.val_cur - else: # inte_att_type == 'int' - val = round(self.val_cur) - - if self.where == 'style': - s = node.get('style') - re_find = '(^|;)'+ self.inte_att +':[^;]*(;|$)' - if re.search( re_find, s ): - s = re.sub( re_find, '\\1'+ self.inte_att +':'+ str(val) +'\\2', s ) - else: - s += ';'+ self.inte_att +':'+ str(val) - node.set( 'style', s ) - elif self.where == 'transform': - t = node.get('transform') - if t == None: t = "" - if self.inte_att == 'trans-x': - val = "translate("+ str(val) +",0)" - elif self.inte_att == 'trans-y': - val = "translate(0,"+ str(val) +")" - else: - val = self.inte_att + "("+ str(val) +")" - node.set( 'transform', t +" "+ val ) - else: # self.where == 'tag': - node.set( self.inte_att, str(val) ) + self.inte_att = self.options.att + if self.inte_att == 'width': + self.inte_att_type = 'float' + self.where = 'tag' + elif self.inte_att == 'height': + self.inte_att_type = 'float' + self.where = 'tag' + elif self.inte_att == 'scale': + self.inte_att_type = 'float' + self.where = 'transform' + elif self.inte_att == 'trans-x': + self.inte_att_type = 'float' + self.where = 'transform' + elif self.inte_att == 'trans-y': + self.inte_att_type = 'float' + self.where = 'transform' + elif self.inte_att == 'fill': + self.inte_att_type = 'color' + self.where = 'style' + elif self.inte_att == 'opacity': + self.inte_att_type = 'float' + self.where = 'style' + + self.getTotElements() if self.inte_att_type == 'color': - self.R_cur += self.R_inc - self.G_cur += self.G_inc - self.B_cur += self.B_inc + self.getColorValues() else: - self.val_cur += self.val_inc - - return True - -if __name__ == '__main__': #pragma: no cover + self.getNumberValues() + + if self.collection is None: + inkex.errormsg( _('There is no selection to interpolate' )) + return False + + for node in self.collection: + if self.inte_att_type == 'color': + val = 'rgb('+ \ + str(int(round(self.R_cur))) +','+ \ + str(int(round(self.G_cur))) +','+ \ + str(int(round(self.B_cur))) +')' + else: + if self.inte_att_type == 'float': + val = self.val_cur + else: # inte_att_type == 'int' + val = int(round(self.val_cur)) + + if self.where == 'style': + s = node.get('style') + re_find = '(^|;)'+ self.inte_att +':[^;]*(;|$)' + if re.search( re_find, s ): + s = re.sub( re_find, '\\1'+ self.inte_att +':'+ str(val) +'\\2', s ) + else: + s += ';'+ self.inte_att +':'+ str(val) + node.set( 'style', s ) + elif self.where == 'transform': + t = node.get('transform') + if t == None: t = "" + if self.inte_att == 'trans-x': + val = "translate("+ str(val) +",0)" + elif self.inte_att == 'trans-y': + val = "translate(0,"+ str(val) +")" + else: + val = self.inte_att + "("+ str(val) +")" + node.set( 'transform', t +" "+ val ) + else: # self.where == 'tag': + if ":" in self.inte_att: + ns, attrib = self.inte_att.split(":") + node.set(inkex.addNS(attrib, ns), str(val)) + else: + node.set( self.inte_att, str(val) ) + + if self.inte_att_type == 'color': + self.R_cur += self.R_inc + self.G_cur += self.G_inc + self.B_cur += self.B_inc + else: + self.val_cur += self.val_inc + + return True + +if __name__ == '__main__': e = InterpAttG() if e.affect(): - exit(0) + exit(0) else: - exit(1) + exit(1) -- cgit v1.2.3