123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- from PyQt5.QtCore import pyqtSignal, pyqtProperty, pyqtSlot, QObject, QVariant
- import UM.Application
- import UM.Logger
- import UM.Settings.ContainerRegistry
- class ExtruderManager(QObject):
-
- extrudersChanged = pyqtSignal(QVariant)
-
- activeExtruderChanged = pyqtSignal()
-
- def __init__(self, parent = None):
- super().__init__(parent)
- self._extruder_trains = { }
- self._active_extruder_index = 0
- UM.Application.getInstance().globalContainerStackChanged.connect(self._addCurrentMachineExtruders)
-
-
-
-
-
-
- @pyqtProperty(str, notify = activeExtruderChanged)
- def activeExtruderStackId(self):
- if not UM.Application.getInstance().getGlobalContainerStack():
- return None
- try:
- return self._extruder_trains[UM.Application.getInstance().getGlobalContainerStack().getBottom().getId()][str(self._active_extruder_index)]
- except KeyError:
- return None
-
-
-
- __instance = None
-
-
-
-
-
-
-
- @classmethod
- def getInstance(cls):
- if not cls.__instance:
- cls.__instance = ExtruderManager()
- return cls.__instance
- @pyqtSlot(int)
- def setActiveExtruderIndex(self, index):
- self._active_extruder_index = index
- self.activeExtruderChanged.emit()
-
-
-
-
- def addMachineExtruders(self, machine_definition):
- machine_id = machine_definition.getId()
- if machine_id not in self._extruder_trains:
- self._extruder_trains[machine_id] = { }
- container_registry = UM.Settings.ContainerRegistry.getInstance()
- if not container_registry:
- return
-
- for extruder_definition in container_registry.findDefinitionContainers(machine = machine_definition.getId()):
- position = extruder_definition.getMetaDataEntry("position", None)
- if not position:
- UM.Logger.log("w", "Extruder definition %s specifies no position metadata entry.", extruder_definition.getId())
- if not container_registry.findContainerStacks(machine = machine_id, position = position):
- self.createExtruderTrain(extruder_definition, machine_definition, position)
-
- extruder_trains = container_registry.findContainerStacks(type = "extruder_train", machine = machine_definition.getId())
- for extruder_train in extruder_trains:
- self._extruder_trains[machine_id][extruder_train.getMetaDataEntry("position")] = extruder_train.getId()
- if extruder_trains:
- self.extrudersChanged.emit(machine_definition)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- def createExtruderTrain(self, extruder_definition, machine_definition, position):
-
- container_registry = UM.Settings.ContainerRegistry.getInstance()
- machine_id = machine_definition.getId()
-
- extruder_stack_id = container_registry.uniqueName(extruder_definition.getId())
- container_stack = UM.Settings.ContainerStack(extruder_stack_id)
- container_stack.setName(extruder_definition.getName())
- container_stack.addMetaDataEntry("type", "extruder_train")
- container_stack.addMetaDataEntry("machine", machine_definition.getId())
- container_stack.addMetaDataEntry("position", position)
- container_stack.addContainer(extruder_definition)
-
- nozzle = container_registry.getEmptyInstanceContainer()
- if machine_definition.getMetaDataEntry("has_nozzles", default = "False") == "True":
-
- nozzles = container_registry.findInstanceContainers(machine = machine_id, type = "nozzle")
- if len(nozzles) >= 1:
- nozzle = nozzles[0]
- preferred_nozzle_id = machine_definition.getMetaDataEntry("preferred_nozzle")
- if preferred_nozzle_id:
- preferred_nozzles = container_registry.findInstanceContainers(id = preferred_nozzle_id, type = "nozzle")
- if len(preferred_nozzles) >= 1:
- nozzle = preferred_nozzles[0]
- else:
- UM.Logger.log("w", "The preferred nozzle \"%s\" of machine %s doesn't exist or is not a nozzle profile.", preferred_nozzle_id, machine_id)
-
- container_stack.addContainer(nozzle)
-
- material = container_registry.getEmptyInstanceContainer()
- if machine_definition.getMetaDataEntry("has_materials", default = "False") == "True":
-
- if machine_definition.getMetaDataEntry("has_nozzle_materials", default = "False") == "True":
- materials = container_registry.findInstanceContainers(type = "material", machine = machine_id, nozzle = nozzle.getId())
- else:
- materials = container_registry.findInstanceContainers(type = "material", machine = machine_id)
- if len(materials) >= 1:
- material = materials[0]
- preferred_material_id = machine_definition.getMetaDataEntry("preferred_material")
- if preferred_material_id:
- preferred_materials = container_registry.findInstanceContainers(id = preferred_material_id, type = "material")
- if len(preferred_materials) >= 1:
- material = preferred_materials[0]
- else:
- UM.Logger.log("w", "The preferred material \"%s\" of machine %s doesn't exist or is not a material profile.", preferred_material_id, machine_id)
-
- container_stack.addContainer(material)
-
- quality = container_registry.getEmptyInstanceContainer()
- if machine_definition.getMetaDataEntry("has_machine_quality"):
-
- qualities = container_registry.findInstanceContainers(type = "quality")
- if len(qualities) >= 1:
- quality = qualities[0]
- preferred_quality_id = machine_definition.getMetaDataEntry("preferred_quality")
- if preferred_quality_id:
- preferred_quality = container_registry.findInstanceContainers(id = preferred_quality_id.lower(), type = "quality")
- if len(preferred_quality) >= 1:
- quality = preferred_quality[0]
- else:
- UM.Logger.log("w", "The preferred quality \"%s\" of machine %s doesn't exist or is not a quality profile.", preferred_quality_id, machine_id)
-
- container_stack.addContainer(quality)
- user_profile = container_registry.findInstanceContainers(id = extruder_stack_id + "_current_settings")
- if user_profile:
- user_profile = user_profile[0]
- else:
- user_profile = UM.Settings.InstanceContainer(extruder_stack_id + "_current_settings")
- user_profile.addMetaDataEntry("type", "user")
- user_profile.setDefinition(machine_definition)
- container_registry.addContainer(user_profile)
- container_stack.addContainer(user_profile)
- container_stack.setNextStack(UM.Application.getInstance().getGlobalContainerStack())
- container_registry.addContainer(container_stack)
-
- def getMachineExtruders(self, machine_definition_id):
- container_registry = UM.Settings.ContainerRegistry.getInstance()
- if not machine_definition_id in self._extruder_trains:
- UM.Logger.log("w", "Tried to get the extruder trains for machine %s, which doesn't exist.", machine_definition_id)
- return
- for _,extruder_train_id in self._extruder_trains[machine_definition_id].items():
- extruder_train = container_registry.findContainerStacks(id = extruder_train_id)
- if extruder_train:
- yield extruder_train[0]
- else:
- UM.Logger.log("w", "Machine %s refers to an extruder train with ID %s, which doesn't exist.", machine_definition_id, extruder_train_id)
-
- def _addCurrentMachineExtruders(self):
- global_stack = UM.Application.getInstance().getGlobalContainerStack()
- if global_stack and global_stack.getBottom():
- self.addMachineExtruders(global_stack.getBottom())
|