diff --git a/cura/QualityManager.py b/cura/QualityManager.py index c0b5afb71e..763599ac73 100644 --- a/cura/QualityManager.py +++ b/cura/QualityManager.py @@ -64,6 +64,19 @@ class QualityManager: result = [quality_change for quality_change in result if quality_change.getName() == quality_changes_name] return result + ## Fetch the list of available quality types for this machine definition. + # + # \param machine_definition \type{DefinitionContainer} + # \param material_containers \type{List[InstanceContainer]} + # \return \type{List[str]} + def findAllQualityTypesForMachine(self, machine_definition: "DefinitionContainerInterface") -> List[str]: + # Determine the common set of quality types which can be + # applied to all of the materials for this machine. + quality_type_dict = self.__fetchQualityTypeDict(machine_definition) + common_quality_types = set(quality_type_dict.keys()) + + return list(common_quality_types) + ## Fetch the list of available quality types for this combination of machine definition and materials. # # \param machine_definition \type{DefinitionContainer} @@ -91,6 +104,18 @@ class QualityManager: return list(qualities) + ## Fetches a dict of quality types names to quality profiles for a combination of machine and material. + # + # \param machine_definition \type{DefinitionContainer} the machine definition. + # \param material \type{InstanceContainer} the material. + # \return \type{Dict[str, InstanceContainer]} the dict of suitable quality type names mapping to qualities. + def __fetchQualityTypeDict(self, machine_definition: "DefinitionContainerInterface") -> Dict[str, InstanceContainer]: + qualities = self.findAllQualitiesForMachineMaterial(machine_definition, None) + quality_type_dict = {} + for quality in qualities: + quality_type_dict[quality.getMetaDataEntry("quality_type")] = quality + return quality_type_dict + ## Fetches a dict of quality types names to quality profiles for a combination of machine and material. # # \param machine_definition \type{DefinitionContainer} the machine definition. diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index c7348ea920..9fcffc9f57 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -54,7 +54,7 @@ class ProfilesModel(InstanceContainersModel): global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack is None: return [] - global_stack_definition = global_container_stack.getBottom() + # global_stack_definition = global_container_stack.getBottom() # Get the list of extruders and place the selected extruder at the front of the list. extruder_manager = ExtruderManager.getInstance() @@ -64,23 +64,26 @@ class ProfilesModel(InstanceContainersModel): extruder_stacks.remove(active_extruder) extruder_stacks = [active_extruder] + extruder_stacks - if ExtruderManager.getInstance().getActiveExtruderStacks(): - # Multi-extruder machine detected. - materials = [extruder.material for extruder in extruder_stacks] - else: - # Machine with one extruder. - materials = [global_container_stack.material] + # if ExtruderManager.getInstance().getActiveExtruderStacks(): + # # Multi-extruder machine detected. + # materials = [extruder.material for extruder in extruder_stacks] + # else: + # # Machine with one extruder. + # materials = [global_container_stack.material] + # + # # Fetch the list of usable qualities across all extruders. + # # The actual list of quality profiles come from the first extruder in the extruder list. + # result = QualityManager.getInstance().findAllQualitiesForMachineAndMaterials(global_stack_definition, + # materials) + # + # for quality in QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders( + # global_container_stack, extruder_stacks): + # if quality not in result: + # result.append(quality) + quality_list = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack, + extruder_stacks) - # Fetch the list of usable qualities across all extruders. - # The actual list of quality profiles come from the first extruder in the extruder list. - result = QualityManager.getInstance().findAllQualitiesForMachineAndMaterials(global_stack_definition, - materials) - - for quality in QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders( - global_container_stack, extruder_stacks): - if quality not in result: - result.append(quality) - return result + return quality_list ## Re-computes the items in this model, and adds the layer height role. def _recomputeItems(self): @@ -93,12 +96,18 @@ class ProfilesModel(InstanceContainersModel): extruder_manager = ExtruderManager.getInstance() active_extruder = extruder_manager.getActiveExtruderStack() extruder_stacks = extruder_manager.getActiveExtruderStacks() + material = global_container_stack.material if active_extruder in extruder_stacks: extruder_stacks.remove(active_extruder) extruder_stacks = [active_extruder] + extruder_stacks + material = active_extruder.material + # Get a list of available qualities for this machine and material qualities = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack, extruder_stacks) + + all_qualities = QualityManager.getInstance().findAllQualitiesForMachineMaterial(global_container_stack.getBottom(), material) + container_registry = ContainerRegistry.getInstance() machine_manager = Application.getInstance().getMachineManager() @@ -125,12 +134,23 @@ class ProfilesModel(InstanceContainersModel): for key in reversed(tmp_all_quality_items.keys()): all_quality_items[key] = tmp_all_quality_items[key] + # First the suitable containers are set in the model + containers = [] for data_item in all_quality_items.values(): - item = data_item["suitable_container"] - if item is None: - item = data_item["all_containers"][0] + suitable_item = data_item["suitable_container"] + if suitable_item is None: + suitable_item = data_item["all_containers"][0] + containers.append(suitable_item) - profile = container_registry.findContainers(id = item["id"]) + # Once the suitable containers are collected, the rest of the containers are appended + for data_item in all_quality_items.values(): + for item in data_item["all_containers"]: + if item not in containers: + containers.append(item) + + # Now all the containers are set + for item in containers: + profile = container_registry.findContainers(id=item["id"]) if not profile: item["layer_height"] = "" # Can't update a profile that is unknown. item["available"] = False diff --git a/cura/Settings/UserProfilesModel.py b/cura/Settings/UserProfilesModel.py index 07669422d2..fdb44ce313 100644 --- a/cura/Settings/UserProfilesModel.py +++ b/cura/Settings/UserProfilesModel.py @@ -25,17 +25,30 @@ class UserProfilesModel(ProfilesModel): machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.getBottom()) quality_changes_list = quality_manager.findAllQualityChangesForMachine(machine_definition) - # Fetch the list of qualities - quality_list = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack, - ExtruderManager.getInstance().getActiveExtruderStacks()) + # Detecting if the machine has multiple extrusion + multiple_extrusion = False + # Get the list of extruders and place the selected extruder at the front of the list. + extruder_manager = ExtruderManager.getInstance() + active_extruder = extruder_manager.getActiveExtruderStack() + extruder_stacks = extruder_manager.getActiveExtruderStacks() + if active_extruder in extruder_stacks: + multiple_extrusion = True + extruder_stacks.remove(active_extruder) + extruder_stacks = [active_extruder] + extruder_stacks + + # Fetch the list of useable qualities across all extruders. + # The actual list of quality profiles come from the first extruder in the extruder list. + quality_list = quality_manager.findAllUsableQualitiesForMachineAndExtruders(global_container_stack, + extruder_stacks) # Filter the quality_change by the list of available quality_types quality_type_set = set([x.getMetaDataEntry("quality_type") for x in quality_list]) - filtered_quality_changes = [qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set] - #Only display the global quality changes. - #Otherwise you get multiple copies of every quality changes profile. - #The actual profile switching goes by profile name (not ID), and as long as the names are consistent, switching to any of the profiles will cause all stacks to switch. - filtered_quality_changes = list(filter(lambda quality_changes: quality_changes.getMetaDataEntry("extruder") is None, filtered_quality_changes)) + if multiple_extrusion: + # If the printer has multiple extruders then quality changes related to the current extruder are kept + filtered_quality_changes = [qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set and qc.getMetaDataEntry("extruder") == active_extruder.definition.getId()] + else: + # If not, the quality changes of the global stack are selected + filtered_quality_changes = [qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set] return filtered_quality_changes diff --git a/resources/qml/Menus/ProfileMenu.qml b/resources/qml/Menus/ProfileMenu.qml index d6412c50be..0ed4448d1b 100644 --- a/resources/qml/Menus/ProfileMenu.qml +++ b/resources/qml/Menus/ProfileMenu.qml @@ -43,7 +43,7 @@ Menu { text: model.name + " - " + model.layer_height checkable: true - checked: Cura.MachineManager.globalQualityId == model.id + checked: Cura.MachineManager.activeQualityChangesId == model.id exclusiveGroup: group onTriggered: Cura.MachineManager.setActiveQuality(model.id) }