4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico#!/usr/bin/env python
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico'''
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNicoCopyright (C) 2007 Terry Brown, terry_n_brown@yahoo.com
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNicoThis program is free software; you can redistribute it and/or modify
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNicoit under the terms of the GNU General Public License as published by
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNicothe Free Software Foundation; either version 2 of the License, or
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico(at your option) any later version.
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNicoThis program is distributed in the hope that it will be useful,
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNicobut WITHOUT ANY WARRANTY; without even the implied warranty of
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNicoMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNicoGNU General Public License for more details.
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNicoYou should have received a copy of the GNU General Public License
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNicoalong with this program; if not, write to the Free Software
107e00c8104649437b9520d0ba298dba659e7cd7JazzyNicoFoundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico'''
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNicoimport inkex
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNicoimport sys
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapennertry:
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner import xml.etree.ElementTree as ElementTree
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapennerexcept:
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner try:
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner from lxml import etree as ElementTree
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner except:
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner try:
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner from elementtree.ElementTree import ElementTree
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner except:
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner sys.stderr.write("""Requires ElementTree module, included
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapennerin Python 2.5 or supplied by lxml or elementtree modules.
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner""")
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNicoclass Nup(inkex.Effect):
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico def __init__(self):
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico inkex.Effect.__init__(self)
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico opts = [('', '--unit', 'string', 'unit', 'px', ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--rows', 'int', 'rows', '2', ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--cols', 'int', 'cols', '2', ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--paddingTop', 'string', 'paddingTop', '', ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--paddingBottom', 'string', 'paddingBottom', '', ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--paddingLeft', 'string', 'paddingLeft', '', ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--paddingRight', 'string', 'paddingRight', '', ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--marginTop', 'string', 'marginTop', '', ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--marginBottom', 'string', 'marginBottom', '', ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--marginLeft', 'string', 'marginLeft', '', ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--marginRight', 'string', 'marginRight', '', ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--pgSizeX', 'string', 'pgSizeX', '', ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--pgSizeY', 'string', 'pgSizeY', '', ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--sizeX', 'string', 'sizeX', '', ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--sizeY', 'string', 'sizeY', '', ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--calculateSize', 'inkbool', 'calculateSize', True, ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--pgMarginTop', 'string', 'pgMarginTop', '', ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--pgMarginBottom', 'string', 'pgMarginBottom', '', ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--pgMarginLeft', 'string', 'pgMarginLeft', '', ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--pgMarginRight', 'string', 'pgMarginRight', '', ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--showHolder', 'inkbool', 'showHolder', True, ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--showCrosses', 'inkbool', 'showCrosses', True, ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--showInner', 'inkbool', 'showInner', True, ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--showOuter', 'inkbool', 'showOuter', False, ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--showInnerBox', 'inkbool', 'showInnerBox', False, ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--showOuterBox', 'inkbool', 'showOuterBox', False, ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ('', '--tab', 'string', 'tab', '', ''),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico ]
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico for o in opts:
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico self.OptionParser.add_option(o[0], o[1], action="store", type=o[2],
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico dest=o[3], default=o[4], help=o[5])
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico def effect(self):
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico showList = []
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico for i in ['showHolder','showCrosses','showInner','showOuter',
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico 'showInnerBox','showOuterBox',]:
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico if getattr(self.options, i):
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico showList.append(i.lower().replace('show', ''))
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico o = self.options
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner self.pf = self.GenerateNup(
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico unit=o.unit,
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico pgSize=(o.pgSizeX,o.pgSizeY),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico pgMargin=(o.pgMarginTop,o.pgMarginRight,o.pgMarginBottom,o.pgMarginLeft),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico num=(o.rows,o.cols),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico calculateSize = o.calculateSize,
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico size=(o.sizeX,o.sizeY),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico margin=(o.marginTop,o.marginRight,o.marginBottom,o.marginLeft),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico padding=(o.paddingTop,o.paddingRight,o.paddingBottom,o.paddingLeft),
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico show=showList,
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico )
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico def setAttr(self, node, name, value):
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico attr = node.ownerDocument.createAttribute(name)
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico attr.value = value
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico node.attributes.setNamedItem(attr)
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico def output(self):
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico sys.stdout.write(self.pf)
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner def expandTuple(self, unit, x, length = 4):
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner try:
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner iter(x)
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner except:
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner return None
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner if len(x) != length: x = x*2
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner if len(x) != length:
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner raise Exception("expandTuple: requires 2 or 4 item tuple")
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner try:
0033c073cef3bdf51409b8f8b37914941f340257apenner return tuple(map(lambda ev: (self.unittouu(str(eval(str(ev)))+unit)/self.unittouu('1px')), x))
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner except:
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner return None
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner def GenerateNup(self,
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner unit="px",
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner pgSize=("8.5*96","11*96"),
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner pgMargin=(0,0),
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner pgPadding=(0,0),
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner num=(2,2),
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner calculateSize=True,
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner size=None,
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner margin=(0,0),
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner padding=(20,20),
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner show=['default'],
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner container='svg',
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner returnTree = False,
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner ):
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner """Generate the SVG. Inputs are run through 'eval(str(x))' so you can use
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner '8.5*72' instead of 612. Margin / padding dimension tuples can be
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner (top & bottom, left & right) or (top, right, bottom, left).
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner Keyword arguments:
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner pgSize -- page size, width x height
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner pgMargin -- extra space around each page
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner pgPadding -- added to pgMargin
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner n -- rows x cols
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner size -- override calculated size, width x height
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner margin -- white space around each piece
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner padding -- inner padding for each piece
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner show -- list of keywords indicating what to show
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner - 'crosses' - cutting guides
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner - 'inner' - inner boundary
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner - 'outer' - outer boundary
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner container -- 'svg' or 'g'
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner returnTree -- whether to return the ElementTree or the string
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner """
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner if 'default' in show:
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner show = set(show).union(['inner', 'innerbox', 'holder', 'crosses'])
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner pgMargin = self.expandTuple(unit, pgMargin)
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner pgPadding = self.expandTuple(unit, pgPadding)
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner margin = self.expandTuple(unit, margin)
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner padding = self.expandTuple(unit, padding)
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner pgSize = self.expandTuple(unit, pgSize, length = 2)
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner # num = tuple(map(lambda ev: eval(str(ev)), num))
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner pgEdge = map(sum,zip(pgMargin, pgPadding))
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner top, right, bottom, left = 0,1,2,3
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner width, height = 0,1
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner rows, cols = 0,1
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner size = self.expandTuple(unit, size, length = 2)
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner if size == None or calculateSize == True or len(size) < 2 or size[0] == 0 or size[1] == 0:
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner size = ((pgSize[width]
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner - pgEdge[left] - pgEdge[right]
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner - num[cols]*(margin[left] + margin[right])) / num[cols],
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner (pgSize[height]
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner - pgEdge[top] - pgEdge[bottom]
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner - num[rows]*(margin[top] + margin[bottom])) / num[rows]
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner )
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner else:
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner size = self.expandTuple(unit, size, length = 2)
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner # sep is separation between same points on pieces
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner sep = (size[width]+margin[right]+margin[left],
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner size[height]+margin[top]+margin[bottom])
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner style = 'stroke:#000000;stroke-opacity:1;fill:none;fill-opacity:1;'
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner padbox = 'rect', {
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner 'x': str(pgEdge[left] + margin[left] + padding[left]),
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner 'y': str(pgEdge[top] + margin[top] + padding[top]),
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner 'width': str(size[width] - padding[left] - padding[right]),
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner 'height': str(size[height] - padding[top] - padding[bottom]),
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner 'style': style,
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner }
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner margbox = 'rect', {
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner 'x': str(pgEdge[left] + margin[left]),
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner 'y': str(pgEdge[top] + margin[top]),
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner 'width': str(size[width]),
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner 'height': str(size[height]),
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner 'style': style,
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner }
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner doc = ElementTree.ElementTree(ElementTree.Element(container,
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner {'xmlns:inkscape':"http://www.inkscape.org/namespaces/inkscape",
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner 'xmlns:xlink':"http://www.w3.org/1999/xlink",
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner 'width':str(pgSize[width]),
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner 'height':str(pgSize[height]),
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner }))
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner sub = ElementTree.SubElement
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner root = doc.getroot()
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner def makeClones(under, to):
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner for r in range(0,num[rows]):
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner for c in range(0,num[cols]):
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner if r == 0 and c == 0: continue
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner sub(under, 'use', {
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner 'xlink:href': '#' + to,
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner 'transform': 'translate(%f,%f)' %
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner (c*sep[width], r*sep[height])})
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner # guidelayer #####################################################
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner if set(['inner', 'outer']).intersection(show):
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner layer = sub(root, 'g', {'id':'guidelayer',
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner 'inkscape:groupmode':'layer'})
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner if 'inner' in show:
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner padbox[1]['id'] = 'innerguide'
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner padbox[1]['style'] = padbox[1]['style'].replace('stroke:#000000',
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner 'stroke:#8080ff')
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner sub(layer, *padbox)
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner del padbox[1]['id']
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner padbox[1]['style'] = padbox[1]['style'].replace('stroke:#8080ff',
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner 'stroke:#000000')
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner makeClones(layer, 'innerguide')
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner if 'outer' in show:
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner margbox[1]['id'] = 'outerguide'
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner margbox[1]['style'] = padbox[1]['style'].replace('stroke:#000000',
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner 'stroke:#8080ff')
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner sub(layer, *margbox)
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner del margbox[1]['id']
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner margbox[1]['style'] = padbox[1]['style'].replace('stroke:#8080ff',
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner 'stroke:#000000')
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner makeClones(layer, 'outerguide')
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner # crosslayer #####################################################
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner if set(['crosses']).intersection(show):
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner layer = sub(root, 'g', {'id':'cutlayer',
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner 'inkscape:groupmode':'layer'})
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner if 'crosses' in show:
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner crosslen = 12
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner group = sub(layer, 'g', id='cross')
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner x,y = 0,0
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner path = 'M%f %f' % (x+pgEdge[left] + margin[left],
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner y+pgEdge[top] + margin[top]-crosslen)
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner path += ' L%f %f' % (x+pgEdge[left] + margin[left],
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner y+pgEdge[top] + margin[top]+crosslen)
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner path += ' M%f %f' % (x+pgEdge[left] + margin[left]-crosslen,
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner y+pgEdge[top] + margin[top])
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner path += ' L%f %f' % (x+pgEdge[left] + margin[left]+crosslen,
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner y+pgEdge[top] + margin[top])
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner sub(group, 'path', style=style+'stroke-width:0.05',
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner d = path, id = 'crossmarker')
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner for r in 0, 1:
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner for c in 0, 1:
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner if r or c:
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner x,y = c*size[width], r*size[height]
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner sub(group, 'use', {
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner 'xlink:href': '#crossmarker',
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner 'transform': 'translate(%f,%f)' %
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner (x,y)})
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner makeClones(layer, 'cross')
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner # clonelayer #####################################################
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner layer = sub(root, 'g', {'id':'clonelayer', 'inkscape:groupmode':'layer'})
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner makeClones(layer, 'main')
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner # mainlayer ######################################################
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner layer = sub(root, 'g', {'id':'mainlayer', 'inkscape:groupmode':'layer'})
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner group = sub(layer, 'g', {'id':'main'})
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner if 'innerbox' in show:
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner sub(group, *padbox)
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner if 'outerbox' in show:
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner sub(group, *margbox)
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner if 'holder' in show:
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner x, y = (pgEdge[left] + margin[left] + padding[left],
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner pgEdge[top] + margin[top] + padding[top])
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner w, h = (size[width] - padding[left] - padding[right],
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner size[height] - padding[top] - padding[bottom])
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner path = 'M%f %f' % (x + w/2., y)
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner path += ' L%f %f' % (x + w, y + h/2.)
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner path += ' L%f %f' % (x + w/2., y + h)
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner path += ' L%f %f' % (x, y + h/2.)
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner path += ' Z'
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner sub(group, 'path', style=style, d = path)
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner if returnTree:
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner return doc
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner else:
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner return ElementTree.tostring(root)
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNicoe = Nup()
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNicoe.affect()