mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-07 06:57:28 -06:00
Added material conflict option
This is still desabled by default due to some architecture issues (so this is temporarily left as it is) CURA-1263
This commit is contained in:
parent
b59be4c88b
commit
b175e6876f
3 changed files with 71 additions and 5 deletions
|
@ -65,6 +65,18 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
||||||
machine_conflict = True
|
machine_conflict = True
|
||||||
break
|
break
|
||||||
|
|
||||||
|
material_conflict = False
|
||||||
|
xml_material_profile = self._getXmlProfileClass()
|
||||||
|
if self._material_container_suffix is None:
|
||||||
|
self._material_container_suffix = ContainerRegistry.getMimeTypeForContainer(xml_material_profile).suffixes[0]
|
||||||
|
if xml_material_profile:
|
||||||
|
material_container_files = [name for name in cura_file_names if name.endswith(self._material_container_suffix)]
|
||||||
|
for material_container_file in material_container_files:
|
||||||
|
container_id = self._stripFileToId(material_container_file)
|
||||||
|
materials = self._container_registry.findInstanceContainers(id=container_id)
|
||||||
|
if materials and not materials[0].isReadOnly(): # Only non readonly materials can be in conflict
|
||||||
|
material_conflict = True
|
||||||
|
|
||||||
# Check if any quality_changes instance container is in conflict.
|
# Check if any quality_changes instance container is in conflict.
|
||||||
instance_container_files = [name for name in cura_file_names if name.endswith(self._instance_container_suffix)]
|
instance_container_files = [name for name in cura_file_names if name.endswith(self._instance_container_suffix)]
|
||||||
for instance_container_file in instance_container_files:
|
for instance_container_file in instance_container_files:
|
||||||
|
@ -83,10 +95,11 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
||||||
quality_changes_conflict = True
|
quality_changes_conflict = True
|
||||||
break
|
break
|
||||||
|
|
||||||
if machine_conflict or quality_changes_conflict:
|
if machine_conflict or quality_changes_conflict or material_conflict:
|
||||||
# There is a conflict; User should choose to either update the existing data, add everything as new data or abort
|
# There is a conflict; User should choose to either update the existing data, add everything as new data or abort
|
||||||
self._dialog.setMachineConflict(machine_conflict)
|
self._dialog.setMachineConflict(machine_conflict)
|
||||||
self._dialog.setQualityChangesConflict(quality_changes_conflict)
|
self._dialog.setQualityChangesConflict(quality_changes_conflict)
|
||||||
|
self._dialog.setMaterialConflict(material_conflict)
|
||||||
self._dialog.show()
|
self._dialog.show()
|
||||||
self._dialog.waitForClose()
|
self._dialog.waitForClose()
|
||||||
if self._dialog.getResult() == {}:
|
if self._dialog.getResult() == {}:
|
||||||
|
@ -147,6 +160,10 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
||||||
material_container = xml_material_profile(container_id)
|
material_container = xml_material_profile(container_id)
|
||||||
material_container.deserialize(archive.open(material_container_file).read().decode("utf-8"))
|
material_container.deserialize(archive.open(material_container_file).read().decode("utf-8"))
|
||||||
self._container_registry.addContainer(material_container)
|
self._container_registry.addContainer(material_container)
|
||||||
|
else:
|
||||||
|
if self._resolve_strategies["material"] == "override":
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
Logger.log("d", "Workspace loading is checking instance containers...")
|
Logger.log("d", "Workspace loading is checking instance containers...")
|
||||||
# Get quality_changes and user profiles saved in the workspace
|
# Get quality_changes and user profiles saved in the workspace
|
||||||
|
@ -194,6 +211,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
||||||
else:
|
else:
|
||||||
if self._resolve_strategies["quality_changes"] == "override":
|
if self._resolve_strategies["quality_changes"] == "override":
|
||||||
quality_changes[0].deserialize(archive.open(instance_container_file).read().decode("utf-8"))
|
quality_changes[0].deserialize(archive.open(instance_container_file).read().decode("utf-8"))
|
||||||
|
elif self._resolve_strategies["quality_changes"] is None:
|
||||||
|
# The ID already exists, but nothing in the values changed, so do nothing.
|
||||||
|
pass
|
||||||
quality_changes_instance_containers.append(instance_container)
|
quality_changes_instance_containers.append(instance_container)
|
||||||
else:
|
else:
|
||||||
continue
|
continue
|
||||||
|
|
|
@ -18,15 +18,19 @@ class WorkspaceDialog(QObject):
|
||||||
self._qml_url = "WorkspaceDialog.qml"
|
self._qml_url = "WorkspaceDialog.qml"
|
||||||
self._lock = threading.Lock()
|
self._lock = threading.Lock()
|
||||||
self._default_strategy = "override"
|
self._default_strategy = "override"
|
||||||
self._result = {"machine": self._default_strategy, "quality_changes": self._default_strategy}
|
self._result = {"machine": self._default_strategy,
|
||||||
|
"quality_changes": self._default_strategy,
|
||||||
|
"material": self._default_strategy}
|
||||||
self._visible = False
|
self._visible = False
|
||||||
self.showDialogSignal.connect(self.__show)
|
self.showDialogSignal.connect(self.__show)
|
||||||
|
|
||||||
self._has_quality_changes_conflict = False
|
self._has_quality_changes_conflict = False
|
||||||
self._has_machine_conflict = False
|
self._has_machine_conflict = False
|
||||||
|
self._has_material_conflict = False
|
||||||
|
|
||||||
machineConflictChanged = pyqtSignal()
|
machineConflictChanged = pyqtSignal()
|
||||||
qualityChangesConflictChanged = pyqtSignal()
|
qualityChangesConflictChanged = pyqtSignal()
|
||||||
|
materialConflictChanged = pyqtSignal()
|
||||||
|
|
||||||
@pyqtProperty(bool, notify = machineConflictChanged)
|
@pyqtProperty(bool, notify = machineConflictChanged)
|
||||||
def machineConflict(self):
|
def machineConflict(self):
|
||||||
|
@ -36,11 +40,19 @@ class WorkspaceDialog(QObject):
|
||||||
def qualityChangesConflict(self):
|
def qualityChangesConflict(self):
|
||||||
return self._has_quality_changes_conflict
|
return self._has_quality_changes_conflict
|
||||||
|
|
||||||
|
@pyqtProperty(bool, notify=materialConflictChanged)
|
||||||
|
def materialConflict(self):
|
||||||
|
return self._has_material_conflict
|
||||||
|
|
||||||
@pyqtSlot(str, str)
|
@pyqtSlot(str, str)
|
||||||
def setResolveStrategy(self, key, strategy):
|
def setResolveStrategy(self, key, strategy):
|
||||||
if key in self._result:
|
if key in self._result:
|
||||||
self._result[key] = strategy
|
self._result[key] = strategy
|
||||||
|
|
||||||
|
def setMaterialConflict(self, material_conflict):
|
||||||
|
self._has_material_conflict = material_conflict
|
||||||
|
self.materialConflictChanged.emit()
|
||||||
|
|
||||||
def setMachineConflict(self, machine_conflict):
|
def setMachineConflict(self, machine_conflict):
|
||||||
self._has_machine_conflict = machine_conflict
|
self._has_machine_conflict = machine_conflict
|
||||||
self.machineConflictChanged.emit()
|
self.machineConflictChanged.emit()
|
||||||
|
@ -54,6 +66,8 @@ class WorkspaceDialog(QObject):
|
||||||
self._result["machine"] = None
|
self._result["machine"] = None
|
||||||
if "quality_changes" in self._result and not self._has_quality_changes_conflict:
|
if "quality_changes" in self._result and not self._has_quality_changes_conflict:
|
||||||
self._result["quality_changes"] = None
|
self._result["quality_changes"] = None
|
||||||
|
if "material" in self._result and not self._has_material_conflict:
|
||||||
|
self._result["material"] = None
|
||||||
return self._result
|
return self._result
|
||||||
|
|
||||||
def _createViewFromQML(self):
|
def _createViewFromQML(self):
|
||||||
|
@ -63,14 +77,16 @@ class WorkspaceDialog(QObject):
|
||||||
self._context.setContextProperty("manager", self)
|
self._context.setContextProperty("manager", self)
|
||||||
self._view = self._component.create(self._context)
|
self._view = self._component.create(self._context)
|
||||||
if self._view is None:
|
if self._view is None:
|
||||||
Logger.log("e", "QQmlComponent status %s", self._component.status())
|
Logger.log("c", "QQmlComponent status %s", self._component.status())
|
||||||
Logger.log("e", "QQmlComponent errorString %s", self._component.errorString())
|
Logger.log("c", "QQmlComponent error string %s", self._component.errorString())
|
||||||
|
|
||||||
def show(self):
|
def show(self):
|
||||||
# Emit signal so the right thread actually shows the view.
|
# Emit signal so the right thread actually shows the view.
|
||||||
self._lock.acquire()
|
self._lock.acquire()
|
||||||
# Reset the result
|
# Reset the result
|
||||||
self._result = {"machine": self._default_strategy, "quality_changes": self._default_strategy}
|
self._result = {"machine": self._default_strategy,
|
||||||
|
"quality_changes": self._default_strategy,
|
||||||
|
"material": self._default_strategy}
|
||||||
self._visible = True
|
self._visible = True
|
||||||
self.showDialogSignal.emit()
|
self.showDialogSignal.emit()
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,7 @@ UM.Dialog
|
||||||
{
|
{
|
||||||
machineResolveComboBox.currentIndex = 0
|
machineResolveComboBox.currentIndex = 0
|
||||||
qualityChangesResolveComboBox.currentIndex = 0
|
qualityChangesResolveComboBox.currentIndex = 0
|
||||||
|
materialConflictComboBox.currentIndex = 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Item
|
Item
|
||||||
|
@ -121,6 +122,35 @@ UM.Dialog
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
UM.TooltipArea
|
||||||
|
{
|
||||||
|
id: materialResolveTooltip
|
||||||
|
width: parent.width
|
||||||
|
height: visible ? 25 : 0
|
||||||
|
text: catalog.i18nc("@info:tooltip", "How should the conflict in the material(s) be resolved?")
|
||||||
|
visible: false #manager.materialConflict
|
||||||
|
Row
|
||||||
|
{
|
||||||
|
width: parent.width
|
||||||
|
height: childrenRect.height
|
||||||
|
Label
|
||||||
|
{
|
||||||
|
text: catalog.i18nc("@action:label","Material")
|
||||||
|
width: 150
|
||||||
|
}
|
||||||
|
|
||||||
|
ComboBox
|
||||||
|
{
|
||||||
|
model: resolveStrategiesModel
|
||||||
|
textRole: "label"
|
||||||
|
id: materialResolveComboBox
|
||||||
|
onActivated:
|
||||||
|
{
|
||||||
|
manager.setResolveStrategy("material", resolveStrategiesModel.get(index).key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rightButtons: [
|
rightButtons: [
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue