66 lines
2.4 KiB
Python
66 lines
2.4 KiB
Python
|
#!/usr/bin/env python3
|
||
|
|
||
|
import inkex
|
||
|
from inkex import Style
|
||
|
import re
|
||
|
import random
|
||
|
|
||
|
class JitterGradients(inkex.EffectExtension):
|
||
|
|
||
|
def add_arguments(self, pars):
|
||
|
pars.add_argument('-j', '--jitter_amount', type=int, default=10, help='Relative to distance between gradient nodes')
|
||
|
|
||
|
def getUrlFromString(self, text):
|
||
|
pattern = re.compile(r"url\(#([a-zA-Z0-9_-]+)\)")
|
||
|
result = re.search(pattern, text)
|
||
|
if (result):
|
||
|
return result.group(1)
|
||
|
else:
|
||
|
return 0;
|
||
|
|
||
|
def getFill(self, element):
|
||
|
if(element.get('fill') and self.getUrlFromString(element.get('fill'))):
|
||
|
return self.getUrlFromString(element.get('fill'))
|
||
|
elif (element.get('style') and Style(element.get('style'))['fill'] and self.getUrlFromString(Style(element.get('style'))['fill'])):
|
||
|
return self.getUrlFromString(Style(element.get('style'))['fill'])
|
||
|
else:
|
||
|
return None
|
||
|
|
||
|
def getGradientFromId(self, elementId):
|
||
|
element = self.svg.getElementById(elementId)
|
||
|
if (element is not None and element.tag.find("linearGradient") >= 0):
|
||
|
return element
|
||
|
else:
|
||
|
return None
|
||
|
|
||
|
def effect(self):
|
||
|
option = self.options.jitter_amount
|
||
|
self._main_function(option)
|
||
|
|
||
|
def _main_function(self, amount):
|
||
|
for element in self.svg.selected.values():
|
||
|
fillId = self.getFill(element)
|
||
|
if (fillId is None):
|
||
|
continue
|
||
|
|
||
|
gradient = self.getGradientFromId(fillId)
|
||
|
if (gradient is None):
|
||
|
continue
|
||
|
|
||
|
x1 = self.svg.unittouu(gradient.get("x1"))
|
||
|
y1 = self.svg.unittouu(gradient.get("y1"))
|
||
|
x2 = self.svg.unittouu(gradient.get("x2"))
|
||
|
y2 = self.svg.unittouu(gradient.get("y2"))
|
||
|
|
||
|
x1 += random.uniform(-amount, amount)
|
||
|
y1 += random.uniform(-amount, amount)
|
||
|
x2 += random.uniform(-amount, amount)
|
||
|
y2 += random.uniform(-amount, amount)
|
||
|
|
||
|
gradient.set('x1', str(self.svg.uutounit(x1, self.svg.unit)) + self.svg.unit)
|
||
|
gradient.set('y1', str(self.svg.uutounit(y1, self.svg.unit)) + self.svg.unit)
|
||
|
gradient.set('x2', str(self.svg.uutounit(x2, self.svg.unit)) + self.svg.unit)
|
||
|
gradient.set('y2', str(self.svg.uutounit(y2, self.svg.unit)) + self.svg.unit)
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
JitterGradients().run()
|