diff --git a/CHANGELOG.md b/CHANGELOG.md index b5538b35..e6252bc0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ CHANGELOG for FlatCAM beta - optimized a bit the UI for Gerber/Excellon/Geometry objects - optimized FlatCAMObj.add_properties_items() method - updated the Turkish translation (by Mehmet Kaya) +- added ability to run a callback function with callback_parameters after a new FlatCAM object is created 20.10.2020 diff --git a/appObjects/AppObject.py b/appObjects/AppObject.py index e91be931..ea893d0e 100644 --- a/appObjects/AppObject.py +++ b/appObjects/AppObject.py @@ -34,7 +34,7 @@ class AppObject(QtCore.QObject): # Emitted by app_obj.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 app_obj.new_object_available. - object_created = QtCore.pyqtSignal(object, bool, bool) + object_created = QtCore.pyqtSignal(object, bool, bool, object, list) # Emitted when a object has been changed (like scaled, mirrored) object_changed = QtCore.pyqtSignal(object) @@ -56,7 +56,7 @@ class AppObject(QtCore.QObject): self.object_plotted.connect(self.on_object_plotted) self.plots_updated.connect(self.app.on_plots_updated) - def new_object(self, kind, name, initialize, plot=True, autoselected=True): + def new_object(self, kind, name, initialize, plot=True, autoselected=True, callback=None, callback_params=None): """ Creates a new specialized FlatCAMObj and attaches it to the application, this is, updates the GUI accordingly, any other records and plots it. @@ -78,10 +78,18 @@ class AppObject(QtCore.QObject): :param plot: If to plot the resulting object :param autoselected: if the resulting object is autoselected in the Project tab and therefore in the self.collection + :param callback: a method that is launched after the object is created + :type callback: function + + :param callback_params: a list of parameters for the parameter: callback + :type callback_params: list + :return: Either the object or the string 'fail' :rtype: object """ + if callback_params is None: + callback_params = [None] log.debug("AppObject.new_object()") obj_plot = plot obj_autoselected = autoselected @@ -204,7 +212,10 @@ class AppObject(QtCore.QObject): # Move the object to the main thread and let the app know that it is available. # ############################################################################################################ obj.moveToThread(self.app.main_thread) - self.object_created.emit(obj, obj_plot, obj_autoselected) + + if callback_params is None: + callback_params = [] + self.object_created.emit(obj, obj_plot, obj_autoselected, callback, callback_params) return obj @@ -324,15 +335,18 @@ class AppObject(QtCore.QObject): self.new_object('document', 'new_document', initialize, plot=False) - def on_object_created(self, obj, plot, auto_select): + def on_object_created(self, obj, plot, auto_select, callback, callback_params): """ Event callback for object creation. It will add the new object to the collection. After that it will plot the object in a threaded way - :param obj: The newly created FlatCAM object. - :param plot: if the newly create object t obe plotted - :param auto_select: if the newly created object to be autoselected after creation - :return: None + :param obj: The newly created FlatCAM object. + :param plot: if the newly create object to be plotted + :param auto_select: if the newly created object to be autoselected after creation + :param callback: a method that is launched after the object is created + :param callback_params: a list of parameters for the parameter: callback + :type callback_params: list + :return: None """ t0 = time.time() # DEBUG @@ -435,7 +449,7 @@ class AppObject(QtCore.QObject): self.app.collection.set_all_inactive() # here it is done the object plotting - def task(t_obj): + def plotting_task(t_obj): with self.app.proc_container.new(_("Plotting")): if t_obj.kind == 'cncjob': t_obj.plot(kind=self.app.defaults["cncjob_plot_kind"]) @@ -456,7 +470,11 @@ class AppObject(QtCore.QObject): # Send to worker # self.worker.add_task(worker_task, [self]) if plot is True: - self.app.worker_task.emit({'fcn': task, 'params': [obj]}) + self.app.worker_task.emit({'fcn': plotting_task, 'params': [obj]}) + + if callback is not None: + # callback(*callback_params) + self.app.worker_task.emit({'fcn': callback, 'params': callback_params}) def on_object_changed(self, obj): """