def test_inline_transformations(self): path = Path() self.assertTrue(path is not path.translate(10, 20)) self.assertTrue(path is not path.transform(Transform(scale=10))) self.assertTrue(path is not path.rotate(10)) self.assertTrue(path is not path.scale(10, 20)) self.assertTrue(path is path.translate(10, 20, inplace=True)) self.assertTrue( path is path.transform(Transform(scale=10), inplace=True)) self.assertTrue(path is path.rotate(10, inplace=True)) self.assertTrue(path is path.scale(10, 20, inplace=True))
def test_transform(self): """Transform by a whole matrix""" ret = Path("M 100 100 L 110 120 L 140 140 L 300 300") ret = ret.transform(Transform(translate=(10, 10))) self.assertEqual(str(ret), 'M 110 110 L 120 130 L 150 150 L 310 310') ret = ret.transform(Transform(translate=(-10, -10))) self.assertEqual(str(ret), 'M 100 100 L 110 120 L 140 140 L 300 300') ret = Path('M 5 5 H 10 V 15') ret = ret.transform(Transform(rotate=-10)) self.assertEqual( 'M 5.79228 4.0558 ' 'L 10.7163 3.18756 ' 'L 12.4528 13.0356', str(ret)) ret = Path("M 10 10 A 50,50 0 0 1 85.355333,85.355341 L 100 0") ret = ret.transform(Transform(scale=10)) self.assertEqual(str(ret), 'M 100 100 A 500 500 0 0 1 853.553 853.553 L 1000 0') self.assertRaises(ValueError, Horz([10]).transform, Transform())
def test_transformation_preserve_type(self): import re paths = [ "M 10 10 A 100 100 0 1 0 100 100 C 10 15 20 20 5 5 Z", "m 10 10 a 100 100 0 1 0 100 100 c 10 15 20 20 5 5 z", "m 10 10 l 100 200 L 20 30 C 10 20 30 40 11 12", "M 10 10 Q 12 13 14 15 T 11 32 T 32 11", "m 10 10 q 12 13 14 15 t 11 32 t 32 11", ] t = Transform(matrix=((1, 2, 3), (4, 5, 6))) for path_str in paths: path = Path(path_str) new_path = path.transform(t) cmds = "".join([cmd.letter for cmd in new_path]) expected = re.sub(r"\d|\s|,", "", path_str) self.assertEqual(expected, cmds) self.assertAlmostTuple( [t.apply_to_point(p) for p in path.control_points], list(new_path.control_points))
def effect(self): for node in self.svg.selection.filter(inkex.PathElement): result = Path() prev = Vector2d() start = None for seg in node.path.to_absolute(): if start is None: start = seg.end_point(start, prev) if isinstance(seg, Curve): result += [ Move(seg.x2, seg.y2), Line(prev.x, prev.y), Move(seg.x3, seg.y3), Line(seg.x4, seg.y4), ] elif isinstance(seg, Quadratic): result += [ Move(seg.x2, seg.y2), Line(prev.x, prev.y), Move(seg.x2, seg.y2), Line(seg.x3, seg.y3) ] prev = seg.end_point(start, prev) if not result: continue elem = node.getparent().add(inkex.PathElement()) elem.path = result.transform(node.transform) elem.style = { 'stroke-linejoin': 'miter', 'stroke-width': '1.0px', 'stroke-opacity': '1.0', 'fill-opacity': '1.0', 'stroke': '#000000', 'stroke-linecap': 'butt', 'fill': 'none' }