summaryrefslogtreecommitdiffstats
path: root/share/extensions/path_number_nodes.py
diff options
context:
space:
mode:
Diffstat (limited to 'share/extensions/path_number_nodes.py')
-rwxr-xr-xshare/extensions/path_number_nodes.py74
1 files changed, 74 insertions, 0 deletions
diff --git a/share/extensions/path_number_nodes.py b/share/extensions/path_number_nodes.py
new file mode 100755
index 0000000..878a1a0
--- /dev/null
+++ b/share/extensions/path_number_nodes.py
@@ -0,0 +1,74 @@
+#!/usr/bin/env python
+# coding=utf-8
+#
+# Copyright (C) 2005 Aaron Spike, aaron@ekips.org
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+import math
+
+import inkex
+from inkex import TextElement, Circle
+
+class NumberNodes(inkex.EffectExtension):
+ """Replace the selection's nodes with numbered dots according to the options"""
+ def add_arguments(self, pars):
+ pars.add_argument("--dotsize", default="10px", help="Size of the dots on the path nodes")
+ pars.add_argument("--fontsize", default="20px", help="Size of node labels")
+ pars.add_argument("--start", type=int, default=1, help="First number in the sequence")
+ pars.add_argument("--step", type=int, default=1, help="Numbering step between two nodes")
+ pars.add_argument("--tab", help="The selected UI-tab when OK was pressed")
+
+ def effect(self):
+ if not self.svg.selected:
+ raise inkex.AbortExtension("Please select an object.")
+ for node in self.svg.selection.filter(inkex.PathElement).values():
+ self.add_dot(node)
+
+ def add_dot(self, node):
+ """Add a dot label for this path element"""
+ group = node.getparent().add(inkex.Group())
+ dot_group = group.add(inkex.Group())
+ num_group = group.add(inkex.Group())
+ group.transform = node.transform
+
+ style = inkex.Style({'stroke': 'none', 'fill': '#000'})
+
+ for step, (x, y) in enumerate(node.path.end_points):
+ circle = dot_group.add(Circle(cx=str(x), cy=str(y),\
+ r=str(self.svg.unittouu(self.options.dotsize) / 2)))
+ circle.style = style
+ num_group.append(self.add_text(
+ x + (self.svg.unittouu(self.options.dotsize) / 2),
+ y - (self.svg.unittouu(self.options.dotsize) / 2),
+ self.options.start + (self.options.step * step)))
+
+ node.delete()
+
+ def add_text(self, x, y, text):
+ """Add a text label at the given location"""
+ elem = TextElement(x=str(x), y=str(y))
+ elem.text = str(text)
+ elem.style = {
+ 'font-size': self.svg.unittouu(self.options.fontsize),
+ 'fill-opacity': '1.0',
+ 'stroke': 'none',
+ 'font-weight': 'normal',
+ 'font-style': 'normal',
+ 'fill': '#999'}
+ return elem
+
+if __name__ == '__main__':
+ NumberNodes().run()