diff options
| author | Maren Hachmann <maren@goos-habermann.de> | 2017-10-03 03:25:26 +0000 |
|---|---|---|
| committer | Maren Hachmann <maren@goos-habermann.de> | 2017-10-03 03:25:26 +0000 |
| commit | e1f313146f99a605f28e1d19313f159b779482ee (patch) | |
| tree | d9c3fe11aad3bd3789770a61e131dada4d848ce5 /share/extensions | |
| parent | Add some help texts, improve structure (diff) | |
| download | inkscape-e1f313146f99a605f28e1d19313f159b779482ee.tar.gz inkscape-e1f313146f99a605f28e1d19313f159b779482ee.zip | |
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.
Diffstat (limited to 'share/extensions')
| -rwxr-xr-x | share/extensions/interp_att_g.py | 293 |
1 files changed, 152 insertions, 141 deletions
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) |
