Browse Source

Merge branch 'master' of github.com:Ultimaker/Cura

Jack Ha 8 years ago
parent
commit
8934555bd6

+ 41 - 13
cura/BuildVolume.py

@@ -473,14 +473,40 @@ class BuildVolume(SceneNode):
         self._has_errors = prime_tower_collision or prime_collision
         self._disallowed_areas = areas
 
-    ##   Private convenience function to get a setting from the adhesion extruder.
-    def _getSettingProperty(self, setting_key, property = "value"):
+    ##  Private convenience function to get a setting from the adhesion
+    #   extruder.
+    #
+    #   \param setting_key The key of the setting to get.
+    #   \param property The property to get from the setting.
+    #   \return The property of the specified setting in the adhesion extruder.
+    def _getSettingFromAdhesionExtruder(self, setting_key, property = "value"):
+        return self._getSettingFromExtruder(setting_key, "adhesion_extruder_nr", property)
+
+    ##  Private convenience function to get a setting from the support infill
+    #   extruder.
+    #
+    #   \param setting_key The key of the setting to get.
+    #   \param property The property to get from the setting.
+    #   \return The property of the specified setting in the support infill
+    #   extruder.
+    def _getSettingFromSupportInfillExtruder(self, setting_key, property = "value"):
+        return self._getSettingFromExtruder(setting_key, "support_infill_extruder_nr", property)
+
+    ##  Helper function to get a setting from an extruder specified in another
+    #   setting.
+    #
+    #   \param setting_key The key of the setting to get.
+    #   \param extruder_setting_key The key of the setting that specifies from
+    #   which extruder to get the setting, if there are multiple extruders.
+    #   \param property The property to get from the setting.
+    #   \return The property of the specified setting in the specified extruder.
+    def _getSettingFromExtruder(self, setting_key, extruder_setting_key, property = "value"):
         multi_extrusion = self._global_container_stack.getProperty("machine_extruder_count", "value") > 1
 
         if not multi_extrusion:
             return self._global_container_stack.getProperty(setting_key, property)
 
-        extruder_index = self._global_container_stack.getProperty("adhesion_extruder_nr", "value")
+        extruder_index = self._global_container_stack.getProperty(extruder_setting_key, "value")
 
         if extruder_index == "-1":  # If extruder index is -1 use global instead
             return self._global_container_stack.getProperty(setting_key, property)
@@ -505,9 +531,9 @@ class BuildVolume(SceneNode):
 
         adhesion_type = container_stack.getProperty("adhesion_type", "value")
         if adhesion_type == "skirt":
-            skirt_distance = self._getSettingProperty("skirt_gap", "value")
-            skirt_line_count = self._getSettingProperty("skirt_line_count", "value")
-            bed_adhesion_size = skirt_distance + (skirt_line_count * self._getSettingProperty("skirt_brim_line_width", "value"))
+            skirt_distance = self._getSettingFromAdhesionExtruder("skirt_gap")
+            skirt_line_count = self._getSettingFromAdhesionExtruder("skirt_line_count")
+            bed_adhesion_size = skirt_distance + (skirt_line_count * self._getSettingFromAdhesionExtruder("skirt_brim_line_width"))
             if self._global_container_stack.getProperty("machine_extruder_count", "value") > 1:
                 adhesion_extruder_nr = int(self._global_container_stack.getProperty("adhesion_extruder_nr", "value"))
                 extruder_values = ExtruderManager.getInstance().getAllExtruderValues("skirt_brim_line_width")
@@ -515,7 +541,7 @@ class BuildVolume(SceneNode):
                 for value in extruder_values:
                     bed_adhesion_size += value
         elif adhesion_type == "brim":
-            bed_adhesion_size = self._getSettingProperty("brim_line_count", "value") * self._getSettingProperty("skirt_brim_line_width", "value")
+            bed_adhesion_size = self._getSettingFromAdhesionExtruder("brim_line_count") * self._getSettingFromAdhesionExtruder("skirt_brim_line_width")
             if self._global_container_stack.getProperty("machine_extruder_count", "value") > 1:
                 adhesion_extruder_nr = int(self._global_container_stack.getProperty("adhesion_extruder_nr", "value"))
                 extruder_values = ExtruderManager.getInstance().getAllExtruderValues("skirt_brim_line_width")
@@ -523,7 +549,7 @@ class BuildVolume(SceneNode):
                 for value in extruder_values:
                     bed_adhesion_size += value
         elif adhesion_type == "raft":
-            bed_adhesion_size = self._getSettingProperty("raft_margin", "value")
+            bed_adhesion_size = self._getSettingFromAdhesionExtruder("raft_margin")
         else:
             raise Exception("Unknown bed adhesion type. Did you forget to update the build volume calculations for your new bed adhesion type?")
 
@@ -534,10 +560,12 @@ class BuildVolume(SceneNode):
             farthest_shield_distance = max(farthest_shield_distance, container_stack.getProperty("ooze_shield_dist", "value"))
 
         move_from_wall_radius = 0  # Moves that start from outer wall.
-        if self._getSettingProperty("infill_wipe_dist", "value"):
-            move_from_wall_radius = max(move_from_wall_radius, self._getSettingProperty("infill_wipe_dist", "value"))
-        if self._getSettingProperty("travel_avoid_distance", "value"):
-            move_from_wall_radius = max(move_from_wall_radius, self._getSettingProperty("travel_avoid_distance", "value"))
+        if self._getSettingFromAdhesionExtruder("infill_wipe_dist"):
+            move_from_wall_radius = max(move_from_wall_radius, self._getSettingFromAdhesionExtruder("infill_wipe_dist"))
+        if self._getSettingFromAdhesionExtruder("travel_avoid_distance"):
+            move_from_wall_radius = max(move_from_wall_radius, self._getSettingFromAdhesionExtruder("travel_avoid_distance"))
+        if self._getSettingFromSupportInfillExtruder("support_offset"):
+            move_from_wall_radius = max(move_from_wall_radius, self._getSettingFromSupportInfillExtruder("support_offset"))
 
         #Now combine our different pieces of data to get the final border size.
         border_size = max(farthest_shield_distance, move_from_wall_radius, bed_adhesion_size)
@@ -551,4 +579,4 @@ class BuildVolume(SceneNode):
     _prime_settings = ["extruder_prime_pos_x", "extruder_prime_pos_y", "extruder_prime_pos_z"]
     _tower_settings = ["prime_tower_enable", "prime_tower_size", "prime_tower_position_x", "prime_tower_position_y"]
     _ooze_shield_settings = ["ooze_shield_enabled", "ooze_shield_dist"]
-    _distance_settings = ["infill_wipe_dist", "travel_avoid_distance"]
+    _distance_settings = ["infill_wipe_dist", "travel_avoid_distance", "support_offset"]

+ 1 - 0
cura/CuraApplication.py

@@ -503,6 +503,7 @@ class CuraApplication(QtApplication):
 
         qmlRegisterType(cura.Settings.ContainerSettingsModel, "Cura", 1, 0, "ContainerSettingsModel")
         qmlRegisterType(cura.Settings.ProfilesModel, "Cura", 1, 0, "ProfilesModel")
+        qmlRegisterType(cura.Settings.ProfilesPageModel, "Cura", 1, 0, "ProfilesPageModel")
         qmlRegisterType(cura.Settings.MaterialSettingsVisibilityHandler, "Cura", 1, 0, "MaterialSettingsVisibilityHandler")
         qmlRegisterType(cura.Settings.QualitySettingsModel, "Cura", 1, 0, "QualitySettingsModel")
 

+ 8 - 4
cura/QualityManager.py

@@ -53,7 +53,9 @@ class QualityManager:
     #                               the current set of selected materials is used.
     #   \return the matching quality containers \type{List[ContainerInstance]}
     def findQualityByQualityType(self, quality_type, machine_definition=None, material_containers=None):
-        criteria = {"type": "quality", "quality_type": quality_type}
+        criteria = {"type": "quality"}
+        if quality_type:
+            criteria["quality_type"] = quality_type
         return self._getFilteredContainersForStack(machine_definition, material_containers, **criteria)
 
     def _getFilteredContainers(self, **kwargs):
@@ -63,9 +65,9 @@ class QualityManager:
         # Fill in any default values.
         if machine_definition is None:
             machine_definition = UM.Application.getInstance().getGlobalContainerStack().getBottom()
-            quality_definition = machine_definition.getMetaDataEntry("quality_definition")
-            if quality_definition is not None:
-                machine_definition = UM.Settings.ContainerRegistry.getInstance().findDefinitionContainers(id=quality_definition)[0]
+            quality_definition_id = machine_definition.getMetaDataEntry("quality_definition")
+            if quality_definition_id is not None:
+                machine_definition = UM.Settings.ContainerRegistry.getInstance().findDefinitionContainers(id=quality_definition_id)[0]
 
         if material_containers is None:
             active_stacks = cura.Settings.ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks()
@@ -81,6 +83,8 @@ class QualityManager:
             criteria["definition"] = definition_id
 
             filter_by_material = whole_machine_definition.getMetaDataEntry("has_materials")
+        else:
+            criteria["definition"] = "fdmprinter"
 
         # Stick the material IDs in a set
         if material_containers is None or len(material_containers) == 0:

+ 6 - 1
cura/Settings/ContainerManager.py

@@ -561,10 +561,15 @@ class ContainerManager(QObject):
         new_name = self._container_registry.uniqueName(new_name)
 
         container_registry = self._container_registry
-        for container in self._getFilteredContainers(name = quality_name, type = "quality_changes"):
+
+        containers_to_rename = self._container_registry.findInstanceContainers(type = "quality_changes", name = quality_name)
+        for container in containers_to_rename:
             stack_id = container.getMetaDataEntry("extruder", global_stack.getId())
             container_registry.renameContainer(container.getId(), new_name, self._createUniqueId(stack_id, new_name))
 
+        if not containers_to_rename:
+            UM.Logger.log("e", "Unable to rename %s, because we could not find the profile", quality_name)
+
         self._machine_manager.activeQualityChanged.emit()
         return True
 

+ 11 - 2
cura/Settings/MachineManager.py

@@ -567,9 +567,18 @@ class MachineManager(QObject):
                                    [material_container])
         if not candidate_qualities:
             # Fall back to normal quality
-            new_quality_id = quality_manager.findQualityByQualityType("normal",
+            quality_containers = quality_manager.findQualityByQualityType("normal",
+                                quality_manager.getWholeMachineDefinition(machine_definition),
+                                [material_container])
+            if quality_containers:
+                new_quality_id = quality_containers[0].getId()
+            else:
+                # There is no normal quality for this machine/variant/material combination
+                quality_containers = quality_manager.findQualityByQualityType(None,
                                     quality_manager.getWholeMachineDefinition(machine_definition),
-                                    [material_container])[0].getId()
+                                    [material_container])
+                new_quality_id = quality_containers[0].getId()
+
         else:
             if not old_quality_changes:
                 new_quality_id = candidate_qualities[0].getId()

+ 2 - 0
cura/Settings/ProfilesModel.py

@@ -13,6 +13,8 @@ class ProfilesModel(InstanceContainersModel):
     def __init__(self, parent = None):
         super().__init__(parent)
 
+        Application.getInstance().globalContainerStackChanged.connect(self._update)
+
     ##  Fetch the list of containers to display.
     #
     #   See UM.Settings.Models.InstanceContainersModel._fetchInstanceContainers().

+ 35 - 0
cura/Settings/ProfilesPageModel.py

@@ -0,0 +1,35 @@
+# Copyright (c) 2016 Ultimaker B.V.
+# Uranium is released under the terms of the AGPLv3 or higher.
+from UM.Application import Application
+from UM.Settings.ContainerRegistry import ContainerRegistry
+
+from cura.QualityManager import QualityManager
+from cura.Settings.ProfilesModel import ProfilesModel
+
+##  QML Model for listing the current list of valid quality and quality changes profiles.
+#
+class ProfilesPageModel(ProfilesModel):
+    def __init__(self, parent = None):
+        super().__init__(parent)
+
+    ##  Fetch the list of containers to display.
+    #
+    #   See UM.Settings.Models.InstanceContainersModel._fetchInstanceContainers().
+    def _fetchInstanceContainers(self):
+        # Fetch the list of qualities
+        quality_list = super()._fetchInstanceContainers()
+
+        # Fetch the list of quality changes.
+        quality_manager = QualityManager.getInstance()
+        application = Application.getInstance()
+
+        machine_definition = quality_manager.getParentMachineDefinition(application.getGlobalContainerStack().getBottom())
+        if machine_definition.getMetaDataEntry("has_machine_quality"):
+            definition_id = machine_definition.getId()
+        else:
+            definition_id = "fdmprinter"
+
+        filter_dict = { "type": "quality_changes", "extruder": None, "definition": definition_id }
+        quality_changes_list = ContainerRegistry.getInstance().findInstanceContainers(**filter_dict)
+
+        return quality_list + quality_changes_list

+ 1 - 0
cura/Settings/__init__.py

@@ -13,3 +13,4 @@ from .SettingOverrideDecorator import SettingOverrideDecorator
 from .QualitySettingsModel import QualitySettingsModel
 from .SettingInheritanceManager import SettingInheritanceManager
 from .ProfilesModel import ProfilesModel
+from .ProfilesPageModel import ProfilesPageModel

+ 2 - 2
plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py

@@ -105,13 +105,13 @@ class Profile:
                 config.set("metadata", "variant", self._machine_variant_name)
 
         if self._settings:
-            VersionUpgrade21to22.VersionUpgrade21to22.VersionUpgrade21to22.translateSettings(self._settings)
+            self._settings = VersionUpgrade21to22.VersionUpgrade21to22.VersionUpgrade21to22.translateSettings(self._settings)
             config.add_section("values")
             for key, value in self._settings.items():
                 config.set("values", key, str(value))
 
         if self._changed_settings_defaults:
-            VersionUpgrade21to22.VersionUpgrade21to22.VersionUpgrade21to22.translateSettings(self._changed_settings_defaults)
+            self._changed_settings_defaults = VersionUpgrade21to22.VersionUpgrade21to22.VersionUpgrade21to22.translateSettings(self._changed_settings_defaults)
             config.add_section("defaults")
             for key, value in self._changed_settings_defaults.items():
                 config.set("defaults", key, str(value))

+ 1 - 1
resources/definitions/fdmprinter.def.json

@@ -3404,7 +3404,7 @@
                     "description": "After printing the prime tower with one nozzle, wipe the oozed material from the other nozzle off on the prime tower.",
                     "type": "bool",
                     "enabled": "resolveOrValue('prime_tower_enable')",
-                    "default_value": false,
+                    "default_value": true,
                     "settable_per_mesh": false,
                     "settable_per_extruder": false
                 },

Some files were not shown because too many files changed in this diff