From 2c699406f791bbf64694bcf1e061bcb7ad5a89e5 Mon Sep 17 00:00:00 2001 From: jpcaram Date: Fri, 13 Feb 2015 14:05:06 -0500 Subject: [PATCH] Activity indicator as context manager when opening files. Opening gerber from File->Open Gerber launches open_gerber in thread. --- FlatCAMApp.py | 131 ++++++++++++++++++---------------------------- FlatCAMProcess.py | 30 ++++++----- camlib.py | 6 ++- 3 files changed, 73 insertions(+), 94 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 75cffb39..8710b7b6 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -1393,13 +1393,11 @@ class App(QtCore.QObject): # TODO: Improve the serialization methods and remove this fix. filename = str(filename) - self.open_gerber(filename) - - # if str(filename) == "": - # self.inform.emit("Open cancelled.") - # else: - # self.worker_task.emit({'fcn': self.open_gerber, - # 'params': [filename]}) + if str(filename) == "": + self.inform.emit("Open cancelled.") + else: + self.worker_task.emit({'fcn': self.open_gerber, + 'params': [filename]}) def on_fileopenexcellon(self): """ @@ -1584,40 +1582,24 @@ class App(QtCore.QObject): App.log.debug("open_gerber()") - proc = self.proc_container.new("Opening Gerber") - log.debug("sys.getrefcount(proc) == %d" % sys.getrefcount(proc)) - self.progress.emit(10) + with self.proc_container.new("Opening Gerber") as proc: + self.progress.emit(10) + # Object name + name = outname or filename.split('/')[-1].split('\\')[-1] - # Object name - name = outname or filename.split('/')[-1].split('\\')[-1] + ### Object creation ### + self.new_object("gerber", name, obj_init) - self.new_object("gerber", name, obj_init) + # Register recent file + self.file_opened.emit("gerber", filename) - # New object creation and file processing - # try: - # self.new_object("gerber", name, obj_init) - # except: - # e = sys.exc_info() - # print "ERROR:", e[0] - # traceback.print_exc() - # self.message_dialog("Failed to create Gerber Object", - # "Attempting to create a FlatCAM Gerber Object from " + - # "Gerber file failed during processing:\n" + - # str(e[0]) + " " + str(e[1]), kind="error") - # GLib.timeout_add_seconds(1, lambda: self.set_progress_bar(0.0, "Idle")) - # self.collection.delete_active() - # return + self.progress.emit(100) + #proc.done() - # Register recent file - self.file_opened.emit("gerber", filename) - - self.progress.emit(100) - #proc.done() - - # GUI feedback - self.inform.emit("Opened: " + filename) + # GUI feedback + self.inform.emit("Opened: " + filename) def open_excellon(self, filename, outname=None): """ @@ -1631,11 +1613,11 @@ class App(QtCore.QObject): App.log.debug("open_excellon()") - self.progress.emit(10) + #self.progress.emit(10) # How the object should be initialized def obj_init(excellon_obj, app_obj): - self.progress.emit(20) + #self.progress.emit(20) try: excellon_obj.parse_file(filename) @@ -1651,32 +1633,21 @@ class App(QtCore.QObject): self.progress.emit(0) raise e - self.progress.emit(70) + #self.progress.emit(70) - # Object name - name = outname or filename.split('/')[-1].split('\\')[-1] + with self.proc_container.new("Opening Excellon."): - self.new_object("excellon", name, obj_init) - # New object creation and file processing - # try: - # self.new_object("excellon", name, obj_init) - # except: - # e = sys.exc_info() - # App.log.error(str(e)) - # self.message_dialog("Failed to create Excellon Object", - # "Attempting to create a FlatCAM Excellon Object from " + - # "Excellon file failed during processing:\n" + - # str(e[0]) + " " + str(e[1]), kind="error") - # self.progress.emit(0) - # self.collection.delete_active() - # return + # Object name + name = outname or filename.split('/')[-1].split('\\')[-1] - # Register recent file - self.file_opened.emit("excellon", filename) + self.new_object("excellon", name, obj_init) - # GUI feedback - self.inform.emit("Opened: " + filename) - self.progress.emit(100) + # Register recent file + self.file_opened.emit("excellon", filename) + + # GUI feedback + self.inform.emit("Opened: " + filename) + #self.progress.emit(100) def open_gcode(self, filename, outname=None): """ @@ -1715,29 +1686,31 @@ class App(QtCore.QObject): self.progress.emit(60) job_obj.create_geometry() - # Object name - name = outname or filename.split('/')[-1].split('\\')[-1] + with self.proc_container.new("Opening G-Code."): - # New object creation and file processing - try: - self.new_object("cncjob", name, obj_init) - except: - e = sys.exc_info() - App.log.error(str(e)) - self.message_dialog("Failed to create CNCJob Object", - "Attempting to create a FlatCAM CNCJob Object from " + - "G-Code file failed during processing:\n" + - str(e[0]) + " " + str(e[1]), kind="error") - self.progress.emit(0) - self.collection.delete_active() - return + # Object name + name = outname or filename.split('/')[-1].split('\\')[-1] - # Register recent file - self.file_opened.emit("cncjob", filename) + # New object creation and file processing + try: + self.new_object("cncjob", name, obj_init) + except Exception as e: + # e = sys.exc_info() + App.log.error(str(e)) + self.message_dialog("Failed to create CNCJob Object", + "Attempting to create a FlatCAM CNCJob Object from " + + "G-Code file failed during processing:\n" + + str(e[0]) + " " + str(e[1]), kind="error") + self.progress.emit(0) + self.collection.delete_active() + raise e - # GUI feedback - self.inform.emit("Opened: " + filename) - self.progress.emit(100) + # Register recent file + self.file_opened.emit("cncjob", filename) + + # GUI feedback + self.inform.emit("Opened: " + filename) + self.progress.emit(100) def open_project(self, filename): """ diff --git a/FlatCAMProcess.py b/FlatCAMProcess.py index a6b2d434..679aaa22 100644 --- a/FlatCAMProcess.py +++ b/FlatCAMProcess.py @@ -2,6 +2,17 @@ from FlatCAMGUI import FlatCAMActivityView from PyQt4 import QtCore import weakref +import logging + +log = logging.getLogger('base2') +log.setLevel(logging.DEBUG) +#log.setLevel(logging.WARNING) +#log.setLevel(logging.INFO) +formatter = logging.Formatter('[%(levelname)s] %(message)s') +handler = logging.StreamHandler() +handler.setFormatter(formatter) +log.addHandler(handler) + class FCProcess(object): @@ -13,9 +24,6 @@ class FCProcess(object): self.status = "Active" def __del__(self): - # print "#######################" - # print "# FCProcess.__del__() #" - # print "#######################" self.done() def __enter__(self): @@ -23,15 +31,14 @@ class FCProcess(object): def __exit__(self, exc_type, exc_val, exc_tb): if exc_type is not None: - print "Abnormal termination of process!" - print exc_type - print exc_val - print exc_tb + log.error("Abnormal termination of process!") + log.error(exc_type) + log.error(exc_val) + log.error(exc_tb) self.done() def done(self): - # print "FCProcess.done()" for fcn in self.callbacks["done"]: fcn(self) @@ -113,21 +120,18 @@ class FCVisibleProcessContainer(QtCore.QObject, FCProcessContainer): self.something_changed.connect(self.update_view) def on_done(self, proc): - print "FCVisibleProcessContainer.on_done()" + log.debug("FCVisibleProcessContainer.on_done()") super(FCVisibleProcessContainer, self).on_done(proc) - #self.update_view() self.something_changed.emit() def on_change(self, proc): - print "FCVisibleProcessContainer.on_change()" + log.debug("FCVisibleProcessContainer.on_change()") super(FCVisibleProcessContainer, self).on_change(proc) - #self.update_view() self.something_changed.emit() def update_view(self): - # print "FCVisibleProcessContainer.update_view()" if len(self.procs) == 0: self.view.set_idle() diff --git a/camlib.py b/camlib.py index c30d73cb..9467b019 100644 --- a/camlib.py +++ b/camlib.py @@ -1929,10 +1929,12 @@ class Gerber (Geometry): # --- Apply buffer --- log.warn("Joining %d polygons." % len(poly_buffer)) + new_poly = cascaded_union(poly_buffer) + new_poly = new_poly.buffer(0) if current_polarity == 'D': - self.solid_geometry = self.solid_geometry.union(cascaded_union(poly_buffer)) + self.solid_geometry = self.solid_geometry.union(new_poly) else: - self.solid_geometry = self.solid_geometry.difference(cascaded_union(poly_buffer)) + self.solid_geometry = self.solid_geometry.difference(new_poly) except Exception, err: #print traceback.format_exc()