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-0.92-deprecated/extensions/fablabchemnitz_render_scale.py

257 lines
9.8 KiB
Python

#!/usr/bin/env python
'''
Copyright (C) 2009 Sascha Poczihoski, sascha@junktech.de
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
TODO
- fix bug: special chars in suffix
'''
import sys, math
sys.path.append('/usr/share/inkscape/extensions') # or another path, as necessary
import inkex
from simplestyle import *
class ScaleGen(inkex.Effect):
"""
Example Inkscape effect extension.
Creates a new layer with a "Hello World!" text centered in the middle of the document.
"""
def __init__(self):
"""
Constructor.
Defines the "--what" option of a script.
"""
# Call the base class constructor.
inkex.Effect.__init__(self)
# Define string option "--what" with "-w" shortcut and default value "World".
self.OptionParser.add_option('-f', '--scalefrom', action = 'store',
type = 'int', dest = 'scalefrom', default = '0',
help = 'Measure from...')
self.OptionParser.add_option('-t', '--scaleto', action = 'store',
type = 'int', dest = 'scaleto', default = '20',
help = 'Measure to...')
self.OptionParser.add_option('-c', '--reverse', action = 'store',
type = 'string', dest = 'reverse', default = 'false',
help = 'Reverse order:')
self.OptionParser.add_option('', '--rotate', action = 'store',
type = 'string', dest = 'rotate', default = '0',
help = 'Rotate:')
self.OptionParser.add_option('-b', '--scaleres', action = 'store',
type = 'int', dest = 'scaleres', default = '100',
help = 'Measure resolution:')
self.OptionParser.add_option('-g', '--scaleheight', action = 'store',
type = 'int', dest = 'scaleheight', default = '100',
help = 'Height of scale:')
self.OptionParser.add_option('-s', '--fontsize', action = 'store',
type = 'int', dest = 'fontsize', default = '16',
help = 'Font Size:')
self.OptionParser.add_option('-i', '--suffix', action = 'store',
type = 'string', dest = 'suffix', default = '',
help = 'Suffix:')
# label offset
self.OptionParser.add_option('-x', '--labeloffseth', action = 'store',
type = 'int', dest = 'labeloffseth', default = '45',
help = 'Label offset h:')
self.OptionParser.add_option('-y', '--labeloffsetv', action = 'store',
type = 'int', dest = 'labeloffsetv', default = '45',
help = 'Label offset v:')
# marker div
self.OptionParser.add_option('-m', '--mark0', action = 'store',
type = 'int', dest = 'mark0', default = '10',
help = 'Div of labeled marker:')
self.OptionParser.add_option('-n', '--mark1', action = 'store',
type = 'int', dest = 'mark1', default = '5',
help = 'Div of bold marker:')
self.OptionParser.add_option('-o', '--mark2', action = 'store',
type = 'int', dest = 'mark2', default = '1',
help = 'Div of standard marker:')
# marker strength
self.OptionParser.add_option('-p', '--mark0str', action = 'store',
type = 'float', dest = 'mark0str', default = '10.0',
help = 'Strength of labeled marker:')
self.OptionParser.add_option('-q', '--mark1str', action = 'store',
type = 'float', dest = 'mark1str', default = '5.0',
help = 'Strength of bold marker:')
self.OptionParser.add_option('-r', '--mark2str', action = 'store',
type = 'float', dest = 'mark2str', default = '1.0',
help = 'Strength of standard marker:')
# marker width
self.OptionParser.add_option('-w', '--mark1wid', action = 'store',
type = 'int', dest = 'mark1wid', default = '75',
help = 'Width of bold marker (\%):')
self.OptionParser.add_option('-v', '--mark2wid', action = 'store',
type = 'int', dest = 'mark2wid', default = '50',
help = 'Width of standard marker (\%):')
self.OptionParser.add_option('-u', '--unit', action = 'store',
type = 'string', dest = 'unit', default = 'mm',
help = 'Unit:')
def addLabel(self, i, x, y, grp, fontsize):
res = self.options.scaleres
pos = i*res + fontsize/2
text = inkex.etree.SubElement(grp, inkex.addNS('text','svg'))
text.text = str(i)+self.options.suffix.encode("utf8")
#rotate = self.options.rotate
fs = str(fontsize)
style = {'text-align' : 'center', 'text-anchor': 'middle', 'font-size': fs}
text.set('style', formatStyle(style))
# text.set('x', str(inkex.unittouu(str(x)+self.options.unit)+self.options.labeloffseth))
# text.set('y', str(inkex.unittouu(str(y)+self.options.unit)+self.options.labeloffsetv))
text.set('x', str(float(x)+int(self.options.labeloffseth)))
text.set('y', str(float(y)+int(self.options.labeloffsetv)))
grp.append(text)
def addLine(self, i, scalefrom, scaleto, grp, grpLabel, type=2):
reverse = self.options.reverse
rotate = self.options.rotate
unit = self.options.unit
fontsize = self.options.fontsize
res = self.options.scaleres
label = False
if reverse=='true':
# Count absolut i for labeling
counter = 0
for n in range(scalefrom, i):
counter += 1
n = scaleto-counter-1
else:
n = i
if type==0:
line_style = { 'stroke': 'red',
'stroke-width': str(self.options.mark0str) }
x1 = 0
y1 = i*res
x2 = self.options.scaleheight
y2 = i*res
label = True
if type==1:
line_style = { 'stroke': 'black',
'stroke-width': str(self.options.mark1str) }
x1 = 0
y1 = i*res
x2 = self.options.scaleheight*0.01*self.options.mark1wid
y2 = i*res
if type==2:
line_style = { 'stroke': 'black',
'stroke-width': str(self.options.mark2str) }
x1 = 0
y1 = i*res
x2 = self.options.scaleheight*0.01*self.options.mark2wid
y2 = i*res
x1 = str(self.unittouu(str(x1)+unit) )
y1 = str(self.unittouu(str(y1)+unit) )
x2 = str(self.unittouu(str(x2)+unit) )
y2 = str(self.unittouu(str(y2)+unit) )
if rotate=='90':
tx = x1
x1 = y1
y1 = tx
tx = x2
x2 = y2
y2 = tx
if label==True:
self.addLabel(n , x2, y2, grpLabel, fontsize)
line_attribs = {'style' : formatStyle(line_style),
inkex.addNS('label','inkscape') : 'name',
'd' : 'M '+x1+','+y1+' L '+x2+','+y2}
line = inkex.etree.SubElement(grp, inkex.addNS('path','svg'), line_attribs )
def effect(self):
scalefrom = self.options.scalefrom
scaleto = self.options.scaleto
scaleheight = self.options.scaleheight
mark0 = self.options.mark0
mark1 = self.options.mark1
mark2 = self.options.mark2
# Get access to main SVG document element and get its dimensions.
svg = self.document.getroot()
# Again, there are two ways to get the attributes:
width = svg.get('width')
height = svg.get('height')
# Create new group
centre = self.view_center #Put in in the centre of the current view
grp_transform = 'translate' + str( centre )
grp_name = 'Scale Labels'
grp_attribs = {inkex.addNS('label','inkscape'):grp_name,
'transform':grp_transform }
grpLabel = inkex.etree.SubElement(self.current_layer, 'g', grp_attribs)
grp_name = 'Scale Mark labeled'
grp_attribs = {inkex.addNS('label','inkscape'):grp_name,
'transform':grp_transform }
grpMark0 = inkex.etree.SubElement(self.current_layer, 'g', grp_attribs)
grp_name = 'Scale Mark medium'
grp_attribs = {inkex.addNS('label','inkscape'):grp_name,
'transform':grp_transform }
grpMark1 = inkex.etree.SubElement(self.current_layer, 'g', grp_attribs)
grp_name = 'Scale Mark default'
grp_attribs = {inkex.addNS('label','inkscape'):grp_name,
'transform':grp_transform }
grpMark2 = inkex.etree.SubElement(self.current_layer, 'g', grp_attribs)
# to allow positive to negative counts
if scalefrom < scaleto:
scaleto += 1
else:
temp = scaleto
scaleto = scalefrom+1
scalefrom = temp
skip = 0
for i in range(scalefrom, scaleto):
if (i % mark0)==0:
div = 0 # This a the labeled marker
grpMark = grpMark0
elif (i % mark1)==0:
div = 1 # the medium marker
grpMark = grpMark1
elif (i % mark2)==0:
div = 2 # the default marker
grpMark = grpMark2
else:
skip=1 # Don't print a marker this time
if skip==0:
self.addLine(i, scalefrom, scaleto, grpMark, grpLabel, div) # addLabel is called from inside
skip = 0
# Create effect instance and apply it.
effect = ScaleGen()
effect.affect()