From b7b48927c2da21a8877bb8c242f46cae6c32216a Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Wed, 11 Apr 2018 17:08:55 +0100 Subject: [PATCH 1/7] Append a \n to each saved line of gcode otherwise the whole file ends up as one line! --- plugins/GCodeReader/FlavorParser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/GCodeReader/FlavorParser.py b/plugins/GCodeReader/FlavorParser.py index 00cbbacacf..b8af673cd4 100644 --- a/plugins/GCodeReader/FlavorParser.py +++ b/plugins/GCodeReader/FlavorParser.py @@ -309,7 +309,7 @@ class FlavorParser: current_line = 0 for line in stream.split("\n"): file_lines += 1 - gcode_list.append(line) + gcode_list.append(line + "\n") if not self._is_layers_in_file and line[:len(self._layer_keyword)] == self._layer_keyword: self._is_layers_in_file = True # stream.seek(0) From 2d30315ecfc2df1a8065de2b3fb4241d87e90580 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 12 Apr 2018 11:49:38 +0200 Subject: [PATCH 2/7] CURA-5220 Skip storing the settings in the GCode if they already are. --- plugins/GCodeWriter/GCodeWriter.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/plugins/GCodeWriter/GCodeWriter.py b/plugins/GCodeWriter/GCodeWriter.py index ccd881afdc..f25e249db1 100644 --- a/plugins/GCodeWriter/GCodeWriter.py +++ b/plugins/GCodeWriter/GCodeWriter.py @@ -42,6 +42,8 @@ class GCodeWriter(MeshWriter): re.escape("\r"): "\\r" # Carriage return. Windows users may need this for visualisation in their editors. } + _setting_keyword = ";SETTING_" + def __init__(self): super().__init__() @@ -69,11 +71,15 @@ class GCodeWriter(MeshWriter): return False gcode_list = gcode_dict.get(active_build_plate, None) if gcode_list is not None: + has_settings = False for gcode in gcode_list: + if gcode[:len(self._setting_keyword)] == self._setting_keyword: + has_settings = True stream.write(gcode) # Serialise the current container stack and put it at the end of the file. - settings = self._serialiseSettings(Application.getInstance().getGlobalContainerStack()) - stream.write(settings) + if not has_settings: + settings = self._serialiseSettings(Application.getInstance().getGlobalContainerStack()) + stream.write(settings) return True return False @@ -108,7 +114,7 @@ class GCodeWriter(MeshWriter): container_registry = self._application.getContainerRegistry() quality_manager = self._application.getQualityManager() - prefix = ";SETTING_" + str(GCodeWriter.version) + " " # The prefix to put before each line. + prefix = self._setting_keyword + str(GCodeWriter.version) + " " # The prefix to put before each line. prefix_length = len(prefix) quality_type = stack.quality.getMetaDataEntry("quality_type") From e50be5cbe7b43393802551c40dda8121ffe3f942 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Wed, 11 Apr 2018 09:12:22 +0100 Subject: [PATCH 3/7] No! G90 does not command absolute extrusion, M82 does that. --- plugins/GCodeReader/RepRapFlavorParser.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/GCodeReader/RepRapFlavorParser.py b/plugins/GCodeReader/RepRapFlavorParser.py index 42853913d6..ba1e13f23d 100644 --- a/plugins/GCodeReader/RepRapFlavorParser.py +++ b/plugins/GCodeReader/RepRapFlavorParser.py @@ -18,10 +18,10 @@ class RepRapFlavorParser(FlavorParser.FlavorParser): self._is_absolute_extrusion = False ## Set the absolute positioning - # RepRapFlavor code G90 sets position of X, Y, Z, and E to absolute + # RepRapFlavor code G90 sets position of X, Y, Z to absolute + # For absolute E, M82 is used def _gCode90(self, position, params, path): self._is_absolute_positioning = True - self._is_absolute_extrusion = True return position ## Set the relative positioning From 8d3c3c0e8079efe72d2328711aa7fc3361a6a911 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 12 Apr 2018 13:46:52 +0200 Subject: [PATCH 4/7] Fix the case that a quality_type is not available CURA-5218 --- cura/Settings/MachineManager.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 21810d394c..1272e043c4 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1020,11 +1020,10 @@ class MachineManager(QObject): quality_type = quality_changes_group.quality_type # A custom quality can be created based on "not supported". # In that case, do not set quality containers to empty. - if quality_type == "not_supported": - quality_group = None - else: + quality_group = None + if quality_type != "not_supported": quality_group_dict = self._quality_manager.getQualityGroups(self._global_container_stack) - quality_group = quality_group_dict[quality_type] + quality_group = quality_group_dict.get(quality_type) quality_changes_container = self._empty_quality_changes_container if quality_changes_group.node_for_global: From 1c4c3a4a0b04f29fdc8cd497e71d0599ce764e95 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 12 Apr 2018 13:57:26 +0200 Subject: [PATCH 5/7] Fix quality changes that are based on no-long-available quality_type CURA-5218 --- cura/Settings/MachineManager.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 1272e043c4..c793acb4ad 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1016,6 +1016,13 @@ class MachineManager(QObject): self.activeQualityGroupChanged.emit() self.activeQualityChangesGroupChanged.emit() + def _fixQualityChangesGroupToNotSupported(self, quality_changes_group): + nodes = [quality_changes_group.node_for_global] + list(quality_changes_group.nodes_for_extruders.values()) + containers = [n.getContainer() for n in nodes if n is not None] + for container in containers: + container.setMetaDataEntry("quality_type", "not_supported") + quality_changes_group.quality_type = "not_supported" + def _setQualityChangesGroup(self, quality_changes_group): quality_type = quality_changes_group.quality_type # A custom quality can be created based on "not supported". @@ -1024,6 +1031,8 @@ class MachineManager(QObject): if quality_type != "not_supported": quality_group_dict = self._quality_manager.getQualityGroups(self._global_container_stack) quality_group = quality_group_dict.get(quality_type) + if quality_group is None: + self._fixQualityChangesGroupToNotSupported(quality_changes_group) quality_changes_container = self._empty_quality_changes_container if quality_changes_group.node_for_global: From fdd78077697f9e3ff9f0fe654eff8af36a1623d9 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 12 Apr 2018 13:57:55 +0200 Subject: [PATCH 6/7] Custom qualities are always checkable CURA-5218 --- resources/qml/Menus/ProfileMenu.qml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/qml/Menus/ProfileMenu.qml b/resources/qml/Menus/ProfileMenu.qml index 5b9a5a3b73..ffd3c556b6 100644 --- a/resources/qml/Menus/ProfileMenu.qml +++ b/resources/qml/Menus/ProfileMenu.qml @@ -51,8 +51,7 @@ Menu MenuItem { text: model.name - checkable: model.available - enabled: model.available + checkable: true checked: Cura.MachineManager.activeQualityOrQualityChangesName == model.name exclusiveGroup: group onTriggered: Cura.MachineManager.setQualityChangesGroup(model.quality_changes_group) From 33949c3b719b436fe0ac778271d458c1e66e557b Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 12 Apr 2018 14:02:54 +0200 Subject: [PATCH 7/7] Update build plate compatibility upon extruder enabled/disabled CURA-5219 --- cura/Settings/MachineManager.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index c793acb4ad..1d6a401b43 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -926,6 +926,8 @@ class MachineManager(QObject): ExtruderManager.getInstance().extrudersChanged.emit(self._global_container_stack.getId()) # Make sure the front end reflects changes self.forceUpdateAllSettings() + # Also trigger the build plate compatibility to update + self.activeMaterialChanged.emit() def _onMachineNameChanged(self): self.globalContainerChanged.emit()