We now display the global and extruder settings in the dialog

CURA-11561
This commit is contained in:
Erwan MATHIEU 2024-02-05 12:39:56 +01:00
parent 2d79479a26
commit 9afe5b46db
4 changed files with 96 additions and 30 deletions

View file

@ -143,12 +143,14 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
self._machine_info = None self._machine_info = None
self._load_profile = False self._load_profile = False
self._user_settings: Dict[str, Dict[str, Any]] = {}
def _clearState(self): def _clearState(self):
self._id_mapping = {} self._id_mapping = {}
self._old_new_materials = {} self._old_new_materials = {}
self._machine_info = None self._machine_info = None
self._load_profile = False self._load_profile = False
self._user_settings = {}
def getNewId(self, old_id: str): def getNewId(self, old_id: str):
"""Get a unique name based on the old_id. This is different from directly calling the registry in that it caches results. """Get a unique name based on the old_id. This is different from directly calling the registry in that it caches results.
@ -604,6 +606,36 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
package_metadata = self._parse_packages_metadata(archive) package_metadata = self._parse_packages_metadata(archive)
missing_package_metadata = self._filter_missing_package_metadata(package_metadata) missing_package_metadata = self._filter_missing_package_metadata(package_metadata)
# Load the user specifically exported settings
self._dialog.exportedSettingModel.clear()
if is_pcb:
try:
self._user_settings = json.loads(archive.open("Cura/user-settings.json").read().decode("utf-8"))
any_extruder_stack = ExtruderManager.getInstance().getExtruderStack(0)
for stack_name, settings in self._user_settings.items():
if stack_name == 'global':
self._dialog.exportedSettingModel.addSettingsFromStack(global_stack, i18n_catalog.i18nc("@label", "Global"), settings)
else:
extruder_match = re.fullmatch('extruder_([0-9]+)', stack_name)
if extruder_match is not None:
extruder_nr = int(extruder_match.group(1))
self._dialog.exportedSettingModel.addSettingsFromStack(any_extruder_stack,
i18n_catalog.i18nc("@label",
"Extruder {0}", extruder_nr + 1),
settings)
except KeyError as e:
# If there is no user settings file, it's not a PCB, so notify user of failure.
Logger.log("w", "File %s is not a valid PCB.", file_name)
message = Message(
i18n_catalog.i18nc("@info:error Don't translate the XML tags <filename> or <message>!",
"Project file <filename>{0}</filename> is corrupt: <message>{1}</message>.",
file_name, str(e)),
title=i18n_catalog.i18nc("@info:title", "Can't Open Project File"),
message_type=Message.MessageType.ERROR)
message.show()
return WorkspaceReader.PreReadResult.failed
# Show the dialog, informing the user what is about to happen. # Show the dialog, informing the user what is about to happen.
self._dialog.setMachineConflict(machine_conflict) self._dialog.setMachineConflict(machine_conflict)
self._dialog.setIsPrinterGroup(is_printer_group) self._dialog.setIsPrinterGroup(is_printer_group)
@ -628,6 +660,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
self._dialog.setAllowCreatemachine(not is_pcb) self._dialog.setAllowCreatemachine(not is_pcb)
self._dialog.show() self._dialog.show()
# Choosing the initially selected printer in MachineSelector # Choosing the initially selected printer in MachineSelector
is_networked_machine = False is_networked_machine = False
is_abstract_machine = False is_abstract_machine = False
@ -790,8 +823,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
for stack in extruder_stacks: for stack in extruder_stacks:
stack.setNextStack(global_stack, connect_signals = False) stack.setNextStack(global_stack, connect_signals = False)
user_settings = {}
if self._load_profile: if self._load_profile:
Logger.log("d", "Workspace loading is checking definitions...") Logger.log("d", "Workspace loading is checking definitions...")
# Get all the definition files & check if they exist. If not, add them. # Get all the definition files & check if they exist. If not, add them.
@ -864,23 +895,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
self._container_registry.addContainer(material_container) self._container_registry.addContainer(material_container)
Job.yieldThread() Job.yieldThread()
QCoreApplication.processEvents() # Ensure that the GUI does not freeze. QCoreApplication.processEvents() # Ensure that the GUI does not freeze.
else:
Logger.log("d", "Workspace loading user settings...")
try:
user_settings = json.loads(archive.open("Cura/user-settings.json").read().decode("utf-8"))
except KeyError as e:
# If there is no user settings file, it's not a PCB, so notify user of failure.
Logger.log("w", "File %s is not a valid PCB.", file_name)
message = Message(
i18n_catalog.i18nc("@info:error Don't translate the XML tags <filename> or <message>!",
"Project file <filename>{0}</filename> is corrupt: <message>{1}</message>.",
file_name, str(e)),
title=i18n_catalog.i18nc("@info:title", "Can't Open Project File"),
message_type=Message.MessageType.ERROR)
message.show()
self.setWorkspaceName("")
return [], {}
if global_stack: if global_stack:
if self._load_profile: if self._load_profile:
@ -905,7 +919,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
if not self._load_profile: if not self._load_profile:
# Now we have switched, apply the user settings # Now we have switched, apply the user settings
self._applyUserSettings(global_stack, extruder_stack_dict, user_settings) self._applyUserSettings(global_stack, extruder_stack_dict, self._user_settings)
# Load all the nodes / mesh data of the workspace # Load all the nodes / mesh data of the workspace
nodes = self._3mf_mesh_reader.read(file_name) nodes = self._3mf_mesh_reader.read(file_name)

View file

@ -22,6 +22,8 @@ import time
from cura.CuraApplication import CuraApplication from cura.CuraApplication import CuraApplication
from .SpecificSettingsModel import SpecificSettingsModel
i18n_catalog = i18nCatalog("cura") i18n_catalog = i18nCatalog("cura")
@ -75,6 +77,7 @@ class WorkspaceDialog(QObject):
self._has_visible_select_same_profile = False self._has_visible_select_same_profile = False
self._select_same_profile_checked = True self._select_same_profile_checked = True
self._allow_create_machine = True self._allow_create_machine = True
self._exported_settings_model = SpecificSettingsModel()
machineConflictChanged = pyqtSignal() machineConflictChanged = pyqtSignal()
qualityChangesConflictChanged = pyqtSignal() qualityChangesConflictChanged = pyqtSignal()
@ -340,6 +343,10 @@ class WorkspaceDialog(QObject):
def allowCreateMachine(self): def allowCreateMachine(self):
return self._allow_create_machine return self._allow_create_machine
@pyqtProperty(QObject, constant = True)
def exportedSettingModel(self):
return self._exported_settings_model
@pyqtSlot() @pyqtSlot()
def closeBackend(self) -> None: def closeBackend(self) -> None:
"""Close the backend: otherwise one could end up with "Slicing...""" """Close the backend: otherwise one could end up with "Slicing..."""

View file

@ -1,12 +1,12 @@
// Copyright (c) 2022 Ultimaker B.V. // Copyright (c) 2022 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher. // Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.10 import QtQuick 2.14
import QtQuick.Controls 2.3 import QtQuick.Controls 2.3
import QtQuick.Layouts 1.3 import QtQuick.Layouts 1.3
import QtQuick.Window 2.2 import QtQuick.Window 2.2
import UM 1.5 as UM import UM 1.6 as UM
import Cura 1.1 as Cura import Cura 1.1 as Cura
UM.Dialog UM.Dialog
@ -171,35 +171,68 @@ UM.Dialog
{ {
leftLabelText: catalog.i18nc("@action:label", "Name") leftLabelText: catalog.i18nc("@action:label", "Name")
rightLabelText: manager.qualityName rightLabelText: manager.qualityName
visible: manager.isCompatibleMachine
} }
WorkspaceRow WorkspaceRow
{ {
leftLabelText: catalog.i18nc("@action:label", "Intent") leftLabelText: catalog.i18nc("@action:label", "Intent")
rightLabelText: manager.intentName rightLabelText: manager.intentName
visible: manager.isCompatibleMachine
} }
WorkspaceRow WorkspaceRow
{ {
leftLabelText: catalog.i18nc("@action:label", "Not in profile") leftLabelText: catalog.i18nc("@action:label", "Not in profile")
rightLabelText: catalog.i18ncp("@action:label", "%1 override", "%1 overrides", manager.numUserSettings).arg(manager.numUserSettings) rightLabelText: catalog.i18ncp("@action:label", "%1 override", "%1 overrides", manager.numUserSettings).arg(manager.numUserSettings)
visible: manager.numUserSettings != 0 visible: manager.numUserSettings != 0 && manager.selectSameProfileChecked && manager.isCompatibleMachine
} }
WorkspaceRow WorkspaceRow
{ {
leftLabelText: catalog.i18nc("@action:label", "Derivative from") leftLabelText: catalog.i18nc("@action:label", "Derivative from")
rightLabelText: catalog.i18ncp("@action:label", "%1, %2 override", "%1, %2 overrides", manager.numSettingsOverridenByQualityChanges).arg(manager.qualityType).arg(manager.numSettingsOverridenByQualityChanges) rightLabelText: catalog.i18ncp("@action:label", "%1, %2 override", "%1, %2 overrides", manager.numSettingsOverridenByQualityChanges).arg(manager.qualityType).arg(manager.numSettingsOverridenByQualityChanges)
visible: manager.numSettingsOverridenByQualityChanges != 0 visible: manager.numSettingsOverridenByQualityChanges != 0 && manager.selectSameProfileChecked && manager.isCompatibleMachine
}
WorkspaceRow
{
leftLabelText: catalog.i18nc("@action:label", "Specific settings")
rightLabelText: catalog.i18ncp("@action:label", "%1 override", "%1 overrides", manager.exportedSettingModel.rowCount()).arg(manager.exportedSettingModel.rowCount())
buttonText: tableViewSpecificSettings.shouldBeVisible ? catalog.i18nc("@action:button", "Hide settings") : catalog.i18nc("@action:button", "Show settings")
visible: !manager.selectSameProfileChecked || !manager.isCompatibleMachine
onButtonClicked: tableViewSpecificSettings.shouldBeVisible = !tableViewSpecificSettings.shouldBeVisible
}
Cura.TableView
{
id: tableViewSpecificSettings
width: parent.width - parent.leftPadding - UM.Theme.getSize("default_margin").width
height: UM.Theme.getSize("card").height
visible: shouldBeVisible && (!manager.selectSameProfileChecked || !manager.isCompatibleMachine)
property bool shouldBeVisible: false
columnHeaders:
[
catalog.i18nc("@title:column", "Applies on"),
catalog.i18nc("@title:column", "Setting"),
catalog.i18nc("@title:column", "Value")
]
model: UM.TableModel
{
id: tableModel
headers: ["category", "label", "value"]
rows: manager.exportedSettingModel.items
}
} }
UM.CheckBox UM.CheckBox
{ {
text: catalog.i18nc("@action:checkbox", "Select the same profile") text: catalog.i18nc("@action:checkbox", "Select the same profile")
enabled: manager.isCompatibleMachine
onEnabledChanged: manager.selectSameProfileChecked = enabled onEnabledChanged: manager.selectSameProfileChecked = enabled
tooltip: enabled ? "" : catalog.i18nc("@tooltip", "You can use the same profile only if you have the same printer as the project was published with") tooltip: enabled ? "" : catalog.i18nc("@tooltip", "You can use the same profile only if you have the same printer as the project was published with")
visible: manager.hasVisibleSelectSameProfile visible: manager.hasVisibleSelectSameProfile && manager.isCompatibleMachine
checked: manager.selectSameProfileChecked checked: manager.selectSameProfileChecked
onCheckedChanged: manager.selectSameProfileChecked = checked onCheckedChanged: manager.selectSameProfileChecked = checked

View file

@ -9,26 +9,38 @@ import QtQuick.Window 2.2
import UM 1.5 as UM import UM 1.5 as UM
import Cura 1.1 as Cura import Cura 1.1 as Cura
Row RowLayout
{ {
id: root
property alias leftLabelText: leftLabel.text property alias leftLabelText: leftLabel.text
property alias rightLabelText: rightLabel.text property alias rightLabelText: rightLabel.text
property alias buttonText: button.text
signal buttonClicked
width: parent.width width: parent.width
height: visible ? childrenRect.height : 0
UM.Label UM.Label
{ {
id: leftLabel id: leftLabel
text: catalog.i18nc("@action:label", "Type") text: catalog.i18nc("@action:label", "Type")
width: Math.round(parent.width / 4) Layout.preferredWidth: Math.round(parent.width / 4)
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
} }
UM.Label UM.Label
{ {
id: rightLabel id: rightLabel
text: manager.machineType text: manager.machineType
width: Math.round(parent.width / 3)
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
} }
Cura.TertiaryButton
{
id: button
visible: !text.isEmpty
Layout.maximumHeight: leftLabel.implicitHeight
Layout.fillWidth: true
onClicked: root.buttonClicked()
}
} }