diff options
author | Ghostkeeper <rubend@tutanota.com> | 2020-08-20 17:34:58 +0300 |
---|---|---|
committer | Ghostkeeper <rubend@tutanota.com> | 2020-08-20 17:34:58 +0300 |
commit | a757dc7fa0b1b19efa1024132e2d6c94d2788626 (patch) | |
tree | c18db21ae7fa7759951c5f8a58e2cbe51460f1d7 /plugins | |
parent | 7f70acbaf1f6a5c6b1f77d9eed47ceb592256983 (diff) | |
parent | af05aa61b79071e1a0ba77bd5340bb19cf0e16f4 (diff) |
Merge branch '4.7'
Diffstat (limited to 'plugins')
-rwxr-xr-x | plugins/3MFReader/ThreeMFWorkspaceReader.py | 30 | ||||
-rw-r--r-- | plugins/3MFReader/UpdatableMachinesModel.py | 43 | ||||
-rw-r--r-- | plugins/3MFReader/WorkspaceDialog.py | 120 | ||||
-rw-r--r-- | plugins/3MFReader/WorkspaceDialog.qml | 65 | ||||
-rw-r--r-- | plugins/PostProcessingPlugin/scripts/ChangeAtZ.py | 5 | ||||
-rw-r--r-- | plugins/SimulationView/SimulationPass.py | 15 | ||||
-rw-r--r-- | plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py | 62 |
7 files changed, 117 insertions, 223 deletions
diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 3ed005f131..6ed35fe72c 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -133,10 +133,12 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # In Cura 2.5 and 2.6, the empty profiles used to have those long names self._old_empty_profile_id_dict = {"empty_%s" % k: "empty" for k in ["material", "variant"]} + self._is_same_machine_type = False self._old_new_materials = {} # type: Dict[str, str] self._machine_info = None def _clearState(self): + self._is_same_machine_type = False self._id_mapping = {} self._old_new_materials = {} self._machine_info = None @@ -227,7 +229,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # Read definition containers # machine_definition_id = None - updatable_machines = [] machine_definition_container_count = 0 extruder_definition_container_count = 0 definition_container_files = [name for name in cura_file_names if name.endswith(self._definition_container_suffix)] @@ -244,9 +245,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader): definition_container_type = definition_container.get("type") if definition_container_type == "machine": machine_definition_id = container_id - machine_definition_containers = self._container_registry.findDefinitionContainers(id = machine_definition_id) - if machine_definition_containers: - updatable_machines = [machine for machine in self._container_registry.findContainerStacks(type = "machine") if machine.definition == machine_definition_containers[0]] machine_type = definition_container["name"] variant_type_name = definition_container.get("variants_name", variant_type_name) @@ -388,8 +386,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): machine_definition_id = id_list[7] stacks = self._container_registry.findContainerStacks(name = machine_name, type = "machine") + self._is_same_machine_type = True existing_global_stack = None - global_stack = None if stacks: global_stack = stacks[0] @@ -402,9 +400,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if global_stack.getContainer(index).getId() != container_id: machine_conflict = True break - - if updatable_machines and not containers_found_dict["machine"]: - containers_found_dict["machine"] = True + self._is_same_machine_type = global_stack.definition.getId() == machine_definition_id # Get quality type parser = ConfigParser(interpolation = None) @@ -489,7 +485,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if intent_id not in ("empty", "empty_intent"): extruder_info.intent_info = instance_container_info_dict[intent_id] - if not machine_conflict and containers_found_dict["machine"] and global_stack: + if not machine_conflict and containers_found_dict["machine"]: if int(position) >= len(global_stack.extruderList): continue @@ -562,6 +558,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._machine_info.custom_quality_name = quality_name self._machine_info.intent_category = intent_category + if machine_conflict and not self._is_same_machine_type: + machine_conflict = False + is_printer_group = False if machine_conflict: group_name = existing_global_stack.getMetaDataEntry("group_name") @@ -582,7 +581,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._dialog.setNumSettingsOverriddenByQualityChanges(num_settings_overridden_by_quality_changes) self._dialog.setNumUserSettings(num_user_settings) self._dialog.setActiveMode(active_mode) - self._dialog.setUpdatableMachines(updatable_machines) self._dialog.setMachineName(machine_name) self._dialog.setMaterialLabels(material_labels) self._dialog.setMachineType(machine_type) @@ -663,8 +661,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): application.expandedCategoriesChanged.emit() # Notify the GUI of the change - # If there are no machines of the same type, create a new machine. - if self._resolve_strategies["machine"] != "override" or self._dialog.updatableMachinesModel.count <= 1: + # If a machine with the same name is of a different type, always create a new one. + if not self._is_same_machine_type or self._resolve_strategies["machine"] != "override": # We need to create a new machine machine_name = self._container_registry.uniqueName(self._machine_info.name) @@ -679,12 +677,10 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._container_registry.addContainer(global_stack) else: - # Find the machine which will be overridden - global_stacks = self._container_registry.findContainerStacks(id = self._dialog.getMachineToOverride(), type = "machine") + # Find the machine + global_stacks = self._container_registry.findContainerStacks(name = self._machine_info.name, type = "machine") if not global_stacks: - message = Message(i18n_catalog.i18nc("@info:error Don't translate the XML tag <filename>!", - "Project file <filename>{0}</filename> is made using profiles that" - " are unknown to this version of Ultimaker Cura.", file_name)) + message = Message(i18n_catalog.i18nc("@info:error Don't translate the XML tag <filename>!", "Project file <filename>{0}</filename> is made using profiles that are unknown to this version of Ultimaker Cura.", file_name)) message.show() self.setWorkspaceName("") return [], {} diff --git a/plugins/3MFReader/UpdatableMachinesModel.py b/plugins/3MFReader/UpdatableMachinesModel.py deleted file mode 100644 index a332c669e6..0000000000 --- a/plugins/3MFReader/UpdatableMachinesModel.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright (c) 2020 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. - -from typing import Dict, List - -from PyQt5.QtCore import Qt - -from UM.Qt.ListModel import ListModel -from cura.Settings.GlobalStack import GlobalStack - -create_new_list_item = { - "id": "new", - "name": "Create new", - "displayName": "Create new", - "type": "default_option" # to make sure we are not mixing the "Create new" option with a printer with id "new" -} # type: Dict[str, str] - - -class UpdatableMachinesModel(ListModel): - """Model that holds cura packages. - - By setting the filter property the instances held by this model can be changed. - """ - - def __init__(self, parent = None) -> None: - super().__init__(parent) - - self.addRoleName(Qt.UserRole + 1, "id") - self.addRoleName(Qt.UserRole + 2, "name") - self.addRoleName(Qt.UserRole + 3, "displayName") - self.addRoleName(Qt.UserRole + 4, "type") # Either "default_option" or "machine" - - def update(self, machines: List[GlobalStack]) -> None: - items = [create_new_list_item] # type: List[Dict[str, str]] - - for machine in sorted(machines, key = lambda printer: printer.name): - items.append({ - "id": machine.id, - "name": machine.name, - "displayName": "Update " + machine.name, - "type": "machine" - }) - self.setItems(items) diff --git a/plugins/3MFReader/WorkspaceDialog.py b/plugins/3MFReader/WorkspaceDialog.py index 8d59ec1339..3c97146583 100644 --- a/plugins/3MFReader/WorkspaceDialog.py +++ b/plugins/3MFReader/WorkspaceDialog.py @@ -1,6 +1,5 @@ -# Copyright (c) 2020 Ultimaker B.V. +# Copyright (c) 2016 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import List, Optional, Dict, cast from PyQt5.QtCore import pyqtSignal, QObject, pyqtProperty, QCoreApplication from UM.FlameProfiler import pyqtSlot @@ -8,15 +7,10 @@ from UM.PluginRegistry import PluginRegistry from UM.Application import Application from UM.i18n import i18nCatalog from UM.Settings.ContainerRegistry import ContainerRegistry -from cura.Settings.GlobalStack import GlobalStack -from .UpdatableMachinesModel import UpdatableMachinesModel import os import threading import time - -from cura.CuraApplication import CuraApplication - i18n_catalog = i18nCatalog("cura") @@ -35,7 +29,6 @@ class WorkspaceDialog(QObject): "quality_changes": self._default_strategy, "definition_changes": self._default_strategy, "material": self._default_strategy} - self._override_machine = None self._visible = False self.showDialogSignal.connect(self.__show) @@ -58,7 +51,6 @@ class WorkspaceDialog(QObject): self._extruders = [] self._objects_on_plate = False self._is_printer_group = False - self._updatable_machines_model = UpdatableMachinesModel(self) machineConflictChanged = pyqtSignal() qualityChangesConflictChanged = pyqtSignal() @@ -71,7 +63,6 @@ class WorkspaceDialog(QObject): qualityTypeChanged = pyqtSignal() intentNameChanged = pyqtSignal() machineNameChanged = pyqtSignal() - updatableMachinesChanged = pyqtSignal() materialLabelsChanged = pyqtSignal() objectsOnPlateChanged = pyqtSignal() numUserSettingsChanged = pyqtSignal() @@ -90,33 +81,33 @@ class WorkspaceDialog(QObject): self.isPrinterGroupChanged.emit() @pyqtProperty(str, notify=variantTypeChanged) - def variantType(self) -> str: + def variantType(self): return self._variant_type - def setVariantType(self, variant_type: str) -> None: + def setVariantType(self, variant_type): if self._variant_type != variant_type: self._variant_type = variant_type self.variantTypeChanged.emit() @pyqtProperty(str, notify=machineTypeChanged) - def machineType(self) -> str: + def machineType(self): return self._machine_type - def setMachineType(self, machine_type: str) -> None: + def setMachineType(self, machine_type): self._machine_type = machine_type self.machineTypeChanged.emit() - def setNumUserSettings(self, num_user_settings: int) -> None: + def setNumUserSettings(self, num_user_settings): if self._num_user_settings != num_user_settings: self._num_user_settings = num_user_settings self.numVisibleSettingsChanged.emit() @pyqtProperty(int, notify=numUserSettingsChanged) - def numUserSettings(self) -> int: + def numUserSettings(self): return self._num_user_settings @pyqtProperty(bool, notify=objectsOnPlateChanged) - def hasObjectsOnPlate(self) -> bool: + def hasObjectsOnPlate(self): return self._objects_on_plate def setHasObjectsOnPlate(self, objects_on_plate): @@ -125,10 +116,10 @@ class WorkspaceDialog(QObject): self.objectsOnPlateChanged.emit() @pyqtProperty("QVariantList", notify = materialLabelsChanged) - def materialLabels(self) -> List[str]: + def materialLabels(self): return self._material_labels - def setMaterialLabels(self, material_labels: List[str]) -> None: + def setMaterialLabels(self, material_labels): if self._material_labels != material_labels: self._material_labels = material_labels self.materialLabelsChanged.emit() @@ -143,44 +134,36 @@ class WorkspaceDialog(QObject): self.extrudersChanged.emit() @pyqtProperty(str, notify = machineNameChanged) - def machineName(self) -> str: + def machineName(self): return self._machine_name - def setMachineName(self, machine_name: str) -> None: + def setMachineName(self, machine_name): if self._machine_name != machine_name: self._machine_name = machine_name self.machineNameChanged.emit() - @pyqtProperty(QObject, notify = updatableMachinesChanged) - def updatableMachinesModel(self) -> UpdatableMachinesModel: - return cast(UpdatableMachinesModel, self._updatable_machines_model) - - def setUpdatableMachines(self, updatable_machines: List[GlobalStack]) -> None: - self._updatable_machines_model.update(updatable_machines) - self.updatableMachinesChanged.emit() - @pyqtProperty(str, notify=qualityTypeChanged) - def qualityType(self) -> str: + def qualityType(self): return self._quality_type - def setQualityType(self, quality_type: str) -> None: + def setQualityType(self, quality_type): if self._quality_type != quality_type: self._quality_type = quality_type self.qualityTypeChanged.emit() @pyqtProperty(int, notify=numSettingsOverridenByQualityChangesChanged) - def numSettingsOverridenByQualityChanges(self) -> int: + def numSettingsOverridenByQualityChanges(self): return self._num_settings_overridden_by_quality_changes - def setNumSettingsOverriddenByQualityChanges(self, num_settings_overridden_by_quality_changes: int) -> None: + def setNumSettingsOverriddenByQualityChanges(self, num_settings_overridden_by_quality_changes): self._num_settings_overridden_by_quality_changes = num_settings_overridden_by_quality_changes self.numSettingsOverridenByQualityChangesChanged.emit() @pyqtProperty(str, notify=qualityNameChanged) - def qualityName(self) -> str: + def qualityName(self): return self._quality_name - def setQualityName(self, quality_name: str) -> None: + def setQualityName(self, quality_name): if self._quality_name != quality_name: self._quality_name = quality_name self.qualityNameChanged.emit() @@ -195,87 +178,80 @@ class WorkspaceDialog(QObject): self.intentNameChanged.emit() @pyqtProperty(str, notify=activeModeChanged) - def activeMode(self) -> str: + def activeMode(self): return self._active_mode - def setActiveMode(self, active_mode: int) -> None: + def setActiveMode(self, active_mode): if active_mode == 0: self._active_mode = i18n_catalog.i18nc("@title:tab", "Recommended") else: self._active_mode = i18n_catalog.i18nc("@title:tab", "Custom") self.activeModeChanged.emit() - @pyqtProperty(bool, notify = hasVisibleSettingsFieldChanged) - def hasVisibleSettingsField(self) -> bool: + @pyqtProperty(int, notify = hasVisibleSettingsFieldChanged) + def hasVisibleSettingsField(self): return self._has_visible_settings_field - def setHasVisibleSettingsField(self, has_visible_settings_field: bool) -> None: + def setHasVisibleSettingsField(self, has_visible_settings_field): self._has_visible_settings_field = has_visible_settings_field self.hasVisibleSettingsFieldChanged.emit() @pyqtProperty(int, constant = True) - def totalNumberOfSettings(self) -> int: + def totalNumberOfSettings(self): general_definition_containers = ContainerRegistry.getInstance().findDefinitionContainers(id = "fdmprinter") if not general_definition_containers: return 0 return len(general_definition_containers[0].getAllKeys()) @pyqtProperty(int, notify = numVisibleSettingsChanged) - def numVisibleSettings(self) -> int: + def numVisibleSettings(self): return self._num_visible_settings - def setNumVisibleSettings(self, num_visible_settings: int) -> None: + def setNumVisibleSettings(self, num_visible_settings): if self._num_visible_settings != num_visible_settings: self._num_visible_settings = num_visible_settings self.numVisibleSettingsChanged.emit() @pyqtProperty(bool, notify = machineConflictChanged) - def machineConflict(self) -> bool: + def machineConflict(self): return self._has_machine_conflict @pyqtProperty(bool, notify=qualityChangesConflictChanged) - def qualityChangesConflict(self) -> bool: + def qualityChangesConflict(self): return self._has_quality_changes_conflict @pyqtProperty(bool, notify=materialConflictChanged) - def materialConflict(self) -> bool: + def materialConflict(self): return self._has_material_conflict @pyqtSlot(str, str) - def setResolveStrategy(self, key: str, strategy: Optional[str]) -> None: + def setResolveStrategy(self, key, strategy): if key in self._result: self._result[key] = strategy - def getMachineToOverride(self) -> str: - return self._override_machine - - @pyqtSlot(str) - def setMachineToOverride(self, machine_name: str) -> None: - self._override_machine = machine_name - @pyqtSlot() - def closeBackend(self) -> None: + def closeBackend(self): """Close the backend: otherwise one could end up with "Slicing...""" Application.getInstance().getBackend().close() - def setMaterialConflict(self, material_conflict: bool) -> None: + def setMaterialConflict(self, material_conflict): if self._has_material_conflict != material_conflict: self._has_material_conflict = material_conflict self.materialConflictChanged.emit() - def setMachineConflict(self, machine_conflict: bool) -> None: + def setMachineConflict(self, machine_conflict): if self._has_machine_conflict != machine_conflict: self._has_machine_conflict = machine_conflict self.machineConflictChanged.emit() - def setQualityChangesConflict(self, quality_changes_conflict: bool) -> None: + def setQualityChangesConflict(self, quality_changes_conflict): if self._has_quality_changes_conflict != quality_changes_conflict: self._has_quality_changes_conflict = quality_changes_conflict self.qualityChangesConflictChanged.emit() - def getResult(self) -> Dict[str, Optional[str]]: - if "machine" in self._result and self.updatableMachinesModel.count <= 1: + def getResult(self): + if "machine" in self._result and not self._has_machine_conflict: self._result["machine"] = None if "quality_changes" in self._result and not self._has_quality_changes_conflict: self._result["quality_changes"] = None @@ -291,13 +267,11 @@ class WorkspaceDialog(QObject): return self._result - def _createViewFromQML(self) -> None: - three_mf_reader_path = PluginRegistry.getInstance().getPluginPath("3MFReader") - if three_mf_reader_path: - path = os.path.join(three_mf_reader_path, self._qml_url) - self._view = CuraApplication.getInstance().createQmlComponent(path, {"manager": self}) + def _createViewFromQML(self): + path = os.path.join(PluginRegistry.getInstance().getPluginPath("3MFReader"), self._qml_url) + self._view = Application.getInstance().createQmlComponent(path, {"manager": self}) - def show(self) -> None: + def show(self): # Emit signal so the right thread actually shows the view. if threading.current_thread() != threading.main_thread(): self._lock.acquire() @@ -310,7 +284,7 @@ class WorkspaceDialog(QObject): self.showDialogSignal.emit() @pyqtSlot() - def notifyClosed(self) -> None: + def notifyClosed(self): """Used to notify the dialog so the lock can be released.""" self._result = {} # The result should be cleared before hide, because after it is released the main thread lock @@ -320,7 +294,7 @@ class WorkspaceDialog(QObject): except: pass - def hide(self) -> None: + def hide(self): self._visible = False self._view.hide() try: @@ -329,7 +303,7 @@ class WorkspaceDialog(QObject): pass @pyqtSlot(bool) - def _onVisibilityChanged(self, visible: bool) -> None: + def _onVisibilityChanged(self, visible): if not visible: try: self._lock.release() @@ -337,17 +311,17 @@ class WorkspaceDialog(QObject): pass @pyqtSlot() - def onOkButtonClicked(self) -> None: + def onOkButtonClicked(self): self._view.hide() self.hide() @pyqtSlot() - def onCancelButtonClicked(self) -> None: + def onCancelButtonClicked(self): self._result = {} self._view.hide() self.hide() - def waitForClose(self) -> None: + def waitForClose(self): """Block thread until the dialog is closed.""" if self._visible: @@ -360,7 +334,7 @@ class WorkspaceDialog(QObject): time.sleep(1 / 50) QCoreApplication.processEvents() # Ensure that the GUI does not freeze. - def __show(self) -> None: + def __show(self): if self._view is None: self._createViewFromQML() if self._view: diff --git a/plugins/3MFReader/WorkspaceDialog.qml b/plugins/3MFReader/WorkspaceDialog.qml index 5f67f54c39..d0fd3d0846 100644 --- a/plugins/3MFReader/WorkspaceDialog.qml +++ b/plugins/3MFReader/WorkspaceDialog.qml @@ -2,7 +2,7 @@ // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.10 -import QtQuick.Controls 2.3 +import QtQuick.Controls 1.4 import QtQuick.Layouts 1.3 import QtQuick.Window 2.2 @@ -20,7 +20,6 @@ UM.Dialog property int comboboxHeight: 15 * screenScaleFactor property int spacerHeight: 10 * screenScaleFactor - property int doubleSpacerHeight: 20 * screenScaleFactor onClosing: manager.notifyClosed() onVisibleChanged: @@ -36,7 +35,7 @@ UM.Dialog Item { anchors.fill: parent - anchors.margins: 10 * screenScaleFactor + anchors.margins: 20 * screenScaleFactor UM.I18nCatalog { @@ -80,7 +79,7 @@ UM.Dialog } Item // Spacer { - height: doubleSpacerHeight + height: spacerHeight width: height } @@ -102,54 +101,36 @@ UM.Dialog } UM.TooltipArea { - id: machineResolveStrategyTooltip + id: machineResolveTooltip width: (parent.width / 3) | 0 height: visible ? comboboxHeight : 0 - visible: base.visible && machineResolveComboBox.model.count > 1 + visible: manager.machineConflict text: catalog.i18nc("@info:tooltip", "How should the conflict in the machine be resolved?") ComboBox { - id: machineResolveComboBox - model: manager.updatableMachinesModel - visible: machineResolveStrategyTooltip.visible - textRole: "displayName" - width: parent.width - onCurrentIndexChanged: + model: ListModel { - if (model.getItem(currentIndex).id == "new" - && model.getItem(currentIndex).type == "default_option") - { - manager.setResolveStrategy("machine", "new") - } - else + Component.onCompleted: { - manager.setResolveStrategy("machine", "override") - manager.setMachineToOverride(model.getItem(currentIndex).id) + append({"key": "override", "label": catalog.i18nc("@action:ComboBox option", "Update") + " " + manager.machineName}); + append({"key": "new", "label": catalog.i18nc("@action:ComboBox option", "Create new")}); } } - - onVisibleChanged: + Connections { - if (!visible) {return} - - currentIndex = 0 - // If the project printer exists in Cura, set it as the default dropdown menu option. - // No need to check object 0, which is the "Create new" option - for (var i = 1; i < model.count; i++) - { - if (model.getItem(i).name == manager.machineName) - { - currentIndex = i - break - } - } - // The project printer does not exist in Cura. If there is at least one printer of the same - // type, select the first one, else set the index to "Create new" - if (currentIndex == 0 && model.count > 1) + target: manager + onMachineNameChanged: { - currentIndex = 1 + machineResolveComboBox.model.get(0).label = catalog.i18nc("@action:ComboBox option", "Update") + " " + manager.machineName; } } + textRole: "label" + id: machineResolveComboBox + width: parent.width + onActivated: + { + manager.setResolveStrategy("machine", resolveStrategiesModel.get(index).key) + } } } } @@ -187,7 +168,7 @@ UM.Dialog Item // Spacer { - height: doubleSpacerHeight + height: spacerHeight width: height } Row @@ -290,7 +271,7 @@ UM.Dialog } Item // Spacer { - height: doubleSpacerHeight + height: spacerHeight width: height } Row @@ -352,7 +333,7 @@ UM.Dialog Item // Spacer { - height: doubleSpacerHeight + height: spacerHeight width: height } diff --git a/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py b/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py index 78e0e71626..42de199e8c 100644 --- a/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py +++ b/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py @@ -1101,7 +1101,7 @@ class ChangeAtZProcessor: # if it's not a linear move, we don't care if linear_command is None: - return line + return # get our linear move parameters feed_rate = linear_command.arguments["F"] @@ -1120,8 +1120,7 @@ class ChangeAtZProcessor: new_line = self.processRetractFeedRate(extrude_length, feed_rate, new_line, x_coord, y_coord, z_coord) # handle print speed adjustments - if extrude_length is not None: # Only for extrusion moves. - new_line = self.processPrintSpeed(feed_rate, new_line) + new_line = self.processPrintSpeed(feed_rate, new_line) # set our current extrude position self.lastE = extrude_length if extrude_length is not None else self.lastE diff --git a/plugins/SimulationView/SimulationPass.py b/plugins/SimulationView/SimulationPass.py index f594fefbe5..b720fc5758 100644 --- a/plugins/SimulationView/SimulationPass.py +++ b/plugins/SimulationView/SimulationPass.py @@ -32,7 +32,6 @@ class SimulationPass(RenderPass): self._current_shader = None # This shader will be the shadow or the normal depending if the user wants to see the paths or the layers self._tool_handle_shader = None self._nozzle_shader = None - self._disabled_shader = None self._old_current_layer = 0 self._old_current_path = 0 self._switching_layers = True # It tracks when the user is moving the layers' slider @@ -91,17 +90,9 @@ class SimulationPass(RenderPass): self._nozzle_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "color.shader")) self._nozzle_shader.setUniformValue("u_color", Color(*Application.getInstance().getTheme().getColor("layerview_nozzle").getRgb())) - if not self._disabled_shader: - self._disabled_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "striped.shader")) - self._disabled_shader.setUniformValue("u_diffuseColor1", Color(*Application.getInstance().getTheme().getColor("model_unslicable").getRgb())) - self._disabled_shader.setUniformValue("u_diffuseColor2", Color(*Application.getInstance().getTheme().getColor("model_unslicable_alt").getRgb())) - self._disabled_shader.setUniformValue("u_width", 50.0) - self._disabled_shader.setUniformValue("u_opacity", 0.6) - self.bind() tool_handle_batch = RenderBatch(self._tool_handle_shader, type = RenderBatch.RenderType.Overlay, backface_cull = True) - disabled_batch = RenderBatch(self._disabled_shader) head_position = None # Indicates the current position of the print head nozzle_node = None @@ -114,9 +105,6 @@ class SimulationPass(RenderPass): nozzle_node = node nozzle_node.setVisible(False) - elif getattr(node, "_outside_buildarea", False) and isinstance(node, SceneNode) and node.getMeshData() and node.isVisible(): - disabled_batch.addItem(node.getWorldTransformation(copy=False), node.getMeshData()) - elif isinstance(node, SceneNode) and (node.getMeshData() or node.callDecoration("isBlockSlicing")) and node.isVisible(): layer_data = node.callDecoration("getLayerData") if not layer_data: @@ -195,9 +183,6 @@ class SimulationPass(RenderPass): nozzle_batch.addItem(nozzle_node.getWorldTransformation(), mesh = nozzle_node.getMeshData()) nozzle_batch.render(self._scene.getActiveCamera()) - if len(disabled_batch.items) > 0: - disabled_batch.render(self._scene.getActiveCamera()) - # Render toolhandles on top of the layerview if len(tool_handle_batch.items) > 0: tool_handle_batch.render(self._scene.getActiveCamera()) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index 508476095d..d18cf4739e 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -1,6 +1,5 @@ -# Copyright (c) 2020 Ultimaker B.V. +# Copyright (c) 2019 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. - import os from typing import Dict, List, Optional, Set @@ -38,7 +37,7 @@ class CloudOutputDeviceManager: SYNC_SERVICE_NAME = "CloudOutputDeviceManager" # The translation catalog for this device. - i18n_catalog = i18nCatalog("cura") + I18N_CATALOG = i18nCatalog("cura") # Signal emitted when the list of discovered devices changed. discoveredDevicesChanged = Signal() @@ -222,7 +221,7 @@ class CloudOutputDeviceManager: ) message = Message( - title = self.i18n_catalog.i18ncp( + title = self.I18N_CATALOG.i18ncp( "info:status", "New printer detected from your Ultimaker account", "New printers detected from your Ultimaker account", @@ -235,7 +234,11 @@ class CloudOutputDeviceManager: message.show() for idx, device in enumerate(new_devices): - message_text = self.i18n_catalog.i18nc("info:status Filled in with printer name and printer model.", "Adding printer {name} ({model}) from your account").format(name = device.name, model = device.printerTypeName) + message_text = self.I18N_CATALOG.i18nc( + "info:status", "Adding printer {} ({}) from your account", + device.name, + device.printerTypeName + ) message.setText(message_text) if len(new_devices) > 1: message.setProgress((idx / len(new_devices)) * 100) @@ -252,12 +255,16 @@ class CloudOutputDeviceManager: if len(new_devices) > max_disp_devices: num_hidden = len(new_devices) - max_disp_devices device_name_list = ["<li>{} ({})</li>".format(device.name, device.printerTypeName) for device in new_devices[0:max_disp_devices]] - device_name_list.append("<li>" + self.i18n_catalog.i18ncp("info:{0} gets replaced by a number of printers", "... and {0} other", "... and {0} others", num_hidden) + "</li>") + device_name_list.append(self.I18N_CATALOG.i18nc("info:hidden list items", "<li>... and {} others</li>", num_hidden)) device_names = "".join(device_name_list) else: device_names = "".join(["<li>{} ({})</li>".format(device.name, device.printerTypeName) for device in new_devices]) - message_text = self.i18n_catalog.i18nc("info:status", "Printers added from Digital Factory:") + "<ul>" + device_names + "</ul>" + message_text = self.I18N_CATALOG.i18nc( + "info:status", + "Printers added from Digital Factory:<ul>{}</ul>", + device_names + ) message.setText(message_text) def _updateOutdatedMachine(self, outdated_machine: GlobalStack, new_cloud_output_device: CloudOutputDevice) -> None: @@ -311,7 +318,7 @@ class CloudOutputDeviceManager: # Generate message self._removed_printers_message = Message( - title = self.i18n_catalog.i18ncp( + title = self.I18N_CATALOG.i18ncp( "info:status", "A cloud connection is not available for a printer", "A cloud connection is not available for some printers", @@ -319,27 +326,26 @@ class CloudOutputDeviceManager: ) ) device_names = "".join(["<li>{} ({})</li>".format(self._um_cloud_printers[device].name, self._um_cloud_printers[device].definition.name) for device in self.reported_device_ids]) - message_text = self.i18n_catalog.i18ncp( + message_text = self.I18N_CATALOG.i18ncp( "info:status", "This printer is not linked to the Digital Factory:", "These printers are not linked to the Digital Factory:", len(self.reported_device_ids) ) - message_text += "<br/><ul>{}</ul><br/>".format(device_names) - digital_factory_string = self.i18n_catalog.i18nc("info:name", "Ultimaker Digital Factory") - - message_text += self.i18n_catalog.i18nc( + message_text += self.I18N_CATALOG.i18nc( "info:status", - "To establish a connection, please visit the {website_link}".format(website_link = "<a href='https://digitalfactory.ultimaker.com/'>{}</a>.".format(digital_factory_string)) + "<ul>{}</ul>To establish a connection, please visit the " + "<a href='https://mycloud.ultimaker.com/'>Ultimaker Digital Factory</a>.", + device_names ) self._removed_printers_message.setText(message_text) self._removed_printers_message.addAction("keep_printer_configurations_action", - name = self.i18n_catalog.i18nc("@action:button", "Keep printer configurations"), + name = self.I18N_CATALOG.i18nc("@action:button", "Keep printer configurations"), icon = "", description = "Keep cloud printers in Ultimaker Cura when not connected to your account.", button_align = Message.ActionButtonAlignment.ALIGN_RIGHT) self._removed_printers_message.addAction("remove_printers_action", - name = self.i18n_catalog.i18nc("@action:button", "Remove printers"), + name = self.I18N_CATALOG.i18nc("@action:button", "Remove printers"), icon = "", description = "Remove cloud printer(s) which aren't linked to your account.", button_style = Message.ActionButtonStyle.SECONDARY, @@ -416,12 +422,13 @@ class CloudOutputDeviceManager: machine.setMetaDataEntry(self.META_HOST_GUID, device.clusterData.host_guid) machine.setMetaDataEntry("group_name", device.name) machine.setMetaDataEntry("group_size", device.clusterSize) - digital_factory_string = self.i18n_catalog.i18nc("info:name", "Ultimaker Digital Factory") - digital_factory_link = "<a href='https://digitalfactory.ultimaker.com/'>{digital_factory_string}</a>".format(digital_factory_string = digital_factory_string) - removal_warning_string = self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "{printer_name} will be removed until the next account sync.").format(printer_name = device.name) \ - + "<br>" + self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "To remove {printer_name} permanently, visit {digital_factory_link}").format(printer_name = device.name, digital_factory_link = digital_factory_link) \ - + "<br><br>" + self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "Are you sure you want to remove {printer_name} temporarily?").format(printer_name = device.name) - machine.setMetaDataEntry("removal_warning", removal_warning_string) + machine.setMetaDataEntry("removal_warning", self.I18N_CATALOG.i18nc( + "@label ({} is printer name)", + "{} will be removed until the next account sync. <br> To remove {} permanently, " + "visit <a href='https://mycloud.ultimaker.com/'>Ultimaker Digital Factory</a>. " + "<br><br>Are you sure you want to remove {} temporarily?", + device.name, device.name, device.name + )) machine.addConfiguredConnectionType(device.connectionType.value) def _connectToOutputDevice(self, device: CloudOutputDevice, machine: GlobalStack) -> None: @@ -457,15 +464,10 @@ class CloudOutputDeviceManager: remove_printers_ids = {self._um_cloud_printers[i].getId() for i in self.reported_device_ids} all_ids = {m.getId() for m in CuraApplication.getInstance().getContainerRegistry().findContainerStacks(type = "machine")} - question_title = self.i18n_catalog.i18nc("@title:window", "Remove printers?") - question_content = self.i18n_catalog.i18ncp( - "@label", - "You are about to remove {num_printers} printer from Cura. This action cannot be undone.\nAre you sure you want to continue?", - "You are about to remove {num_printers} printers from Cura. This action cannot be undone.\nAre you sure you want to continue?", - len(remove_printers_ids) - ).format(num_printers = len(remove_printers_ids)) + question_title = self.I18N_CATALOG.i18nc("@title:window", "Remove printers?") + question_content = self.I18N_CATALOG.i18nc("@label", "You are about to remove {} printer(s) from Cura. This action cannot be undone. \nAre you sure you want to continue?".format(len(remove_printers_ids))) if remove_printers_ids == all_ids: - question_content = self.i18n_catalog.i18nc("@label", "You are about to remove all printers from Cura. This action cannot be undone.\nAre you sure you want to continue?") + question_content = self.I18N_CATALOG.i18nc("@label", "You are about to remove all printers from Cura. This action cannot be undone. \nAre you sure you want to continue?") result = QMessageBox.question(None, question_title, question_content) if result == QMessageBox.No: return |