diff --git a/FlatCAMApp.py b/FlatCAMApp.py index d4397dca..a943a334 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -149,7 +149,7 @@ class App(QtCore.QObject): # Emitted by new_object() and passes the new object as argument, plot flag. # on_object_created() adds the object to the collection, plots on appropriate flag # and emits new_object_available. - object_created = QtCore.pyqtSignal(object, bool, bool) + object_created = QtCore.pyqtSignal(object, bool, bool, bool) # Emitted when a object has been changed (like scaled, mirrored) object_changed = QtCore.pyqtSignal(object) @@ -2298,7 +2298,7 @@ class App(QtCore.QObject): # Re-buid the recent items menu self.setup_recent_items() - def new_object(self, kind, name, initialize, active=True, fit=True, plot=True, autoselected=True): + def new_object(self, kind, name, initialize, active=True, fit=True, plot=True, autoselected=True, overwrite=False): """ Creates a new specalized FlatCAMObj and attaches it to the application, this is, updates the GUI accordingly, any other records and plots it. @@ -2323,8 +2323,10 @@ class App(QtCore.QObject): """ App.log.debug("new_object()") - self.plot = plot - self.autoselected = autoselected + obj_plot = plot + obj_autoselected = autoselected + obj_overwrite = overwrite + t0 = time.time() # Debug ## Create object @@ -2412,7 +2414,7 @@ class App(QtCore.QObject): # Move the object to the main thread and let the app know that it is available. obj.moveToThread(QtWidgets.QApplication.instance().thread()) - self.object_created.emit(obj, self.plot, self.autoselected) + self.object_created.emit(obj, obj_plot, obj_autoselected, obj_overwrite) return obj @@ -2429,7 +2431,7 @@ class App(QtCore.QObject): self.new_object('geometry', 'new_g', initialize, plot=False) - def on_object_created(self, obj, plot, autoselect): + def on_object_created(self, obj, plot, autoselect, overwrite): """ Event callback for object creation. @@ -2440,7 +2442,7 @@ class App(QtCore.QObject): self.log.debug("on_object_created()") # The Collection might change the name if there is a collision - self.collection.append(obj) + self.collection.append(obj, overwrite=overwrite) # after adding the object to the collection always update the list of objects that are in the collection self.all_objects_list = self.collection.get_list() diff --git a/ObjectCollection.py b/ObjectCollection.py index 97dcb0fd..d2ef99d6 100644 --- a/ObjectCollection.py +++ b/ObjectCollection.py @@ -642,7 +642,7 @@ class ObjectCollection(QtCore.QAbstractItemModel): # return QtWidgets.QAbstractItemModel.flags(self, index) - def append(self, obj, active=False): + def append(self, obj, active=False, overwrite=False): FlatCAMApp.App.log.debug(str(inspect.stack()[1][3]) + " --> OC.append()") name = obj.options["name"] @@ -652,6 +652,13 @@ class ObjectCollection(QtCore.QAbstractItemModel): self.promises.remove(name) # FlatCAMApp.App.log.debug("Promised object %s became available." % name) # FlatCAMApp.App.log.debug("%d promised objects remaining." % len(self.promises)) + + # first delete the old object + if overwrite: + if name in self.get_names(): + self.set_active(name) + self.delete_active(select_project=False) + # Prevent same name while name in self.get_names(): ## Create a new name @@ -752,7 +759,7 @@ class ObjectCollection(QtCore.QAbstractItemModel): return obj return None - def delete_active(self): + def delete_active(self, select_project=True): selections = self.view.selectedIndexes() if len(selections) == 0: return @@ -779,8 +786,9 @@ class ObjectCollection(QtCore.QAbstractItemModel): self.endRemoveRows() - # always go to the Project Tab after object deletion as it may be done with a shortcut key - self.app.ui.notebook.setCurrentWidget(self.app.ui.project_tab) + if select_project: + # always go to the Project Tab after object deletion as it may be done with a shortcut key + self.app.ui.notebook.setCurrentWidget(self.app.ui.project_tab) self.app.should_we_save = True diff --git a/README.md b/README.md index 9edd041e..965b26da 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ CAD program, and create G-Code for Isolation routing. - fixed issue with not updating correctly the plot kind (all, cut, travel) when clicking in the CNC Tools Table plot buttons - made the GCode Editor for ToolSolderPaste clear the text before updating the Code Editor tab - all the Tabs in Plot Area are closed (except Plot Area itself) on New Project creation +- added ability to regenerate objects (it's actually deletion followed by recreation) 20.02.2019 diff --git a/flatcamTools/ToolSolderPaste.py b/flatcamTools/ToolSolderPaste.py index 9cd9bdf5..92f4a103 100644 --- a/flatcamTools/ToolSolderPaste.py +++ b/flatcamTools/ToolSolderPaste.py @@ -933,7 +933,7 @@ class SolderPaste(FlatCAMTool): def job_thread(app_obj): try: - app_obj.new_object("geometry", name + "_solderpaste", geo_init) + app_obj.new_object("geometry", name + "_solderpaste", geo_init, overwrite=True) except Exception as e: proc.done() traceback.print_stack() @@ -1065,7 +1065,7 @@ class SolderPaste(FlatCAMTool): self.app.file_saved.emit("gcode", filename) self.app.inform.emit("[success] Solder paste dispenser GCode file saved to: %s" % filename) - def on_create_gcode(self, use_thread=True): + def on_create_gcode(self, signal, use_thread=True): """ Creates a multi-tool CNCJob out of this Geometry object. :return: None @@ -1168,11 +1168,9 @@ class SolderPaste(FlatCAMTool): if use_thread: # To be run in separate thread - # The idea is that if there is a solid_geometry in the file "root" then most likely thare are no - # separate solid_geometry in the self.tools dictionary def job_thread(app_obj): with self.app.proc_container.new("Generating CNC Code"): - if app_obj.new_object("cncjob", outname, job_init) != 'fail': + if app_obj.new_object("cncjob", outname, job_init, overwrite=True) != 'fail': app_obj.inform.emit("[success]ToolSolderPaste CNCjob created: %s" % outname) app_obj.progress.emit(100) @@ -1181,7 +1179,7 @@ class SolderPaste(FlatCAMTool): # Send to worker self.app.worker_task.emit({'fcn': job_thread, 'params': [self.app]}) else: - self.app.new_object("cncjob", outname, job_init) + self.app.new_object("cncjob", outname, job_init, overwrite=True) def reset_fields(self): self.obj_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex()))