Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Ultimaker/Cura.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGhostkeeper <rubend@tutanota.com>2020-08-20 17:34:58 +0300
committerGhostkeeper <rubend@tutanota.com>2020-08-20 17:34:58 +0300
commita757dc7fa0b1b19efa1024132e2d6c94d2788626 (patch)
treec18db21ae7fa7759951c5f8a58e2cbe51460f1d7 /plugins
parent7f70acbaf1f6a5c6b1f77d9eed47ceb592256983 (diff)
parentaf05aa61b79071e1a0ba77bd5340bb19cf0e16f4 (diff)
Merge branch '4.7'
Diffstat (limited to 'plugins')
-rwxr-xr-xplugins/3MFReader/ThreeMFWorkspaceReader.py30
-rw-r--r--plugins/3MFReader/UpdatableMachinesModel.py43
-rw-r--r--plugins/3MFReader/WorkspaceDialog.py120
-rw-r--r--plugins/3MFReader/WorkspaceDialog.qml65
-rw-r--r--plugins/PostProcessingPlugin/scripts/ChangeAtZ.py5
-rw-r--r--plugins/SimulationView/SimulationPass.py15
-rw-r--r--plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py62
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