diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 6ce042d8..42a66666 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -1320,7 +1320,9 @@ class App(QtCore.QObject): self.ui.menueditdelete.triggered.connect(self.on_delete) self.ui.menueditcopyobject.triggered.connect(self.on_copy_object) - self.ui.menueditcopyobjectasgeom.triggered.connect(self.on_copy_object_as_geometry) + self.ui.menueditconvert_any2geo.triggered.connect(self.convert_any2geo) + self.ui.menueditconvert_any2gerber.triggered.connect(self.convert_any2gerber) + self.ui.menueditorigin.triggered.connect(self.on_set_origin) self.ui.menueditjump.triggered.connect(self.on_jump_to) @@ -4719,8 +4721,8 @@ class App(QtCore.QObject): except: log.warning("Could not rename the object in the list") - def on_copy_object_as_geometry(self): - self.report_usage("on_copy_object_as_geometry()") + def convert_any2geo(self): + self.report_usage("convert_any2geo()") def initialize(obj_init, app): obj_init.solid_geometry = obj.solid_geometry @@ -4733,8 +4735,11 @@ class App(QtCore.QObject): except: pass - if obj.tools: - obj_init.tools = obj.tools + try: + if obj.tools: + obj_init.tools = obj.tools + except AttributeError: + pass def initialize_excellon(obj_init, app): # objs = self.collection.get_selected() @@ -4745,15 +4750,82 @@ class App(QtCore.QObject): solid_geo.append(geo) obj_init.solid_geometry = deepcopy(solid_geo) + if not self.collection.get_selected(): + log.warning("App.convert_any2geo --> No object selected") + self.inform.emit(_("[WARNING_NOTCL] No object is selected. Select an object and try again.")) + return + for obj in self.collection.get_selected(): obj_name = obj.options["name"] try: if isinstance(obj, FlatCAMExcellon): - self.new_object("geometry", str(obj_name) + "_gcopy", initialize_excellon) + self.new_object("geometry", str(obj_name) + "_conv", initialize_excellon) else: - self.new_object("geometry", str(obj_name) + "_gcopy", initialize) + self.new_object("geometry", str(obj_name) + "_conv", initialize) + + except Exception as e: + return "Operation failed: %s" % str(e) + + def convert_any2gerber(self): + self.report_usage("convert_any2gerber()") + + def initialize(obj_init, app): + apertures = {} + apid = 0 + + apertures[str(apid)] = {} + apertures[str(apid)]['solid_geometry'] = [] + apertures[str(apid)]['solid_geometry'] = deepcopy(obj.solid_geometry) + apertures[str(apid)]['size'] = 0.0 + apertures[str(apid)]['type'] = 'C' + + obj_init.solid_geometry = deepcopy(obj.solid_geometry) + obj_init.apertures = deepcopy(apertures) + + def initialize_excellon(obj_init, app): + apertures = {} + + apid = 10 + for tool in obj.tools: + apertures[str(apid)] = {} + apertures[str(apid)]['solid_geometry'] = [] + for geo in obj.tools[tool]['solid_geometry']: + apertures[str(apid)]['solid_geometry'].append(geo) + + apertures[str(apid)]['size'] = float(obj.tools[tool]['C']) + apertures[str(apid)]['type'] = 'C' + apid += 1 + + # create solid_geometry + solid_geometry = [] + for apid in apertures: + for geo in apertures[apid]['solid_geometry']: + solid_geometry.append(geo) + + solid_geometry = MultiPolygon(solid_geometry) + solid_geometry = solid_geometry.buffer(0.0000001) + + obj_init.solid_geometry = deepcopy(solid_geometry) + obj_init.apertures = deepcopy(apertures) + # clear the working objects (perhaps not necessary due of Python GC) + apertures.clear() + + if not self.collection.get_selected(): + log.warning("App.convert_any2gerber --> No object selected") + self.inform.emit(_("[WARNING_NOTCL] No object is selected. Select an object and try again.")) + return + + for obj in self.collection.get_selected(): + + obj_name = obj.options["name"] + + try: + if isinstance(obj, FlatCAMExcellon): + self.new_object("gerber", str(obj_name) + "_conv", initialize_excellon) + else: + self.new_object("gerber", str(obj_name) + "_conv", initialize) except Exception as e: return "Operation failed: %s" % str(e) diff --git a/README.md b/README.md index 3c45a0bd..90e9686f 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,8 @@ CAD program, and create G-Code for Isolation routing. - fixed bug in camlib.parse_lines() in the clear_geometry processing section for self.apertures - fixed bug in parsing Gerber regions (a point was added unnecessary) +- renamed the menu entry Edit -> Copy as Geo to Convert Any to Geo and moved it in the Edit -> Conversion +- created a new function named Convert Any to Gerber and installed it in Edit -> Conversion. It's doing what the name say: it will convert an Geometry or Excellon FlatCAM object to a Gerber object. 01.05.2019 diff --git a/flatcamGUI/FlatCAMGUI.py b/flatcamGUI/FlatCAMGUI.py index bdae0b5f..de4cd1a0 100644 --- a/flatcamGUI/FlatCAMGUI.py +++ b/flatcamGUI/FlatCAMGUI.py @@ -265,13 +265,18 @@ class FlatCAMGUI(QtWidgets.QMainWindow): _( "Will convert a Geometry object from multi_geometry type\n" "to a single_geometry type.") ) + # Separator + self.menuedit_convert.addSeparator() + self.menueditconvert_any2geo = self.menuedit_convert.addAction(QtGui.QIcon('share/copy_geo.png'), + _('Convert Any to Geo')) + self.menueditconvert_any2gerber = self.menuedit_convert.addAction(QtGui.QIcon('share/copy_geo.png'), + _('Convert Any to Gerber')) self.menuedit_convert.setToolTipsVisible(True) # Separator self.menuedit.addSeparator() - self.menueditcopyobject = self.menuedit.addAction(QtGui.QIcon('share/copy.png'), _('&Copy Object\tCTRL+C')) - self.menueditcopyobjectasgeom = self.menuedit.addAction(QtGui.QIcon('share/copy_geo.png'), - _('Copy as &Geom')) + self.menueditcopyobject = self.menuedit.addAction(QtGui.QIcon('share/copy.png'), _('&Copy\tCTRL+C')) + # Separator self.menuedit.addSeparator() self.menueditdelete = self.menuedit.addAction(QtGui.QIcon('share/trash16.png'), _('&Delete\tDEL'))