Quellcode durchsuchen

- added the ability to compress the FlatCAM project on save with LZMA compression. There is a setting in Edit -> Preferences -> Compression Level between 0 and 9. 9 level yields best compression at the price of RAM usage and time spent.
- made FlatCAM able to load old type (uncompressed) FlatCAM projects

Marius Stanciu vor 7 Jahren
Ursprung
Commit
7f65cf628d
3 geänderte Dateien mit 71 neuen und 32 gelöschten Zeilen
  1. 49 32
      FlatCAMApp.py
  2. 17 0
      FlatCAMGUI.py
  3. 5 0
      README.md

+ 49 - 32
FlatCAMApp.py

@@ -14,6 +14,7 @@ import os
 import random
 import logging
 import simplejson as json
+import lzma
 
 import re
 import os
@@ -312,6 +313,7 @@ class App(QtCore.QObject):
             "global_project_at_startup": self.general_defaults_form.general_app_group.project_startup_cb,
             "global_project_autohide": self.general_defaults_form.general_app_group.project_autohide_cb,
             "global_advanced": self.general_defaults_form.general_app_group.advanced_cb,
+            "global_compression_level": self.general_defaults_form.general_app_group.compress_combo,
 
             "global_gridx": self.general_defaults_form.general_gui_group.gridx_entry,
             "global_gridy": self.general_defaults_form.general_gui_group.gridy_entry,
@@ -547,6 +549,7 @@ class App(QtCore.QObject):
             "global_shell_shape": [500, 300],  # Shape of the shell in pixels.
             "global_shell_at_startup": False,  # Show the shell at startup.
             "global_recent_limit": 10,  # Max. items in recent list.
+            "global_compression_level": 3,
             "fit_key": 'V',
             "zoom_out_key": '-',
             "zoom_in_key": '=',
@@ -6222,7 +6225,7 @@ class App(QtCore.QObject):
         """
         App.log.debug("Opening project: " + filename)
 
-        # Open and parse
+        # Open and parse an uncompressed Project file
         try:
             f = open(filename, 'r')
         except IOError:
@@ -6236,7 +6239,16 @@ class App(QtCore.QObject):
             App.log.error("Failed to parse project file: %s" % filename)
             self.inform.emit("[ERROR_NOTCL] Failed to parse project file: %s" % filename)
             f.close()
-            return
+
+            # Open and parse a compressed Project file
+            try:
+                with lzma.open(filename) as f:
+                    file_content = f.read().decode('utf-8')
+                    d = json.loads(file_content, object_hook=dict2obj)
+            except IOError:
+                App.log.error("Failed to open project file: %s" % filename)
+                self.inform.emit("[ERROR_NOTCL] Failed to open project file: %s" % filename)
+                return
 
         self.file_opened.emit("project", filename)
 
@@ -6958,37 +6970,42 @@ The normal flow when working in FlatCAM is the following:</span></p>
                  "options": self.options,
                  "version": self.version}
 
+            with lzma.open(filename, "w", preset=int(self.defaults['global_compression_level'])) as f:
+                g = json.dumps(d, default=to_dict, indent=2, sort_keys=True).encode('utf-8')
+                # # Write
+                f.write(g)
+            self.inform.emit("[success] Project saved to: %s" % filename)
             # Open file
-            try:
-                f = open(filename, 'w')
-            except IOError:
-                App.log.error("[ERROR] Failed to open file for saving: %s", filename)
-                return
-
-            # Write
-            json.dump(d, f, default=to_dict, indent=2, sort_keys=True)
-            f.close()
-
-            # verification of the saved project
-            # Open and parse
-            try:
-                saved_f = open(filename, 'r')
-            except IOError:
-                self.inform.emit("[ERROR_NOTCL] Failed to verify project file: %s. Retry to save it." % filename)
-                return
-
-            try:
-                saved_d = json.load(saved_f, object_hook=dict2obj)
-            except:
-                self.inform.emit("[ERROR_NOTCL] Failed to parse saved project file: %s. Retry to save it." % filename)
-                f.close()
-                return
-            saved_f.close()
-
-            if 'version' in saved_d:
-                self.inform.emit("[success] Project saved to: %s" % filename)
-            else:
-                self.inform.emit("[ERROR_NOTCL] Failed to save project file: %s. Retry to save it." % filename)
+            # try:
+            #     f = open(filename, 'w')
+            # except IOError:
+            #     App.log.error("[ERROR] Failed to open file for saving: %s", filename)
+            #     return
+            #
+            # # Write
+            # json.dump(d, f, default=to_dict, indent=2, sort_keys=True)
+            # f.close()
+            #
+            # # verification of the saved project
+            # # Open and parse
+            # try:
+            #     saved_f = open(filename, 'r')
+            # except IOError:
+            #     self.inform.emit("[ERROR_NOTCL] Failed to verify project file: %s. Retry to save it." % filename)
+            #     return
+            #
+            # try:
+            #     saved_d = json.load(saved_f, object_hook=dict2obj)
+            # except:
+            #     self.inform.emit("[ERROR_NOTCL] Failed to parse saved project file: %s. Retry to save it." % filename)
+            #     f.close()
+            #     return
+            # saved_f.close()
+            #
+            # if 'version' in saved_d:
+            #     self.inform.emit("[success] Project saved to: %s" % filename)
+            # else:
+            #     self.inform.emit("[ERROR_NOTCL] Failed to save project file: %s. Retry to save it." % filename)
 
     def on_options_app2project(self):
         """

+ 17 - 0
FlatCAMGUI.py

@@ -3129,6 +3129,23 @@ class GeneralAppPrefGroupUI(OptionsGroupUI):
         hlay.addWidget(self.advanced_cb)
         hlay.addStretch()
 
+        hlay1 = QtWidgets.QHBoxLayout()
+        self.layout.addLayout(hlay1)
+
+        # Project LZMA Comppression Level
+        self.compress_combo = FCComboBox()
+        self.compress_label = QtWidgets.QLabel('Compress Level:')
+        self.compress_label.setToolTip(
+            "The level of compression used when saving\n"
+            "a FlatCAM project. Higher value means better compression\n"
+            "but require more RAM and time."
+        )
+        # self.advanced_cb.setLayoutDirection(QtCore.Qt.RightToLeft)
+        self.compress_combo.addItems([str(i) for i in range(10)])
+
+        hlay1.addWidget(self.compress_label)
+        hlay1.addWidget(self.compress_combo)
+
         self.form_box_2 = QtWidgets.QFormLayout()
         self.layout.addLayout(self.form_box_2)
 

+ 5 - 0
README.md

@@ -9,6 +9,11 @@ CAD program, and create G-Code for Isolation routing.
 
 =================================================
 
+19.02.2019
+
+- added the ability to compress the FlatCAM project on save with LZMA compression. There is a setting in Edit -> Preferences -> Compression Level between 0 and 9. 9 level yields best compression at the price of RAM usage and time spent.
+- made FlatCAM able to load old type (uncompressed) FlatCAM projects 
+
 18.02.2019
 
 - added protections again wrong values for the Buffer and Paint Tool in Geometry Editor