diff --git a/extensions/fablabchemnitz/label_guides.inx b/extensions/fablabchemnitz/label_guides.inx new file mode 100644 index 00000000..5bfcae15 --- /dev/null +++ b/extensions/fablabchemnitz/label_guides.inx @@ -0,0 +1,158 @@ + + + Label Guides + fablabchemnitz.de.label_guides + + mm + inch + + + + + 199.6 x 289.1mm Labels (1/sheet, A4) [L7167, LP1/199] + 199.6 x 143.5mm Labels (2/sheet, A4) [L7168, LP2/199] + 99.1 x 139mm Labels (4/sheet, A4) [L7169, LP4/99] + 192 x 62mm Lever Arch File Labels (4/sheet, A4) [L7701, LP4/192] + 200 x 60mm Lever Arch File Labels (4/sheet, A4) [L7171, LP4/200] + 99.1 x 93.1mm Labels (6/sheet, A4) [L7166, LP6/99] + 192 x 39mm Lever Arch File Labels (7/sheet, A4) [L4760, LP7/192] + 99.1 x 67.7mm Labels (8/sheet, A4) [L7165, LP8/99] + 70 x 71.8mm Diskette Labels (8/sheet, A4) [L7664, LP8/71] + 133 x 29.6mm Data Cartridge Labels (9/sheet, A4) [L7667, LP9/133] + 99.1 x 57mm Labels (10/sheet, A4) [L7173, LP10/99] + 38.1 x 135mm Smartstamp “Logo” Labels (10/sheet, A4) [J5103, LP10/38] + 70 x 52mm Labels (10/sheet, A4) [L7666, LP10/70] + 95.8 x 50.7mm Labels (10/sheet, A4) [L7783, LP10/96] + 63.5 x 72mm Labels (12/sheet, A4) [L7164, LP12/63] + 76.2 x 46.4mm Labels (12/sheet, A4) [L7671, LP12/76] + 99.1 x 42.3mm Labels (12/sheet, A4) [L7177, LP12/99] + 99.1 x 38.1mm Labels (14/sheet, A4) [L7163, LP14/99] + 59 x 50.9mm Labels (15/sheet, A4) [L7668, LP15/59] + 99.1 x 33.9mm Labels (16/sheet, A4) [L7162, LP16/99] + 145 x 17mm Labels (16/sheet, A4) [L7674, LP16/145] + 63.5 x 46.6mm Labels (18/sheet, A4) [L7161, LP18/63] + 100 x 30mm Labels (18/sheet, A4) [L7172, LP18/100] + 38.1 x 69mm Smartstamp “Bulk Print” Labels (20/sheet, A4) [J5101, LP20/38] + 63.5 x 38.1mm Labels (21/sheet, A4) [L7160, LP21/63] + 63.5 x 33.9mm Labels (24/sheet, A4) [L7159, LP24/63] + 72 x 21.15mm Labels (24/sheet, A4) [L7665, LP24/72] + 134 x 11mm Eurofolio Labels (24/sheet, A4) [L7170, LP24/134] + 63.5 x 29.6mm Labels (27/sheet, A4) [L6011, LP27/63] + 54 x 22mm Labels (33/sheet, A4) [LP33/53] + 48.9 x 29.6mm Labels (36/sheet, A4) [LP36/49] + 45.7 x 25.4mm Labels (40/sheet, A4) [L7654, LP40/45] + 45.7 x 21.2mm Labels (48/sheet, A4) [L7636, LP48/45] + 89 x 10mm Labels (56/sheet, A4) [LP56/89] + 38.1 x 21.2mm Labels (65/sheet, A4) [L7651, LP65/38] + 46 x 11.1mm Labels (84/sheet, A4) [L7656, LP84/46] + 25.4 x 10mm Labels (189/sheet, A4) [L7658, LP189/25] + 17.8 x 10mm Labels (270/sheet, A4) [L7657, LP270/18] + 95 x 95mm Labels (6/sheet, A4) [LP6/95SQ] + 65 x 65mm Labels (12/sheet, A4) [LP12/65SQ] + 51 x 51mm Labels (15/sheet, A4) [LP15/51SQ] + 37 x 37mm Labels (35/sheet, A4) [LP35/37SQ] + 25 x 25mm Labels (70/sheet, A4) [LP70/25SQ] + + 1 + + + + 210 x 297mm Labels (1/sheet, A4) [L7784, LP1/210H,J,V] + 105 x 297mm Labels (2/sheet, A4) [LP2/105] + 210 x 148.5mm Labels (2/sheet, A4) [3655, LP2/210] + 210 x 99mm Labels (3/sheet, A4) [LP3/210] + 105 x 148.5mm Labels (4/sheet, A4) [3483, LP4/105] + 210 x 74.25mm Labels (4/sheet, A4) [LP4/210] + 70 x 148.5mm Labels (6/sheet, A4) [LP6/70] + 105 x 99mm Labels (6/sheet, A4) [LP6/105] + 105 x 74.25mm Labels (8/sheet, A4) [3427, LP8/105] + 105 x 70.7mm Labels (8/sheet, A4) [LP8/105S] + 105 x 59.4mm Labels (10/sheet, A4) [LP10/105] + 105 x 57.55mm Labels (10/sheet, A4) [3425, LP10/105S] + 105 x 49.5mm Labels (12/sheet, A4) [LP12/105] + 105 x 47.9mm Labels (12/sheet, A4) [3424, LP12/105S] + 105 x 42.42mm Labels (14/sheet, A4) [3653, LP14/105] + 70 x 59.4mm Labels (15/sheet, A4) [LP15/70] + 70 x 50.7mm Labels (15/sheet, A4) [LP15/70S] + 105 x 37.12mm Labels (16/sheet, A4) [3484, LP16/105] + 105 x 34.95mm Labels (16/sheet, A4) [3423, LP16/105S] + 70 x 42.42mm Labels (21/sheet, A4) [3652, LP21/70] + 70 x 38.1mm Labels (21/sheet, A4) [LP21/70S] + 70 x 37.12mm Labels (24/sheet, A4) [3474, LP24/70] + 70 x 34.95mm Labels (24/sheet, A4) [3422, LP24/70S] + 70 x 34mm Labels (24/sheet, A4) [LP24/70LS] + 70 x 36mm Labels (24/sheet, A4) [3475, LP24/70SS] + 70 x 31.95mm Labels (27/sheet, A4) [LP27/70S] + 70 x 29.7mm Labels (30/sheet, A4) [3489, LP30/70] + 70 x 25.4mm Labels (33/sheet, A4) [3421, LP33/70S] + 57 x 15mm Labels (51/sheet, A4) [L7409, LP51/57] + 52.5 x 21.21mm Labels (56/sheet, A4) [LP56/52] + + + + + 114.5mm Labels (2/sheet, A4) [LP2/115R] + 88mm Labels (6/sheet, A4) [LP6/88R] + 85mm Labels (6/sheet, A4) [LP6/85R] + 76mm Labels (6/sheet, A4) [LP6/76R] + 72mm Labels (6/sheet, A4) [C2244, LP6/72R] + 69mm Labels (8/sheet, A4) [LP8/69R] + 63.5mm Labels (12/sheet, A4) [L7670, LP12/64R] + 51mm Labels (15/sheet, A4) [LP15/51R] + 45mm Labels (24/sheet, A4) [LP24/45R] + 40mm Labels (24/sheet, A4) [L7780, LP24/40R] + 37mm Labels (35/sheet, A4) [LP35/37R] + 35mm Labels (35/sheet, A4) [LP35/35R] + 32mm Labels (40/sheet, A4) [LP40/32R] + 29mm Labels (54/sheet, A4) [LP54/29R] + 25mm Labels (70/sheet, A4) [LP70/25R] + 19mm Labels (117/sheet, A4) [LP117/19R] + 13mm Labels (216/sheet, A4) [LP216/13R] + 195 x 138mm Labels (2/sheet, A4) [LP2/195OV] + 90 x 135mm Labels (4/sheet, A4) [LP4/90OV] + 90 x 62mm Labels (8/sheet, A4) [LP8/90OV] + 95 x 53mm Labels (10/sheet, A4) [LP10/95OV] + 95 x 34mm Labels (14/sheet, A4) [LP14/95OV] + 60 x 34mm Labels (21/sheet, A4) [LP21/60OV] + 40 x 30mm Labels (32/sheet, A4) [LP32/40OV] + 35.05 x 16mm Labels (65/sheet, A4) [LP65/35OV] + + + + Custom Label Options + 8.5 + 13> + 37 + 37 + 39 + 39 + 5 + 7 + + Rectangle + Circle/Ellipse + + + + Drawing Options + false + true + true + 5 + true + true + 5 + true + false + + all + + + + + + + + \ No newline at end of file diff --git a/extensions/fablabchemnitz/label_guides.py b/extensions/fablabchemnitz/label_guides.py new file mode 100755 index 00000000..01c8ffe3 --- /dev/null +++ b/extensions/fablabchemnitz/label_guides.py @@ -0,0 +1,565 @@ +#!/usr/bin/env python2 +''' +Label Guides Creator + +Copyright (C) 2018 John Beard - john.j.beard **guesswhat** gmail.com + +## Simple Extension to draw guides and outlines for common paper labels + +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; version 2 of the License. + +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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +''' + +import inkex +import simplestyle +from lxml import etree + +# Colours to use for the guides +GUIDE_COLOURS = { + 'edge': '#00A000', + 'centre': '#A00000', + 'inset': '#0000A0' +} + +# Preset list +# Regular grids defined as: +# 'reg', unit, page_szie, l marg, t marg, X size, Y size, +# X pitch, Y pitch, Number across, Number down, shapes +PRESETS = { + # Rounded rectangular labels in grid layout + 'L7167': ['reg', 'mm', 'a4', 5.2, 3.95, 199.6, 289.1, 199.6, 289.1, 1, 1, 'rrect'], + 'L7168': ['reg', 'mm', 'a4', 5.2, 5, 199.6, 143.5, 199.6, 143.5, 1, 2, 'rrect'], + 'L7169': ['reg', 'mm', 'a4', 4.65, 9.5, 99.1, 139, 101.6, 139, 2, 2, 'rrect'], + 'L7701': ['reg', 'mm', 'a4', 9, 24.5, 192, 62, 192, 62, 1, 4, 'rrect'], + 'L7171': ['reg', 'mm', 'a4', 5, 28.5, 200, 60, 200, 60, 1, 4, 'rrect'], + 'L7166': ['reg', 'mm', 'a4', 4.65, 8.85, 99.1, 93.1, 101.6, 93.1, 2, 3, 'rrect'], + 'L4760': ['reg', 'mm', 'a4', 9, 12, 192, 39, 192, 39, 1, 7, 'rrect'], + 'L7165': ['reg', 'mm', 'a4', 4.65, 13.1, 99.1, 67.7, 101.6, 67.7, 2, 4, 'rrect'], + 'L7664': ['reg', 'mm', 'a4', 18, 4.9, 70, 71.8, 104, 71.8, 2, 4, 'rrect'], + 'L7667': ['reg', 'mm', 'a4', 38.5, 15.3, 133, 29.6, 133, 29.6, 1, 9, 'rrect'], + 'L7173': ['reg', 'mm', 'a4', 4.65, 6, 99.1, 57, 101.6, 57, 2, 5, 'rrect'], + 'J5103': ['reg', 'mm', 'a4', 4.75, 13.5, 38.1, 135, 40.6, 135, 5, 2, 'rrect'], + 'L7666': ['reg', 'mm', 'a4', 23, 18.5, 70, 52, 94, 52, 2, 5, 'rrect'], + 'L7783': ['reg', 'mm', 'a4', 7.85, 21.75, 95.8, 50.7, 98.5, 50.7, 2, 5, 'rrect'], + 'L7164': ['reg', 'mm', 'a4', 7.25, 4.5, 63.5, 72, 66, 72, 3, 4, 'rrect'], + 'L7671': ['reg', 'mm', 'a4', 27.55, 9.3, 76.2, 46.4, 78.7, 46.4, 2, 6, 'rrect'], + 'L7177': ['reg', 'mm', 'a4', 4.65, 21.6, 99.1, 42.3, 101.6, 42.3, 2, 6, 'rrect'], + 'L7163': ['reg', 'mm', 'a4', 4.65, 15.15, 99.1, 38.1, 101.6, 38.1, 2, 7, 'rrect'], + 'L7668': ['reg', 'mm', 'a4', 13.5, 21.25, 59, 50.9, 62, 50.9, 3, 5, 'rrect'], + 'L7162': ['reg', 'mm', 'a4', 4.65, 12.9, 99.1, 33.9, 101.6, 33.9, 2, 8, 'rrect'], + 'L7674': ['reg', 'mm', 'a4', 32.5, 12.5, 145, 17, 145, 17, 1, 16, 'rrect'], + 'L7161': ['reg', 'mm', 'a4', 7.25, 8.7, 63.5, 46.6, 66, 46.6, 3, 6, 'rrect'], + 'L7172': ['reg', 'mm', 'a4', 3.75, 13.5, 100, 30, 102.5, 30, 2, 9, 'rrect'], + 'J5101': ['reg', 'mm', 'a4', 4.75, 10.5, 38.1, 69, 40.6, 69, 5, 4, 'rrect'], + 'L7160': ['reg', 'mm', 'a4', 7.25, 15.15, 63.5, 38.1, 66, 38.1, 3, 7, 'rrect'], + 'L7159': ['reg', 'mm', 'a4', 7.25, 12.9, 63.5, 33.9, 66, 33.9, 3, 8, 'rrect'], + 'L7665': ['reg', 'mm', 'a4', 22, 21.6, 72, 21.15, 94, 21.15, 2, 12, 'rrect'], + 'L7170': ['reg', 'mm', 'a4', 38, 16.5, 134, 11, 134, 11, 1, 24, 'rrect'], + 'L6011': ['reg', 'mm', 'a4', 7.25, 15.3, 63.5, 29.6, 66, 29.6, 3, 9, 'rrect'], + 'LP33_53': ['reg', 'mm', 'a4', 21, 17.5, 54, 22, 57, 24, 3, 11, 'rrect'], + 'LP36_49': ['reg', 'mm', 'a4', 4.8, 15.3, 48.9, 29.6, 50.5, 29.6, 4, 9, 'rrect'], + 'L7654': ['reg', 'mm', 'a4', 9.7, 21.5, 45.7, 25.4, 48.3, 25.4, 4, 10, 'rrect'], + 'L7636': ['reg', 'mm', 'a4', 9.85, 21.3, 45.7, 21.2, 48.2, 21.2, 4, 12, 'rrect'], + 'LP56_89': ['reg', 'mm', 'a4', 8, 8.5, 89, 10, 105, 10, 2, 28, 'rrect'], + 'L7651': ['reg', 'mm', 'a4', 4.75, 10.7, 38.1, 21.2, 40.6, 21.2, 5, 13, 'rrect'], + 'L7656': ['reg', 'mm', 'a4', 5.95, 15.95, 46, 11.1, 50.7, 12.7, 4, 21, 'rrect'], + 'L7658': ['reg', 'mm', 'a4', 8.6, 13.5, 25.4, 10, 27.9, 10, 7, 27, 'rrect'], + 'L7657': ['reg', 'mm', 'a4', 4.75, 13.5, 17.8, 10, 20.3, 10, 10, 27, 'rrect'], + + # Rect labels + 'L7784': ['reg', 'mm', 'a4', 0, 0, 210, 297, 210, 297, 1, 1, 'rect'], + 'LP2_105': ['reg', 'mm', 'a4', 0, 0, 105, 297, 105, 297, 2, 1, 'rect'], + '3655': ['reg', 'mm', 'a4', 0, 0, 210, 148.5, 210, 148.5, 1, 2, 'rect'], + 'LP3_210': ['reg', 'mm', 'a4', 0, 0, 210, 99, 210, 99, 1, 3, 'rect'], + '3483': ['reg', 'mm', 'a4', 0, 0, 105, 148.5, 105, 148.5, 2, 2, 'rect'], + 'LP4_210': ['reg', 'mm', 'a4', 0, 0, 210, 74.25, 210, 74.25, 1, 4, 'rect'], + 'LP6_70': ['reg', 'mm', 'a4', 0, 0, 70, 148.5, 70, 148.5, 3, 2, 'rect'], + 'LP6_105': ['reg', 'mm', 'a4', 0, 0, 105, 99, 105, 99, 2, 3, 'rect'], + '3427': ['reg', 'mm', 'a4', 0, 0, 105, 74.25, 105, 74.25, 2, 4, 'rect'], + 'LP8_105S': ['reg', 'mm', 'a4', 0, 7.1, 105, 70.7, 105, 70.7, 2, 4, 'rect'], + 'LP10_105': ['reg', 'mm', 'a4', 0, 0, 105, 59.4, 105, 59.4, 2, 5, 'rect'], + '3425': ['reg', 'mm', 'a4', 0, 4.625, 105, 57.55, 105, 57.55, 2, 5, 'rect'], + 'LP12_105': ['reg', 'mm', 'a4', 0, 0, 105, 49.5, 105, 49.5, 2, 6, 'rect'], + '3424': ['reg', 'mm', 'a4', 0, 4.8, 105, 47.9, 105, 47.9, 2, 6, 'rect'], + '3653': ['reg', 'mm', 'a4', 0, 0, 105, 42.42, 105, 42.42, 2, 7, 'rect'], + 'LP15_70': ['reg', 'mm', 'a4', 0, 0, 70, 59.4, 70, 59.4, 3, 5, 'rect'], + 'LP15_70S': ['reg', 'mm', 'a4', 0, 21.75, 70, 50.7, 70, 50.7, 3, 5, 'rect'], + '3484': ['reg', 'mm', 'a4', 0, 0, 105, 37.12, 105, 37.12, 2, 8, 'rect'], + '3423': ['reg', 'mm', 'a4', 0, 8.7, 105, 34.95, 105, 34.95, 2, 8, 'rect'], + '3652': ['reg', 'mm', 'a4', 0, 0, 70, 42.42, 70, 42.42, 3, 7, 'rect'], + 'LP21_70S': ['reg', 'mm', 'a4', 0, 15.15, 70, 38.1, 70, 38.1, 3, 7, 'rect'], + '3474': ['reg', 'mm', 'a4', 0, 0, 70, 37.12, 70, 37.12, 3, 8, 'rect'], + '3422': ['reg', 'mm', 'a4', 0, 8.7, 70, 34.95, 70, 34.95, 3, 8, 'rect'], + 'LP24_70LS': ['reg', 'mm', 'a4', 0, 12.5, 70, 34, 70, 34, 3, 8, 'rect'], + '3475': ['reg', 'mm', 'a4', 0, 4.5, 70, 36, 70, 36, 3, 8, 'rect'], + 'LP27_70S': ['reg', 'mm', 'a4', 0, 4.725, 70, 31.95, 70, 31.95, 3, 9, 'rect'], + '3489': ['reg', 'mm', 'a4', 0, 0, 70, 29.7, 70, 29.7, 3, 10, 'rect'], + '3421': ['reg', 'mm', 'a4', 0, 8.8, 70, 25.4, 70, 25.4, 3, 11, 'rect'], + 'L7409': ['reg', 'mm', 'a4', 19.5, 21, 57, 15, 57, 15, 3, 17, 'rect'], + 'LP56_52': ['reg', 'mm', 'a4', 0, 0, 52.5, 21.21, 52.5, 21.21, 4, 14, 'rect'], + + # Round labels + 'LP2_115R': ['reg', 'mm', 'a4', 47.75, 16.65, 114.5, 114.5, 114.5, 149.2, 1, 2, 'circle'], + 'LP6_88R': ['reg', 'mm', 'a4', 16, 14.5, 88, 88, 90, 90, 2, 3, 'circle'], + 'LP6_85R': ['reg', 'mm', 'a4', 17.5, 16, 85, 85, 90, 90, 2, 3, 'circle'], + 'LP6_76R': ['reg', 'mm', 'a4', 27, 31, 76, 76, 80, 79.5, 2, 3, 'circle'], + 'C2244': ['reg', 'mm', 'a4', 29.7, 33.9, 72, 72, 78.6, 78.6, 2, 3, 'circle'], + 'LP8_69R': ['reg', 'mm', 'a4', 34.5, 6, 69, 69, 72, 72, 2, 4, 'circle'], + 'L7670': ['reg', 'mm', 'a4', 5.25, 14.75, 63.5, 63.5, 68, 68, 3, 4, 'circle'], + 'LP15_51R': ['reg', 'mm', 'a4', 26.5, 17, 51, 51, 53, 53, 3, 5, 'circle'], + 'LP24_45R': ['reg', 'mm', 'a4', 9, 6, 45, 45, 49, 48, 4, 6, 'circle'], + 'L7780': ['reg', 'mm', 'a4', 16, 13.5, 40, 40, 46, 46, 4, 6, 'circle'], + 'LP35_37R': ['reg', 'mm', 'a4', 8.5, 13, 37, 37, 39, 39, 5, 7, 'circle'], + 'LP35_35R': ['reg', 'mm', 'a4', 9.5, 17, 35, 35, 39, 38, 5, 7, 'circle'], + 'LP40_32R': ['reg', 'mm', 'a4', 19, 10.35, 32, 32, 35, 34.9, 5, 8, 'circle'], + 'LP54_29R': ['reg', 'mm', 'a4', 8, 6, 29, 29, 33, 32, 6, 9, 'circle'], + 'LP70_25R': ['reg', 'mm', 'a4', 11.5, 14.5, 25, 25, 27, 27, 7, 10, 'circle'], + 'LP117_19R': ['reg', 'mm', 'a4', 11.5, 13, 19, 19, 21, 21, 9, 13, 'circle'], + 'LP216_13R': ['reg', 'mm', 'a4', 13.25, 10.25, 13, 13, 15.5, 15.5, 12, 18, 'circle'], + + # Oval labels + 'LP2_195OV': ['reg', 'mm', 'a4', 7.5, 8.5, 195, 138, 195, 142, 1, 2, 'circle'], + 'LP4_90OV': ['reg', 'mm', 'a4', 14, 12.5, 90, 135, 92, 137, 2, 2, 'circle'], + 'LP8_90OV': ['reg', 'mm', 'a4', 9.25, 15.95, 90, 62, 101.5, 67.7, 2, 4, 'circle'], + 'LP10_95OV': ['reg', 'mm', 'a4', 7, 8, 95, 53, 101, 57, 2, 5, 'circle'], + 'LP14_95OV': ['reg', 'mm', 'a4', 7, 17.5, 95, 34, 101, 38, 2, 7, 'circle'], + 'LP21_60OV': ['reg', 'mm', 'a4', 11, 10, 60, 34, 64, 40.5, 3, 7, 'circle'], + 'LP32_40OV': ['reg', 'mm', 'a4', 22, 21.5, 40, 30, 42, 32, 4, 8, 'circle'], + 'LP65_35OV': ['reg', 'mm', 'a4', 5.975, 13.3, 35.05, 16, 40.75, 21.2, 5, 13, 'circle'], + + # Square labels + 'LP6_95SQ': ['reg', 'mm', 'a4', 6.5, 3, 95, 95, 98, 98, 2, 3, 'rrect'], + 'LP12_65SQ': ['reg', 'mm', 'a4', 5, 15.5, 65, 65, 67.5, 67, 3, 4, 'rrect'], + 'LP15_51SQ': ['reg', 'mm', 'a4', 26.6, 17.2, 51, 51, 52.9, 52.9, 3, 5, 'rrect'], + 'LP35_37SQ': ['reg', 'mm', 'a4', 8.5 / 12, 13.3, 37, 37, 39, 38.9, 5, 7, 'rrect'], + 'LP70_25SQ': ['reg', 'mm', 'a4', 11.5, 14.5, 25, 25, 27, 27, 7, 10, 'rrect'], +} + + +def add_SVG_guide(x, y, orientation, colour, parent): + """ Create a sodipodi:guide node on the given parent + """ + + try: + # convert mnemonics to actual orientations + orientation = { + 'vert': '1,0', + 'horz': '0,1' + }[orientation] + except KeyError: + pass + + attribs = { + 'position': str(x) + "," + str(y), + 'orientation': orientation + } + + if colour is not None: + attribs[inkex.addNS('color', 'inkscape')] = colour + + etree.SubElement( + parent, + inkex.addNS('guide', 'sodipodi'), + attribs) + + +def delete_all_guides(document): + # getting the parent's tag of the guides + nv = document.xpath( + '/svg:svg/sodipodi:namedview', namespaces=inkex.NSS)[0] + + # getting all the guides + children = document.xpath('/svg:svg/sodipodi:namedview/sodipodi:guide', + namespaces=inkex.NSS) + + # removing each guides + for element in children: + nv.remove(element) + + +def draw_SVG_ellipse(rx, ry, cx, cy, style, parent): + + attribs = { + 'style': str(inkex.Style(style)), + inkex.addNS('cx', 'sodipodi'): str(cx), + inkex.addNS('cy', 'sodipodi'): str(cy), + inkex.addNS('rx', 'sodipodi'): str(rx), + inkex.addNS('ry', 'sodipodi'): str(ry), + inkex.addNS('type', 'sodipodi'): 'arc', + } + + etree.SubElement(parent, inkex.addNS('path', 'svg'), attribs) + + +def draw_SVG_rect(x, y, w, h, round, style, parent): + + attribs = { + 'style': str(inkex.Style(style)), + 'height': str(h), + 'width': str(w), + 'x': str(x), + 'y': str(y) + } + + if round: + attribs['ry'] = str(round) + + etree.SubElement(parent, inkex.addNS('rect', 'svg'), attribs) + + +def add_SVG_layer(parent, gid, label): + + layer = etree.SubElement(parent, 'g', { + 'id': gid, + inkex.addNS('groupmode', 'inkscape'): 'layer', + inkex.addNS('label', 'inkscape'): label + }) + + return layer + + +class LabelGuides(inkex.Effect): + + def __init__(self): + + inkex.Effect.__init__(self) + self.arg_parser.add_argument('--units', default="mm", help='The units to use for custom label sizing') + self.arg_parser.add_argument('--preset_tab', default='rrect', help='The preset section that is selected (other sections will be ignored)') + + # ROUNDED RECTANGLE PRESET OPTIONS + self.arg_parser.add_argument('--rrect_preset', default='L7167', help='Use the given rounded rectangle preset template') + self.arg_parser.add_argument('--rrect_radius', type=float, default=1, help='Rectangle corner radius') # RECTANGULAR PRESET OPTIONS + self.arg_parser.add_argument('--rect_preset', default='L7784', help='Use the given square-corner rectangle template') + + # CIRCULAR PRESET OPTIONS + self.arg_parser.add_argument('--circ_preset', default='LP2_115R', help='Use the given circular template') + + # CUSTOM LABEL OPTIONS + self.arg_parser.add_argument('--margin_l', type=float, default=8.5, help='Left page margin') + self.arg_parser.add_argument('--margin_t', type=float, default=13, help='Top page margin') + self.arg_parser.add_argument('--size_x', type=float, default=37, help='Label X size') + self.arg_parser.add_argument('--size_y', type=float, default=37, help='Label Y size') + self.arg_parser.add_argument('--pitch_x', type=float, default=39, help='Label X pitch') + self.arg_parser.add_argument('--pitch_y', type=float, default=39, help='Label Y pitch') + self.arg_parser.add_argument('--count_x', type=int, default=5, help='Number of labels across') + self.arg_parser.add_argument('--count_y', type=int, default=7, help='Number of labels down') + self.arg_parser.add_argument('--shapes', default='rect', help='Label shapes to draw') + + # GENERAL DRAWING OPTIONS + self.arg_parser.add_argument('--delete_existing_guides', type=inkex.Boolean, default=False, help='Delete existing guides from document') + self.arg_parser.add_argument('--draw_edge_guides', type=inkex.Boolean, default=True, help='Draw guides at label edges') + self.arg_parser.add_argument('--draw_centre_guides', type=inkex.Boolean, default=True, help='Draw guides at label centres') + self.arg_parser.add_argument('--inset', type=float, default=5, help='Inset to use for inset guides') + self.arg_parser.add_argument('--draw_inset_guides', type=inkex.Boolean, default=True, help='Draw guides inset to label edges') + self.arg_parser.add_argument('--draw_shapes', type=inkex.Boolean, default=True, help='Draw label outline shapes') + self.arg_parser.add_argument('--shape_inset', default=5, help='Inset to use for inset shapes') + self.arg_parser.add_argument('--draw_inset_shapes', type=inkex.Boolean, default=True, help='Draw shapes inset in the label outline') + self.arg_parser.add_argument('--set_page_size', type=inkex.Boolean, default=True, help='Set page size (presets only)') + + def _to_uu(self, val, unit): + """ + Transform a value in given units to User Units + """ + return self.svg.unittouu(str(val) + unit) + + def _get_page_size(self, size): + """ + Get a page size from a definition entry - can be in the form + [x, y], or a string (one of ['a4']) + """ + + if isinstance(size, (list,)): + # Explicit size + return size + elif size == "a4": + return [210, 297] + + # Failed to find a useful size, None will inhibit setting the size + return None + + def _set_SVG_page_size(self, document, x, y, unit): + """ + Set the SVG page size to the given absolute size. The viewbox is + also rescaled as needed to maintain the scale factor. + """ + + svg = document.getroot() + + # Re-calculate viewbox in terms of User Units + new_uu_w = self._to_uu(x, unit) + new_uu_h = self._to_uu(y, unit) + + # set SVG page size + svg.attrib['width'] = str(x) + unit + svg.attrib['height'] = str(y) + unit + + svg.attrib['viewBox'] = "0 0 %f %f" % (new_uu_w, new_uu_h) + + def _read_custom_options(self, options): + """ + Read custom label geometry options and produce + a dictionary of parameters for ingestion + """ + unit = options.units + + custom_opts = { + 'units': options.units, + 'page_size': None, + 'margin': { + 'l': self._to_uu(options.margin_l, unit), + 't': self._to_uu(options.margin_t, unit) + }, + 'size': { + 'x': self._to_uu(options.size_x, unit), + 'y': self._to_uu(options.size_y, unit) + }, + 'pitch': { + 'x': self._to_uu(options.pitch_x, unit), + 'y': self._to_uu(options.pitch_y, unit) + }, + 'count': { + 'x': options.count_x, + 'y': options.count_y + }, + 'shapes': options.shapes, + 'corner_rad': None, + } + + return custom_opts + + def _construct_preset_opts(self, preset_type, preset_id, options): + """Construct an options object for a preset label template + """ + preset = PRESETS[preset_id] + + unit = preset[1] + + opts = { + 'units': unit, + 'page_size': self._get_page_size(preset[2]), + 'margin': { + 'l': self._to_uu(preset[3], unit), + 't': self._to_uu(preset[4], unit) + }, + 'size': { + 'x': self._to_uu(preset[5], unit), + 'y': self._to_uu(preset[6], unit) + }, + 'pitch': { + 'x': self._to_uu(preset[7], unit), + 'y': self._to_uu(preset[8], unit) + }, + 'count': { + 'x': preset[9], + 'y': preset[10] + }, + 'shapes': preset[11], + 'corner_rad': None, + } + + # add addtional options by preset type + if preset_type == "rrect": + opts["corner_rad"] = self._to_uu(options.rrect_radius, unit) + + return opts + + def _get_regular_guides(self, label_opts, inset): + """ + Get the guides for a set of labels defined by a regular grid + + This is done so that irregular-grid presets can be defined if + needed + """ + + guides = {'v': [], 'h': []} + + x = label_opts['margin']['l'] + + for x_idx in range(label_opts['count']['x']): + + l_pos = x + inset + r_pos = x + label_opts['size']['x'] - inset + + guides['v'].extend([l_pos, r_pos]) + + # Step over to next label + x += label_opts['pitch']['x'] + + # Horizontal guides, top to bottom + height = self.svg.unittouu(self.svg.height) + + y = height - label_opts['margin']['t'] + + for y_idx in range(label_opts['count']['y']): + + t_pos = y - inset + b_pos = y - label_opts['size']['y'] + inset + + guides['h'].extend([t_pos, b_pos]) + + # Step over to next label + y -= label_opts['pitch']['y'] + + return guides + + def _draw_label_guides(self, document, label_opts, inset, colour): + """ + Draws label guides from a regular guide description object + """ + # convert to UU + inset = self._to_uu(inset, label_opts['units']) + + guides = self._get_regular_guides(label_opts, inset) + + # Get parent tag of the guides + nv = self.svg.namedview + + # Draw vertical guides + for g in guides['v']: + add_SVG_guide(g, 0, 'vert', colour, nv) + + for g in guides['h']: + add_SVG_guide(0, g, 'horz', colour, nv) + + def _draw_centre_guides(self, document, label_opts, colour): + """ + Draw guides in the centre of labels defined by the given options + """ + + guides = self._get_regular_guides(label_opts, 0) + nv = self.svg.namedview + + for g in range(0, len(guides['v']), 2): + pos = (guides['v'][g] + guides['v'][g + 1]) / 2 + add_SVG_guide(pos, 0, 'vert', colour, nv) + + for g in range(0, len(guides['h']), 2): + pos = (guides['h'][g] + guides['h'][g + 1]) / 2 + add_SVG_guide(0, pos, 'horz', colour, nv) + + def _draw_shapes(self, document, label_opts, inset): + """ + Draw label shapes from a regular grid + """ + + style = { + 'stroke': '#000000', + 'stroke-width': self._to_uu(1, "px"), + 'fill': "none" + } + + inset = self._to_uu(inset, label_opts['units']) + + guides = self._get_regular_guides(label_opts, 0) + shape = label_opts['shapes'] + + shapeLayer = add_SVG_layer( + self.document.getroot(), + self.svg.get_unique_id("outlineLayer"), + "Label outlines") + + # guides start from the bottom, SVG items from the top + height = self.svg.unittouu(self.svg.height) + + # draw shapes between every set of two guides + for xi in range(0, len(guides['v']), 2): + + for yi in range(0, len(guides['h']), 2): + + if shape == 'circle': + cx = (guides['v'][xi] + guides['v'][xi + 1]) / 2 + cy = (guides['h'][yi] + guides['h'][yi + 1]) / 2 + + rx = cx - guides['v'][xi] - inset + ry = guides['h'][yi] - cy - inset + + draw_SVG_ellipse(rx, ry, cx, height - cy, style, + shapeLayer) + + elif shape in ["rect", "rrect"]: + + x = guides['v'][xi] + inset + w = guides['v'][xi + 1] - x - inset + + y = guides['h'][yi] - inset + h = y - guides['h'][yi + 1] - inset + + rnd = self._to_uu(label_opts['corner_rad'], + label_opts['units']) + + draw_SVG_rect(x, height - y, w, h, rnd, style, shapeLayer) + + def _set_page_size(self, document, label_opts): + """ + Set the SVG page size from the given label template definition + """ + + size = label_opts['page_size'] + unit = label_opts['units'] + + if size is not None: + self._set_SVG_page_size(document, size[0], size[1], unit) + + def effect(self): + """ + Perform the label template generation effect + """ + + preset_type = self.options.preset_tab.strip('"') + + if preset_type == "custom": + # construct from parameters + label_opts = self._read_custom_options(self.options) + else: + # construct from a preset + + # get the preset ID from the relevant enum entry + preset_id = { + "rrect": self.options.rrect_preset, + "rect": self.options.rect_preset, + "circ": self.options.circ_preset, + }[preset_type] + + label_opts = self._construct_preset_opts(preset_type, preset_id, + self.options) + + if self.options.delete_existing_guides: + delete_all_guides(self.document) + + # Resize page first, otherwise guides won't be in the right places + if self.options.set_page_size: + self._set_page_size(self.document, label_opts) + + if self.options.draw_edge_guides: + self._draw_label_guides(self.document, label_opts, 0, + GUIDE_COLOURS['edge']) + + if self._draw_centre_guides: + self._draw_centre_guides(self.document, label_opts, + GUIDE_COLOURS['centre']) + + if self.options.draw_inset_guides and self.options.inset > 0.0: + self._draw_label_guides(self.document, label_opts, + self.options.inset, + GUIDE_COLOURS['inset']) + + if self.options.draw_shapes: + self._draw_shapes(self.document, label_opts, 0) + + if self.options.draw_inset_shapes: + self._draw_shapes(self.document, label_opts, + self.options.shape_inset) + + +if __name__ == '__main__': + LabelGuides().run()