Browse Source

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

Jack Ha 8 years ago
parent
commit
ab23637f3b

+ 17 - 9
cura/QualityManager.py

@@ -90,8 +90,8 @@ class QualityManager:
 
         # Fall back to using generic materials and qualities if nothing could be found.
         if not result and material_containers and len(material_containers) == 1:
-            basic_material = self._getBasicMaterial(material_containers[0])
-            result = self._getFilteredContainersForStack(machine_definition, [basic_material], **criteria)
+            basic_materials = self._getBasicMaterials(material_containers[0])
+            result = self._getFilteredContainersForStack(machine_definition, basic_materials, **criteria)
         return result[0] if result else None
 
     ##  Find all suitable qualities for a combination of machine and material.
@@ -103,8 +103,8 @@ class QualityManager:
         criteria = {"type": "quality" }
         result = self._getFilteredContainersForStack(machine_definition, [material_container], **criteria)
         if not result:
-            basic_material = self._getBasicMaterial(material_container)
-            result = self._getFilteredContainersForStack(machine_definition, [basic_material], **criteria)
+            basic_materials = self._getBasicMaterials(material_container)
+            result = self._getFilteredContainersForStack(machine_definition, basic_materials, **criteria)
         return result
 
     ##  Find all quality changes for a machine.
@@ -154,16 +154,24 @@ class QualityManager:
     #
     #   This tries to find a generic or basic version of the given material.
     #   \param material_container \type{InstanceContainer} the material
-    #   \return \type{Option[InstanceContainer]} the basic material or None if one could not be found.
-    def _getBasicMaterial(self, material_container):
+    #   \return \type{List[InstanceContainer]} the basic material or None if one could not be found.
+    def _getBasicMaterials(self, material_container):
         base_material = material_container.getMetaDataEntry("material")
+        if material_container.getDefinition().getMetaDataEntry("has_machine_quality"):
+            definition_id = material_container.getDefinition().getMetaDataEntry("quality_definition", material_container.getDefinition().getId())
+        else:
+            definition_id = "fdmprinter"
+
         if base_material:
             # There is a basic material specified
-            criteria = { "type": "material", "name": base_material, "definition": "fdmprinter" }
+            criteria = { "type": "material", "name": base_material, "definition": definition_id }
             containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**criteria)
-            return containers[0] if containers else None
+            containers = [basic_material for basic_material in containers if
+                               basic_material.getMetaDataEntry("variant") == material_container.getMetaDataEntry(
+                                   "variant")]
+            return containers
 
-        return None
+        return []
 
     def _getFilteredContainers(self, **kwargs):
         return self._getFilteredContainersForStack(None, None, **kwargs)

+ 4 - 2
cura/Settings/ContainerManager.py

@@ -480,6 +480,7 @@ class ContainerManager(QObject):
             new_changes = self._createQualityChanges(quality_container, unique_name,
                                                      UM.Application.getInstance().getGlobalContainerStack().getBottom(),
                                                      extruder_id)
+            self._performMerge(new_changes, quality_changes_container, clear_settings = False)
             self._performMerge(new_changes, user_container)
 
             self._container_registry.addContainer(new_changes)
@@ -694,7 +695,7 @@ class ContainerManager(QObject):
     def createContainerManager(engine, js_engine):
         return ContainerManager.getInstance()
 
-    def _performMerge(self, merge_into, merge):
+    def _performMerge(self, merge_into, merge, clear_settings = True):
         assert isinstance(merge, type(merge_into))
 
         if merge == merge_into:
@@ -703,7 +704,8 @@ class ContainerManager(QObject):
         for key in merge.getAllKeys():
             merge_into.setProperty(key, "value", merge.getProperty(key, "value"))
 
-        merge.clear()
+        if clear_settings:
+            merge.clear()
 
     def _updateContainerNameFilters(self):
         self._container_name_filters = {}

+ 15 - 15
cura/Settings/QualitySettingsModel.py

@@ -27,8 +27,8 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel):
 
         self._extruder_id = None
         self._extruder_definition_id = None
-        self._quality = None
-        self._material = None
+        self._quality_id = None
+        self._material_id = None
 
         self.addRoleName(self.KeyRole, "key")
         self.addRoleName(self.LabelRole, "label")
@@ -61,29 +61,29 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel):
         return self._extruder_definition_id
 
     def setQuality(self, quality):
-        if quality != self._quality:
-            self._quality = quality
+        if quality != self._quality_id:
+            self._quality_id = quality
             self._update()
             self.qualityChanged.emit()
 
     qualityChanged = pyqtSignal()
     @pyqtProperty(str, fset = setQuality, notify = qualityChanged)
     def quality(self):
-        return self._quality
+        return self._quality_id
 
     def setMaterial(self, material):
-        if material != self._material:
-            self._material = material
+        if material != self._material_id:
+            self._material_id = material
             self._update()
             self.materialChanged.emit()
 
     materialChanged = pyqtSignal()
     @pyqtProperty(str, fset = setMaterial, notify = materialChanged)
     def material(self):
-        return self._material
+        return self._material_id
 
     def _update(self):
-        if not self._quality:
+        if not self._quality_id:
             return
 
         items = []
@@ -91,9 +91,9 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel):
         settings = collections.OrderedDict()
         definition_container = UM.Application.getInstance().getGlobalContainerStack().getBottom()
 
-        containers = self._container_registry.findInstanceContainers(id = self._quality)
+        containers = self._container_registry.findInstanceContainers(id = self._quality_id)
         if not containers:
-            UM.Logger.log("w", "Could not find a quality container with id %s", self._quality)
+            UM.Logger.log("w", "Could not find a quality container with id %s", self._quality_id)
             return
 
         quality_container = None
@@ -110,8 +110,8 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel):
                 "definition": quality_changes_container.getDefinition().getId()
             }
 
-            if self._material:
-                criteria["material"] = self._material
+            if self._material_id and self._material_id != "empty_material":
+                criteria["material"] = self._material_id
 
             quality_container = self._container_registry.findInstanceContainers(**criteria)
             if not quality_container:
@@ -124,8 +124,8 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel):
 
         criteria = {"type": "quality", "quality_type": quality_type, "definition": definition_id}
 
-        if self._material:
-            criteria["material"] = self._material
+        if self._material_id and self._material_id != "empty_material":
+            criteria["material"] = self._material_id
 
         criteria["extruder"] = self._extruder_id
 

+ 6 - 1
plugins/3MFReader/ThreeMFReader.py

@@ -77,6 +77,7 @@ class ThreeMFReader(MeshReader):
                 mesh_data = mesh_builder.build().getTransformed(rotation)
 
                 if not len(mesh_data.getVertices()):
+                    Logger.log("d", "One of the objects does not have vertices. Skipping it.")
                     continue  # This object doesn't have data, so skip it.
 
                 node.setMeshData(mesh_data)
@@ -114,6 +115,7 @@ class ThreeMFReader(MeshReader):
                 try:
                     node.getBoundingBox()  # Selftest - There might be more functions that should fail
                 except:
+                    Logger.log("w", "Bounding box test for object failed. Skipping this object")
                     continue
 
                 result.addChild(node)
@@ -125,7 +127,10 @@ class ThreeMFReader(MeshReader):
                 group_decorator = GroupDecorator()
                 result.addDecorator(group_decorator)
             elif len(objects) == 1:
-                result = result.getChildren()[0]  # Only one object found, return that.
+                if result.getChildren():
+                    result = result.getChildren()[0]  # Only one object found, return that.
+                else: # we failed to load any data
+                    return None
         except Exception as e:
             Logger.log("e", "exception occured in 3mf reader: %s", e)
         try:  # Selftest - There might be more functions that should fail

+ 16 - 10
resources/definitions/fdmprinter.def.json

@@ -1211,7 +1211,7 @@
                     "minimum_value": "0",
                     "minimum_value_warning": "1",
                     "maximum_value": "machine_max_feedrate_e",
-                    "maximum_value_warning": "25",
+                    "maximum_value_warning": "70",
                     "enabled": "retraction_enable",
                     "settable_per_mesh": false,
                     "settable_per_extruder": true,
@@ -1225,7 +1225,7 @@
                             "minimum_value": "0",
                             "maximum_value": "machine_max_feedrate_e",
                             "minimum_value_warning": "1",
-                            "maximum_value_warning": "25",
+                            "maximum_value_warning": "70",
                             "enabled": "retraction_enable",
                             "value": "retraction_speed",
                             "settable_per_mesh": false,
@@ -1240,7 +1240,7 @@
                             "minimum_value": "0",
                             "maximum_value": "machine_max_feedrate_e",
                             "minimum_value_warning": "1",
-                            "maximum_value_warning": "25",
+                            "maximum_value_warning": "70",
                             "enabled": "retraction_enable",
                             "value": "retraction_speed",
                             "settable_per_mesh": false,
@@ -1363,7 +1363,9 @@
                     "enabled": "retraction_enable",
                     "default_value": 20,
                     "minimum_value": "0.1",
-                    "maximum_value_warning": "25",
+                    "minimum_value_warning": "1",
+                    "maximum_value": "machine_max_feedrate_e",
+                    "maximum_value_warning": "70",
                     "settable_per_mesh": false,
                     "settable_per_extruder": true,
                     "children":
@@ -1378,7 +1380,9 @@
                             "default_value": 20,
                             "value": "switch_extruder_retraction_speeds",
                             "minimum_value": "0.1",
-                            "maximum_value_warning": "25",
+                            "minimum_value_warning": "1",
+                            "maximum_value": "machine_max_feedrate_e",
+                            "maximum_value_warning": "70",
                             "settable_per_mesh": false,
                             "settable_per_extruder": true
                         },
@@ -1392,7 +1396,9 @@
                             "default_value": 20,
                             "value": "switch_extruder_retraction_speeds",
                             "minimum_value": "0.1",
-                            "maximum_value_warning": "25",
+                            "minimum_value_warning": "1",
+                            "maximum_value": "machine_max_feedrate_e",
+                            "maximum_value_warning": "70",
                             "settable_per_mesh": false,
                             "settable_per_extruder": true
                         }
@@ -2865,7 +2871,7 @@
                     "type": "float",
                     "default_value": 15,
                     "minimum_value_warning": "raft_interface_line_width",
-                    "maximum_value_warning": "10",
+                    "maximum_value_warning": "20",
                     "enabled": "resolveOrValue('adhesion_type') == 'raft'",
                     "limit_to_extruder": "adhesion_extruder_nr",
                     "settable_per_mesh": false,
@@ -2893,7 +2899,7 @@
                     "default_value": 0.22,
                     "value": "raft_airgap / 2",
                     "minimum_value": "0",
-                    "maximum_value_warning": "layer_height",
+                    "maximum_value_warning": "raft_airgap",
                     "enabled": "resolveOrValue('adhesion_type') == 'raft'",
                     "settable_per_mesh": false,
                     "settable_per_extruder": true,
@@ -2970,7 +2976,7 @@
                     "value": "layer_height * 1.5",
                     "minimum_value": "0.001",
                     "minimum_value_warning": "0.04",
-                    "maximum_value_warning": "0.75 * extruderValue(adhesion_extruder_nr, 'machine_nozzle_size')",
+                    "maximum_value_warning": "0.75 * extruderValue(adhesion_extruder_nr, 'raft_interface_line_width')",
                     "enabled": "resolveOrValue('adhesion_type') == 'raft'",
                     "settable_per_mesh": false,
                     "settable_per_extruder": true,
@@ -3018,7 +3024,7 @@
                     "value": "resolveOrValue('layer_height_0') * 1.2",
                     "minimum_value": "0.001",
                     "minimum_value_warning": "0.04",
-                    "maximum_value_warning": "0.75 * extruderValue(adhesion_extruder_nr, 'machine_nozzle_size')",
+                    "maximum_value_warning": "0.75 * extruderValue(adhesion_extruder_nr, 'raft_base_line_width')",
                     "enabled": "resolveOrValue('adhesion_type') == 'raft'",
                     "settable_per_mesh": false,
                     "settable_per_extruder": true,

+ 0 - 4
resources/qml/MonitorButton.qml

@@ -161,10 +161,6 @@ Rectangle
         visible: showProgress;
         indeterminate:
         {
-            if(!showProgress)
-            {
-                return false; //Never be indeterminate when not visible, since that triggers a redraw of the screen.
-            }
             switch(Cura.MachineManager.printerOutputDevices[0].jobState)
             {
                 case "pausing":

+ 1 - 1
resources/quality/high.inst.cfg

@@ -6,7 +6,7 @@ definition = fdmprinter
 [metadata]
 type = quality
 quality_type = high
-weight = -3
+weight = 1
 
 [values]
 layer_height = 0.06

+ 1 - 1
resources/quality/normal.inst.cfg

@@ -6,6 +6,6 @@ definition = fdmprinter
 [metadata]
 type = quality
 quality_type = normal
-weight = -2
+weight = 0
 
 [values]

+ 1 - 1
resources/quality/ultimaker2_plus/pla_0.25_normal.inst.cfg

@@ -6,7 +6,7 @@ definition = ultimaker2_plus
 [metadata]
 type = quality
 material = generic_pla_ultimaker2_plus_0.25_mm
-weight = -2
+weight = 1
 quality_type = high
 
 [values]

+ 1 - 1
resources/quality/ultimaker2_plus/pla_0.4_high.inst.cfg

@@ -6,7 +6,7 @@ definition = ultimaker2_plus
 [metadata]
 type = quality
 material = generic_pla_ultimaker2_plus_0.4_mm
-weight = -3
+weight = 1
 quality_type = high
 
 [values]

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