def deserialize(self, serialized: str, file_name: Optional[str] = None) -> str: # update the serialized data first serialized = super().deserialize(serialized, file_name) new_containers = self._containers.copy() while len(new_containers) < len(_ContainerIndexes.IndexTypeMap): new_containers.append(self._empty_instance_container) # Validate and ensure the list of containers matches with what we expect for index, type_name in _ContainerIndexes.IndexTypeMap.items(): container = None try: container = new_containers[index] except IndexError: pass if type_name == "definition": if not container or not isinstance(container, DefinitionContainer): definition = self.findContainer( container_type=DefinitionContainer) if not definition: raise InvalidContainerStackError( "Stack {id} does not have a definition!".format( id=self.getId())) new_containers[index] = definition continue if not container or container.getMetaDataEntry( "type") != type_name: actual_container = self.findContainer(type=type_name) if actual_container: new_containers[index] = actual_container else: new_containers[index] = self._empty_instance_container self._containers = new_containers # CURA-5281 # Some stacks can have empty definition_changes containers which will cause problems. # Make sure that all stacks here have non-empty definition_changes containers. if isinstance(new_containers[_ContainerIndexes.DefinitionChanges], type(self._empty_instance_container)): from cura.Settings.CuraStackBuilder import CuraStackBuilder CuraStackBuilder.createDefinitionChangesContainer( self, self.getId() + "_settings") ## TODO; Deserialize the containers. return serialized
def _reset(self): global_stack = self._application.getMachineManager().activeMachine if not global_stack: return # Make sure there is a definition_changes container to store the machine settings definition_changes_id = global_stack.definitionChanges.getId() if isEmptyContainer(definition_changes_id): CuraStackBuilder.createDefinitionChangesContainer(global_stack, global_stack.getName() + "_settings") # Disable auto-slicing while the MachineAction is showing if self._backend: # This sometimes triggers before backend is loaded. self._backend.disableTimer()
def deserialize(self, serialized: str, file_name: Optional[str] = None) -> str: # update the serialized data first serialized = super().deserialize(serialized, file_name) new_containers = self._containers.copy() while len(new_containers) < len(_ContainerIndexes.IndexTypeMap): new_containers.append(self._empty_instance_container) # Validate and ensure the list of containers matches with what we expect for index, type_name in _ContainerIndexes.IndexTypeMap.items(): container = None try: container = new_containers[index] except IndexError: pass if type_name == "definition": if not container or not isinstance(container, DefinitionContainer): definition = self.findContainer(container_type = DefinitionContainer) if not definition: raise InvalidContainerStackError("Stack {id} does not have a definition!".format(id = self.getId())) new_containers[index] = definition continue if not container or container.getMetaDataEntry("type") != type_name: actual_container = self.findContainer(type = type_name) if actual_container: new_containers[index] = actual_container else: new_containers[index] = self._empty_instance_container self._containers = new_containers # CURA-5281 # Some stacks can have empty definition_changes containers which will cause problems. # Make sure that all stacks here have non-empty definition_changes containers. if isinstance(new_containers[_ContainerIndexes.DefinitionChanges], type(self._empty_instance_container)): from cura.Settings.CuraStackBuilder import CuraStackBuilder CuraStackBuilder.createDefinitionChangesContainer(self, self.getId() + "_settings") ## TODO; Deserialize the containers. return serialized
def _onActiveExtruderStackChanged(self): extruder_container_stack = ExtruderManager.getInstance().getActiveExtruderStack() if not self._global_container_stack or not extruder_container_stack: return # Make sure there is a definition_changes container to store the machine settings definition_changes_container = extruder_container_stack.definitionChanges if definition_changes_container == self._empty_container: definition_changes_container = CuraStackBuilder.createDefinitionChangesContainer( extruder_container_stack, extruder_container_stack.getId() + "_settings")
def setHeatedChamber(self, heated_bed = True): global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: # Make sure there is a definition_changes container to store the machine settings definition_changes_container = global_container_stack.definitionChanges if definition_changes_container == ContainerRegistry.getInstance().getEmptyInstanceContainer(): definition_changes_container = CuraStackBuilder.createDefinitionChangesContainer( global_container_stack, global_container_stack.getId() + "_settings") definition_changes_container.setProperty("machine_heated_chamber", "value", heated_bed) self.heatedChamberChanged.emit()
def applyGcodeFlavorFix(self, apply_fix: bool) -> None: global_container_stack = self._application.getGlobalContainerStack() if not global_container_stack: return gcode_flavor = "RepRap (Marlin/Sprinter)" if apply_fix else "UltiGCode" if global_container_stack.getProperty("machine_gcode_flavor", "value") == gcode_flavor: # No need to add a definition_changes container if the setting is not going to be changed return # Make sure there is a definition_changes container to store the machine settings definition_changes_container = global_container_stack.definitionChanges if definition_changes_container == ContainerRegistry.getInstance().getEmptyInstanceContainer(): definition_changes_container = CuraStackBuilder.createDefinitionChangesContainer( global_container_stack, global_container_stack.getId() + "_settings") definition_changes_container.setProperty("machine_gcode_flavor", "value", gcode_flavor) # Update the has_materials metadata flag after switching gcode flavor definition = global_container_stack.getBottom() if ( not definition or definition.getProperty("machine_gcode_flavor", "value") != "UltiGCode" or definition.getMetaDataEntry("has_materials", False) ): # In other words: only continue for the UM2 (extended), but not for the UM2+ return has_materials = global_container_stack.getProperty("machine_gcode_flavor", "value") != "UltiGCode" material_container = global_container_stack.material if has_materials: global_container_stack.setMetaDataEntry("has_materials", True) # Set the material container to a sane default if material_container == ContainerRegistry.getInstance().getEmptyInstanceContainer(): search_criteria = { "type": "material", "definition": "fdmprinter", "id": global_container_stack.getMetaDataEntry("preferred_material") } materials = ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) if materials: global_container_stack.material = materials[0] else: # The metadata entry is stored in an ini, and ini files are parsed as strings only. # Because any non-empty string evaluates to a boolean True, we have to remove the entry to make it False. if "has_materials" in global_container_stack.getMetaData(): global_container_stack.removeMetaDataEntry("has_materials") global_container_stack.material = ContainerRegistry.getInstance().getEmptyInstanceContainer() self._application.globalContainerStackChanged.emit()
def setHeatedBed(self, heated_bed = True): global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: # Make sure there is a definition_changes container to store the machine settings definition_changes_container = global_container_stack.definitionChanges if definition_changes_container == ContainerRegistry.getInstance().getEmptyInstanceContainer(): definition_changes_container = CuraStackBuilder.createDefinitionChangesContainer( global_container_stack, global_container_stack.getId() + "_settings") definition_changes_container.setProperty("machine_heated_bed", "value", heated_bed) self.heatedBedChanged.emit()
def _reset(self): if not self._global_container_stack: return # Make sure there is a definition_changes container to store the machine settings definition_changes_id = self._global_container_stack.definitionChanges.getId() if self._isEmptyDefinitionChanges(definition_changes_id): CuraStackBuilder.createDefinitionChangesContainer(self._global_container_stack, self._global_container_stack.getName() + "_settings") # Notify the UI in which container to store the machine settings data from cura.Settings.CuraContainerStack import _ContainerIndexes container_index = _ContainerIndexes.DefinitionChanges if container_index != self._container_index: self._container_index = container_index self.containerIndexChanged.emit() # Disable auto-slicing while the MachineAction is showing if self._backend: # This sometimes triggers before backend is loaded. self._backend.disableTimer()
def applyGcodeFlavorFix(self, apply_fix: bool) -> None: global_container_stack = self._application.getGlobalContainerStack() if not global_container_stack: return gcode_flavor = "RepRap (Marlin/Sprinter)" if apply_fix else "UltiGCode" if global_container_stack.getProperty("machine_gcode_flavor", "value") == gcode_flavor: # No need to add a definition_changes container if the setting is not going to be changed return # Make sure there is a definition_changes container to store the machine settings definition_changes_container = global_container_stack.definitionChanges if definition_changes_container == ContainerRegistry.getInstance().getEmptyInstanceContainer(): definition_changes_container = CuraStackBuilder.createDefinitionChangesContainer( global_container_stack, global_container_stack.getId() + "_settings") definition_changes_container.setProperty("machine_gcode_flavor", "value", gcode_flavor) # Update the has_materials metadata flag after switching gcode flavor definition = global_container_stack.getBottom() if not definition or definition.getProperty("machine_gcode_flavor", "value") != "UltiGCode" or definition.getMetaDataEntry("has_materials", False): # In other words: only continue for the UM2 (extended), but not for the UM2+ return has_materials = global_container_stack.getProperty("machine_gcode_flavor", "value") != "UltiGCode" material_container = global_container_stack.material if has_materials: global_container_stack.setMetaDataEntry("has_materials", True) # Set the material container to a sane default if material_container == ContainerRegistry.getInstance().getEmptyInstanceContainer(): search_criteria = { "type": "material", "definition": "fdmprinter", "id": global_container_stack.getMetaDataEntry("preferred_material")} materials = ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) if materials: global_container_stack.material = materials[0] else: # The metadata entry is stored in an ini, and ini files are parsed as strings only. # Because any non-empty string evaluates to a boolean True, we have to remove the entry to make it False. if "has_materials" in global_container_stack.getMetaData(): global_container_stack.removeMetaDataEntry("has_materials") global_container_stack.material = ContainerRegistry.getInstance().getEmptyInstanceContainer() self._application.globalContainerStackChanged.emit()
def _reset(self): if not self._global_container_stack: return # Make sure there is a definition_changes container to store the machine settings definition_changes_container = self._global_container_stack.definitionChanges if definition_changes_container == self._empty_container: definition_changes_container = CuraStackBuilder.createDefinitionChangesContainer( self._global_container_stack, self._global_container_stack.getName() + "_settings") # Notify the UI in which container to store the machine settings data container_index = self._global_container_stack.getContainerIndex(definition_changes_container) if container_index != self._container_index: self._container_index = container_index self.containerIndexChanged.emit() # Disable auto-slicing while the MachineAction is showing if self._backend: # This sometimes triggers before backend is loaded. self._backend.disableTimer()