87 lines
2.4 KiB
Python
87 lines
2.4 KiB
Python
|
#!/usr/bin/env python2
|
||
|
|
||
|
import sys
|
||
|
sys.path.append('/usr/share/inkscape/extensions')
|
||
|
|
||
|
from inkex import Effect as InkscapeEffect
|
||
|
from inkex import etree, addNS
|
||
|
|
||
|
from copy import deepcopy
|
||
|
|
||
|
from simpletransform import computeBBox, applyTransformToNode
|
||
|
from simplepath import parsePath, translatePath, formatPath
|
||
|
|
||
|
class FillRow(InkscapeEffect):
|
||
|
def __init__(self):
|
||
|
InkscapeEffect.__init__(self)
|
||
|
self.filename = sys.argv[-1]
|
||
|
|
||
|
def effect(self):
|
||
|
if len(self.selected) > 0:
|
||
|
# bboxes = self.calculate_bboxes(self.selected)
|
||
|
self.total_height = 0
|
||
|
for id, node in self.selected.items():
|
||
|
self.fill_row(node)
|
||
|
|
||
|
def fill_row(self, node):
|
||
|
max_line_width = self.unittouu('450mm')
|
||
|
|
||
|
x_gap = y_gap = self.unittouu('10mm')
|
||
|
x_start = self.unittouu('3mm')
|
||
|
y_start = self.unittouu('1600mm') - self.unittouu('3mm')
|
||
|
|
||
|
total_width = 0
|
||
|
total_height = self.total_height
|
||
|
|
||
|
group = etree.SubElement(self.current_layer, addNS('g','svg'))
|
||
|
|
||
|
bbox = computeBBox([node])
|
||
|
x, _, y, _ = bbox
|
||
|
node_width = x_gap + self.width(bbox)
|
||
|
|
||
|
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 + self.height(bbox))
|
||
|
|
||
|
# translation logic
|
||
|
if node_copy.tag == addNS('path','svg'):
|
||
|
x_delta = x_dest - x
|
||
|
y_delta = y_dest - y
|
||
|
|
||
|
path = parsePath(node_copy.attrib['d'])
|
||
|
translatePath(path, x_delta, y_delta)
|
||
|
node_copy.attrib['d'] = formatPath(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]]
|
||
|
applyTransformToNode(translation_matrix, node_copy)
|
||
|
|
||
|
else:
|
||
|
node_copy.attrib['x'] = str(x_dest)
|
||
|
node_copy.attrib['y'] = str(y_dest)
|
||
|
|
||
|
total_width += node_width
|
||
|
|
||
|
self.total_height += self.height(computeBBox(group)) + y_gap
|
||
|
|
||
|
def width(self,bbox):
|
||
|
(x1, x2, y1, y2) = bbox
|
||
|
width = x2 - x1
|
||
|
|
||
|
return width
|
||
|
|
||
|
def height(self,bbox):
|
||
|
(x1, x2, y1, y2) = bbox
|
||
|
height = y2 - y1
|
||
|
|
||
|
return height
|
||
|
|
||
|
|
||
|
effect = FillRow()
|
||
|
effect.affect()
|