From d5c5ca0a4c048875170090e465fe29fb4547ae47 Mon Sep 17 00:00:00 2001 From: Jonathan Neuhauser Date: Fri, 21 May 2021 00:22:27 +0200 Subject: [PATCH] Respect parent transforms for "measure path" and "number nodes" --- measure.py | 11 ++++-- path_number_nodes.py | 12 ++++--- ...ets__--presetFormat__FT_start__--id__D.out | 34 +++++++++++++++++++ ...ts__--presetFormat__TaP_start__--id__D.out | 34 +++++++++++++++++++ .../refs/measure__--type__cofm__--id__D.out | 34 +++++++++++++++++++ .../data/refs/path_number_nodes__--id__D.out | 33 ++++++++++++++++++ tests/test_measure.py | 11 ++++++ tests/test_path_number_nodes.py | 8 +++++ 8 files changed, 170 insertions(+), 7 deletions(-) create mode 100644 tests/data/refs/measure__--method__presets__--presetFormat__FT_start__--id__D.out create mode 100644 tests/data/refs/measure__--method__presets__--presetFormat__TaP_start__--id__D.out create mode 100644 tests/data/refs/measure__--type__cofm__--id__D.out create mode 100644 tests/data/refs/path_number_nodes__--id__D.out diff --git a/measure.py b/measure.py index 56bb89ba..5dd8d26c 100755 --- a/measure.py +++ b/measure.py @@ -72,8 +72,12 @@ class MeasureLength(inkex.EffectExtension): factor *= scale / self.svg.unittouu('1' + self.options.unit) # loop over all selected paths - for node in self.svg.selection.filter(inkex.PathElement): + filtered = self.svg.selection.filter(inkex.PathElement) + if not filtered: + raise inkex.AbortExtension("Please select at least one path object.") + for node in filtered: csp = node.path.transform(node.composed_transform()).to_superpath() + inverse_parent_transform = - node.getparent().composed_transform() if self.options.mtype == "length": slengths, stotal = csplength(csp) self.group = node.getparent().add(TextElement()) @@ -88,9 +92,11 @@ class MeasureLength(inkex.EffectExtension): self.group = node.getparent().add(inkex.PathElement()) self.group.set('id', 'MassCenter_' + node.get('id')) self.add_cross(self.group, xc, yc, scale) + self.group.transform = inverse_parent_transform continue # Format the length as string val = round(stotal * factor * self.options.scale, prec) + # Transform the result back self.options.method(node, str(val)) def method_textonpath(self, node, lenstr): @@ -109,7 +115,7 @@ class MeasureLength(inkex.EffectExtension): tx, ty = cspcofm(csp) anchor = 'middle' elif self.options.position == "center": - bbox = node.bounding_box() + bbox = node.bounding_box(True) tx, ty = bbox.center anchor = 'middle' else: # default @@ -190,6 +196,7 @@ class MeasureLength(inkex.EffectExtension): node.set('x', str(x)) node.set('y', str(y)) node.set('transform', 'rotate(%s, %s, %s)' % (angle, x, y)) + node.transform = - node.getparent().composed_transform() * node.transform if __name__ == '__main__': MeasureLength().run() diff --git a/path_number_nodes.py b/path_number_nodes.py index 06e9b956..76e69cf5 100755 --- a/path_number_nodes.py +++ b/path_number_nodes.py @@ -32,9 +32,10 @@ class NumberNodes(inkex.EffectExtension): 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): + 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): @@ -42,11 +43,12 @@ class NumberNodes(inkex.EffectExtension): group = node.getparent().add(inkex.Group()) dot_group = group.add(inkex.Group()) num_group = group.add(inkex.Group()) - group.transform = node.transform + 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(node.path.end_points): + 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 diff --git a/tests/data/refs/measure__--method__presets__--presetFormat__FT_start__--id__D.out b/tests/data/refs/measure__--method__presets__--presetFormat__FT_start__--id__D.out new file mode 100644 index 00000000..09774b93 --- /dev/null +++ b/tests/data/refs/measure__--method__presets__--presetFormat__FT_start__--id__D.out @@ -0,0 +1,34 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + 54.15 mm + + + + + + + + \ No newline at end of file diff --git a/tests/data/refs/measure__--method__presets__--presetFormat__TaP_start__--id__D.out b/tests/data/refs/measure__--method__presets__--presetFormat__TaP_start__--id__D.out new file mode 100644 index 00000000..a21eb634 --- /dev/null +++ b/tests/data/refs/measure__--method__presets__--presetFormat__TaP_start__--id__D.out @@ -0,0 +1,34 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + 54.15 mm + + + + + + + + \ No newline at end of file diff --git a/tests/data/refs/measure__--type__cofm__--id__D.out b/tests/data/refs/measure__--type__cofm__--id__D.out new file mode 100644 index 00000000..6779ab00 --- /dev/null +++ b/tests/data/refs/measure__--type__cofm__--id__D.out @@ -0,0 +1,34 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/data/refs/path_number_nodes__--id__D.out b/tests/data/refs/path_number_nodes__--id__D.out new file mode 100644 index 00000000..ab2102a2 --- /dev/null +++ b/tests/data/refs/path_number_nodes__--id__D.out @@ -0,0 +1,33 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + 1234567 + + + + + + + + \ No newline at end of file diff --git a/tests/test_measure.py b/tests/test_measure.py index 4e0f7dda..7d4671ae 100644 --- a/tests/test_measure.py +++ b/tests/test_measure.py @@ -1,4 +1,5 @@ # coding=utf-8 +from inkex.utils import filename_arg from measure import MeasureLength from inkex.tester import ComparisonMixin, TestCase from inkex.tester.filters import CompareNumericFuzzy @@ -16,3 +17,13 @@ class LengthBasicTest(ComparisonMixin, TestCase): ('--type=area', '--id=p1'), ('--type=cofm', '--id=c3'), ] + +class LengthComplexTransformTest(ComparisonMixin, TestCase): + effect_class = MeasureLength + compare_filters = [CompareNumericFuzzy()] + compare_file = "svg/complextransform.test.svg" + comparisons = [ + ('--method=presets', '--presetFormat=TaP_start', '--id=D'), + ('--method=presets', '--presetFormat=FT_start', '--id=D'), + ('--type=cofm', '--id=D'), + ] diff --git a/tests/test_path_number_nodes.py b/tests/test_path_number_nodes.py index e1a4fd19..6af6a257 100644 --- a/tests/test_path_number_nodes.py +++ b/tests/test_path_number_nodes.py @@ -5,3 +5,11 @@ from inkex.tester import ComparisonMixin, TestCase class NumberNodesTest(ComparisonMixin, TestCase): effect_class = NumberNodes comparisons = [('--id=p1', '--id=r3')] + +class LengthComplexTransformTest(ComparisonMixin, TestCase): + effect_class = NumberNodes + compare_file = "svg/complextransform.test.svg" + comparisons = [ + ['--id=D'] + ] + -- GitLab