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

This commit is contained in:
Jaime van Kessel 2017-03-28 13:16:00 +02:00
commit 38a07d75c7
7 changed files with 63 additions and 56 deletions

View File

@ -27,6 +27,7 @@ from UM.Settings.Validator import Validator
from UM.Message import Message from UM.Message import Message
from UM.i18n import i18nCatalog from UM.i18n import i18nCatalog
from UM.Workspace.WorkspaceReader import WorkspaceReader from UM.Workspace.WorkspaceReader import WorkspaceReader
from UM.Platform import Platform
from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation
from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation
@ -725,7 +726,9 @@ class CuraApplication(QtApplication):
else: else:
# Default # Default
self.getController().setActiveTool("TranslateTool") self.getController().setActiveTool("TranslateTool")
if Preferences.getInstance().getValue("view/center_on_select"):
# Hack: QVector bindings are broken on PyQt 5.7.1 on Windows. This disables it being called at all.
if Preferences.getInstance().getValue("view/center_on_select") and not Platform.isWindows():
self._center_after_select = True self._center_after_select = True
else: else:
if self.getController().getActiveTool(): if self.getController().getActiveTool():

View File

@ -619,64 +619,67 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice):
self._gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list") self._gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list")
print_information = Application.getInstance().getPrintInformation() print_information = Application.getInstance().getPrintInformation()
# Check if print cores / materials are loaded at all. Any failure in these results in an Error.
for index in range(0, self._num_extruders):
if print_information.materialLengths[index] != 0:
if self._json_printer_state["heads"][0]["extruders"][index]["hotend"]["id"] == "":
Logger.log("e", "No cartridge loaded in slot %s, unable to start print", index + 1)
self._error_message = Message(
i18n_catalog.i18nc("@info:status", "Unable to start a new print job. No PrinterCore loaded in slot {0}".format(index + 1)))
self._error_message.show()
return
if self._json_printer_state["heads"][0]["extruders"][index]["active_material"]["guid"] == "":
Logger.log("e", "No material loaded in slot %s, unable to start print", index + 1)
self._error_message = Message(
i18n_catalog.i18nc("@info:status",
"Unable to start a new print job. No material loaded in slot {0}".format(index + 1)))
self._error_message.show()
return
warnings = [] # There might be multiple things wrong. Keep a list of all the stuff we need to warn about. warnings = [] # There might be multiple things wrong. Keep a list of all the stuff we need to warn about.
for index in range(0, self._num_extruders): # Only check for mistakes if there is material length information.
# Check if there is enough material. Any failure in these results in a warning. if print_information.materialLengths:
material_length = self._json_printer_state["heads"][0]["extruders"][index]["active_material"]["length_remaining"] # Check if print cores / materials are loaded at all. Any failure in these results in an Error.
if material_length != -1 and print_information.materialLengths[index] > material_length: for index in range(0, self._num_extruders):
Logger.log("w", "Printer reports that there is not enough material left for extruder %s. We need %s and the printer has %s", index + 1, print_information.materialLengths[index], material_length) if print_information.materialLengths[index] != 0:
warnings.append(i18n_catalog.i18nc("@label", "Not enough material for spool {0}.").format(index+1)) if self._json_printer_state["heads"][0]["extruders"][index]["hotend"]["id"] == "":
Logger.log("e", "No cartridge loaded in slot %s, unable to start print", index + 1)
self._error_message = Message(
i18n_catalog.i18nc("@info:status", "Unable to start a new print job. No PrinterCore loaded in slot {0}".format(index + 1)))
self._error_message.show()
return
if self._json_printer_state["heads"][0]["extruders"][index]["active_material"]["guid"] == "":
Logger.log("e", "No material loaded in slot %s, unable to start print", index + 1)
self._error_message = Message(
i18n_catalog.i18nc("@info:status",
"Unable to start a new print job. No material loaded in slot {0}".format(index + 1)))
self._error_message.show()
return
# Check if the right cartridges are loaded. Any failure in these results in a warning. for index in range(0, self._num_extruders):
extruder_manager = cura.Settings.ExtruderManager.ExtruderManager.getInstance() # Check if there is enough material. Any failure in these results in a warning.
if print_information.materialLengths[index] != 0: material_length = self._json_printer_state["heads"][0]["extruders"][index]["active_material"]["length_remaining"]
variant = extruder_manager.getExtruderStack(index).findContainer({"type": "variant"}) if material_length != -1 and print_information.materialLengths[index] > material_length:
core_name = self._json_printer_state["heads"][0]["extruders"][index]["hotend"]["id"] Logger.log("w", "Printer reports that there is not enough material left for extruder %s. We need %s and the printer has %s", index + 1, print_information.materialLengths[index], material_length)
if variant: warnings.append(i18n_catalog.i18nc("@label", "Not enough material for spool {0}.").format(index+1))
if variant.getName() != core_name:
Logger.log("w", "Extruder %s has a different Cartridge (%s) as Cura (%s)", index + 1, core_name, variant.getName())
warnings.append(i18n_catalog.i18nc("@label", "Different print core (Cura: {0}, Printer: {1}) selected for extruder {2}".format(variant.getName(), core_name, index + 1)))
material = extruder_manager.getExtruderStack(index).findContainer({"type": "material"}) # Check if the right cartridges are loaded. Any failure in these results in a warning.
if material: extruder_manager = cura.Settings.ExtruderManager.ExtruderManager.getInstance()
remote_material_guid = self._json_printer_state["heads"][0]["extruders"][index]["active_material"]["guid"] if print_information.materialLengths[index] != 0:
if material.getMetaDataEntry("GUID") != remote_material_guid: variant = extruder_manager.getExtruderStack(index).findContainer({"type": "variant"})
Logger.log("w", "Extruder %s has a different material (%s) as Cura (%s)", index + 1, core_name = self._json_printer_state["heads"][0]["extruders"][index]["hotend"]["id"]
remote_material_guid, if variant:
material.getMetaDataEntry("GUID")) if variant.getName() != core_name:
Logger.log("w", "Extruder %s has a different Cartridge (%s) as Cura (%s)", index + 1, core_name, variant.getName())
warnings.append(i18n_catalog.i18nc("@label", "Different print core (Cura: {0}, Printer: {1}) selected for extruder {2}".format(variant.getName(), core_name, index + 1)))
remote_materials = UM.Settings.ContainerRegistry.ContainerRegistry.getInstance().findInstanceContainers(type = "material", GUID = remote_material_guid, read_only = True) material = extruder_manager.getExtruderStack(index).findContainer({"type": "material"})
remote_material_name = "Unknown" if material:
if remote_materials: remote_material_guid = self._json_printer_state["heads"][0]["extruders"][index]["active_material"]["guid"]
remote_material_name = remote_materials[0].getName() if material.getMetaDataEntry("GUID") != remote_material_guid:
warnings.append(i18n_catalog.i18nc("@label", "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}").format(material.getName(), remote_material_name, index + 1)) Logger.log("w", "Extruder %s has a different material (%s) as Cura (%s)", index + 1,
remote_material_guid,
material.getMetaDataEntry("GUID"))
try: remote_materials = UM.Settings.ContainerRegistry.ContainerRegistry.getInstance().findInstanceContainers(type = "material", GUID = remote_material_guid, read_only = True)
is_offset_calibrated = self._json_printer_state["heads"][0]["extruders"][index]["hotend"]["offset"]["state"] == "valid" remote_material_name = "Unknown"
except KeyError: # Older versions of the API don't expose the offset property, so we must asume that all is well. if remote_materials:
is_offset_calibrated = True remote_material_name = remote_materials[0].getName()
warnings.append(i18n_catalog.i18nc("@label", "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}").format(material.getName(), remote_material_name, index + 1))
if not is_offset_calibrated: try:
warnings.append(i18n_catalog.i18nc("@label", "Print core {0} is not properly calibrated. XY calibration needs to be performed on the printer.").format(index + 1)) is_offset_calibrated = self._json_printer_state["heads"][0]["extruders"][index]["hotend"]["offset"]["state"] == "valid"
except KeyError: # Older versions of the API don't expose the offset property, so we must asume that all is well.
is_offset_calibrated = True
if not is_offset_calibrated:
warnings.append(i18n_catalog.i18nc("@label", "Print core {0} is not properly calibrated. XY calibration needs to be performed on the printer.").format(index + 1))
else:
Logger.log("w", "There was no material usage found. No check to match used material with machine is done.")
if warnings: if warnings:
text = i18n_catalog.i18nc("@label", "Are you sure you wish to print with the selected configuration?") text = i18n_catalog.i18nc("@label", "Are you sure you wish to print with the selected configuration?")

View File

@ -23,7 +23,7 @@
"machine_extruder_end_pos_x": { "default_value": 213 }, "machine_extruder_end_pos_x": { "default_value": 213 },
"machine_extruder_end_pos_y": { "default_value": 207 }, "machine_extruder_end_pos_y": { "default_value": 207 },
"machine_nozzle_head_distance": { "default_value": 2.7 }, "machine_nozzle_head_distance": { "default_value": 2.7 },
"extruder_prime_pos_x": { "default_value": 170 }, "extruder_prime_pos_x": { "default_value": 9 },
"extruder_prime_pos_y": { "default_value": 6 }, "extruder_prime_pos_y": { "default_value": 6 },
"extruder_prime_pos_z": { "default_value": 2 } "extruder_prime_pos_z": { "default_value": 2 }
} }

View File

@ -23,7 +23,7 @@
"machine_extruder_end_pos_x": { "default_value": 213 }, "machine_extruder_end_pos_x": { "default_value": 213 },
"machine_extruder_end_pos_y": { "default_value": 189 }, "machine_extruder_end_pos_y": { "default_value": 189 },
"machine_nozzle_head_distance": { "default_value": 4.2 }, "machine_nozzle_head_distance": { "default_value": 4.2 },
"extruder_prime_pos_x": { "default_value": 182 }, "extruder_prime_pos_x": { "default_value": 222 },
"extruder_prime_pos_y": { "default_value": 6 }, "extruder_prime_pos_y": { "default_value": 6 },
"extruder_prime_pos_z": { "default_value": 2 } "extruder_prime_pos_z": { "default_value": 2 }
} }

View File

@ -23,7 +23,7 @@
"machine_extruder_end_pos_x": { "default_value": 213 }, "machine_extruder_end_pos_x": { "default_value": 213 },
"machine_extruder_end_pos_y": { "default_value": 207 }, "machine_extruder_end_pos_y": { "default_value": 207 },
"machine_nozzle_head_distance": { "default_value": 2.7 }, "machine_nozzle_head_distance": { "default_value": 2.7 },
"extruder_prime_pos_x": { "default_value": 170 }, "extruder_prime_pos_x": { "default_value": 9 },
"extruder_prime_pos_y": { "default_value": 6 }, "extruder_prime_pos_y": { "default_value": 6 },
"extruder_prime_pos_z": { "default_value": 2 } "extruder_prime_pos_z": { "default_value": 2 }
} }

View File

@ -23,7 +23,7 @@
"machine_extruder_end_pos_x": { "default_value": 213 }, "machine_extruder_end_pos_x": { "default_value": 213 },
"machine_extruder_end_pos_y": { "default_value": 189 }, "machine_extruder_end_pos_y": { "default_value": 189 },
"machine_nozzle_head_distance": { "default_value": 4.2 }, "machine_nozzle_head_distance": { "default_value": 4.2 },
"extruder_prime_pos_x": { "default_value": 182 }, "extruder_prime_pos_x": { "default_value": 222 },
"extruder_prime_pos_y": { "default_value": 6 }, "extruder_prime_pos_y": { "default_value": 6 },
"extruder_prime_pos_z": { "default_value": 2 } "extruder_prime_pos_z": { "default_value": 2 }
} }

View File

@ -259,6 +259,7 @@ UM.PreferencesPage
text: catalog.i18nc("@action:button","Center camera when item is selected"); text: catalog.i18nc("@action:button","Center camera when item is selected");
checked: boolCheck(UM.Preferences.getValue("view/center_on_select")) checked: boolCheck(UM.Preferences.getValue("view/center_on_select"))
onClicked: UM.Preferences.setValue("view/center_on_select", checked) onClicked: UM.Preferences.setValue("view/center_on_select", checked)
enabled: Qt.platform.os != "windows" // Hack: disable the feature on windows as it's broken for pyqt 5.7.1.
} }
} }