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/fablabchemnitz_metaext.py
2019-11-14 20:05:10 +01:00

110 lines
3.2 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
sys.path.append('/usr/share/inkscape/extensions')
# We will use the inkex module with the predefined Effect base class.
import inkex
import tempfile
try:
from subprocess import Popen, PIPE
bsubprocess = True
except:
bsubprocess = False
class MetaEffect(object):
"""
Inkscape extension running the commands from the list on the selected
objects.
"""
def __init__(self, command_list):
"""
Constructor.
"""
self._command_list = command_list
def command_on_selection(self):
selected = ["--select={}".format(id_)
for id_, _ in self.selected.iteritems()]
selected = " ".join(selected)
verbs = ["--verb={}".format(cmd) for cmd in self._command_list]
verbs = " ".join(verbs)
command = "{} {}".format(selected, verbs)
return command
def run_file(self, filename, cmd):
cmd += " --verb=FileSave --verb=FileQuit"
if bsubprocess:
p = Popen('inkscape "%s" %s' % (filename, cmd), shell=True,
stdout=PIPE, stderr=PIPE) # TODO: gui-less version
rc = p.wait()
f = p.stdout
err = p.stderr
else:
_, f, err = os.popen3("inkscape %s %s" % (filename, cmd))
f.close()
err.close()
def run_commands_on_file(self, command):
"""Run the actions on the svg xml tree"""
# First save the document
svgfile = tempfile.mktemp(".svg")
self.document.write(svgfile)
# Run the action on the document
self.run_file(svgfile, command)
# Open the resulting file
stream = open(svgfile, 'r')
new_svg_doc = inkex.etree.parse(stream)
stream.close()
# Clean up.
try:
os.remove(svgfile)
except Exception:
pass
# Return the new document
return new_svg_doc
def effect(self, document, selected, doc_ids):
"""
Effect behaviour.
Overrides base class' method
"""
self.document = document
self.selected = selected
whole_tree = self.document.getroot()
svg_id_id = ".//{http://www.w3.org/2000/svg}path[@id]"
prev_ids = set(child.get('id')
for child in whole_tree.findall(svg_id_id))
command = self.command_on_selection()
self.document = self.run_commands_on_file(command)
new_ids = set(child.get('id')
for child in self.document.getroot().findall(svg_id_id))
diff_ids = list(new_ids.difference(prev_ids))
self.selected = {}
for i in diff_ids:
path = '//*[@id="%s"]' % i
for node in self.document.xpath(path, namespaces=inkex.NSS):
self.selected[i] = node
self.doc_ids = {}
docIdNodes = self.document.xpath('//@id', namespaces=inkex.NSS)
for m in docIdNodes:
self.doc_ids[m] = 1
document._setroot(self.document.getroot())
selected.clear()
selected.update(self.selected)
doc_ids.clear()
doc_ids.update(self.doc_ids)