diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py
index 7961e8db31..b159183241 100644
--- a/cura/Settings/CuraContainerRegistry.py
+++ b/cura/Settings/CuraContainerRegistry.py
@@ -4,6 +4,9 @@
import os
import os.path
import re
+
+from typing import Optional
+
from PyQt5.QtWidgets import QMessageBox
from UM.Decorators import override
@@ -199,8 +202,12 @@ class CuraContainerRegistry(ContainerRegistry):
new_name = self.uniqueName(name_seed)
if type(profile_or_list) is not list:
profile = profile_or_list
- self._configureProfile(profile, name_seed, new_name)
- return { "status": "ok", "message": catalog.i18nc("@info:status", "Successfully imported profile {0}", profile.getName()) }
+
+ result = self._configureProfile(profile, name_seed, new_name)
+ if result is not None:
+ return {"status": "error", "message": catalog.i18nc("@info:status", "Failed to import profile from {0}: {1}", file_name, result)}
+
+ return {"status": "ok", "message": catalog.i18nc("@info:status", "Successfully imported profile {0}", profile.getName())}
else:
profile_index = -1
global_profile = None
@@ -230,7 +237,9 @@ class CuraContainerRegistry(ContainerRegistry):
global_profile = profile
profile_id = (global_container_stack.getBottom().getId() + "_" + name_seed).lower().replace(" ", "_")
- self._configureProfile(profile, profile_id, new_name)
+ result = self._configureProfile(profile, profile_id, new_name)
+ if result is not None:
+ return {"status": "error", "message": catalog.i18nc("@info:status", "Failed to import profile from {0}: {1}", file_name, result)}
profile_index += 1
@@ -244,7 +253,14 @@ class CuraContainerRegistry(ContainerRegistry):
super().load()
self._fixupExtruders()
- def _configureProfile(self, profile, id_seed, new_name):
+ ## Update an imported profile to match the current machine configuration.
+ #
+ # \param profile The profile to configure.
+ # \param id_seed The base ID for the profile. May be changed so it does not conflict with existing containers.
+ # \param new_name The new name for the profile.
+ #
+ # \return None if configuring was successful or an error message if an error occurred.
+ def _configureProfile(self, profile: InstanceContainer, id_seed: str, new_name: str) -> Optional[str]:
profile.setReadOnly(False)
profile.setDirty(True) # Ensure the profiles are correctly saved
@@ -257,15 +273,34 @@ class CuraContainerRegistry(ContainerRegistry):
else:
profile.addMetaDataEntry("type", "quality_changes")
+ quality_type = profile.getMetaDataEntry("quality_type")
+ if not quality_type:
+ return catalog.i18nc("@info:status", "Profile is missing a quality type.")
+
+ quality_type_criteria = {"quality_type": quality_type}
if self._machineHasOwnQualities():
profile.setDefinition(self._activeQualityDefinition())
if self._machineHasOwnMaterials():
profile.addMetaDataEntry("material", self._activeMaterialId())
+ quality_type_criteria["material"] = self._activeMaterialId()
+
+ quality_type_criteria["definition"] = profile.getDefinition().getId()
+
else:
profile.setDefinition(ContainerRegistry.getInstance().findDefinitionContainers(id="fdmprinter")[0])
+ quality_type_criteria["definition"] = "fdmprinter"
+
+ # Check to make sure the imported profile actually makes sense in context of the current configuration.
+ # This prevents issues where importing a "draft" profile for a machine without "draft" qualities would report as
+ # successfully imported but then fail to show up.
+ qualities = self.findInstanceContainers(**quality_type_criteria)
+ if not qualities:
+ return catalog.i18nc("@info:status", "Could not find a quality type {0} for the current configuration.", quality_type)
ContainerRegistry.getInstance().addContainer(profile)
+ return None
+
## Gets a list of profile writer plugins
# \return List of tuples of (plugin_id, meta_data).
def _getIOPlugins(self, io_type):