diff --git a/extensions/fablabchemnitz_inkcut.py b/extensions/fablabchemnitz_inkcut.py new file mode 100644 index 0000000..51581be --- /dev/null +++ b/extensions/fablabchemnitz_inkcut.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Inkcut, Plot HPGL directly from Inkscape. + inkcut.py + + Copyright 2018 The Inkcut Team + + 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 3 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., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA. +""" + +import inkex +from subprocess import Popen, PIPE +from shutil import copy2 +from distutils.spawn import find_executable + +def contains_text(nodes): + for node in nodes: + tag = node.tag[node.tag.rfind("}")+1:] + if tag == 'text': + return True + return False + +def convert_objects_to_paths(file, document): + tempfile = inkex.os.path.splitext(file)[0] + "-prepare.svg" + # tempfile is needed here only because we want to force the extension to be .svg + # so that we can open and close it silently + copy2(file, tempfile) + + command = 'inkscape --verb=EditSelectAllInAllLayers --verb=EditUnlinkClone --verb=ObjectToPath --verb=FileSave --verb=FileQuit ' + tempfile + + if find_executable('xvfb-run'): + command = 'xvfb-run -a ' + command + + p = Popen(command, shell=True, stdout=PIPE, stderr=PIPE) + (out, err) = p.communicate() + + if p.returncode != 0: + inkex.errormsg(_("Failed to convert objects to paths. Continued without converting.")) + inkex.errormsg(out) + inkex.errormsg(err) + return document.getroot() + else: + return inkex.etree.parse(tempfile).getroot() + + diff --git a/extensions/fablabchemnitz_inkcut_cut.inx b/extensions/fablabchemnitz_inkcut_cut.inx new file mode 100644 index 0000000..fa29eda --- /dev/null +++ b/extensions/fablabchemnitz_inkcut_cut.inx @@ -0,0 +1,19 @@ + + + <_name>Inkcut - Cut selection + fablabchemnitz.de.inkcut_cut + fablabchemnitz_inkcut_cut.py + fablabchemnitz_inkcut.py + inkex.py + + all + + + + + + + + \ No newline at end of file diff --git a/extensions/fablabchemnitz_inkcut_cut.py b/extensions/fablabchemnitz_inkcut_cut.py new file mode 100644 index 0000000..8fa01db --- /dev/null +++ b/extensions/fablabchemnitz_inkcut_cut.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Inkcut, Plot HPGL directly from Inkscape. + extension.py + + Copyright 2010-2018 The Inkcut Team + + 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 3 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., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA. +""" +import os +import sys +import inkex +inkex.localize() +import subprocess +from fablabchemnitz_inkcut import contains_text, convert_objects_to_paths + +DEBUG = False + +try: + from subprocess import DEVNULL # py3k +except ImportError: + import os + DEVNULL = open(os.devnull, 'wb') + +class InkscapeInkcutPlugin(inkex.Effect): + def effect(self): + """ Like cut but requires no selection and does no validation for + text nodes. + """ + nodes = self.selected + if not len(nodes): + inkex.errormsg("There were no paths were selected.") + return + + document = self.document + if contains_text(self.selected.values()): + document = convert_objects_to_paths(self.args[-1], self.document) + + #: If running from source + if DEBUG: + python = '~/inkcut/venv/bin/python' + inkcut = '~/inkcut/main.py' + cmd = [python, inkcut] + else: + cmd = ['inkcut'] + + cmd += ['open', '-', + '--nodes']+[str(k) for k in nodes.keys()] + p = subprocess.Popen(cmd, + stdin=subprocess.PIPE, + stdout=DEVNULL, + stderr=subprocess.STDOUT, + close_fds=sys.platform != "win32") + p.stdin.write(inkex.etree.tostring(document)) + p.stdin.close() + +# Create effect instance and apply it. +effect = InkscapeInkcutPlugin() +effect.affect() diff --git a/extensions/fablabchemnitz_inkcut_open.inx b/extensions/fablabchemnitz_inkcut_open.inx new file mode 100644 index 0000000..2347c36 --- /dev/null +++ b/extensions/fablabchemnitz_inkcut_open.inx @@ -0,0 +1,19 @@ + + + <_name>Inkcut - Open current document + fablabchemnitz.de.inkcut_open + fablabchemnitz_inkcut_open.py + fablabchemnitz_inkcut.py + inkex.py + + all + + + + + + + + \ No newline at end of file diff --git a/extensions/fablabchemnitz_inkcut_open.py b/extensions/fablabchemnitz_inkcut_open.py new file mode 100644 index 0000000..58fb33b --- /dev/null +++ b/extensions/fablabchemnitz_inkcut_open.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Inkcut, Plot HPGL directly from Inkscape. + extension.py + + Copyright 2010-2018 The Inkcut Team + + 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 3 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., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA. +""" +import os +import sys +import inkex +inkex.localize() +import subprocess + +from fablabchemnitz_inkcut import convert_objects_to_paths + +DEBUG = False +try: + from subprocess import DEVNULL # py3k +except ImportError: + import os + DEVNULL = open(os.devnull, 'wb') + + +class InkscapeInkcutPlugin(inkex.Effect): + def effect(self): + """ Like cut but requires no selection and does no validation for + text nodes. + """ + #: If running from source + if DEBUG: + python = '~/inkcut/venv/bin/python' + inkcut = '~/inkcut/main.py' + cmd = [python, inkcut] + else: + cmd = ['inkcut'] + + document = convert_objects_to_paths(self.args[-1], self.document) + + cmd += ['open', '-'] + p = subprocess.Popen(cmd, + stdin=subprocess.PIPE, + stdout=DEVNULL, + stderr=subprocess.STDOUT, + close_fds=sys.platform != "win32") + p.stdin.write(inkex.etree.tostring(document)) + p.stdin.close() + +# Create effect instance and apply it. +effect = InkscapeInkcutPlugin() +effect.affect()