Merge branch 'feature_send_extruder_settings' of github.com:Ultimaker/Cura

This commit is contained in:
Jaime van Kessel 2016-06-09 16:41:22 +02:00
commit 1db74b00fd
4 changed files with 44 additions and 41 deletions

View File

@ -191,9 +191,8 @@ class ExtruderManager(QObject):
container_registry.addContainer(container_stack) container_registry.addContainer(container_stack)
## Generates extruders for a specific machine. ## Generates extruders for a specific machine.
def getMachineExtruders(self, machine_definition): def getMachineExtruders(self, machine_id):
container_registry = UM.Settings.ContainerRegistry.getInstance() container_registry = UM.Settings.ContainerRegistry.getInstance()
machine_id = machine_definition.getId()
if not machine_id in self._extruder_trains: 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) UM.Logger.log("w", "Tried to get the extruder trains for machine %s, which doesn't exist.", machine_id)
return return

View File

@ -5,12 +5,20 @@ package cura.proto;
message ObjectList message ObjectList
{ {
repeated Object objects = 1; repeated Object objects = 1;
repeated Setting settings = 2; repeated Setting settings = 2; // meshgroup settings (for one-at-a-time printing)
} }
message Slice message Slice
{ {
repeated ObjectList object_lists = 1; 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
{
int32 id = 1;
SettingList settings = 2;
} }
message Object message Object
@ -29,10 +37,10 @@ message Progress
message Layer { message Layer {
int32 id = 1; int32 id = 1;
float height = 2; float height = 2; // Z position
float thickness = 3; float thickness = 3; // height of a single layer
repeated Polygon polygons = 4; repeated Polygon polygons = 4; // layer data
} }
message Polygon { message Polygon {
@ -48,19 +56,19 @@ message Polygon {
MoveCombingType = 8; MoveCombingType = 8;
MoveRetractionType = 9; MoveRetractionType = 9;
} }
Type type = 1; Type type = 1; // Type of move
bytes points = 2; 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; float line_width = 3; // The width of the line being laid down
} }
message GCodeLayer { message GCodeLayer {
bytes data = 2; bytes data = 2;
} }
message ObjectPrintTime { message ObjectPrintTime { // The print time for the whole print and material estimates for the first extruder
int64 id = 1; int64 id = 1;
float time = 2; float time = 2; // Total time estimate
float material_amount = 3; float material_amount = 3; // material used in the first extruder
} }
message SettingList { message SettingList {
@ -68,13 +76,13 @@ message SettingList {
} }
message Setting { 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 { 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 { message SlicingFinished {

View File

@ -145,8 +145,7 @@ class CuraEngineBackend(Backend):
self.slicingStarted.emit() self.slicingStarted.emit()
slice_message = self._socket.createMessage("cura.proto.Slice") slice_message = self._socket.createMessage("cura.proto.Slice")
settings_message = self._socket.createMessage("cura.proto.SettingList") self._start_slice_job = StartSliceJob.StartSliceJob(slice_message)
self._start_slice_job = StartSliceJob.StartSliceJob(slice_message, settings_message)
self._start_slice_job.start() self._start_slice_job.start()
self._start_slice_job.finished.connect(self._onStartSliceCompleted) self._start_slice_job.finished.connect(self._onStartSliceCompleted)
@ -205,7 +204,6 @@ class CuraEngineBackend(Backend):
return return
# Preparation completed, send it to the backend. # Preparation completed, send it to the backend.
self._socket.sendMessage(job.getSettingsMessage())
self._socket.sendMessage(job.getSliceMessage()) self._socket.sendMessage(job.getSliceMessage())
## Listener for when the scene has changed. ## Listener for when the scene has changed.

View File

@ -15,6 +15,7 @@ from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
from UM.Settings.Validator import ValidatorState from UM.Settings.Validator import ValidatorState
from cura.OneAtATimeIterator import OneAtATimeIterator from cura.OneAtATimeIterator import OneAtATimeIterator
from cura.ExtruderManager import ExtruderManager
class StartJobResult(IntEnum): class StartJobResult(IntEnum):
Finished = 1 Finished = 1
@ -37,17 +38,13 @@ class GcodeStartEndFormatter(Formatter):
## Job class that builds up the message of scene data to send to CuraEngine. ## Job class that builds up the message of scene data to send to CuraEngine.
class StartSliceJob(Job): class StartSliceJob(Job):
def __init__(self, slice_message, settings_message): def __init__(self, slice_message):
super().__init__() super().__init__()
self._scene = Application.getInstance().getController().getScene() self._scene = Application.getInstance().getController().getScene()
self._slice_message = slice_message self._slice_message = slice_message
self._settings_message = settings_message
self._is_cancelled = False self._is_cancelled = False
def getSettingsMessage(self):
return self._settings_message
def getSliceMessage(self): def getSliceMessage(self):
return self._slice_message return self._slice_message
@ -131,6 +128,9 @@ class StartSliceJob(Job):
self._buildGlobalSettingsMessage(stack) self._buildGlobalSettingsMessage(stack)
for extruder_stack in ExtruderManager.getInstance().getMachineExtruders(stack.getBottom().getId()):
self._buildExtruderMessage(extruder_stack)
for group in object_groups: for group in object_groups:
group_message = self._slice_message.addRepeatedMessage("object_lists") group_message = self._slice_message.addRepeatedMessage("object_lists")
if group[0].getParent().callDecoration("isGroup"): if group[0].getParent().callDecoration("isGroup"):
@ -170,6 +170,15 @@ class StartSliceJob(Job):
Logger.logException("w", "Unable to do token replacement on start/end gcode") Logger.logException("w", "Unable to do token replacement on start/end gcode")
return str(value).encode("utf-8") 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.getMessage("settings").addRepeatedMessage("settings")
setting.name = key
setting.value = str(stack.getProperty(key, "value")).encode("utf-8")
Job.yieldThread()
## Sends all global settings to the engine. ## Sends all global settings to the engine.
# #
# The settings are taken from the global stack. This does not include any # The settings are taken from the global stack. This does not include any
@ -185,7 +194,7 @@ class StartSliceJob(Job):
settings["material_print_temp_prepend"] = "{material_print_temperature}" not in start_gcode 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. 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 setting_message.name = key
if key == "machine_start_gcode" or key == "machine_end_gcode": #If it's a g-code message, use special formatting. 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) setting_message.value = self._expandGcodeTokens(key, value, settings)
@ -193,21 +202,10 @@ class StartSliceJob(Job):
setting_message.value = str(value).encode("utf-8") setting_message.value = str(value).encode("utf-8")
def _handlePerObjectSettings(self, node, message): def _handlePerObjectSettings(self, node, message):
profile = node.callDecoration("getProfile") stack = node.callDecoration("getStack")
if profile: if stack:
for key, value in profile.getAllSettingValues().items(): for key in stack.getAllKeys():
setting = message.addRepeatedMessage("settings") setting = message.addRepeatedMessage("settings")
setting.name = key setting.name = key
setting.value = str(value).encode() setting.value = str(stack.getProperty(key, "value")).encode("utf-8")
Job.yieldThread() 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()