From 276b43aaa9e8465770414909df519881da10e44a Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Tue, 30 Aug 2011 22:19:30 +0200 Subject: Extensions. New n-up layout extension (see bug #169955), thanks to Terry N. Brown. Extensions. Moving Perfect Bound Cover and Printing Marks to the new Render>Layout submenu. (bzr r10603) --- share/extensions/Makefile.am | 41 +++--- share/extensions/layout_nup.inx | 79 +++++++++++ share/extensions/layout_nup.py | 90 ++++++++++++ share/extensions/layout_nup_pageframe.py | 229 +++++++++++++++++++++++++++++++ share/extensions/perfectboundcover.inx | 24 ++-- share/extensions/printing-marks.inx | 86 ++++++------ 6 files changed, 477 insertions(+), 72 deletions(-) create mode 100644 share/extensions/layout_nup.inx create mode 100644 share/extensions/layout_nup.py create mode 100644 share/extensions/layout_nup_pageframe.py diff --git a/share/extensions/Makefile.am b/share/extensions/Makefile.am index 6a44781f5..a6815d932 100644 --- a/share/extensions/Makefile.am +++ b/share/extensions/Makefile.am @@ -63,7 +63,7 @@ extensions = \ fractalize.py \ funcplot.py \ gears.py\ - gcodetools.py\ + gcodetools.py\ generate_voronoi.py \ gimp_xcf.py \ grid_cartesian.py \ @@ -74,7 +74,7 @@ extensions = \ handles.py \ hpgl_output.py \ ill2svg.pl \ - ink2canvas.py \ + ink2canvas.py \ inkex.py \ Inkscape.pm \ inkwebeffect.py \ @@ -95,6 +95,8 @@ extensions = \ launch_webbrowser.py \ layers2svgfont.py \ svgfont2layers.py \ + layout_nup.py \ + layout_nup_pageframe.py \ lindenmayer.py \ lorem_ipsum.py \ markers_strokepaint.py \ @@ -145,8 +147,8 @@ extensions = \ svgcalendar.py \ svg_regex.py \ svg_and_media_zip_output.py \ - text_extract.py \ - svg_transform.py \ + text_extract.py \ + svg_transform.py \ text_uppercase.py \ text_lowercase.py \ text_sentencecase.py \ @@ -180,7 +182,7 @@ otherstuff = \ aisvg.xslt \ colors.xml \ jessyInk_video.svg \ - svg2fxg.xsl \ + svg2fxg.xsl \ svg2xaml.xsl \ xaml2svg.xsl @@ -233,17 +235,17 @@ modules = \ fractalize.inx \ funcplot.inx \ gears.inx\ - gcodetools_about.inx\ - gcodetools_area.inx\ - gcodetools_check_for_updates.inx\ - gcodetools_dxf_points.inx\ - gcodetools_engraving.inx\ - gcodetools_graffiti.inx\ - gcodetools_lathe.inx\ - gcodetools_orientation_points.inx\ - gcodetools_path_to_gcode.inx\ - gcodetools_prepare_path_for_plasma.inx\ - gcodetools_tools_library.inx\ + gcodetools_about.inx\ + gcodetools_area.inx\ + gcodetools_check_for_updates.inx\ + gcodetools_dxf_points.inx\ + gcodetools_engraving.inx\ + gcodetools_graffiti.inx\ + gcodetools_lathe.inx\ + gcodetools_orientation_points.inx\ + gcodetools_path_to_gcode.inx\ + gcodetools_prepare_path_for_plasma.inx\ + gcodetools_tools_library.inx\ generate_voronoi.inx \ gimp_xcf.inx \ grid_cartesian.inx \ @@ -253,7 +255,7 @@ modules = \ guillotine.inx \ handles.inx \ hpgl_output.inx \ - ink2canvas.inx \ + ink2canvas.inx \ inkscape_help_askaquestion.inx \ inkscape_help_commandline.inx \ inkscape_help_faq.inx\ @@ -278,6 +280,7 @@ modules = \ jessyInk_view.inx \ layers2svgfont.inx \ svgfont2layers.inx \ + layout_nup.inx \ lindenmayer.inx \ lorem_ipsum.inx \ markers_strokepaint.inx \ @@ -316,11 +319,11 @@ modules = \ split.inx \ straightseg.inx \ summersnight.inx \ - svg2fxg.inx \ + svg2fxg.inx \ svg2xaml.inx \ svg_and_media_zip_output.inx \ svgcalendar.inx \ - text_extract.inx \ + text_extract.inx \ text_uppercase.inx\ text_lowercase.inx \ text_sentencecase.inx \ diff --git a/share/extensions/layout_nup.inx b/share/extensions/layout_nup.inx new file mode 100644 index 000000000..bdf650722 --- /dev/null +++ b/share/extensions/layout_nup.inx @@ -0,0 +1,79 @@ + + + <_name>N-up layout + org.greygreen.inkscape.effects.nup + layout_nup.py + layout_nup_pageframe.py + inkex.py + + + + + px + pt + in + cm + mm + + 765 + 990 + <_param name="pgMargin" type="description" appearance="header">Page margins + 0 + 0 + 0 + 0 + + + 2 + 2 + 100 + 200 + true + <_param name="padding" type="description" appearance="header">Layout padding + 12 + 12 + 12 + 12 + <_param name="margin" type="description" appearance="header">Layout margins + 0 + 0 + 0 + 0 + + + true + true + true + false + false + 0 + + + <_param name="instructions" type="description" xml:space="preserve"> +Parameters: + * Page size: width and height. + * Page margins: extra space around each page. + * Layout rows and cols. + * Layout size: width and height, auto calculated if one is 0. + * Auto calculate layout size: don't use the layout size values. + * Layout margins: white space around each part of the layout. + * Layout padding: inner padding for each part of the layout. + + + + + + all + + + + + + + + + + + diff --git a/share/extensions/layout_nup.py b/share/extensions/layout_nup.py new file mode 100644 index 000000000..5f8451c45 --- /dev/null +++ b/share/extensions/layout_nup.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python +''' +Copyright (C) 2007 Terry Brown, terry_n_brown@yahoo.com + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +''' +import inkex +import sys + +import layout_nup_pageframe + +class Nup(inkex.Effect): + def __init__(self): + inkex.Effect.__init__(self) + opts = [('', '--unit', 'string', 'unit', 'px', ''), + ('', '--rows', 'int', 'rows', '2', ''), + ('', '--cols', 'int', 'cols', '2', ''), + ('', '--paddingTop', 'string', 'paddingTop', '', ''), + ('', '--paddingBottom', 'string', 'paddingBottom', '', ''), + ('', '--paddingLeft', 'string', 'paddingLeft', '', ''), + ('', '--paddingRight', 'string', 'paddingRight', '', ''), + ('', '--marginTop', 'string', 'marginTop', '', ''), + ('', '--marginBottom', 'string', 'marginBottom', '', ''), + ('', '--marginLeft', 'string', 'marginLeft', '', ''), + ('', '--marginRight', 'string', 'marginRight', '', ''), + ('', '--pgSizeX', 'string', 'pgSizeX', '', ''), + ('', '--pgSizeY', 'string', 'pgSizeY', '', ''), + ('', '--sizeX', 'string', 'sizeX', '', ''), + ('', '--sizeY', 'string', 'sizeY', '', ''), + ('', '--calculateSize', 'inkbool', 'calculateSize', True, ''), + ('', '--pgMarginTop', 'string', 'pgMarginTop', '', ''), + ('', '--pgMarginBottom', 'string', 'pgMarginBottom', '', ''), + ('', '--pgMarginLeft', 'string', 'pgMarginLeft', '', ''), + ('', '--pgMarginRight', 'string', 'pgMarginRight', '', ''), + ('', '--showHolder', 'inkbool', 'showHolder', True, ''), + ('', '--showCrosses', 'inkbool', 'showCrosses', True, ''), + ('', '--showInner', 'inkbool', 'showInner', True, ''), + ('', '--showOuter', 'inkbool', 'showOuter', False, ''), + ('', '--showInnerBox', 'inkbool', 'showInnerBox', False, ''), + ('', '--showOuterBox', 'inkbool', 'showOuterBox', False, ''), + ('', '--tab', 'string', 'tab', '', ''), + ] + for o in opts: + self.OptionParser.add_option(o[0], o[1], action="store", type=o[2], + dest=o[3], default=o[4], help=o[5]) + + + def effect(self): + showList = [] + for i in ['showHolder','showCrosses','showInner','showOuter', + 'showInnerBox','showOuterBox',]: + if getattr(self.options, i): + showList.append(i.lower().replace('show', '')) + o = self.options + self.pf = layout_nup_pageframe.GenerateNup( + unit=o.unit, + pgSize=(o.pgSizeX,o.pgSizeY), + pgMargin=(o.pgMarginTop,o.pgMarginRight,o.pgMarginBottom,o.pgMarginLeft), + num=(o.rows,o.cols), + calculateSize = o.calculateSize, + size=(o.sizeX,o.sizeY), + margin=(o.marginTop,o.marginRight,o.marginBottom,o.marginLeft), + padding=(o.paddingTop,o.paddingRight,o.paddingBottom,o.paddingLeft), + show=showList, + ) + + def setAttr(self, node, name, value): + attr = node.ownerDocument.createAttribute(name) + attr.value = value + node.attributes.setNamedItem(attr) + + def output(self): + sys.stdout.write(self.pf) + +e = Nup() +e.affect() + + diff --git a/share/extensions/layout_nup_pageframe.py b/share/extensions/layout_nup_pageframe.py new file mode 100644 index 000000000..1eec15805 --- /dev/null +++ b/share/extensions/layout_nup_pageframe.py @@ -0,0 +1,229 @@ +#@+leo-ver=4-thin +#@+node:tbrown.20070622094435.1:@thin pageframe.py +"""Create n-up SVG layouts""" + +#@+others +#@+node:tbrown.20070622103716:imports +import sys, inkex + +try: + import xml.etree.ElementTree as ElementTree +except: + try: + from lxml import etree as ElementTree + except: + try: + from elementtree.ElementTree import ElementTree + except: + sys.stderr.write("""Requires ElementTree module, included +in Python 2.5 or supplied by lxml or elementtree modules. + +""") +#@-node:tbrown.20070622103716:imports +#@+node:tbrown.20070622103716.1:expandTuple +def expandTuple(unit, x, length = 4): + try: + iter(x) + except: + return None + + if len(x) != length: x = x*2 + if len(x) != length: + raise Exception("expandTuple: requires 2 or 4 item tuple") + try: + return tuple(map(lambda ev: (inkex.unittouu(str(eval(str(ev)))+unit)), x)) + except: + return None +#@-node:tbrown.20070622103716.1:expandTuple +#@+node:tbrown.20070622103716.2:GenerateNup +def GenerateNup(unit="px", + pgSize=("8.5*90","11*90"), + pgMargin=(0,0), + pgPadding=(0,0), + num=(2,2), + calculateSize=True, + size=None, + margin=(0,0), + padding=(20,20), + show=['default'], + container='svg', + returnTree = False, + ): + """Generate the SVG. Inputs are run through 'eval(str(x))' so you can use +'8.5*72' instead of 612. Margin / padding dimension tuples can be +(top & bottom, left & right) or (top, right, bottom, left). + +Keyword arguments: +pgSize -- page size, width x height +pgMargin -- extra space around each page +pgPadding -- added to pgMargin +n -- rows x cols +size -- override calculated size, width x height +margin -- white space around each piece +padding -- inner padding for each piece +show -- list of keywords indicating what to show + - 'crosses' - cutting guides + - 'inner' - inner boundary + - 'outer' - outer boundary +container -- 'svg' or 'g' +returnTree -- whether to return the ElementTree or the string +""" + + if 'default' in show: + show = set(show).union(['inner', 'innerbox', 'holder', 'crosses']) + + pgMargin = expandTuple(unit, pgMargin) + pgPadding = expandTuple(unit, pgPadding) + margin = expandTuple(unit, margin) + padding = expandTuple(unit, padding) + + pgSize = expandTuple(unit, pgSize, length = 2) +# num = tuple(map(lambda ev: eval(str(ev)), num)) + + pgEdge = map(sum,zip(pgMargin, pgPadding)) + + top, right, bottom, left = 0,1,2,3 + width, height = 0,1 + rows, cols = 0,1 + size = expandTuple(unit, size, length = 2) + if size == None or calculateSize == True or len(size) < 2 or size[0] == 0 or size[1] == 0: + size = ((pgSize[width] + - pgEdge[left] - pgEdge[right] + - num[cols]*(margin[left] + margin[right])) / num[cols], + (pgSize[height] + - pgEdge[top] - pgEdge[bottom] + - num[rows]*(margin[top] + margin[bottom])) / num[rows] + ) + else: + size = expandTuple(unit, size, length = 2) + + # sep is separation between same points on pieces + sep = (size[width]+margin[right]+margin[left], + size[height]+margin[top]+margin[bottom]) + + style = 'stroke:#000000;stroke-opacity:1;fill:none;fill-opacity:1;' + + padbox = 'rect', { + 'x': str(pgEdge[left] + margin[left] + padding[left]), + 'y': str(pgEdge[top] + margin[top] + padding[top]), + 'width': str(size[width] - padding[left] - padding[right]), + 'height': str(size[height] - padding[top] - padding[bottom]), + 'style': style, + } + margbox = 'rect', { + 'x': str(pgEdge[left] + margin[left]), + 'y': str(pgEdge[top] + margin[top]), + 'width': str(size[width]), + 'height': str(size[height]), + 'style': style, + } + + doc = ElementTree.ElementTree(ElementTree.Element(container, + {'xmlns:inkscape':"http://www.inkscape.org/namespaces/inkscape", + 'xmlns:xlink':"http://www.w3.org/1999/xlink", + 'width':str(pgSize[width]), + 'height':str(pgSize[height]), + })) + + sub = ElementTree.SubElement + + root = doc.getroot() + + def makeClones(under, to): + for r in range(0,num[rows]): + for c in range(0,num[cols]): + if r == 0 and c == 0: continue + sub(under, 'use', { + 'xlink:href': '#' + to, + 'transform': 'translate(%f,%f)' % + (c*sep[width], r*sep[height])}) + + # guidelayer ##################################################### + if set(['inner', 'outer']).intersection(show): + layer = sub(root, 'g', {'id':'guidelayer', + 'inkscape:groupmode':'layer'}) + if 'inner' in show: + padbox[1]['id'] = 'innerguide' + padbox[1]['style'] = padbox[1]['style'].replace('stroke:#000000', + 'stroke:#8080ff') + sub(layer, *padbox) + del padbox[1]['id'] + padbox[1]['style'] = padbox[1]['style'].replace('stroke:#8080ff', + 'stroke:#000000') + makeClones(layer, 'innerguide') + if 'outer' in show: + margbox[1]['id'] = 'outerguide' + margbox[1]['style'] = padbox[1]['style'].replace('stroke:#000000', + 'stroke:#8080ff') + sub(layer, *margbox) + del margbox[1]['id'] + margbox[1]['style'] = padbox[1]['style'].replace('stroke:#8080ff', + 'stroke:#000000') + makeClones(layer, 'outerguide') + + # crosslayer ##################################################### + if set(['crosses']).intersection(show): + layer = sub(root, 'g', {'id':'cutlayer', + 'inkscape:groupmode':'layer'}) + + if 'crosses' in show: + crosslen = 12 + group = sub(layer, 'g', id='cross') + x,y = 0,0 + path = 'M%f %f' % (x+pgEdge[left] + margin[left], + y+pgEdge[top] + margin[top]-crosslen) + path += ' L%f %f' % (x+pgEdge[left] + margin[left], + y+pgEdge[top] + margin[top]+crosslen) + path += ' M%f %f' % (x+pgEdge[left] + margin[left]-crosslen, + y+pgEdge[top] + margin[top]) + path += ' L%f %f' % (x+pgEdge[left] + margin[left]+crosslen, + y+pgEdge[top] + margin[top]) + sub(group, 'path', style=style+'stroke-width:0.05', + d = path, id = 'crossmarker') + for r in 0, 1: + for c in 0, 1: + if r or c: + x,y = c*size[width], r*size[height] + sub(group, 'use', { + 'xlink:href': '#crossmarker', + 'transform': 'translate(%f,%f)' % + (x,y)}) + makeClones(layer, 'cross') + + # clonelayer ##################################################### + layer = sub(root, 'g', {'id':'clonelayer', 'inkscape:groupmode':'layer'}) + makeClones(layer, 'main') + + # mainlayer ###################################################### + layer = sub(root, 'g', {'id':'mainlayer', 'inkscape:groupmode':'layer'}) + group = sub(layer, 'g', {'id':'main'}) + + if 'innerbox' in show: + sub(group, *padbox) + if 'outerbox' in show: + sub(group, *margbox) + if 'holder' in show: + x, y = (pgEdge[left] + margin[left] + padding[left], + pgEdge[top] + margin[top] + padding[top]) + w, h = (size[width] - padding[left] - padding[right], + size[height] - padding[top] - padding[bottom]) + path = 'M%f %f' % (x + w/2., y) + path += ' L%f %f' % (x + w, y + h/2.) + path += ' L%f %f' % (x + w/2., y + h) + path += ' L%f %f' % (x, y + h/2.) + path += ' Z' + sub(group, 'path', style=style, d = path) + + if returnTree: + return doc + else: + return ElementTree.tostring(root) + +if __name__ == '__main__': + print GenerateNup(num=(10,3), margin=(5,5), show=['default', 'outer']) +#@-node:tbrown.20070622103716.2:GenerateNup +#@-others +#@-node:tbrown.20070622094435.1:@thin pageframe.py +#@-leo + + diff --git a/share/extensions/perfectboundcover.inx b/share/extensions/perfectboundcover.inx index f36ad64a6..20285e2a6 100644 --- a/share/extensions/perfectboundcover.inx +++ b/share/extensions/perfectboundcover.inx @@ -5,34 +5,36 @@ perfectboundcover.py inkex.py <_param name="book" type="description" appearance="header">Book Properties - 6 - 9 - 64 - true + 6 + 9 + 64 + true <_param name="paper" type="description" appearance="header">Interior Pages - + <_item value="ppi">Pages Per Inch (PPI) <_item value="caliper">Caliper (inches) <_item value="points">Points <_item value="bond_weight">Bond Weight # <_item value="width">Specify Width - 0 + 0 <_param name="cover" type="description" appearance="header">Cover - + <_item value="ppi">Pages Per Inch (PPI) <_item value="caliper">Caliper (inches) <_item value="points">Points <_item value="bond_weight">Bond Weight # <_item value="width">Specify Width - 0 - .25 - <_param name="warning" type="description">Note: Bond Weight # calculations are a best-guess estimate. + 0 + .25 + <_param name="warning" type="description" indent="1">Note: Bond Weight # calculations are a best-guess estimate. all - + + + + -- cgit v1.2.3