From 9f138bdcc2049fa9d47dc6b85f7ec9c882bf6652 Mon Sep 17 00:00:00 2001 From: Juan Pablo Caram Date: Sat, 4 Jun 2016 23:01:36 -0400 Subject: [PATCH] Fixes #119. --- DblSidedTool.py | 6 ++-- camlib.py | 79 +++++++++++++++++++++++++++++++------------------ 2 files changed, 54 insertions(+), 31 deletions(-) diff --git a/DblSidedTool.py b/DblSidedTool.py index d9356b54..c9cdbd9c 100644 --- a/DblSidedTool.py +++ b/DblSidedTool.py @@ -162,8 +162,10 @@ class DblSidedTool(FlatCAMTool): # For now, lets limit to Gerbers and Excellons. # assert isinstance(gerb, FlatCAMGerber) - if not isinstance(fcobj, FlatCAMGerber) and not isinstance(fcobj, FlatCAMExcellon): - self.info("ERROR: Only Gerber and Excellon objects can be mirrored.") + if not isinstance(fcobj, FlatCAMGerber) and \ + not isinstance(fcobj, FlatCAMExcellon) and \ + not isinstance(fcobj, FlatCAMGeometry): + self.info("ERROR: Only Gerber, Excellon and Geometry objects can be mirrored.") return axis = self.mirror_axis.get_value() diff --git a/camlib.py b/camlib.py index 29c26e69..89d99af4 100644 --- a/camlib.py +++ b/camlib.py @@ -912,6 +912,27 @@ class Geometry(object): svg_elem = geom.svg(scale_factor=scale_factor) return svg_elem + def mirror(self, axis, point): + """ + Mirrors the object around a specified axis passign through + the given point. + + :param axis: "X" or "Y" indicates around which axis to mirror. + :type axis: str + :param point: [x, y] point belonging to the mirror axis. + :type point: list + :return: None + """ + + px, py = point + xscale, yscale = {"X": (1.0, -1.0), "Y": (-1.0, 1.0)}[axis] + + ## solid_geometry ??? + # It's a cascaded union of objects. + self.solid_geometry = affinity.scale(self.solid_geometry, + xscale, yscale, origin=(px, py)) + + class ApertureMacro: """ Syntax of aperture macros. @@ -1496,35 +1517,35 @@ class Gerber (Geometry): ## Solid geometry self.solid_geometry = affinity.translate(self.solid_geometry, xoff=dx, yoff=dy) - def mirror(self, axis, point): - """ - Mirrors the object around a specified axis passign through - the given point. What is affected: - - * ``buffered_paths`` - * ``flash_geometry`` - * ``solid_geometry`` - * ``regions`` - - NOTE: - Does not modify the data used to create these elements. If these - are recreated, the scaling will be lost. This behavior was modified - because of the complexity reached in this class. - - :param axis: "X" or "Y" indicates around which axis to mirror. - :type axis: str - :param point: [x, y] point belonging to the mirror axis. - :type point: list - :return: None - """ - - px, py = point - xscale, yscale = {"X": (1.0, -1.0), "Y": (-1.0, 1.0)}[axis] - - ## solid_geometry ??? - # It's a cascaded union of objects. - self.solid_geometry = affinity.scale(self.solid_geometry, - xscale, yscale, origin=(px, py)) + # def mirror(self, axis, point): + # """ + # Mirrors the object around a specified axis passign through + # the given point. What is affected: + # + # * ``buffered_paths`` + # * ``flash_geometry`` + # * ``solid_geometry`` + # * ``regions`` + # + # NOTE: + # Does not modify the data used to create these elements. If these + # are recreated, the scaling will be lost. This behavior was modified + # because of the complexity reached in this class. + # + # :param axis: "X" or "Y" indicates around which axis to mirror. + # :type axis: str + # :param point: [x, y] point belonging to the mirror axis. + # :type point: list + # :return: None + # """ + # + # px, py = point + # xscale, yscale = {"X": (1.0, -1.0), "Y": (-1.0, 1.0)}[axis] + # + # ## solid_geometry ??? + # # It's a cascaded union of objects. + # self.solid_geometry = affinity.scale(self.solid_geometry, + # xscale, yscale, origin=(px, py)) def aperture_parse(self, apertureId, apertureType, apParameters): """