diff --git a/measure.py b/measure.py
index 56bb89baebee46a7ba60364d565f4fdcc5615a4d..5dd8d26ce382d797422b5d1a08aa1179f4bd9567 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 06e9b95671f1270cb2b70e8b13ff404e11dbb14f..76e69cf5e2caed05adced7438c743627c8a140c8 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 0000000000000000000000000000000000000000..09774b9365134dab99ce1146d2b5510b9e9d1162
--- /dev/null
+++ b/tests/data/refs/measure__--method__presets__--presetFormat__FT_start__--id__D.out
@@ -0,0 +1,34 @@
+
\ 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 0000000000000000000000000000000000000000..a21eb634f9e9645ddbd389dc005aa4eb04662423
--- /dev/null
+++ b/tests/data/refs/measure__--method__presets__--presetFormat__TaP_start__--id__D.out
@@ -0,0 +1,34 @@
+
\ 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 0000000000000000000000000000000000000000..6779ab0053dd7ab107d0a3436828778fe2cf2394
--- /dev/null
+++ b/tests/data/refs/measure__--type__cofm__--id__D.out
@@ -0,0 +1,34 @@
+
\ 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 0000000000000000000000000000000000000000..ab2102a27629b8d47dc8da43df27dd9df97f4094
--- /dev/null
+++ b/tests/data/refs/path_number_nodes__--id__D.out
@@ -0,0 +1,33 @@
+
\ No newline at end of file
diff --git a/tests/test_measure.py b/tests/test_measure.py
index 4e0f7dda05a36296d5ea8b88a2166dd9c242cb88..7d4671ae49eb50e04800c4912c4d50af2a12e954 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 e1a4fd1930f7e3ce70ef84d0e015d6c0382dd6c3..6af6a2571525a60321019d6047dc74febde7b57a 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']
+ ]
+