2020-08-19 12:16:00 +02:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
|
|
# Program allowing the addition of small grey dots in rectangles created using Inkscape.
|
|
|
|
|
|
|
|
# Thomas Guzik, thomas.guzik@laposte.net
|
|
|
|
# Leo 130 contact@avilab.fr
|
|
|
|
# Corentin Bettiol - corentin-bettiol@hotmail.fr
|
|
|
|
|
|
|
|
# -Creative Commons License
|
|
|
|
# -This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
|
|
|
|
# -http://creativecommons.org/licenses/by-nc-sa/4.0/
|
|
|
|
|
|
|
|
import inkex
|
|
|
|
from lxml import etree
|
|
|
|
|
2021-04-04 01:51:59 +02:00
|
|
|
def recup(selection, attrib):
|
2020-08-19 12:16:00 +02:00
|
|
|
l = []
|
|
|
|
for i in selection:
|
|
|
|
selec = i
|
|
|
|
valr = selec.get(attrib)
|
|
|
|
l.append(valr)
|
|
|
|
return l
|
|
|
|
|
2021-04-04 01:51:59 +02:00
|
|
|
def generCircle(y, x, r):
|
2020-08-19 12:16:00 +02:00
|
|
|
circle = etree.Element('{http://www.w3.org/2000/svg}circle')
|
|
|
|
circle.set('cy',str(y))
|
|
|
|
circle.set('cx',str(x))
|
|
|
|
circle.set('r',str(r))
|
|
|
|
circle.set('fill','#000000')
|
|
|
|
circle.set('stroke','#000000')
|
|
|
|
circle.set('stroke-width','0')
|
|
|
|
return circle
|
|
|
|
|
|
|
|
def toFloat(l):
|
|
|
|
for i in range(len(l)):
|
|
|
|
l[i] = float(l[i])
|
|
|
|
return l
|
|
|
|
|
2021-04-04 01:51:59 +02:00
|
|
|
class Circle(inkex.EffectExtension):
|
2020-08-19 12:16:00 +02:00
|
|
|
def __init__(self):
|
|
|
|
inkex.Effect.__init__(self)
|
|
|
|
self.arg_parser.add_argument('--radius', type = float, default = 3.0, help = 'Radius to enter')
|
|
|
|
self.arg_parser.add_argument('--margin', type = float, default = 10.0, help = 'Margin between the edge of the rectangles and the circles')
|
|
|
|
self.arg_parser.add_argument('--space', type = float, default = 30.0, help = 'Spacing between circles')
|
|
|
|
|
|
|
|
def effect(self):
|
|
|
|
# svg = self.svg.document.getroot()
|
|
|
|
# layer = etree.SubElement(svg, 'g')
|
|
|
|
# layer.set(inkex.addNS('label', 'inkscape'), 'Layer')
|
|
|
|
# layer.set(inkex.addNS('groupmode', 'inkscape'), 'layer')
|
|
|
|
# Should we add the circles on a different layer sheet?
|
|
|
|
|
|
|
|
radius = self.options.radius
|
|
|
|
margin = self.options.margin
|
|
|
|
space = self.options.space
|
|
|
|
|
|
|
|
if str(list(self.svg.selected.values())[0]) == 'rect':
|
|
|
|
selection = (self.svg.selected).values()
|
|
|
|
|
|
|
|
y,x,height,width = [], [], [], []
|
|
|
|
|
|
|
|
if (len(selection))>0:
|
|
|
|
y = toFloat(recup(selection,'y'))
|
|
|
|
x = toFloat(recup(selection,'x'))
|
|
|
|
height = toFloat(recup(selection,'height'))
|
|
|
|
width = toFloat(recup(selection,'width'))
|
|
|
|
|
|
|
|
for i in range(len(selection)):
|
|
|
|
xC = x[i] + margin
|
|
|
|
yC = y[i] + margin
|
|
|
|
|
|
|
|
while xC < (x[i] + width[i] - margin):
|
|
|
|
while yC < (y[i] + height[i] - margin):
|
|
|
|
self.svg.get_current_layer().append(generCircle(yC,xC,radius))
|
|
|
|
yC += (space + radius)
|
|
|
|
|
|
|
|
xC += space + radius
|
|
|
|
yC = y[i] + margin
|
|
|
|
else:
|
|
|
|
inkex.utils.debug("No rectangle(s) have been selected.")
|
|
|
|
|
2020-08-31 21:25:41 +02:00
|
|
|
if __name__ == '__main__':
|
|
|
|
Circle().run()
|