summaryrefslogtreecommitdiffstats
path: root/share/extensions
diff options
context:
space:
mode:
authorJabier Arraiza <jabier.arraiza@marker.es>2017-11-03 00:10:02 +0000
committerJabier Arraiza <jabier.arraiza@marker.es>2017-11-03 00:10:02 +0000
commitd2df0412f728dd5bb54537dfdfe7c35b34d40e0e (patch)
treee2703384779e83312c456399999997fcc289c5cf /share/extensions
parentMerge branch 'master' into powerpencil (diff)
parentchange assignment to equality (diff)
downloadinkscape-d2df0412f728dd5bb54537dfdfe7c35b34d40e0e.tar.gz
inkscape-d2df0412f728dd5bb54537dfdfe7c35b34d40e0e.zip
Merge branch 'master' into powerpencil
Diffstat (limited to 'share/extensions')
-rw-r--r--share/extensions/interp_att_g.inx13
-rwxr-xr-xshare/extensions/interp_att_g.py293
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)