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.py95
1 files changed, 95 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..e43fce4
--- /dev/null
+++ b/share/extensions/path_number_nodes.py
@@ -0,0 +1,95 @@
+#!/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
+from inkex.localization import inkex_gettext as _
+
+
+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):
+ filtered = self.svg.selection.filter(inkex.PathElement)
+ if not filtered:
+ raise inkex.AbortExtension(_("Please select at least one path object."))
+ for node in filtered:
+ self.add_dot(node)
+
+ def add_dot(self, node: inkex.PathElement):
+ """Add a dot label for this path element"""
+ group: inkex.Group = node.getparent().add(inkex.Group())
+ dot_group = group.add(inkex.Group())
+ num_group = group.add(inkex.Group())
+ path_trans_applied = node.path.transform(node.composed_transform())
+ group.transform = -node.getparent().composed_transform()
+
+ style = inkex.Style({"stroke": "none", "fill": "#000"})
+
+ for step, (x, y) in enumerate(path_trans_applied.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()