88 lines
3.1 KiB
Python
88 lines
3.1 KiB
Python
|
#!/usr/bin/env python
|
||
|
|
||
|
# These two lines are only needed if you don't put the script directly into
|
||
|
# the installation directory
|
||
|
import sys
|
||
|
import simplestyle # will be needed here for styles support
|
||
|
sys.path.append('/usr/share/inkscape/extensions')
|
||
|
|
||
|
# We will use the inkex module with the predefined Effect base class.
|
||
|
import inkex
|
||
|
import fablabchemnitz_metaext
|
||
|
|
||
|
class AddKerf(inkex.Effect):
|
||
|
"""
|
||
|
An Inkscape extension which joins multiple lines in one object and adds
|
||
|
kerf to it.
|
||
|
"""
|
||
|
def __init__(self):
|
||
|
"""
|
||
|
Constructor.
|
||
|
"""
|
||
|
# Call the base class constructor.
|
||
|
inkex.Effect.__init__(self)
|
||
|
|
||
|
# Define string option "--what" with "-w" shortcut and default value "World".
|
||
|
# TODO: better name
|
||
|
self.OptionParser.add_option('-w', '--what', action = 'store',
|
||
|
type = 'float', dest = 'what', default = '0.0',
|
||
|
help = 'Kerf in 1/10 mm.')
|
||
|
|
||
|
def set_appropriate_width(self, kerf_in_mm):
|
||
|
found = False
|
||
|
for _, node in self.selected.iteritems():
|
||
|
if node.tag == inkex.addNS('g', 'svg'):
|
||
|
inkex.error("Can't add kerf to a group, please ungroup first.")
|
||
|
if node.tag == inkex.addNS('path', 'svg'):
|
||
|
style = {'stroke-width': kerf_in_mm, 'fill': 'none',
|
||
|
'stroke':'#000000'}
|
||
|
style = simplestyle.formatStyle(style)
|
||
|
node.set('style', style)
|
||
|
found = True
|
||
|
return found
|
||
|
|
||
|
def effect(self):
|
||
|
"""% mod
|
||
|
Effect behaviour.
|
||
|
"""
|
||
|
# Get script's "--what" option value.
|
||
|
what = self.options.what / 10.
|
||
|
negative_kerf = False
|
||
|
if what < 0.:
|
||
|
what = -what
|
||
|
negative_kerf = True
|
||
|
|
||
|
kerf_in_mm = self.unittouu(str(what) + " mm")
|
||
|
|
||
|
operation_list = ["StrokeToPath", "SelectionUnion",
|
||
|
"SelectionBreakApart", "SelectionUnion", "SelectionBreakApart"]
|
||
|
if negative_kerf:
|
||
|
operation_list[-2] = "SelectionIntersect"
|
||
|
|
||
|
join_ext = fablabchemnitz_metaext.MetaEffect(operation_list)
|
||
|
|
||
|
if not self.set_appropriate_width(kerf_in_mm):
|
||
|
objectify = fablabchemnitz_metaext.MetaEffect(["ObjectToPath"])
|
||
|
objectify.effect(self.document, self.selected, self.doc_ids)
|
||
|
if not self.set_appropriate_width(kerf_in_mm):
|
||
|
inkex.error("Didn't found any selected path, breaking")
|
||
|
return
|
||
|
|
||
|
join_ext.effect(self.document, self.selected, self.doc_ids)
|
||
|
|
||
|
for _, node in self.selected.iteritems():
|
||
|
#inkex.debug("node %s" % inkex.etree.tostring(node))
|
||
|
if node.tag == inkex.addNS('path', 'svg'):
|
||
|
new_width = self.unittouu("0.5mm")
|
||
|
colour = '#ff0000' if negative_kerf else '#000000'
|
||
|
style = {'stroke-width': new_width, 'fill': 'none',
|
||
|
'stroke': colour}
|
||
|
style = simplestyle.formatStyle(style)
|
||
|
node.set('style', style)
|
||
|
# inkex.debug("node %s" % inkex.etree.tostring(node))
|
||
|
|
||
|
|
||
|
# Create effect instance and apply it.
|
||
|
effect = AddKerf()
|
||
|
effect.affect()
|