|
@@ -14,6 +14,7 @@ import os
|
|
|
import random
|
|
import random
|
|
|
import logging
|
|
import logging
|
|
|
import simplejson as json
|
|
import simplejson as json
|
|
|
|
|
+import lzma
|
|
|
|
|
|
|
|
import re
|
|
import re
|
|
|
import os
|
|
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_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_project_autohide": self.general_defaults_form.general_app_group.project_autohide_cb,
|
|
|
"global_advanced": self.general_defaults_form.general_app_group.advanced_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_gridx": self.general_defaults_form.general_gui_group.gridx_entry,
|
|
|
"global_gridy": self.general_defaults_form.general_gui_group.gridy_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_shape": [500, 300], # Shape of the shell in pixels.
|
|
|
"global_shell_at_startup": False, # Show the shell at startup.
|
|
"global_shell_at_startup": False, # Show the shell at startup.
|
|
|
"global_recent_limit": 10, # Max. items in recent list.
|
|
"global_recent_limit": 10, # Max. items in recent list.
|
|
|
|
|
+ "global_compression_level": 3,
|
|
|
"fit_key": 'V',
|
|
"fit_key": 'V',
|
|
|
"zoom_out_key": '-',
|
|
"zoom_out_key": '-',
|
|
|
"zoom_in_key": '=',
|
|
"zoom_in_key": '=',
|
|
@@ -6222,7 +6225,7 @@ class App(QtCore.QObject):
|
|
|
"""
|
|
"""
|
|
|
App.log.debug("Opening project: " + filename)
|
|
App.log.debug("Opening project: " + filename)
|
|
|
|
|
|
|
|
- # Open and parse
|
|
|
|
|
|
|
+ # Open and parse an uncompressed Project file
|
|
|
try:
|
|
try:
|
|
|
f = open(filename, 'r')
|
|
f = open(filename, 'r')
|
|
|
except IOError:
|
|
except IOError:
|
|
@@ -6236,7 +6239,16 @@ class App(QtCore.QObject):
|
|
|
App.log.error("Failed to parse project file: %s" % filename)
|
|
App.log.error("Failed to parse project file: %s" % filename)
|
|
|
self.inform.emit("[ERROR_NOTCL] Failed to parse project file: %s" % filename)
|
|
self.inform.emit("[ERROR_NOTCL] Failed to parse project file: %s" % filename)
|
|
|
f.close()
|
|
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)
|
|
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,
|
|
"options": self.options,
|
|
|
"version": self.version}
|
|
"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
|
|
# 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):
|
|
def on_options_app2project(self):
|
|
|
"""
|
|
"""
|