diff --git a/README.md b/README.md index 4023c0da..36d744e6 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ CAD program, and create G-Code for Isolation routing. 4.03.2019 - finished work on object hovering +- fixed Excellon object move and all the other transformations 3.03.2019 diff --git a/camlib.py b/camlib.py index 2b6ab7df..b15e65c3 100644 --- a/camlib.py +++ b/camlib.py @@ -3721,7 +3721,6 @@ class Excellon(Geometry): headerless = True try: self.convert_units({"INCH": "IN", "METRIC": "MM"}[self.excellon_units]) - print("Units converted .............................. %s" % self.excellon_units) except Exception as e: log.warning("Units could not be converted: %s" % str(e)) @@ -4427,10 +4426,24 @@ class Excellon(Geometry): else: px, py = point + def scale_geom(obj): + if type(obj) is list: + new_obj = [] + for g in obj: + new_obj.append(scale_geom(g)) + return new_obj + else: + return affinity.scale(obj, xfactor, + yfactor, origin=(px, py)) + # Drills for drill in self.drills: drill['point'] = affinity.scale(drill['point'], xfactor, yfactor, origin=(px, py)) + # scale solid_geometry + for tool in self.tools: + self.tools[tool]['solid_geometry'] = scale_geom(self.tools[tool]['solid_geometry']) + # Slots for slot in self.slots: slot['stop'] = affinity.scale(slot['stop'], xfactor, yfactor, origin=(px, py)) @@ -4449,14 +4462,22 @@ class Excellon(Geometry): dx, dy = vect + def offset_geom(obj): + if type(obj) is list: + new_obj = [] + for g in obj: + new_obj.append(offset_geom(g)) + return new_obj + else: + return affinity.translate(obj, xoff=dx, yoff=dy) + # Drills for drill in self.drills: drill['point'] = affinity.translate(drill['point'], xoff=dx, yoff=dy) # offset solid_geometry for tool in self.tools: - for geo in self.tools[tool]['solid_geometry']: - geo = affinity.translate(geo, xoff=dx, yoff=dy) + self.tools[tool]['solid_geometry'] = offset_geom(self.tools[tool]['solid_geometry']) # Slots for slot in self.slots: @@ -4478,11 +4499,24 @@ class Excellon(Geometry): px, py = point xscale, yscale = {"X": (1.0, -1.0), "Y": (-1.0, 1.0)}[axis] + def mirror_geom(obj): + if type(obj) is list: + new_obj = [] + for g in obj: + new_obj.append(mirror_geom(g)) + return new_obj + else: + return affinity.scale(obj, xscale, yscale, origin=(px, py)) + # Modify data # Drills for drill in self.drills: drill['point'] = affinity.scale(drill['point'], xscale, yscale, origin=(px, py)) + # mirror solid_geometry + for tool in self.tools: + self.tools[tool]['solid_geometry'] = mirror_geom(self.tools[tool]['solid_geometry']) + # Slots for slot in self.slots: slot['stop'] = affinity.scale(slot['stop'], xscale, yscale, origin=(px, py)) @@ -4512,16 +4546,30 @@ class Excellon(Geometry): if angle_y is None: angle_y = 0.0 + def skew_geom(obj): + if type(obj) is list: + new_obj = [] + for g in obj: + new_obj.append(skew_geom(g)) + return new_obj + else: + return affinity.skew(obj, angle_x, angle_y, origin=(px, py)) + if point is None: + px, py = 0, 0 + # Drills for drill in self.drills: drill['point'] = affinity.skew(drill['point'], angle_x, angle_y, - origin=(0, 0)) + origin=(px, py)) + # skew solid_geometry + for tool in self.tools: + self.tools[tool]['solid_geometry'] = skew_geom(self.tools[tool]['solid_geometry']) # Slots for slot in self.slots: - slot['stop'] = affinity.skew(slot['stop'], angle_x, angle_y, origin=(0, 0)) - slot['start'] = affinity.skew(slot['start'], angle_x, angle_y, origin=(0, 0)) + slot['stop'] = affinity.skew(slot['stop'], angle_x, angle_y, origin=(px, py)) + slot['start'] = affinity.skew(slot['start'], angle_x, angle_y, origin=(px, py)) else: px, py = point # Drills @@ -4529,6 +4577,10 @@ class Excellon(Geometry): drill['point'] = affinity.skew(drill['point'], angle_x, angle_y, origin=(px, py)) + # skew solid_geometry + for tool in self.tools: + self.tools[tool]['solid_geometry'] = skew_geom( self.tools[tool]['solid_geometry']) + # Slots for slot in self.slots: slot['stop'] = affinity.skew(slot['stop'], angle_x, angle_y, origin=(px, py)) @@ -4543,11 +4595,28 @@ class Excellon(Geometry): :param point: tuple of coordinates (x, y) :return: """ + + def rotate_geom(obj, origin=None): + if type(obj) is list: + new_obj = [] + for g in obj: + new_obj.append(rotate_geom(g)) + return new_obj + else: + if origin: + return affinity.rotate(obj, angle, origin=origin) + else: + return affinity.rotate(obj, angle, origin=(px, py)) + if point is None: # Drills for drill in self.drills: drill['point'] = affinity.rotate(drill['point'], angle, origin='center') + # rotate solid_geometry + for tool in self.tools: + self.tools[tool]['solid_geometry'] = rotate_geom(self.tools[tool]['solid_geometry'], origin='center') + # Slots for slot in self.slots: slot['stop'] = affinity.rotate(slot['stop'], angle, origin='center') @@ -4558,6 +4627,10 @@ class Excellon(Geometry): for drill in self.drills: drill['point'] = affinity.rotate(drill['point'], angle, origin=(px, py)) + # rotate solid_geometry + for tool in self.tools: + self.tools[tool]['solid_geometry'] = rotate_geom(self.tools[tool]['solid_geometry']) + # Slots for slot in self.slots: slot['stop'] = affinity.rotate(slot['stop'], angle, origin=(px, py)) diff --git a/flatcamTools/ToolMove.py b/flatcamTools/ToolMove.py index 9d83255d..50c145b9 100644 --- a/flatcamTools/ToolMove.py +++ b/flatcamTools/ToolMove.py @@ -125,7 +125,11 @@ class ToolMove(FlatCAMTool): # offset sel_obj.offset((dx, dy)) sel_obj.plot() - sel_obj.replotApertures.emit() + + try: + sel_obj.replotApertures.emit() + except: + pass # Update the object bounding box options a,b,c,d = sel_obj.bounds()