Просмотр исходного кода

When saving the quality profile data, also incorporate any user settings/changes.
Contributes to CURA-1727 GCode Profile reading/writing: Broken and needs update

Simon Edwards 8 лет назад
Родитель
Сommit
642ea6791b
3 измененных файлов с 28 добавлено и 5 удалено
  1. 7 2
      cura/CuraApplication.py
  2. 1 1
      cura/Settings/MachineManager.py
  3. 20 2
      plugins/GCodeWriter/GCodeWriter.py

+ 7 - 2
cura/CuraApplication.py

@@ -126,6 +126,7 @@ class CuraApplication(QtApplication):
         )
 
         self._machine_action_manager = MachineActionManager.MachineActionManager()
+        self._machine_manager = None    # This is initialized on demand.
 
         super().__init__(name = "cura", version = CuraVersion, buildtype = CuraBuildType)
 
@@ -399,8 +400,7 @@ class CuraApplication(QtApplication):
 
         # Initialise extruder so as to listen to global container stack changes before the first global container stack is set.
         cura.Settings.ExtruderManager.getInstance()
-        qmlRegisterSingletonType(cura.Settings.MachineManager, "Cura", 1, 0, "MachineManager",
-                                 cura.Settings.MachineManager.createMachineManager)
+        qmlRegisterSingletonType(cura.Settings.MachineManager, "Cura", 1, 0, "MachineManager", self.getMachineManager)
 
         qmlRegisterSingletonType(MachineActionManager.MachineActionManager, "Cura", 1, 0, "MachineActionManager", self.getMachineActionManager)
         self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml"))
@@ -419,6 +419,11 @@ class CuraApplication(QtApplication):
 
             self.exec_()
 
+    def getMachineManager(self, *args):
+        if self._machine_manager is None:
+            self._machine_manager = cura.Settings.MachineManager.createMachineManager()
+        return self._machine_manager
+
     ##  Get the machine action manager
     #   We ignore any *args given to this, as we also register the machine manager as qml singleton.
     #   It wants to give this function an engine and script engine, but we don't care about that.

+ 1 - 1
cura/Settings/MachineManager.py

@@ -692,7 +692,7 @@ class MachineManager(QObject):
             return containers[0].getBottom().getId()
 
     @staticmethod
-    def createMachineManager(engine, script_engine):
+    def createMachineManager(engine=None, script_engine=None):
         return MachineManager()
 
     def _updateVariantContainer(self, definition):

+ 20 - 2
plugins/GCodeWriter/GCodeWriter.py

@@ -4,7 +4,9 @@
 from UM.Mesh.MeshWriter import MeshWriter
 from UM.Logger import Logger
 from UM.Application import Application
+import UM.Settings.ContainerRegistry
 
+from cura.CuraApplication import CuraApplication
 from cura.Settings.ExtruderManager import ExtruderManager
 
 import re #For escaping characters in the settings.
@@ -72,14 +74,30 @@ class GCodeWriter(MeshWriter):
         prefix_length = len(prefix)
 
         container_with_profile = stack.findContainer({"type": "quality"})
-        serialized = container_with_profile.serialize()
+        machine_manager = CuraApplication.getInstance().getMachineManager()
+
+        # Duplicate the current quality profile and update it with any user settings.
+        flat_quality_id = machine_manager.duplicateContainer(container_with_profile.getId())
+        flat_quality = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = flat_quality_id)[0]
+        user_settings = stack.getTop()
+        for key in user_settings.getAllKeys():
+            flat_quality.setProperty(key, "value", user_settings.getProperty(key, "value"))
+
+        serialized = flat_quality.serialize()
 
         data = {"global_quality": serialized}
 
         manager = ExtruderManager.getInstance()
         for extruder in manager.getMachineExtruders(stack.getBottom().getId()):
             extruder_quality = extruder.findContainer({"type": "quality"})
-            extruder_serialized = extruder_quality.serialize()
+
+            flat_extruder_quality_id = machine_manager.duplicateContainer(extruder_quality.getId())
+            flat_extruder_quality = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id=flat_extruder_quality_id)[0]
+            extruder_user_settings = extruder.getTop()
+            for key in extruder_user_settings.getAllKeys():
+                flat_extruder_quality.setProperty(key, "value", extruder_user_settings.getProperty(key, "value"))
+
+            extruder_serialized = flat_extruder_quality.serialize()
             data.setdefault("extruder_quality", []).append(extruder_serialized)
 
         json_string = json.dumps(data)