mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-12-05 16:51:12 -07:00
Merge remote-tracking branch 'origin/feature_intent_container_tree' into feature_intent_upgrade
This commit is contained in:
commit
823f7e5921
14 changed files with 159 additions and 206 deletions
|
|
@ -11,7 +11,9 @@ from UM.Settings.ContainerRegistry import ContainerRegistry
|
|||
from UM.Settings.DefinitionContainer import DefinitionContainer
|
||||
from UM.Util import parseBool
|
||||
|
||||
import cura.CuraApplication # Imported like this to prevent circular dependencies.
|
||||
from cura.MachineAction import MachineAction
|
||||
from cura.Machines.ContainerTree import ContainerTree # To re-build the machine node when hasMaterials changes.
|
||||
from cura.Settings.CuraStackBuilder import CuraStackBuilder
|
||||
from cura.Settings.cura_empty_instance_containers import isEmptyContainer
|
||||
|
||||
|
|
@ -41,6 +43,9 @@ class MachineSettingsAction(MachineAction):
|
|||
self._backend = self._application.getBackend()
|
||||
self.onFinished.connect(self._onFinished)
|
||||
|
||||
# If the g-code flavour changes between UltiGCode and another flavour, we need to update the container tree.
|
||||
self._application.globalContainerStackChanged.connect(self._updateHasMaterialsInContainerTree)
|
||||
|
||||
# Which container index in a stack to store machine setting changes.
|
||||
@pyqtProperty(int, constant = True)
|
||||
def storeContainerIndex(self) -> int:
|
||||
|
|
@ -51,6 +56,16 @@ class MachineSettingsAction(MachineAction):
|
|||
if isinstance(container, DefinitionContainer) and container.getMetaDataEntry("type") == "machine":
|
||||
self._application.getMachineActionManager().addSupportedAction(container.getId(), self.getKey())
|
||||
|
||||
## Triggered when the global container stack changes or when the g-code
|
||||
# flavour setting is changed.
|
||||
def _updateHasMaterialsInContainerTree(self) -> None:
|
||||
global_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack()
|
||||
machine_node = ContainerTree.getInstance().machines[global_stack.definition.getId()]
|
||||
|
||||
if machine_node.has_materials != parseBool(global_stack.getMetaDataEntry("has_materials")): # May have changed due to the g-code flavour.
|
||||
machine_node.has_materials = parseBool(global_stack.getMetaDataEntry("has_materials"))
|
||||
machine_node._loadAll()
|
||||
|
||||
def _reset(self):
|
||||
global_stack = self._application.getMachineManager().activeMachine
|
||||
if not global_stack:
|
||||
|
|
@ -98,11 +113,8 @@ class MachineSettingsAction(MachineAction):
|
|||
return
|
||||
|
||||
machine_manager = self._application.getMachineManager()
|
||||
material_manager = self._application.getMaterialManager()
|
||||
extruder_positions = list(global_stack.extruders.keys())
|
||||
has_materials = global_stack.getProperty("machine_gcode_flavor", "value") != "UltiGCode"
|
||||
|
||||
material_node = None
|
||||
if has_materials:
|
||||
global_stack.setMetaDataEntry("has_materials", True)
|
||||
else:
|
||||
|
|
@ -111,11 +123,15 @@ class MachineSettingsAction(MachineAction):
|
|||
if "has_materials" in global_stack.getMetaData():
|
||||
global_stack.removeMetaDataEntry("has_materials")
|
||||
|
||||
self._updateHasMaterialsInContainerTree()
|
||||
|
||||
# set materials
|
||||
for position in extruder_positions:
|
||||
if has_materials:
|
||||
material_node = material_manager.getDefaultMaterial(global_stack, position, None)
|
||||
machine_manager.setMaterial(position, material_node)
|
||||
machine_node = ContainerTree.getInstance().machines[global_stack.definition.getId()]
|
||||
for position, extruder in enumerate(global_stack.extruderList):
|
||||
#Find out what material we need to default to.
|
||||
approximate_diameter = round(extruder.getProperty("material_diameter", "value"))
|
||||
material_node = machine_node.variants[extruder.variant.getName()].preferredMaterial(approximate_diameter)
|
||||
machine_manager.setMaterial(str(position), material_node)
|
||||
|
||||
self._application.globalContainerStackChanged.emit()
|
||||
|
||||
|
|
|
|||
|
|
@ -69,9 +69,9 @@ class SendMaterialJob(Job):
|
|||
def _sendMaterials(self, materials_to_send: Set[str]) -> None:
|
||||
container_registry = CuraApplication.getInstance().getContainerRegistry()
|
||||
all_materials = container_registry.findInstanceContainersMetadata(type = "material")
|
||||
all_root_materials = {material["base_file"] for material in all_materials if "base_file" in material} # Filters out uniques by making it a set. Don't include files without base file (i.e. empty material).
|
||||
all_base_files = {material["base_file"] for material in all_materials if "base_file" in material} # Filters out uniques by making it a set. Don't include files without base file (i.e. empty material).
|
||||
|
||||
for root_material_id in all_root_materials:
|
||||
for root_material_id in all_base_files:
|
||||
if root_material_id not in materials_to_send:
|
||||
# If the material does not have to be sent we skip it.
|
||||
continue
|
||||
|
|
@ -129,10 +129,10 @@ class SendMaterialJob(Job):
|
|||
def _getLocalMaterials() -> Dict[str, LocalMaterial]:
|
||||
result = {} # type: Dict[str, LocalMaterial]
|
||||
all_materials = CuraApplication.getInstance().getContainerRegistry().findInstanceContainersMetadata(type = "material")
|
||||
all_root_materials = [material for material in all_materials if material["id"] == material.get("base_file")] # Don't send materials without base_file: The empty material doesn't need to be sent.
|
||||
all_base_files = [material for material in all_materials if material["id"] == material.get("base_file")] # Don't send materials without base_file: The empty material doesn't need to be sent.
|
||||
|
||||
# Find the latest version of all material containers in the registry.
|
||||
for material_metadata in all_root_materials:
|
||||
for material_metadata in all_base_files:
|
||||
try:
|
||||
# material version must be an int
|
||||
material_metadata["version"] = int(material_metadata["version"])
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue