UI now displays an option to select the same profile

CURA-11561
This commit is contained in:
Erwan MATHIEU 2024-02-02 12:17:34 +01:00
parent c6e5620295
commit 733ef4d3d8
8 changed files with 64 additions and 7 deletions

View file

@ -46,8 +46,15 @@ class ThreeMFReader(MeshReader):
suffixes=["3mf"] suffixes=["3mf"]
) )
) )
MimeTypeDatabase.addMimeType(
MimeType(
name="application/x-pcb",
comment="PCB",
suffixes=["pcb"]
)
)
self._supported_extensions = [".3mf"] self._supported_extensions = [".3mf", ".pcb"]
self._root = None self._root = None
self._base_name = "" self._base_name = ""
self._unit = None self._unit = None

View file

@ -112,7 +112,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
def __init__(self) -> None: def __init__(self) -> None:
super().__init__() super().__init__()
self._supported_extensions = [".3mf"] self._supported_extensions = [".3mf", ".pcb"]
self._dialog = WorkspaceDialog() self._dialog = WorkspaceDialog()
self._3mf_mesh_reader = None self._3mf_mesh_reader = None
self._container_registry = ContainerRegistry.getInstance() self._container_registry = ContainerRegistry.getInstance()
@ -228,11 +228,14 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
self._resolve_strategies = {k: None for k in resolve_strategy_keys} self._resolve_strategies = {k: None for k in resolve_strategy_keys}
containers_found_dict = {k: False for k in resolve_strategy_keys} containers_found_dict = {k: False for k in resolve_strategy_keys}
# Check whether the file is a PCB
is_pcb = file_name.endswith('.pcb')
# #
# Read definition containers # Read definition containers
# #
machine_definition_id = None machine_definition_id = None
updatable_machines = [] updatable_machines = None if is_pcb else []
machine_definition_container_count = 0 machine_definition_container_count = 0
extruder_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)] definition_container_files = [name for name in cura_file_names if name.endswith(self._definition_container_suffix)]
@ -250,7 +253,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
if definition_container_type == "machine": if definition_container_type == "machine":
machine_definition_id = container_id machine_definition_id = container_id
machine_definition_containers = self._container_registry.findDefinitionContainers(id = machine_definition_id) machine_definition_containers = self._container_registry.findDefinitionContainers(id = machine_definition_id)
if machine_definition_containers: if machine_definition_containers and updatable_machines is not None:
updatable_machines = [machine for machine in self._container_registry.findContainerStacks(type = "machine") if machine.definition == machine_definition_containers[0]] updatable_machines = [machine for machine in self._container_registry.findContainerStacks(type = "machine") if machine.definition == machine_definition_containers[0]]
machine_type = definition_container["name"] machine_type = definition_container["name"]
variant_type_name = definition_container.get("variants_name", variant_type_name) variant_type_name = definition_container.get("variants_name", variant_type_name)
@ -617,6 +620,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
self._dialog.setVariantType(variant_type_name) self._dialog.setVariantType(variant_type_name)
self._dialog.setHasObjectsOnPlate(Application.getInstance().platformActivity) self._dialog.setHasObjectsOnPlate(Application.getInstance().platformActivity)
self._dialog.setMissingPackagesMetadata(missing_package_metadata) self._dialog.setMissingPackagesMetadata(missing_package_metadata)
self._dialog.setHasVisibleSelectSameProfileChanged(is_pcb)
self._dialog.show() self._dialog.show()
# Choosing the initially selected printer in MachineSelector # Choosing the initially selected printer in MachineSelector

View file

@ -71,6 +71,8 @@ class WorkspaceDialog(QObject):
self._install_missing_package_dialog: Optional[QObject] = None self._install_missing_package_dialog: Optional[QObject] = None
self._is_abstract_machine = False self._is_abstract_machine = False
self._is_networked_machine = False self._is_networked_machine = False
self._is_compatible_machine = False
self._has_visible_select_same_profile = False
machineConflictChanged = pyqtSignal() machineConflictChanged = pyqtSignal()
qualityChangesConflictChanged = pyqtSignal() qualityChangesConflictChanged = pyqtSignal()
@ -94,6 +96,8 @@ class WorkspaceDialog(QObject):
extrudersChanged = pyqtSignal() extrudersChanged = pyqtSignal()
isPrinterGroupChanged = pyqtSignal() isPrinterGroupChanged = pyqtSignal()
missingPackagesChanged = pyqtSignal() missingPackagesChanged = pyqtSignal()
isCompatibleMachineChanged = pyqtSignal()
hasVisibleSelectSameProfileChanged = pyqtSignal()
@pyqtProperty(bool, notify = isPrinterGroupChanged) @pyqtProperty(bool, notify = isPrinterGroupChanged)
def isPrinterGroup(self) -> bool: def isPrinterGroup(self) -> bool:
@ -291,8 +295,30 @@ class WorkspaceDialog(QObject):
@pyqtSlot(str) @pyqtSlot(str)
def setMachineToOverride(self, machine_name: str) -> None: def setMachineToOverride(self, machine_name: str) -> None:
registry = ContainerRegistry.getInstance()
containers_expected = registry.findDefinitionContainers(name = self._machine_type)
containers_selected = registry.findContainerStacks(id = machine_name)
if len(containers_expected) == 1 and len(containers_selected) == 1:
new_compatible_machine = (containers_expected[0] == containers_selected[0].definition)
if new_compatible_machine != self._is_compatible_machine:
self._is_compatible_machine = new_compatible_machine
self.isCompatibleMachineChanged.emit()
self._override_machine = machine_name self._override_machine = machine_name
@pyqtProperty(bool, notify = isCompatibleMachineChanged)
def isCompatibleMachine(self) -> bool:
return self._is_compatible_machine
def setHasVisibleSelectSameProfileChanged(self, has_visible_select_same_profile):
if has_visible_select_same_profile != self._has_visible_select_same_profile:
self._has_visible_select_same_profile = has_visible_select_same_profile
self.hasVisibleSelectSameProfileChanged.emit()
@pyqtProperty(bool, notify = hasVisibleSelectSameProfileChanged)
def hasVisibleSelectSameProfile(self):
return self._has_visible_select_same_profile
@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

@ -186,6 +186,15 @@ UM.Dialog
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
} }
UM.CheckBox
{
text: catalog.i18nc("@action:checkbox", "Select the same profile")
enabled: manager.isCompatibleMachine
onEnabledChanged: checked = 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")
visible: manager.hasVisibleSelectSameProfile
}
} }
comboboxVisible: manager.qualityChangesConflict comboboxVisible: manager.qualityChangesConflict

View file

@ -25,12 +25,20 @@ def getMetaData() -> Dict:
{ {
"extension": "3mf", "extension": "3mf",
"description": catalog.i18nc("@item:inlistbox", "3MF File") "description": catalog.i18nc("@item:inlistbox", "3MF File")
},
{
"extension": "pcb",
"description": catalog.i18nc("@item:inlistbox", "PCB File")
} }
] ]
metaData["workspace_reader"] = [ metaData["workspace_reader"] = [
{ {
"extension": workspace_extension, "extension": workspace_extension,
"description": catalog.i18nc("@item:inlistbox", "3MF File") "description": catalog.i18nc("@item:inlistbox", "3MF File")
},
{
"extension": "pcb",
"description": catalog.i18nc("@item:inlistbox", "PCB File")
} }
] ]

View file

@ -2,7 +2,7 @@
"name": "3MF Reader", "name": "3MF Reader",
"author": "Ultimaker B.V.", "author": "Ultimaker B.V.",
"version": "1.0.1", "version": "1.0.1",
"description": "Provides support for reading 3MF files.", "description": "Provides support for reading 3MF and PCB files.",
"api": 8, "api": 8,
"i18n-catalog": "cura" "i18n-catalog": "cura"
} }

View file

@ -2,7 +2,7 @@
"name": "3MF Writer", "name": "3MF Writer",
"author": "Ultimaker B.V.", "author": "Ultimaker B.V.",
"version": "1.0.1", "version": "1.0.1",
"description": "Provides support for writing 3MF files.", "description": "Provides support for writing 3MF and PCB files.",
"api": 8, "api": 8,
"i18n-catalog": "cura" "i18n-catalog": "cura"
} }

View file

@ -77,7 +77,10 @@ Cura.Menu
enabled: UM.WorkspaceFileHandler.enabled enabled: UM.WorkspaceFileHandler.enabled
onTriggered: onTriggered:
{ {
var args = { "filter_by_machine": false, "file_type": "workspace", "preferred_mimetypes": "application/x-pcb" }; var args = { "filter_by_machine": false,
"file_type": "workspace",
"preferred_mimetypes": "application/x-pcb",
"limit_mimetypes": "application/x-pcb"};
UM.OutputDeviceManager.requestWriteToDevice("local_file", PrintInformation.jobName, args) UM.OutputDeviceManager.requestWriteToDevice("local_file", PrintInformation.jobName, args)
} }
} }