ソースを参照

Activity indicator as context manager when opening files. Opening gerber from File->Open Gerber launches open_gerber in thread.

jpcaram 11 年 前
コミット
2c699406f7
3 ファイル変更73 行追加94 行削除
  1. 52 79
      FlatCAMApp.py
  2. 17 13
      FlatCAMProcess.py
  3. 4 2
      camlib.py

+ 52 - 79
FlatCAMApp.py

@@ -1393,13 +1393,11 @@ class App(QtCore.QObject):
         # TODO: Improve the serialization methods and remove this fix.
         # TODO: Improve the serialization methods and remove this fix.
         filename = str(filename)
         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):
     def on_fileopenexcellon(self):
         """
         """
@@ -1584,40 +1582,24 @@ class App(QtCore.QObject):
 
 
         App.log.debug("open_gerber()")
         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]
 
 
-        self.new_object("gerber", name, obj_init)
+            ### Object creation ###
+            self.new_object("gerber", name, obj_init)
 
 
-        # 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
+            # Register recent file
+            self.file_opened.emit("gerber", filename)
 
 
-        # Register recent file
-        self.file_opened.emit("gerber", filename)
+            self.progress.emit(100)
+            #proc.done()
 
 
-        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):
     def open_excellon(self, filename, outname=None):
         """
         """
@@ -1631,11 +1613,11 @@ class App(QtCore.QObject):
 
 
         App.log.debug("open_excellon()")
         App.log.debug("open_excellon()")
 
 
-        self.progress.emit(10)
+        #self.progress.emit(10)
 
 
         # How the object should be initialized
         # How the object should be initialized
         def obj_init(excellon_obj, app_obj):
         def obj_init(excellon_obj, app_obj):
-            self.progress.emit(20)
+            #self.progress.emit(20)
 
 
             try:
             try:
                 excellon_obj.parse_file(filename)
                 excellon_obj.parse_file(filename)
@@ -1651,32 +1633,21 @@ class App(QtCore.QObject):
                 self.progress.emit(0)
                 self.progress.emit(0)
                 raise e
                 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]
+
+            self.new_object("excellon", name, obj_init)
 
 
-        # Register recent file
-        self.file_opened.emit("excellon", filename)
+            # Register recent file
+            self.file_opened.emit("excellon", filename)
 
 
-        # GUI feedback
-        self.inform.emit("Opened: " + filename)
-        self.progress.emit(100)
+            # GUI feedback
+            self.inform.emit("Opened: " + filename)
+            #self.progress.emit(100)
 
 
     def open_gcode(self, filename, outname=None):
     def open_gcode(self, filename, outname=None):
         """
         """
@@ -1715,29 +1686,31 @@ class App(QtCore.QObject):
             self.progress.emit(60)
             self.progress.emit(60)
             job_obj.create_geometry()
             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]
+
+            # 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
 
 
-        # Register recent file
-        self.file_opened.emit("cncjob", filename)
+            # Register recent file
+            self.file_opened.emit("cncjob", filename)
 
 
-        # GUI feedback
-        self.inform.emit("Opened: " + filename)
-        self.progress.emit(100)
+            # GUI feedback
+            self.inform.emit("Opened: " + filename)
+            self.progress.emit(100)
 
 
     def open_project(self, filename):
     def open_project(self, filename):
         """
         """

+ 17 - 13
FlatCAMProcess.py

@@ -2,6 +2,17 @@ from FlatCAMGUI import FlatCAMActivityView
 from PyQt4 import QtCore
 from PyQt4 import QtCore
 import weakref
 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):
 class FCProcess(object):
 
 
@@ -13,9 +24,6 @@ class FCProcess(object):
         self.status = "Active"
         self.status = "Active"
 
 
     def __del__(self):
     def __del__(self):
-        # print "#######################"
-        # print "# FCProcess.__del__() #"
-        # print "#######################"
         self.done()
         self.done()
 
 
     def __enter__(self):
     def __enter__(self):
@@ -23,15 +31,14 @@ class FCProcess(object):
 
 
     def __exit__(self, exc_type, exc_val, exc_tb):
     def __exit__(self, exc_type, exc_val, exc_tb):
         if exc_type is not None:
         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()
         self.done()
 
 
     def done(self):
     def done(self):
-        # print "FCProcess.done()"
         for fcn in self.callbacks["done"]:
         for fcn in self.callbacks["done"]:
             fcn(self)
             fcn(self)
 
 
@@ -113,21 +120,18 @@ class FCVisibleProcessContainer(QtCore.QObject, FCProcessContainer):
         self.something_changed.connect(self.update_view)
         self.something_changed.connect(self.update_view)
 
 
     def on_done(self, proc):
     def on_done(self, proc):
-        print "FCVisibleProcessContainer.on_done()"
+        log.debug("FCVisibleProcessContainer.on_done()")
         super(FCVisibleProcessContainer, self).on_done(proc)
         super(FCVisibleProcessContainer, self).on_done(proc)
 
 
-        #self.update_view()
         self.something_changed.emit()
         self.something_changed.emit()
 
 
     def on_change(self, proc):
     def on_change(self, proc):
-        print "FCVisibleProcessContainer.on_change()"
+        log.debug("FCVisibleProcessContainer.on_change()")
         super(FCVisibleProcessContainer, self).on_change(proc)
         super(FCVisibleProcessContainer, self).on_change(proc)
 
 
-        #self.update_view()
         self.something_changed.emit()
         self.something_changed.emit()
 
 
     def update_view(self):
     def update_view(self):
-        # print "FCVisibleProcessContainer.update_view()"
         if len(self.procs) == 0:
         if len(self.procs) == 0:
             self.view.set_idle()
             self.view.set_idle()
 
 

+ 4 - 2
camlib.py

@@ -1929,10 +1929,12 @@ class Gerber (Geometry):
 
 
             # --- Apply buffer ---
             # --- Apply buffer ---
             log.warn("Joining %d polygons." % len(poly_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':
             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:
             else:
-                self.solid_geometry = self.solid_geometry.difference(cascaded_union(poly_buffer))
+                self.solid_geometry = self.solid_geometry.difference(new_poly)
 
 
         except Exception, err:
         except Exception, err:
             #print traceback.format_exc()
             #print traceback.format_exc()