mightyscape-1.2/extensions/fablabchemnitz/jitter_gradients/jitter_gradients.py

66 lines
2.4 KiB
Python
Raw Normal View History

2022-10-03 02:49:07 +02:00
#!/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()