From 20f657af888692f4f8620c974d3781429d2f4c6c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 9 Jun 2016 10:40:28 +0200 Subject: [PATCH 1/8] Updated proto file Objects & global settings are now sent in one message. Also added support for extruder settings CURA-1681 --- plugins/CuraEngineBackend/Cura.proto | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/CuraEngineBackend/Cura.proto b/plugins/CuraEngineBackend/Cura.proto index 0d4975aca4..c51829aeff 100644 --- a/plugins/CuraEngineBackend/Cura.proto +++ b/plugins/CuraEngineBackend/Cura.proto @@ -11,6 +11,8 @@ message ObjectList message Slice { repeated ObjectList object_lists = 1; + SettingList global_settings = 2; + repeated SettingsList extruder_settings = 3; } message Object From ce9d8b6dd0ea1b6147913dd317a1b8ca6cb8ae97 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Thu, 9 Jun 2016 10:48:44 +0200 Subject: [PATCH 2/8] proto file typo fix (CURA-1681 CURA-1682) --- plugins/CuraEngineBackend/Cura.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/Cura.proto b/plugins/CuraEngineBackend/Cura.proto index c51829aeff..c2b6a142b4 100644 --- a/plugins/CuraEngineBackend/Cura.proto +++ b/plugins/CuraEngineBackend/Cura.proto @@ -12,7 +12,7 @@ message Slice { repeated ObjectList object_lists = 1; SettingList global_settings = 2; - repeated SettingsList extruder_settings = 3; + repeated SettingList extruder_settings = 3; } message Object From 123c2f5c85148bb74b5e510f5d7cc06d2ba31cc9 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 9 Jun 2016 11:33:15 +0200 Subject: [PATCH 3/8] Moved global settings into slice message (as per API changes) CURA-1681 --- plugins/CuraEngineBackend/CuraEngineBackend.py | 4 +--- plugins/CuraEngineBackend/StartSliceJob.py | 8 ++------ 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 9607ba407b..3e22f8f6fb 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -145,8 +145,7 @@ class CuraEngineBackend(Backend): self.slicingStarted.emit() slice_message = self._socket.createMessage("cura.proto.Slice") - settings_message = self._socket.createMessage("cura.proto.SettingList") - self._start_slice_job = StartSliceJob.StartSliceJob(slice_message, settings_message) + self._start_slice_job = StartSliceJob.StartSliceJob(slice_message) self._start_slice_job.start() self._start_slice_job.finished.connect(self._onStartSliceCompleted) @@ -205,7 +204,6 @@ class CuraEngineBackend(Backend): return # Preparation completed, send it to the backend. - self._socket.sendMessage(job.getSettingsMessage()) self._socket.sendMessage(job.getSliceMessage()) ## Listener for when the scene has changed. diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index dee6f2b64c..75bbd4073f 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -37,17 +37,13 @@ class GcodeStartEndFormatter(Formatter): ## Job class that builds up the message of scene data to send to CuraEngine. class StartSliceJob(Job): - def __init__(self, slice_message, settings_message): + def __init__(self, slice_message): super().__init__() self._scene = Application.getInstance().getController().getScene() self._slice_message = slice_message - self._settings_message = settings_message self._is_cancelled = False - def getSettingsMessage(self): - return self._settings_message - def getSliceMessage(self): return self._slice_message @@ -185,7 +181,7 @@ class StartSliceJob(Job): settings["material_print_temp_prepend"] = "{material_print_temperature}" not in start_gcode for key, value in settings.items(): #Add all submessages for each individual setting. - setting_message = self._settings_message.addRepeatedMessage("settings") + setting_message = self._slice_message.getMessage("global_settings").addRepeatedMessage("settings") setting_message.name = key if key == "machine_start_gcode" or key == "machine_end_gcode": #If it's a g-code message, use special formatting. setting_message.value = self._expandGcodeTokens(key, value, settings) From 899e4cc175ff8b78ccea35be29e163805c53ea20 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 9 Jun 2016 11:46:52 +0200 Subject: [PATCH 4/8] Fixed sending of per-object settings to engine CURA-1681 --- plugins/CuraEngineBackend/StartSliceJob.py | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 75bbd4073f..9a3dc3a263 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -189,21 +189,10 @@ class StartSliceJob(Job): setting_message.value = str(value).encode("utf-8") def _handlePerObjectSettings(self, node, message): - profile = node.callDecoration("getProfile") - if profile: - for key, value in profile.getAllSettingValues().items(): + stack = node.callDecoration("getStack") + if stack: + for key in stack.getAllKeys(): setting = message.addRepeatedMessage("settings") setting.name = key - setting.value = str(value).encode() - - Job.yieldThread() - - object_settings = node.callDecoration("getAllSettingValues") - if not object_settings: - return - for key, value in object_settings.items(): - setting = message.addRepeatedMessage("settings") - setting.name = key - setting.value = str(value).encode() - - Job.yieldThread() + setting.value = str(stack.getProperty(key, "value")).encode("utf-8") + Job.yieldThread() \ No newline at end of file From a01b554ee3320a148753417df8ebcaa933a097ce Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 9 Jun 2016 11:56:41 +0200 Subject: [PATCH 5/8] Added extruder to proto message CURA-1681 --- plugins/CuraEngineBackend/Cura.proto | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/Cura.proto b/plugins/CuraEngineBackend/Cura.proto index c2b6a142b4..aa42ed989a 100644 --- a/plugins/CuraEngineBackend/Cura.proto +++ b/plugins/CuraEngineBackend/Cura.proto @@ -12,7 +12,13 @@ message Slice { repeated ObjectList object_lists = 1; SettingList global_settings = 2; - repeated SettingList extruder_settings = 3; + repeated Extruder extruders = 3; +} + +message Extruder +{ + int32 id = 1; + SettingList settings = 2; } message Object From b6649eab3aef1dbd72058618dfd441d56c65f8a4 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Thu, 9 Jun 2016 12:08:10 +0200 Subject: [PATCH 6/8] dox: documented proto file (CURA-1681 CURA-1682) --- plugins/CuraEngineBackend/Cura.proto | 32 ++++++++++++++-------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/plugins/CuraEngineBackend/Cura.proto b/plugins/CuraEngineBackend/Cura.proto index aa42ed989a..38753fd804 100644 --- a/plugins/CuraEngineBackend/Cura.proto +++ b/plugins/CuraEngineBackend/Cura.proto @@ -5,14 +5,14 @@ package cura.proto; message ObjectList { repeated Object objects = 1; - repeated Setting settings = 2; + repeated Setting settings = 2; // meshgroup settings (for one-at-a-time printing) } message Slice { - repeated ObjectList object_lists = 1; - SettingList global_settings = 2; - repeated Extruder extruders = 3; + repeated ObjectList object_lists = 1; // The meshgroups to be printed one after another + SettingList global_settings = 2; // The global settings used for the whole print job + repeated Extruder extruders = 3; // The settings sent to each extruder object } message Extruder @@ -37,10 +37,10 @@ message Progress message Layer { int32 id = 1; - float height = 2; - float thickness = 3; + float height = 2; // Z position + float thickness = 3; // height of a single layer - repeated Polygon polygons = 4; + repeated Polygon polygons = 4; // layer data } message Polygon { @@ -56,19 +56,19 @@ message Polygon { MoveCombingType = 8; MoveRetractionType = 9; } - Type type = 1; - bytes points = 2; - float line_width = 3; + Type type = 1; // Type of move + bytes points = 2; // The points of the polygon, or two points if only a line segment (Currently only line segments are used) + float line_width = 3; // The width of the line being laid down } message GCodeLayer { bytes data = 2; } -message ObjectPrintTime { +message ObjectPrintTime { // The print time for the whole print and material estimates for the first extruder int64 id = 1; - float time = 2; - float material_amount = 3; + float time = 2; // Total time estimate + float material_amount = 3; // material used in the first extruder } message SettingList { @@ -76,13 +76,13 @@ message SettingList { } message Setting { - string name = 1; + string name = 1; // Internal key to signify a setting - bytes value = 2; + bytes value = 2; // The value of the setting } message GCodePrefix { - bytes data = 2; + bytes data = 2; // Header string to be prenpended before the rest of the gcode sent from the engine } message SlicingFinished { From d93044a338cc2e9603c6a027c2c29d9813935a52 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 9 Jun 2016 13:04:07 +0200 Subject: [PATCH 7/8] Added setting sending per extruder CURA-1681 --- cura/ExtruderManager.py | 13 ++++++------- cura/ExtrudersModel.py | 2 +- plugins/CuraEngineBackend/StartSliceJob.py | 13 +++++++++++++ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/cura/ExtruderManager.py b/cura/ExtruderManager.py index c8a07a4000..102f7d7fc0 100644 --- a/cura/ExtruderManager.py +++ b/cura/ExtruderManager.py @@ -187,19 +187,18 @@ class ExtruderManager(QObject): container_registry.addContainer(container_stack) - ## Generates extruders for a specific machine. - def getMachineExtruders(self, machine_definition): + ## Gets extruders for a specific machine. + def getMachineExtruders(self, machine_definition_id): container_registry = UM.Settings.ContainerRegistry.getInstance() - machine_id = machine_definition.getId() - if not machine_id in self._extruder_trains: - UM.Logger.log("w", "Tried to get the extruder trains for machine %s, which doesn't exist.", machine_id) + if not machine_definition_id in self._extruder_trains: + UM.Logger.log("w", "Tried to get the extruder trains for machine %s, which doesn't exist.", machine_definition_id) return - for _,extruder_train_id in self._extruder_trains[machine_id].items(): + for _,extruder_train_id in self._extruder_trains[machine_definition_id].items(): extruder_train = container_registry.findContainerStacks(id = extruder_train_id) if extruder_train: yield extruder_train[0] else: - UM.Logger.log("w", "Machine %s refers to an extruder train with ID %s, which doesn't exist.", machine_id, extruder_train_id) + UM.Logger.log("w", "Machine %s refers to an extruder train with ID %s, which doesn't exist.", machine_definition_id, extruder_train_id) ## Adds the extruders of the currently active machine. def _addCurrentMachineExtruders(self): diff --git a/cura/ExtrudersModel.py b/cura/ExtrudersModel.py index 60bd60abab..1efc86d9c5 100644 --- a/cura/ExtrudersModel.py +++ b/cura/ExtrudersModel.py @@ -51,7 +51,7 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): global_container_stack = UM.Application.getInstance().getGlobalContainerStack() if not global_container_stack: return #There is no machine to get the extruders of. - for index, extruder in enumerate(manager.getMachineExtruders(global_container_stack.getBottom())): + for index, extruder in enumerate(manager.getMachineExtruders(global_container_stack.getBottom().getId())): material = extruder.findContainer({ "type": "material" }) colour = material.getMetaDataEntry("color_code", default = "#FFFF00") if material else "#FFFF00" item = { #Construct an item with only the relevant information. diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 9a3dc3a263..259750d098 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -15,6 +15,7 @@ from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Settings.Validator import ValidatorState from cura.OneAtATimeIterator import OneAtATimeIterator +from cura.ExtruderManager import ExtruderManager class StartJobResult(IntEnum): Finished = 1 @@ -127,6 +128,9 @@ class StartSliceJob(Job): self._buildGlobalSettingsMessage(stack) + for extruder_stack in ExtruderManager.getInstance().getMachineExtruders(stack.getBottom().getId()): + self._buildExtruderMessage(extruder_stack) + for group in object_groups: group_message = self._slice_message.addRepeatedMessage("object_lists") if group[0].getParent().callDecoration("isGroup"): @@ -166,6 +170,15 @@ class StartSliceJob(Job): Logger.logException("w", "Unable to do token replacement on start/end gcode") return str(value).encode("utf-8") + def _buildExtruderMessage(self, stack): + message = self._slice_message.addRepeatedMessage("extruders") + message.id = int(stack.getMetaDataEntry("position")) + for key in stack.getAllKeys(): + setting = message.addRepeatedMessage("settings") + setting.name = key + setting.value = str(stack.getProperty(key, "value")).encode("utf-8") + Job.yieldThread() + ## Sends all global settings to the engine. # # The settings are taken from the global stack. This does not include any From 3df1bc4e62c302721d89974838104c948cea6a0e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 9 Jun 2016 13:23:09 +0200 Subject: [PATCH 8/8] Fixed minor issue in buildExtruderMessage CURA-1681 --- plugins/CuraEngineBackend/StartSliceJob.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 259750d098..3d2eb0ed4a 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -174,7 +174,7 @@ class StartSliceJob(Job): message = self._slice_message.addRepeatedMessage("extruders") message.id = int(stack.getMetaDataEntry("position")) for key in stack.getAllKeys(): - setting = message.addRepeatedMessage("settings") + setting = message.getMessage("settings").addRepeatedMessage("settings") setting.name = key setting.value = str(stack.getProperty(key, "value")).encode("utf-8") Job.yieldThread()