73 lines
2.4 KiB
Python
73 lines
2.4 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import sys
|
|
from inkex import Effect as InkscapeEffect
|
|
from inkex import etree, addNS
|
|
from copy import deepcopy
|
|
from inkex.paths import Path
|
|
from inkex.transforms import Transform
|
|
from lxml import etree
|
|
|
|
class FillRow(InkscapeEffect):
|
|
def __init__(self):
|
|
InkscapeEffect.__init__(self)
|
|
self.arg_parser.add_argument("--gap_x", type=int, default="10")
|
|
self.arg_parser.add_argument("--gap_y",type=int, default="10")
|
|
|
|
def effect(self):
|
|
if len(self.svg.selected) > 0:
|
|
self.total_height = 0
|
|
for id, node in self.svg.selected.items():
|
|
self.fill_row(node)
|
|
|
|
def fill_row(self, node):
|
|
#max_line_width = self.svg.unittouu('450mm')
|
|
#x_start = self.svg.unittouu('3mm')
|
|
#y_start = self.svg.unittouu('1600mm') - self.svg.unittouu('3mm')
|
|
#gap_x = gap_y = self.svg.unittouu('10mm')
|
|
|
|
svg = self.document.getroot()
|
|
x_start = 0
|
|
y_start = self.svg.unittouu(svg.attrib['height'])
|
|
max_line_width = self.svg.unittouu(svg.get('width'))
|
|
|
|
total_width = 0
|
|
total_height = self.total_height
|
|
|
|
group = etree.SubElement(self.svg.get_current_layer(), addNS('g','svg'))
|
|
|
|
bbox = node.bounding_box()
|
|
x = bbox.left
|
|
y = bbox.top
|
|
node_width = self.options.gap_x + bbox.width
|
|
|
|
while total_width + node_width < max_line_width:
|
|
node_copy = deepcopy(node)
|
|
group.append(node_copy)
|
|
|
|
x_dest = x_start + total_width
|
|
y_dest = y_start - (total_height + bbox.height)
|
|
|
|
# translation logic
|
|
if node_copy.tag == addNS('path','svg'):
|
|
x_delta = x_dest - x
|
|
y_delta = y_dest - y
|
|
|
|
path = Path(node_copy.attrib['d'])
|
|
path.translate(x_delta, y_delta, True)
|
|
node_copy.attrib['d'] = str(Path(path))
|
|
elif node_copy.tag == addNS('g','svg'):
|
|
x_delta = x_dest - x
|
|
y_delta = y_dest - y
|
|
|
|
translation_matrix = [[1.0, 0.0, x_delta], [0.0, 1.0, y_delta]]
|
|
Transform(translation_matrix) * node_copy.transform
|
|
else:
|
|
node_copy.attrib['x'] = str(x_dest)
|
|
node_copy.attrib['y'] = str(y_dest)
|
|
|
|
total_width += node_width
|
|
|
|
self.total_height += group.bounding_box().height + self.options.gap_y
|
|
|
|
FillRow().run() |