diff options
| author | Jabier Arraiza <jabier.arraiza@marker.es> | 2017-11-03 00:10:02 +0000 |
|---|---|---|
| committer | Jabier Arraiza <jabier.arraiza@marker.es> | 2017-11-03 00:10:02 +0000 |
| commit | d2df0412f728dd5bb54537dfdfe7c35b34d40e0e (patch) | |
| tree | e2703384779e83312c456399999997fcc289c5cf /share/extensions | |
| parent | Merge branch 'master' into powerpencil (diff) | |
| parent | change assignment to equality (diff) | |
| download | inkscape-d2df0412f728dd5bb54537dfdfe7c35b34d40e0e.tar.gz inkscape-d2df0412f728dd5bb54537dfdfe7c35b34d40e0e.zip | |
Merge branch 'master' into powerpencil
Diffstat (limited to 'share/extensions')
| -rw-r--r-- | share/extensions/interp_att_g.inx | 13 | ||||
| -rwxr-xr-x | share/extensions/interp_att_g.py | 293 |
2 files changed, 160 insertions, 146 deletions
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> <_item value="other">Other</_item> </param> - <_param name="other-info" type="description">If you select "Other", you must know the SVG attributes to identify here this "other".</_param> - <param name="att-other" type="string" _gui-text="Other Attribute:"></param> + + <_param name="other-header" type="description" appearance="header">Other Attribute</_param> + <_param name="other-info" type="description">If you selected "Other" above, you must specify the details for this "other" here.</_param> + <param name="att-other" type="string" _gui-text="Other Attribute:" _gui-description="Examples: r, width, inkscape:rounded, sodipodi:sides"></param> <param name="att-other-type" type="enum" _gui-text="Other Attribute type:"> <_item value="color">Color</_item> <_item value="int">Integer Number</_item> @@ -28,9 +30,10 @@ <_item value="style">Style</_item> <_item value="transform">Transformation</_item> </param> - <_param name="sep" type="description">••••••••••••••••••••••••••••••••••••••••••••••••</_param> - <param name="start-val" type="string" _gui-text="Start Value:"></param> - <param name="end-val" type="string" _gui-text="End Value:"></param> + + <_param name="numbers" type="description" appearance="header">Values</_param> + <param name="start-val" type="string" _gui-text="Start Value:" _gui-description="Examples: 0.5, 5, #rgb, #rrggbb or r, g, b"></param> + <param name="end-val" type="string" _gui-text="End Value:" _gui-description="Examples: 0.5, 5, #rgb, #rrggbb or r, g, b"></param> <param name="unit" type="enum" _gui-text="Unit:"> <_item value="none">No Unit</_item> <_item value="color">Color</_item> 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) |
