This repository has been archived on 2023-03-25. You can view files and clone it, but cannot push or open issues or pull requests.
mightyscape-1.1-deprecated/extensions/fablabchemnitz_gridstrip_creator.py

389 lines
17 KiB
Python
Raw Normal View History

2020-07-30 01:16:18 +02:00
#!/usr/bin/env python3
'''
Grid Strip Creator v1.0 (30/11/2014)
Copyright (C) 2014 Thomas Gebert - tsgebert **AT** web.de
## This basic extension allows you to automatically draw guides in inkscape for hexagons.
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
'''
# Making an .INX file : http://wiki.inkscape.org/wiki/index.php/MakingAnINX
# see also http://codespeak.net/lxml/dev/tutorial.html#namespaces for XML namespaces manipulation
# These two lines are only needed if you don't put the script directly into the installation directory
import inkex
from xml.etree import ElementTree as ET
from lxml import etree
import gettext
_ = gettext.gettext
def printDebug(string):
inkex.errormsg(_(string))
class GridStrip_Creator(inkex.Effect):
def __init__(self):
inkex.Effect.__init__(self)
"""
Constructor.
Defines options of the script.
"""
# Call the base class constructor.
inkex.Effect.__init__(self)
self.arg_parser.add_argument('--length', type = float, default = 230.0, help = 'Length of strip')
self.arg_parser.add_argument('--width', type = float, default = 20.0, help = 'Width of strip')
self.arg_parser.add_argument('--cellheight', type = float, default = 12.5, help = 'height of cell')
self.arg_parser.add_argument('--cellwidth', type = float, default = 12.5, help = 'Width of cell')
self.arg_parser.add_argument('--scalecells', type = inkex.Boolean, default = False, help = 'Scale cells over length')
self.arg_parser.add_argument('--cellnumx', type = int, default = 11, help = 'Number of cells x')
self.arg_parser.add_argument('--cellnumy', type = int, default = 10, help = 'Number of cells y')
self.arg_parser.add_argument('--notchdepth', type = float, default = 1.0, help = 'Depth of notch')
self.arg_parser.add_argument('--notchwidth', type = float, default = 10.0, help = 'Width of notch')
self.arg_parser.add_argument('--notchhorizontal', type = inkex.Boolean, default = False, help = 'Make notches on horizontal strip')
self.arg_parser.add_argument('--notchvertical', type = inkex.Boolean, default = False, help = 'Make notches on vertical strip')
self.arg_parser.add_argument('--notch2width', type = float, default = 3.0, help = 'Width of notch')
self.arg_parser.add_argument('--notchxcorner', type = inkex.Boolean, default = False, help = 'Make notches on corner of horizontal strip')
self.arg_parser.add_argument('--notchycorner', type = inkex.Boolean, default = False, help = 'Make notches on corner of vertical strip')
def effect(self):
# Get access to main SVG document element and get its dimensions.
svg = self.document.getroot()
# getting the parent tag of the guide
nv = self.document.xpath('/svg:svg/sodipodi:namedview',namespaces=inkex.NSS)[0]
documentUnits = inkex.addNS('document-units', 'inkscape')
# inkex.utils.debug(nv.get(documentUnits))
uunits = nv.get(documentUnits)
message="Units="+uunits
# inkex.utils.debug(message)
# Get script's options value.
stripwidth=self.svg.unittouu(str(self.options.width)+uunits)
striplength=self.svg.unittouu(str(self.options.length)+uunits)
cellheight=self.svg.unittouu(str(self.options.cellheight)+uunits)
cellwidth=self.svg.unittouu(str(self.options.cellwidth)+uunits)
scalecells=(self.options.scalecells)
cellnumx=(self.options.cellnumx)
cellnumy=(self.options.cellnumy)
notchdepth=self.svg.unittouu(str(self.options.notchdepth)+uunits)
notchwidth=self.svg.unittouu(str(self.options.notchwidth)+uunits)
notchhorizontal=(self.options.notchhorizontal)
notchvertical=(self.options.notchvertical)
# notch2depth=self.svg.unittouu(str(self.options.notch2depth)+uunits)
notch2width=self.svg.unittouu(str(self.options.notch2width)+uunits)
notch2depth= stripwidth/2
notchxcorner=(self.options.notchxcorner)
notchycorner=(self.options.notchycorner)
if scalecells:
cellwidth=(striplength-4*notch2width)/cellnumx
cellheight=(striplength-4*notch2width)/cellnumy
notchxcorner=False
notchycorner=False
linewidth=self.svg.unittouu(str(0.2)+uunits)
distx=(striplength-cellnumx*cellwidth)/2
disty=(striplength-cellnumy*cellheight)/2
celldistx=(cellwidth-notchwidth)/2
celldisty=(cellheight-notch2width)/2
# getting the width and height attributes of the canvas
width = float(self.svg.unittouu(svg.attrib['width']))
height = float(self.svg.unittouu(svg.attrib['height']))
# maxlength=max(width,height)
# if striplength > maxlength:
# factor=striplength/maxlength+1
# inkex.utils.debug("document width="+str(self.uutounit(width,uunits)))
# inkex.utils.debug("document height="+str(self.uutounit(height,uunits)))
# inkex.utils.debug("strip length="+str(self.uutounit(striplength,uunits)))
# inkex.utils.debug("strip width="+str(self.uutounit(stripwidth,uunits)))
# inkex.utils.debug("cell width="+str(self.uutounit(cellwidth,uunits)))
# inkex.utils.debug("cell height="+str(self.uutounit(cellheight,uunits)))
# inkex.utils.debug("Number of cells horizontal="+str(cellnumx))
# inkex.utils.debug("Number of cells vertical ="+str(cellnumy))
# inkex.utils.debug("Depth of extra notch="+str(self.uutounit(notchdepth,uunits)))
# inkex.utils.debug("Width of extra notch="+str(self.uutounit(notchwidth,uunits)))
# inkex.utils.debug("Depth of notch for grid="+str(self.uutounit(notchdepth,uunits)))
# inkex.utils.debug("Width of notch for grid="+str(self.uutounit(notchwidth,uunits)))
# inkex.utils.debug("distx="+str(self.uutounit(distx,uunits)))
# inkex.utils.debug("disty="+str(self.uutounit(disty,uunits)))
# inkex.utils.debug("celldistx="+str(self.uutounit(celldistx,uunits)))
# inkex.utils.debug("celldisty="+str(self.uutounit(celldisty,uunits)))
parent = self.svg.get_current_layer()
layername=''
if notchhorizontal:
layername=layername+'VLED '
if notchvertical:
layername=layername+'HLED '
# Create a new layer
layer = etree.SubElement(svg,'g')
layer.set(inkex.addNS('label', 'inkscape'),layername+'Long strips')
layer.set(inkex.addNS('groupmode','inkscape'), 'layer')
grp_name = 'group_horizontal_strip_long'
grp_attribs = {inkex.addNS('label','inkscape'):grp_name}
grp = etree.SubElement(layer, 'g', grp_attribs) #the group to put everything in
style = { 'stroke': '#000000', 'stroke-width':str(linewidth), 'fill': 'none' }
for num in range(0,2):
pathstring='M '+str(1)+','+str(1)+' L '
if notchxcorner:
pathstring+=str(stripwidth-2*notchdepth)+','+str(1) # Obere Querkante
pathstring+=' L '+str(stripwidth-2*notchdepth)+','+str(notchwidth) # Erste Kerbe aussen
pathstring+=' L '+str(stripwidth)+','+str(notchwidth) # Ausrueckung
else:
pathstring+=str(stripwidth)+','+str(1)
if notchhorizontal:
pathstring+=' L '+str(stripwidth)+','+str(distx) # Distance to corner
y=distx
for i in range(0,cellnumx):
pathstring+=' L '+str(stripwidth)+','+str(y+celldistx) # Abstand
pathstring+=' L '+str(stripwidth-notchdepth)+','+str(y+celldistx) # Einrueckung
pathstring+=' L '+str(stripwidth-notchdepth)+','+str(y+celldistx+notchwidth) # Kerbe
pathstring+=' L '+str(stripwidth)+','+str(y+celldistx+notchwidth) # Ausrueckung
pathstring+=' L '+str(stripwidth)+','+str(y+2*celldistx+notchwidth) # Abstand
y=y+2*celldistx+notchwidth
if notchxcorner:
pathstring+=' L '+str(stripwidth)+','+str(striplength-notchwidth) # Untere rechte Ecke
pathstring+=' L '+str(stripwidth-2*notchdepth)+','+str(striplength-notchwidth) # Untere rechte Ecke
pathstring+=' L '+str(stripwidth-2*notchdepth)+','+str(striplength) # Untere rechte Ecke
else:
pathstring+=' L '+str(stripwidth)+','+str(striplength)
pathstring+=' L '+str(1)+','+str(striplength) # Linke untere Ecke
y=striplength-distx+notch2width/2
pathstring+=' L '+str(1)+','+str(y) # Distance to corner
pathstring+=' L '+str(notch2depth)+','+str(y) # Einrueckung
for i in range(0,cellnumx):
pathstring+=' L '+str(notch2depth)+','+str(y-notch2width) # Kerbe
pathstring+=' L '+str(1)+','+str(y-notch2width) # Ausrueckung
pathstring+=' L '+str(1)+','+str(y-notch2width-cellwidth+notch2width) # Abstand
pathstring+=' L '+str(notch2depth)+','+str(y-notch2width-cellwidth+notch2width) # Einrueckung
y=y-notch2width-cellwidth+notch2width
pathstring+=' L '+str(notch2depth)+','+str(y-notch2width) # Kerbe
pathstring+=' L '+str(1)+','+str(y-notch2width) # Ausrueckung
pathstring+=' L '+str(1)+','+str(1)+' z'
strip_transform= 'rotate(' + str(90)+')'
strip_transform+=' translate('+str(stripwidth*num)+','+str(1)+')'
strip_attribs = {'style':str(inkex.Style(style)),
inkex.addNS('label','inkscape'):"strip horizontal long",
'transform': strip_transform,
'd':pathstring}
etree.SubElement(grp, inkex.addNS('path','svg'), strip_attribs )
celldisty=(cellheight-notch2width-notchwidth)/2
grp_name = 'group_vertical_strip_long'
grp_attribs = {inkex.addNS('label','inkscape'):grp_name}
grp = etree.SubElement(layer, 'g', grp_attribs) #the group to put everything in
for num in range(0,2):
y=disty-notch2width/2
pathstring='M '+str(1)+','+str(1)
if notchycorner:
pathstring+=' L '+str(stripwidth-2*notchdepth)+','+str(1) # Obere Querkante
pathstring+=' L '+str(stripwidth-2*notchdepth)+','+str(notchwidth)
pathstring+=' L '+str(stripwidth)+','+str(notchwidth)
else:
pathstring+=' L '+str(stripwidth)+','+str(1)
pathstring+=' L '+str(stripwidth)+','+str(y) # Distance to corner
for i in range(0,cellnumy):
pathstring+=' L '+str(stripwidth-notch2depth)+','+str(y) # Einrueckung
pathstring+=' L '+str(stripwidth-notch2depth)+','+str(y+notch2width) # Kerbe
pathstring+=' L '+str(stripwidth)+','+str(y+notch2width) # Ausrueckung
if notchvertical:
pathstring+=' L '+str(stripwidth)+','+str(y+notch2width+celldisty) # Abstand
pathstring+=' L '+str(stripwidth-notchdepth)+','+str(y+notch2width+celldisty) # Einrueckung
pathstring+=' L '+str(stripwidth-notchdepth)+','+str(y+notch2width+celldisty+notchwidth) # Kerbe
pathstring+=' L '+str(stripwidth)+','+str(y+notch2width+celldisty+notchwidth) # Ausrueckung
pathstring+=' L '+str(stripwidth)+','+str(y+notch2width+2*celldisty+notchwidth) # Abstand
y=y+notch2width+2*celldisty+notchwidth
pathstring+=' L '+str(stripwidth-notch2depth)+','+str(y) # Einrueckung
pathstring+=' L '+str(stripwidth-notch2depth)+','+str(y+notch2width) # Kerbe
pathstring+=' L '+str(stripwidth)+','+str(y+notch2width) # Ausrueckung
if notchycorner:
pathstring+=' L '+str(stripwidth)+','+str(striplength-notchwidth) # Untere rechte Ecke
pathstring+=' L '+str(stripwidth-2*notchdepth)+','+str(striplength-notchwidth) # Untere rechte Ecke
pathstring+=' L '+str(stripwidth-2*notchdepth)+','+str(striplength) # Untere rechte Ecke
else:
pathstring+=' L '+str(stripwidth)+','+str(striplength)
pathstring+=' L '+str(1)+','+str(striplength) # Linke untere Ecke
pathstring+=' L '+str(1)+','+str(1)+' z'
strip_transform= 'translate('+str(num*stripwidth)+','+str(1)+')'
strip_attribs = {'style':str(inkex.Style(style)),
inkex.addNS('label','inkscape'):"strip vertical long",
'transform': strip_transform,
'd':pathstring}
etree.SubElement(grp, inkex.addNS('path','svg'), strip_attribs )
# Create a new layer
layer = etree.SubElement(svg,'g')
layer.set(inkex.addNS('label', 'inkscape'), layername+'Horizontal strips short')
layer.set(inkex.addNS('groupmode','inkscape'), 'layer')
grp_name = 'group horizontal_strip_short'
grp_attribs = {inkex.addNS('label','inkscape'):grp_name}
grp = etree.SubElement(layer, 'g', grp_attribs) #the group to put everything in
striplength=cellnumx*cellwidth+4*notch2width
distx=(striplength-cellnumx*cellwidth)/2
disty=(striplength-cellnumy*cellheight)/2
style = { 'stroke': '#000000', 'stroke-width':str(linewidth), 'fill': 'none' }
for num in range(1,cellnumy):
pathstring='M '+str(1)+','+str(1)+' L '
pathstring+=str(stripwidth)+','+str(1)
if notchhorizontal:
pathstring+=' L '+str(stripwidth)+','+str(distx) # Distance to corner
y=distx
for i in range(0,cellnumx):
pathstring+=' L '+str(stripwidth)+','+str(y+celldistx) # Abstand
pathstring+=' L '+str(stripwidth-notchdepth)+','+str(y+celldistx) # Einrueckung
pathstring+=' L '+str(stripwidth-notchdepth)+','+str(y+celldistx+notchwidth) # Kerbe
pathstring+=' L '+str(stripwidth)+','+str(y+celldistx+notchwidth) # Ausrueckung
pathstring+=' L '+str(stripwidth)+','+str(y+2*celldistx+notchwidth) # Abstand
y=y+2*celldistx+notchwidth
pathstring+=' L '+str(stripwidth)+','+str(striplength)
pathstring+=' L '+str(1)+','+str(striplength) # Linke untere Ecke
y=striplength-distx+notch2width/2
pathstring+=' L '+str(1)+','+str(y) # Distance to corner
pathstring+=' L '+str(notch2depth)+','+str(y) # Einrueckung
for i in range(0,cellnumx):
pathstring+=' L '+str(notch2depth)+','+str(y-notch2width) # Kerbe
pathstring+=' L '+str(1)+','+str(y-notch2width) # Ausrueckung
pathstring+=' L '+str(1)+','+str(y-notch2width-cellwidth+notch2width) # Abstand
pathstring+=' L '+str(notch2depth)+','+str(y-notch2width-cellwidth+notch2width) # Einrueckung
y=y-notch2width-cellwidth+notch2width
pathstring+=' L '+str(notch2depth)+','+str(y-notch2width) # Kerbe
pathstring+=' L '+str(1)+','+str(y-notch2width) # Ausrueckung
pathstring+=' L '+str(1)+','+str(1)+' z'
strip_transform='rotate(' + str(90)+')'
strip_transform+=' translate('+str((num+1)*stripwidth+2)+','+str(1)+')'
stripname="strip horizontal short"+str(num)
strip_attribs = {'style':str(inkex.Style(style)),
inkex.addNS('label','inkscape'):stripname,
'transform': strip_transform,
'd':pathstring}
etree.SubElement(grp, inkex.addNS('path','svg'), strip_attribs )
# Create a new layer
layer = etree.SubElement(svg,'g')
layer.set(inkex.addNS('label', 'inkscape'), layername+'Vertical strips short')
layer.set(inkex.addNS('groupmode','inkscape'), 'layer')
grp_name = 'group vertical_strip_short'
grp_attribs = {inkex.addNS('label','inkscape'):grp_name}
grp = etree.SubElement(layer, 'g', grp_attribs) #the group to put everything in
striplength=cellnumx*cellwidth+4*notch2width
distx=(striplength-cellnumx*cellwidth)/2
disty=(striplength-cellnumy*cellheight)/2
striplength=cellnumy*cellheight+4*notch2width
distx=(striplength-cellnumx*cellwidth)/2
disty=(striplength-cellnumy*cellheight)/2
celldisty=(cellheight-notch2width-notchwidth)/2
for num in range(1,cellnumx):
y=disty-notch2width/2
pathstring='M '+str(1)+','+str(1)
pathstring+=' L '+str(stripwidth)+','+str(1)
pathstring+=' L '+str(stripwidth)+','+str(y) # Distance to corner
for i in range(0,cellnumy):
pathstring+=' L '+str(stripwidth-notch2depth)+','+str(y) # Einrueckung
pathstring+=' L '+str(stripwidth-notch2depth)+','+str(y+notch2width) # Kerbe
pathstring+=' L '+str(stripwidth)+','+str(y+notch2width) # Ausrueckung
if notchvertical:
pathstring+=' L '+str(stripwidth)+','+str(y+notch2width+celldisty) # Abstand
pathstring+=' L '+str(stripwidth-notchdepth)+','+str(y+notch2width+celldisty) # Einrueckung
pathstring+=' L '+str(stripwidth-notchdepth)+','+str(y+notch2width+celldisty+notchwidth) # Kerbe
pathstring+=' L '+str(stripwidth)+','+str(y+notch2width+celldisty+notchwidth) # Ausrueckung
pathstring+=' L '+str(stripwidth)+','+str(y+notch2width+2*celldisty+notchwidth) # Abstand
y=y+notch2width+2*celldisty+notchwidth
pathstring+=' L '+str(stripwidth-notch2depth)+','+str(y) # Einrueckung
pathstring+=' L '+str(stripwidth-notch2depth)+','+str(y+notch2width) # Kerbe
pathstring+=' L '+str(stripwidth)+','+str(y+notch2width) # Ausrueckung
pathstring+=' L '+str(stripwidth)+','+str(striplength)
pathstring+=' L '+str(1)+','+str(striplength) # Linke untere Ecke
pathstring+=' L '+str(1)+','+str(1)+' z'
strip_transform= 'translate('+str((num+1)*stripwidth+10)+','+str(1)+')'
stripname="strip vertical short"+str(num)
strip_attribs = {'style':str(inkex.Style(style)),
inkex.addNS('label','inkscape'):stripname,
'transform': strip_transform,
'd':pathstring}
etree.SubElement(grp, inkex.addNS('path','svg'), strip_attribs )
if __name__ == '__main__':
GridStrip_Creator().run()