From 2caddee2fa9e7e696f77426e4cd1e0842f8bc0e5 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Wed, 28 Dec 2016 08:38:33 +0000 Subject: [PATCH 001/146] Add infill_angles setting to control direction of lines and zig zag infill. This setting provides 4 options: Default - the original directions, 45 and 135. Uniform - one each of 45, 90, 135 and 180. Stronger X - 45, 90, 135 and 90 again - provides more strength in X direction. Stronger Y - 45, 0, 135 and 0 again - provides more strength in Y direction. --- resources/definitions/fdmprinter.def.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 842a2a5bfd..3938ecaaad 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1071,6 +1071,22 @@ "value": "'lines' if infill_sparse_density > 25 else 'grid'", "settable_per_mesh": true }, + "infill_angles": + { + "label": "Infill Line Directions", + "description": "The line directions to use when the infill pattern is lines or zig zag. Default directions are 45 and 135 degrees, Uniform directions are 45, 90, 135 and 180, Stronger X directions are 45, 90, 135 and 90 again and Stronger Y directions are 45, 0, 135 and 0 again.", + "type": "enum", + "options": + { + "45,135": "Default", + "45,90,135,180": "Uniform", + "45,90,135,90": "Stronger X", + "45,0,135,0": "Stronger Y" + }, + "default_value": "45,135", + "enabled": "infill_pattern == 'lines' or infill_pattern == 'zigzag'", + "settable_per_mesh": true + }, "sub_div_rad_mult": { "label": "Cubic Subdivision Radius", From 8d3984a7b48e90eb0d58ea87b500d649322a9bd8 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Thu, 29 Dec 2016 11:32:02 +0000 Subject: [PATCH 002/146] Change Default label to Orthogonal. --- resources/definitions/fdmprinter.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 3938ecaaad..f53720d863 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1074,11 +1074,11 @@ "infill_angles": { "label": "Infill Line Directions", - "description": "The line directions to use when the infill pattern is lines or zig zag. Default directions are 45 and 135 degrees, Uniform directions are 45, 90, 135 and 180, Stronger X directions are 45, 90, 135 and 90 again and Stronger Y directions are 45, 0, 135 and 0 again.", + "description": "The line directions to use when the infill pattern is lines or zig zag. Orthogonal directions are 45 and 135 degrees, Uniform directions are 45, 90, 135 and 180, Stronger X directions are 45, 90, 135 and 90 again and Stronger Y directions are 45, 0, 135 and 0 again.", "type": "enum", "options": { - "45,135": "Default", + "45,135": "Orthogonal", "45,90,135,180": "Uniform", "45,90,135,90": "Stronger X", "45,0,135,0": "Stronger Y" From 03fe03ed65eb39ed82448376f3984be3c847dc46 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Mon, 16 Jan 2017 16:05:21 +0000 Subject: [PATCH 003/146] Modify the constraints of the SettingTextField when the setting type is "str". When the setting type is "str" it now allows the setting contents to be up to 20 characters long with no constraint on what those characters are. --- resources/qml/Settings/SettingTextField.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index da24f0f521..af899bec12 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -98,9 +98,9 @@ SettingItem selectByMouse: true; - maximumLength: 10; + maximumLength: (definition.type == "str") ? 20 : 10; - validator: RegExpValidator { regExp: (definition.type == "int") ? /^-?[0-9]{0,10}$/ : /^-?[0-9]{0,9}[.,]?[0-9]{0,10}$/ } // definition.type property from parent loader used to disallow fractional number entry + validator: RegExpValidator { regExp: (definition.type == "str") ? /^.{0,20}$/ : (definition.type == "int") ? /^-?[0-9]{0,10}$/ : /^-?[0-9]{0,9}[.,]?[0-9]{0,10}$/ } // definition.type property from parent loader used to disallow fractional number entry Binding { From efc3869efe4d8cf10488cb385739ca51dc9583ce Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Mon, 16 Jan 2017 16:09:48 +0000 Subject: [PATCH 004/146] Infill Line Directions setting can now contain an arbitrary string. The SettingTextField can now cope with strings of arbitrary characters (not just digits) so revert to plan A and let the user input a comma separated list of angles rather than having fixed combinations. CuraEngine will parse the list and ignore bad input. --- resources/definitions/fdmprinter.def.json | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index dd863719f0..6dd30800be 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1089,15 +1089,8 @@ "infill_angles": { "label": "Infill Line Directions", - "description": "The line directions to use when the infill pattern is lines or zig zag. Orthogonal directions are 45 and 135 degrees, Uniform directions are 45, 90, 135 and 180, Stronger X directions are 45, 90, 135 and 90 again and Stronger Y directions are 45, 0, 135 and 0 again.", - "type": "enum", - "options": - { - "45,135": "Orthogonal", - "45,90,135,180": "Uniform", - "45,90,135,90": "Stronger X", - "45,0,135,0": "Stronger Y" - }, + "description": "A comma separated list of line directions to use when the infill pattern is lines or zig zag. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. Default directions are 45 and 135 degrees.", + "type": "str", "default_value": "45,135", "enabled": "infill_pattern == 'lines' or infill_pattern == 'zigzag'", "settable_per_mesh": true From 3e7b9e99f31d3f96d4b123ca52992814c9fc230e Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Tue, 24 Jan 2017 18:09:11 +0000 Subject: [PATCH 005/146] Now the Infill Line Directions setting is enabled for all infill patterns. The default value is now the empty string which tells the engine to use the traditional angles (45 & 135 for lines and zig zag patterns, just 45 for everything else. --- resources/definitions/fdmprinter.def.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index a85a50b37c..ffabf9a7d5 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1089,10 +1089,9 @@ "infill_angles": { "label": "Infill Line Directions", - "description": "A comma separated list of line directions to use when the infill pattern is lines or zig zag. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. Default directions are 45 and 135 degrees.", + "description": "A comma separated list of line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. Default is empty which means use the traditional default angles (45 and 135 degrees for the lines and zig zag patterns and 45 degrees for all other patterns).", "type": "str", - "default_value": "45,135", - "enabled": "infill_pattern == 'lines' or infill_pattern == 'zigzag'", + "default_value": "", "settable_per_mesh": true }, "sub_div_rad_mult": From bb1fa3ae04a5695c55123164d5e9bc67e19f4632 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 26 Jan 2017 17:29:39 +0100 Subject: [PATCH 006/146] Started changing layout of layer view. CURA-3321 --- plugins/LayerView/LayerView.qml | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 92948a7ec6..6dc74a3c3b 100644 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -146,13 +146,14 @@ Item } Rectangle { - anchors.left: parent.left - anchors.verticalCenter: parent.verticalCenter - anchors.top: slider_background.bottom - anchors.topMargin: UM.Theme.getSize("default_margin").height - //anchors.leftMargin: UM.Theme.getSize("default_margin").width - width: UM.Theme.getSize("slider_layerview_background").width * 3 - height: slider.height + UM.Theme.getSize("default_margin").height * 2 + anchors.left: parent.right + //anchors.verticalCenter: parent.verticalCenter + //anchors.top: toolbar.top + anchors.bottom: slider_background.top + //anchors.topMargin: UM.Theme.getSize("default_margin").height + anchors.leftMargin: UM.Theme.getSize("default_margin").width + width: UM.Theme.getSize("slider_layerview_background").width * 4 + height: slider.height + UM.Theme.getSize("default_margin").height * 10 color: UM.Theme.getColor("tool_panel_background"); border.width: UM.Theme.getSize("default_lining").width border.color: UM.Theme.getColor("lining") @@ -173,8 +174,10 @@ Item ComboBox { id: layer_type_combobox - anchors.top: slider_background.bottom + anchors.top: parent.top + anchors.topMargin: UM.Theme.getSize("default_margin").height anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width model: layerViewTypes visible: !UM.LayerView.compatibilityMode onActivated: { From db3cf0c0fb271461143049285cd7f099d043253f Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Fri, 27 Jan 2017 15:54:19 +0000 Subject: [PATCH 007/146] Add the [int] setting type for settings that are a list of integers. The RegExpValidator (more of a restrictor than a validator) requires the text to start with a '[' and then have a sequence of integers separated by commas. A trailing ']' is accepted. --- cura/CuraApplication.py | 2 ++ plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml | 2 ++ resources/qml/Settings/SettingTextField.qml | 4 ++-- resources/qml/Settings/SettingView.qml | 2 ++ 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 6288c2d211..d1f6504431 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -107,6 +107,8 @@ class CuraApplication(QtApplication): SettingDefinition.addSettingType("extruder", None, str, Validator) + SettingDefinition.addSettingType("[int]", None, str, None) + SettingFunction.registerOperator("extruderValues", cura.Settings.ExtruderManager.getExtruderValues) SettingFunction.registerOperator("extruderValue", cura.Settings.ExtruderManager.getExtruderValue) SettingFunction.registerOperator("resolveOrValue", cura.Settings.ExtruderManager.getResolveOrValue) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index 9811316948..cb65da635b 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -209,6 +209,8 @@ Item { { case "int": return settingTextField + case "[int]": + return settingTextField case "float": return settingTextField case "enum": diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index af899bec12..05c99d7e25 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -98,9 +98,9 @@ SettingItem selectByMouse: true; - maximumLength: (definition.type == "str") ? 20 : 10; + maximumLength: (definition.type == "[int]") ? 20 : 10; - validator: RegExpValidator { regExp: (definition.type == "str") ? /^.{0,20}$/ : (definition.type == "int") ? /^-?[0-9]{0,10}$/ : /^-?[0-9]{0,9}[.,]?[0-9]{0,10}$/ } // definition.type property from parent loader used to disallow fractional number entry + validator: RegExpValidator { regExp: (definition.type == "[int]") ? /^\[(\s*-?[0-9]+\s*,)*(\s*-?[0-9]+)\s*\]$/ : (definition.type == "int") ? /^-?[0-9]{0,10}$/ : /^-?[0-9]{0,9}[.,]?[0-9]{0,10}$/ } // definition.type property from parent loader used to disallow fractional number entry Binding { diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 24022891c3..7138d4acd3 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -217,6 +217,8 @@ Item { case "int": return "SettingTextField.qml" + case "[int]": + return "SettingTextField.qml" case "float": return "SettingTextField.qml" case "enum": From afc75b6c3e5af11636ea9fe64d845f73af713457 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Fri, 27 Jan 2017 15:54:58 +0000 Subject: [PATCH 008/146] Now uses the [int] setting type. The default value is [ ] (an empty list). --- resources/definitions/fdmprinter.def.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index ffabf9a7d5..4f39be7462 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1089,9 +1089,9 @@ "infill_angles": { "label": "Infill Line Directions", - "description": "A comma separated list of line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. Default is empty which means use the traditional default angles (45 and 135 degrees for the lines and zig zag patterns and 45 degrees for all other patterns).", - "type": "str", - "default_value": "", + "description": "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees for the lines and zig zag patterns and 45 degrees for all other patterns).", + "type": "[int]", + "default_value": "[ ]", "settable_per_mesh": true }, "sub_div_rad_mult": From 27a52092d301121e439097777614529ba28a4dcd Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Fri, 27 Jan 2017 15:55:22 +0000 Subject: [PATCH 009/146] Add the skin_angles setting which is analogous to the infill_angles setting. --- resources/definitions/fdmprinter.def.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 4f39be7462..adf909a644 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -905,6 +905,14 @@ "value": "top_bottom_pattern", "settable_per_mesh": true }, + "skin_angles": + { + "label": "Top/Bottom Line Directions", + "description": "A list of integer line directions to use when the top/bottom layers use the lines or zig zag pattern. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees).", + "type": "[int]", + "default_value": "[ ]", + "settable_per_mesh": true + }, "wall_0_inset": { "label": "Outer Wall Inset", From b1d95f3464ab5511deb7ff484cb35bcd01bd93f1 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 30 Jan 2017 11:24:51 +0100 Subject: [PATCH 010/146] Layout Layer View menu, removed item, changed size. CURA-3321 --- plugins/LayerView/LayerView.py | 2 +- plugins/LayerView/LayerView.qml | 76 ++++++++++++++++++++++++++------ resources/themes/cura/theme.json | 3 ++ 3 files changed, 66 insertions(+), 15 deletions(-) diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py index 15a79c4412..54854c7618 100644 --- a/plugins/LayerView/LayerView.py +++ b/plugins/LayerView/LayerView.py @@ -60,7 +60,7 @@ class LayerView(View): self._controller.getScene().getRoot().childrenChanged.connect(self._onSceneChanged) self._layer_view_type = 0 # 0 is material color, 1 is color by linetype, 2 is speed - self._only_color_active_extruder = True + self._only_color_active_extruder = False self._extruder_opacity = [1.0, 1.0, 1.0, 1.0] self._show_travel_moves = 0 self._show_support = 1 diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 6dc74a3c3b..90e2528c87 100644 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -148,16 +148,26 @@ Item Rectangle { anchors.left: parent.right //anchors.verticalCenter: parent.verticalCenter - //anchors.top: toolbar.top + //anchors.top: sidebar.top anchors.bottom: slider_background.top //anchors.topMargin: UM.Theme.getSize("default_margin").height anchors.leftMargin: UM.Theme.getSize("default_margin").width - width: UM.Theme.getSize("slider_layerview_background").width * 4 - height: slider.height + UM.Theme.getSize("default_margin").height * 10 + width: UM.Theme.getSize("layerview_menu_size").width + height: UM.Theme.getSize("layerview_menu_size").height color: UM.Theme.getColor("tool_panel_background"); border.width: UM.Theme.getSize("default_lining").width border.color: UM.Theme.getColor("lining") + Label + { + id: layerViewTypesLabel + anchors.top: parent.top + anchors.topMargin: UM.Theme.getSize("default_margin").height + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + text: catalog.i18nc("@label","Color scheme") + } + ListModel { id: layerViewTypes @@ -173,12 +183,57 @@ Item ComboBox { - id: layer_type_combobox - anchors.top: parent.top + id: layerTypeCombobox + anchors.top: layerViewTypesLabel.bottom + anchors.topMargin: UM.Theme.getSize("margin_small").height + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("default_margin").width + model: layerViewTypes + visible: !UM.LayerView.compatibilityMode + onActivated: { + UM.LayerView.setLayerViewType(layerViewTypes.get(index).type_id); + } + } + + Label + { + id: layerRangeTypeLabel + anchors.top: layerTypeCombobox.bottom anchors.topMargin: UM.Theme.getSize("default_margin").height anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("default_margin").width - model: layerViewTypes + text: catalog.i18nc("@label","Layer range") + } + + ListModel + { + id: layerRangeTypes + ListElement { + text: "All layers" + range_type_id: 0 + } + ListElement { + text: "Layer range" + range_type_id: 1 + } + ListElement { + text: "Single layer" + range_type_id: 2 + } + } + + ComboBox + { + id: layerRangeTypeCombobox + anchors.top: layerRangeTypeLabel.bottom + anchors.topMargin: UM.Theme.getSize("margin_small").height + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("default_margin").width + model: layerRangeTypes visible: !UM.LayerView.compatibilityMode onActivated: { UM.LayerView.setLayerViewType(layerViewTypes.get(index).type_id); @@ -195,7 +250,7 @@ Item ColumnLayout { id: view_settings - anchors.top: layer_type_combobox.bottom + anchors.top: layerRangeTypeCombobox.bottom anchors.topMargin: UM.Theme.getSize("default_margin").height x: UM.Theme.getSize("default_margin").width @@ -249,13 +304,6 @@ Item } text: "Show infill" } - CheckBox { - checked: true - onClicked: { - UM.LayerView.setOnlyColorActiveExtruder(checked); - } - text: "Only color active extruder" - } } } } diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index 31caeeabd4..9349d8858f 100644 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -239,6 +239,7 @@ "default_lining": [0.08, 0.08], "default_arrow": [0.8, 0.8], "logo": [9.5, 2.0], + "margin_small": [0.5, 0.5], "sidebar": [35.0, 10.0], "sidebar_header": [0.0, 4.0], @@ -287,6 +288,8 @@ "slider_layerview_background": [4.0, 0.0], "slider_layerview_margin": [3.0, 3.0], + "layerview_menu_size": [16.0, 25.0], + "checkbox": [2.0, 2.0], "tooltip": [20.0, 10.0], From 5817905459d7b7f12e4161a3db0fdd876b34de3a Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Tue, 31 Jan 2017 18:47:27 +0000 Subject: [PATCH 011/146] Added anchor_skin_in_infill setting. When enabled, skin areas are increased in size so that they project into the infill by at least the distance between infill lines. --- resources/definitions/fdmprinter.def.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index f6cb2060c6..825686640e 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1240,6 +1240,14 @@ "minimum_value": "0", "default_value": 0, "settable_per_mesh": true + }, + "anchor_skin_in_infill": + { + "label": "Anchor Skin In Infill", + "description": "Expand skin areas so that they are anchored by the infill layers above and below. The skin areas are expanded sufficiently so that they bridge the gap between the infill lines.", + "type": "bool", + "default_value": false, + "settable_per_mesh": true } } }, From 45dc52de1639702f52b87659177941cf275847f9 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Wed, 1 Feb 2017 08:37:20 +0000 Subject: [PATCH 012/146] Provide separate settings for anchoring upper and lower skins in infill. Just expanding the upper skins into the infill is probably sufficient for most situations but if users want a symmetrical structure then expanding lower skins too could be useful. Users will need to experiment to get the desired results for a given model. --- resources/definitions/fdmprinter.def.json | 27 ++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 825686640e..ab00f55ef6 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1241,13 +1241,34 @@ "default_value": 0, "settable_per_mesh": true }, - "anchor_skin_in_infill": + "anchor_skins_in_infill": { - "label": "Anchor Skin In Infill", + "label": "Anchor Skins In Infill", "description": "Expand skin areas so that they are anchored by the infill layers above and below. The skin areas are expanded sufficiently so that they bridge the gap between the infill lines.", "type": "bool", "default_value": false, - "settable_per_mesh": true + "settable_per_mesh": true, + "children": + { + "anchor_upper_skin_in_infill": + { + "label": "Anchor Upper Skin In Infill", + "description": "Expand upper skin areas (areas with air above) so that they are anchored by the infill layers above and below. The skin areas are expanded sufficiently so that they bridge the gap between the infill lines.", + "type": "bool", + "default_value": false, + "value": "anchor_skins_in_infill", + "settable_per_mesh": true + }, + "anchor_lower_skin_in_infill": + { + "label": "Anchor Lower Skin In Infill", + "description": "Expand lower skin areas (areas with air below) so that they are anchored by the infill layers above and below. The skin areas are expanded sufficiently so that they bridge the gap between the infill lines.", + "type": "bool", + "default_value": false, + "value": "anchor_skins_in_infill", + "settable_per_mesh": true + } + } } } }, From eabfb797d68b117e77a87daa6f79e580b3ecfa25 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Wed, 1 Feb 2017 12:54:35 +0000 Subject: [PATCH 013/146] Add anchor_skin_distance setting and tweak descriptions of related settings. Now, the user can control how far the skins are expanded into the infill. --- resources/definitions/fdmprinter.def.json | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index ab00f55ef6..fe2809b872 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1244,7 +1244,7 @@ "anchor_skins_in_infill": { "label": "Anchor Skins In Infill", - "description": "Expand skin areas so that they are anchored by the infill layers above and below. The skin areas are expanded sufficiently so that they bridge the gap between the infill lines.", + "description": "Expand skin areas into the infill behind walls. By default, skins stop when they reach the wall lines that surround infill. This setting extends the skins beyond the wall lines so that the skins become anchored in the infill.", "type": "bool", "default_value": false, "settable_per_mesh": true, @@ -1253,7 +1253,7 @@ "anchor_upper_skin_in_infill": { "label": "Anchor Upper Skin In Infill", - "description": "Expand upper skin areas (areas with air above) so that they are anchored by the infill layers above and below. The skin areas are expanded sufficiently so that they bridge the gap between the infill lines.", + "description": "Expand upper skin areas (areas with air above) so that they are anchored by the infill layers above and below.", "type": "bool", "default_value": false, "value": "anchor_skins_in_infill", @@ -1262,11 +1262,22 @@ "anchor_lower_skin_in_infill": { "label": "Anchor Lower Skin In Infill", - "description": "Expand lower skin areas (areas with air below) so that they are anchored by the infill layers above and below. The skin areas are expanded sufficiently so that they bridge the gap between the infill lines.", + "description": "Expand lower skin areas (areas with air below) so that they are anchored by the infill layers above and below.", "type": "bool", "default_value": false, "value": "anchor_skins_in_infill", "settable_per_mesh": true + }, + "anchor_skin_distance": + { + "label": "Anchor Skin Distance", + "description": "The distance the skins are expanded into the infill. The default value is sufficient to bridge the gap between the infill lines.", + "unit": "mm", + "type": "float", + "default_value": 1.0, + "value": "infill_line_distance * 1.4", + "minimum_value": "0", + "settable_per_mesh": true } } } From 9dd61ba094e15491d17189bd2f3602be0795cf4f Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Thu, 2 Feb 2017 10:44:25 +0000 Subject: [PATCH 014/146] Added combing_retract_before_outer_wall setting. This boolean setting controls whether travel moves to the first point in an outer wall will always involve a retraction. IMHO, forcing a retraction has two benefits: 1 - avoids taking the ooze that would occur during the travel to the outer surface. 2 - the slight pause when un-retracting could help reduce any ripples introduced by the rapid movement hot-end movement. --- resources/definitions/fdmprinter.def.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index b19c97b793..1a1eea4227 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2418,6 +2418,16 @@ "settable_per_mesh": false, "settable_per_extruder": false }, + "combing_retract_before_outer_wall": + { + "label": "Retract Before Outer Wall", + "description": "When combing is enabled, always retract when moving to start an outer wall.", + "type": "bool", + "default_value": false, + "enabled": "resolveOrValue('retraction_combing') != 'off'", + "settable_per_mesh": false, + "settable_per_extruder": true + }, "travel_avoid_other_parts": { "label": "Avoid Printed Parts When Traveling", From d5ea0f0bc2b7ea9f89344fa0861f467f94429d29 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Thu, 2 Feb 2017 11:18:52 +0000 Subject: [PATCH 015/146] Don't let combing_retract_before_outer_wall be settable per extruder. Combing mode isn't, so why should this be? --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 1a1eea4227..8c2d0cc1e3 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2426,7 +2426,7 @@ "default_value": false, "enabled": "resolveOrValue('retraction_combing') != 'off'", "settable_per_mesh": false, - "settable_per_extruder": true + "settable_per_extruder": false }, "travel_avoid_other_parts": { From a3326a83137bd33db107103e476208103f57750c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 2 Feb 2017 15:54:44 +0100 Subject: [PATCH 016/146] 3mf reader now uses libSavitar for loading This greatly decreases (~factor 10) the time required to load 3mf files CURA-3215 --- plugins/3MFReader/ThreeMFReader.py | 132 ++++++++++++++++++++--------- 1 file changed, 90 insertions(+), 42 deletions(-) diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index 0f4ab532fa..2595f8affa 100644 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -18,6 +18,9 @@ from cura.Settings.ExtruderManager import ExtruderManager from cura.QualityManager import QualityManager from UM.Scene.SceneNode import SceneNode +import Savitar +import numpy + try: import xml.etree.cElementTree as ET except ImportError: @@ -129,6 +132,9 @@ class ThreeMFReader(MeshReader): return node def _createMatrixFromTransformationString(self, transformation): + if transformation == "": + return Matrix() + splitted_transformation = transformation.split() ## Transformation is saved as: ## M00 M01 M02 0.0 @@ -155,51 +161,92 @@ class ThreeMFReader(MeshReader): return temp_mat + def _convertSavitarNodeToUMNode(self, savitar_node): + um_node = SceneNode() + transformation = self._createMatrixFromTransformationString(savitar_node.getTransformation()) + um_node.setTransformation(transformation) + mesh_builder = MeshBuilder() + + data = numpy.fromstring(savitar_node.getMeshData().getFlatVerticesAsBytes(), dtype=numpy.float32) + + vertices = numpy.resize(data, (int(data.size / 3), 3)) + mesh_builder.setVertices(vertices) + mesh_builder.calculateNormals(fast=True) + mesh_data = mesh_builder.build() + + if len(mesh_data.getVertices()): + um_node.setMeshData(mesh_data) + + for child in savitar_node.getChildren(): + um_node.addChild(self._convertSavitarNodeToUMNode(child)) + settings = savitar_node.getSettings() + + # Add the setting override decorator, so we can add settings to this node. + if settings: + um_node.addDecorator(SettingOverrideDecorator()) + + global_container_stack = Application.getInstance().getGlobalContainerStack() + # Ensure the correct next container for the SettingOverride decorator is set. + if global_container_stack: + multi_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1 + + # Ensure that all extruder data is reset + if not multi_extrusion: + default_stack_id = global_container_stack.getId() + else: + default_stack = ExtruderManager.getInstance().getExtruderStack(0) + if default_stack: + default_stack_id = default_stack.getId() + else: + default_stack_id = global_container_stack.getId() + um_node.callDecoration("setActiveExtruder", default_stack_id) + + # Get the definition & set it + definition = QualityManager.getInstance().getParentMachineDefinition(global_container_stack.getBottom()) + um_node.callDecoration("getStack").getTop().setDefinition(definition) + + setting_container = um_node.callDecoration("getStack").getTop() + + for key in settings: + setting_value = settings[key] + + # Extruder_nr is a special case. + if key == "extruder_nr": + extruder_stack = ExtruderManager.getInstance().getExtruderStack(int(setting_value)) + if extruder_stack: + um_node.callDecoration("setActiveExtruder", extruder_stack.getId()) + else: + Logger.log("w", "Unable to find extruder in position %s", setting_value) + continue + setting_container.setProperty(key,"value", setting_value) + + if len(um_node.getChildren()) > 0: + group_decorator = GroupDecorator() + um_node.addDecorator(group_decorator) + um_node.setSelectable(True) + return um_node + def read(self, file_name): result = [] # The base object of 3mf is a zipped archive. - archive = zipfile.ZipFile(file_name, "r") - self._base_name = os.path.basename(file_name) try: - self._root = ET.parse(archive.open("3D/3dmodel.model")) - self._unit = self._root.getroot().get("unit") - - build_items = self._root.findall("./3mf:build/3mf:item", self._namespaces) - - for build_item in build_items: - id = build_item.get("objectid") - object = self._root.find("./3mf:resources/3mf:object[@id='{0}']".format(id), self._namespaces) - if "type" in object.attrib: - if object.attrib["type"] == "support" or object.attrib["type"] == "other": - # Ignore support objects, as cura does not support these. - # We can't guarantee that they wont be made solid. - # We also ignore "other", as I have no idea what to do with them. - Logger.log("w", "3MF file contained an object of type %s which is not supported by Cura", object.attrib["type"]) - continue - elif object.attrib["type"] == "solidsupport" or object.attrib["type"] == "model": - pass # Load these as normal - else: - # We should technically fail at this point because it's an invalid 3MF, but try to continue anyway. - Logger.log("e", "3MF file contained an object of type %s which is not supported by the 3mf spec", - object.attrib["type"]) - continue - - build_item_node = self._createNodeFromObject(object, self._base_name + "_" + str(id)) - + archive = zipfile.ZipFile(file_name, "r") + self._base_name = os.path.basename(file_name) + parser = Savitar.ThreeMFParser() + scene_3mf = parser.parse(archive.open("3D/3dmodel.model").read()) + self._unit = scene_3mf.getUnit() + for node in scene_3mf.getSceneNodes(): + um_node = self._convertSavitarNodeToUMNode(node) # compensate for original center position, if object(s) is/are not around its zero position + transform_matrix = Matrix() - mesh_data = build_item_node.getMeshData() + mesh_data = um_node.getMeshData() if mesh_data is not None: extents = mesh_data.getExtents() center_vector = Vector(extents.center.x, extents.center.y, extents.center.z) transform_matrix.setByTranslation(center_vector) - - # offset with transform from 3mf - transform = build_item.get("transform") - if transform is not None: - transform_matrix.multiply(self._createMatrixFromTransformationString(transform)) - - build_item_node.setTransformation(transform_matrix) + transform_matrix.multiply(um_node.getLocalTransformation()) + um_node.setTransformation(transform_matrix) global_container_stack = UM.Application.getInstance().getGlobalContainerStack() @@ -214,9 +261,9 @@ class ThreeMFReader(MeshReader): # Second step: 3MF defines the left corner of the machine as center, whereas cura uses the center of the # build volume. if global_container_stack: - translation_vector = Vector(x = -global_container_stack.getProperty("machine_width", "value") / 2, - y = -global_container_stack.getProperty("machine_depth", "value") / 2, - z = 0) + translation_vector = Vector(x=-global_container_stack.getProperty("machine_width", "value") / 2, + y=-global_container_stack.getProperty("machine_depth", "value") / 2, + z=0) translation_matrix = Matrix() translation_matrix.setByTranslation(translation_vector) transformation_matrix.multiply(translation_matrix) @@ -227,12 +274,13 @@ class ThreeMFReader(MeshReader): transformation_matrix.multiply(scale_matrix) # Pre multiply the transformation with the loaded transformation, so the data is handled correctly. - build_item_node.setTransformation(build_item_node.getLocalTransformation().preMultiply(transformation_matrix)) + um_node.setTransformation(um_node.getLocalTransformation().preMultiply(transformation_matrix)) - result.append(build_item_node) + result.append(um_node) - except Exception as e: - Logger.log("e", "An exception occurred in 3mf reader: %s", e) + except Exception: + Logger.logException("e", "An exception occurred in 3mf reader.") + return [] return result From b83537f27d828ff7e74b67763f6696ff758ece09 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Sun, 5 Feb 2017 15:58:42 +0000 Subject: [PATCH 017/146] Hide children of anchor_skins_in_infill when it isn't enabled. --- resources/definitions/fdmprinter.def.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index fe2809b872..c90f17edb6 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1257,6 +1257,7 @@ "type": "bool", "default_value": false, "value": "anchor_skins_in_infill", + "enabled": "anchor_skins_in_infill", "settable_per_mesh": true }, "anchor_lower_skin_in_infill": @@ -1266,6 +1267,7 @@ "type": "bool", "default_value": false, "value": "anchor_skins_in_infill", + "enabled": "anchor_skins_in_infill", "settable_per_mesh": true }, "anchor_skin_distance": @@ -1277,6 +1279,7 @@ "default_value": 1.0, "value": "infill_line_distance * 1.4", "minimum_value": "0", + "enabled": "anchor_skins_in_infill", "settable_per_mesh": true } } From 495a73e9762f568072b4ff6c053b30014e076e2e Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Mon, 6 Feb 2017 08:44:25 +0000 Subject: [PATCH 018/146] Tweaked descriptions of anchor_skin_in_infill and anchor_skin_distance. --- resources/definitions/fdmprinter.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index c90f17edb6..bbb9d14e8d 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1244,7 +1244,7 @@ "anchor_skins_in_infill": { "label": "Anchor Skins In Infill", - "description": "Expand skin areas into the infill behind walls. By default, skins stop when they reach the wall lines that surround infill. This setting extends the skins beyond the wall lines so that the skins become anchored in the infill.", + "description": "Expand skin areas into the infill behind walls. By default, skins stop under the wall lines that surround infill but this can lead to holes appearing when the infill density is low. This setting extends the skins beyond the wall lines so that the skins become anchored in the infill.", "type": "bool", "default_value": false, "settable_per_mesh": true, @@ -1273,7 +1273,7 @@ "anchor_skin_distance": { "label": "Anchor Skin Distance", - "description": "The distance the skins are expanded into the infill. The default value is sufficient to bridge the gap between the infill lines.", + "description": "The distance the skins are expanded into the infill. The default distance is enough to bridge the gap between the infill lines and will stop holes appearing in the skin where it meets the wall when the infill density is low. A smaller distance will often be sufficient.", "unit": "mm", "type": "float", "default_value": 1.0, From b6118a764e28326aaf9ebc97acd4847dcd60ad77 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 6 Feb 2017 14:13:20 +0100 Subject: [PATCH 019/146] Updated documentation CURA-3215 --- plugins/3MFReader/ThreeMFReader.py | 95 ++---------------------------- 1 file changed, 4 insertions(+), 91 deletions(-) diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index 2595f8affa..bfa9d2764b 100644 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -40,97 +40,6 @@ class ThreeMFReader(MeshReader): self._base_name = "" self._unit = None - def _createNodeFromObject(self, object, name = ""): - node = SceneNode() - node.setName(name) - mesh_builder = MeshBuilder() - vertex_list = [] - - components = object.find(".//3mf:components", self._namespaces) - if components: - for component in components: - id = component.get("objectid") - new_object = self._root.find("./3mf:resources/3mf:object[@id='{0}']".format(id), self._namespaces) - new_node = self._createNodeFromObject(new_object, self._base_name + "_" + str(id)) - node.addChild(new_node) - transform = component.get("transform") - if transform is not None: - new_node.setTransformation(self._createMatrixFromTransformationString(transform)) - - # for vertex in entry.mesh.vertices.vertex: - for vertex in object.findall(".//3mf:vertex", self._namespaces): - vertex_list.append([vertex.get("x"), vertex.get("y"), vertex.get("z")]) - Job.yieldThread() - - xml_settings = list(object.findall(".//cura:setting", self._namespaces)) - - # Add the setting override decorator, so we can add settings to this node. - if xml_settings: - node.addDecorator(SettingOverrideDecorator()) - - global_container_stack = Application.getInstance().getGlobalContainerStack() - # Ensure the correct next container for the SettingOverride decorator is set. - if global_container_stack: - multi_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1 - # Ensure that all extruder data is reset - if not multi_extrusion: - default_stack_id = global_container_stack.getId() - else: - default_stack = ExtruderManager.getInstance().getExtruderStack(0) - if default_stack: - default_stack_id = default_stack.getId() - else: - default_stack_id = global_container_stack.getId() - node.callDecoration("setActiveExtruder", default_stack_id) - - # Get the definition & set it - definition = QualityManager.getInstance().getParentMachineDefinition(global_container_stack.getBottom()) - node.callDecoration("getStack").getTop().setDefinition(definition) - - setting_container = node.callDecoration("getStack").getTop() - for setting in xml_settings: - setting_key = setting.get("key") - setting_value = setting.text - - # Extruder_nr is a special case. - if setting_key == "extruder_nr": - extruder_stack = ExtruderManager.getInstance().getExtruderStack(int(setting_value)) - if extruder_stack: - node.callDecoration("setActiveExtruder", extruder_stack.getId()) - else: - Logger.log("w", "Unable to find extruder in position %s", setting_value) - continue - setting_container.setProperty(setting_key,"value", setting_value) - - if len(node.getChildren()) > 0: - group_decorator = GroupDecorator() - node.addDecorator(group_decorator) - - triangles = object.findall(".//3mf:triangle", self._namespaces) - mesh_builder.reserveFaceCount(len(triangles)) - - for triangle in triangles: - v1 = int(triangle.get("v1")) - v2 = int(triangle.get("v2")) - v3 = int(triangle.get("v3")) - - mesh_builder.addFaceByPoints(vertex_list[v1][0], vertex_list[v1][1], vertex_list[v1][2], - vertex_list[v2][0], vertex_list[v2][1], vertex_list[v2][2], - vertex_list[v3][0], vertex_list[v3][1], vertex_list[v3][2]) - - Job.yieldThread() - - # TODO: We currently do not check for normals and simply recalculate them. - mesh_builder.calculateNormals(fast=True) - mesh_builder.setFileName(name) - mesh_data = mesh_builder.build() - - if len(mesh_data.getVertices()): - node.setMeshData(mesh_data) - - node.setSelectable(True) - return node - def _createMatrixFromTransformationString(self, transformation): if transformation == "": return Matrix() @@ -161,6 +70,9 @@ class ThreeMFReader(MeshReader): return temp_mat + + ## Convenience function that converts a SceneNode object (as obtained from libSavitar) to a Uranium scenenode. + # \returns Uranium Scenen node. def _convertSavitarNodeToUMNode(self, savitar_node): um_node = SceneNode() transformation = self._createMatrixFromTransformationString(savitar_node.getTransformation()) @@ -179,6 +91,7 @@ class ThreeMFReader(MeshReader): for child in savitar_node.getChildren(): um_node.addChild(self._convertSavitarNodeToUMNode(child)) + settings = savitar_node.getSettings() # Add the setting override decorator, so we can add settings to this node. From 4dc70cc2b129dcf4ff6a0254fcbb86e41dcc31cd Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 6 Feb 2017 14:14:03 +0100 Subject: [PATCH 020/146] 3MF writer now also uses libSavitar CURA-3215 --- plugins/3MFWriter/ThreeMFWriter.py | 185 ++++++++++++----------------- 1 file changed, 75 insertions(+), 110 deletions(-) diff --git a/plugins/3MFWriter/ThreeMFWriter.py b/plugins/3MFWriter/ThreeMFWriter.py index 764c73b1f0..f7ea04ed0d 100644 --- a/plugins/3MFWriter/ThreeMFWriter.py +++ b/plugins/3MFWriter/ThreeMFWriter.py @@ -6,6 +6,11 @@ from UM.Math.Vector import Vector from UM.Logger import Logger from UM.Math.Matrix import Matrix from UM.Application import Application +import UM.Scene.SceneNode + +import Savitar + +import numpy try: import xml.etree.cElementTree as ET @@ -33,18 +38,18 @@ class ThreeMFWriter(MeshWriter): def _convertMatrixToString(self, matrix): result = "" - result += str(matrix._data[0,0]) + " " - result += str(matrix._data[1,0]) + " " - result += str(matrix._data[2,0]) + " " - result += str(matrix._data[0,1]) + " " - result += str(matrix._data[1,1]) + " " - result += str(matrix._data[2,1]) + " " - result += str(matrix._data[0,2]) + " " - result += str(matrix._data[1,2]) + " " - result += str(matrix._data[2,2]) + " " - result += str(matrix._data[0,3]) + " " - result += str(matrix._data[1,3]) + " " - result += str(matrix._data[2,3]) + result += str(matrix._data[0, 0]) + " " + result += str(matrix._data[1, 0]) + " " + result += str(matrix._data[2, 0]) + " " + result += str(matrix._data[0, 1]) + " " + result += str(matrix._data[1, 1]) + " " + result += str(matrix._data[2, 1]) + " " + result += str(matrix._data[0, 2]) + " " + result += str(matrix._data[1, 2]) + " " + result += str(matrix._data[2, 2]) + " " + result += str(matrix._data[0, 3]) + " " + result += str(matrix._data[1, 3]) + " " + result += str(matrix._data[2, 3]) return result ## Should we store the archive @@ -53,6 +58,48 @@ class ThreeMFWriter(MeshWriter): def setStoreArchive(self, store_archive): self._store_archive = store_archive + ## Convenience function that converts an Uranium SceneNode object to a SavitarSceneNode + # \returns Uranium Scenen node. + def _convertUMNodeToSavitarNode(self, um_node, transformation = Matrix()): + if type(um_node) is not UM.Scene.SceneNode.SceneNode: + return None + + savitar_node = Savitar.SceneNode() + + node_matrix = um_node.getLocalTransformation() + + matrix_string = self._convertMatrixToString(node_matrix.preMultiply(transformation)) + + savitar_node.setTransformation(matrix_string) + mesh_data = um_node.getMeshData() + if mesh_data is not None: + savitar_node.getMeshData().setVerticesFromBytes(mesh_data.getVerticesAsByteArray()) + indices_array = mesh_data.getIndicesAsByteArray() + if indices_array is not None: + savitar_node.getMeshData().setFacesFromBytes(indices_array) + else: + savitar_node.getMeshData().setFacesFromBytes(numpy.arange(mesh_data.getVertices().size / 3, dtype=numpy.int32).tostring()) + + # Handle per object settings (if any) + stack = um_node.callDecoration("getStack") + if stack is not None: + changed_setting_keys = set(stack.getTop().getAllKeys()) + + # Ensure that we save the extruder used for this object. + if stack.getProperty("machine_extruder_count", "value") > 1: + changed_setting_keys.add("extruder_nr") + + # Get values for all changed settings & save them. + for key in changed_setting_keys: + savitar_node.setSetting(key, str(stack.getProperty(key, "value"))) + + for child_node in um_node.getChildren(): + savitar_child_node = self._convertUMNodeToSavitarNode(child_node) + if savitar_child_node is not None: + savitar_node.addChild(savitar_child_node) + + return savitar_node + def getArchive(self): return self._archive @@ -77,98 +124,7 @@ class ThreeMFWriter(MeshWriter): relations_element = ET.Element("Relationships", xmlns = self._namespaces["relationships"]) model_relation_element = ET.SubElement(relations_element, "Relationship", Target = "/3D/3dmodel.model", Id = "rel0", Type = "http://schemas.microsoft.com/3dmanufacturing/2013/01/3dmodel") - model = ET.Element("model", unit = "millimeter", xmlns = self._namespaces["3mf"]) - model.set("xmlns:cura", self._namespaces["cura"]) - - # Add the version of Cura this was created with. Since there is no "version" or similar metadata name we need - # to prefix it with the cura namespace, as specified by the 3MF specification. - version_metadata = ET.SubElement(model, "metadata", name = "cura:version") - version_metadata.text = Application.getInstance().getVersion() - - resources = ET.SubElement(model, "resources") - build = ET.SubElement(model, "build") - - added_nodes = [] - index = 0 # Ensure index always exists (even if there are no nodes to write) - # Write all nodes with meshData to the file as objects inside the resource tag - for index, n in enumerate(MeshWriter._meshNodes(nodes)): - added_nodes.append(n) # Save the nodes that have mesh data - object = ET.SubElement(resources, "object", id = str(index+1), type = "model") - mesh = ET.SubElement(object, "mesh") - - mesh_data = n.getMeshData() - vertices = ET.SubElement(mesh, "vertices") - verts = mesh_data.getVertices() - - if verts is None: - Logger.log("d", "3mf writer can't write nodes without mesh data. Skipping this node.") - continue # No mesh data, nothing to do. - if mesh_data.hasIndices(): - for face in mesh_data.getIndices(): - v1 = verts[face[0]] - v2 = verts[face[1]] - v3 = verts[face[2]] - xml_vertex1 = ET.SubElement(vertices, "vertex", x = str(v1[0]), y = str(v1[1]), z = str(v1[2])) - xml_vertex2 = ET.SubElement(vertices, "vertex", x = str(v2[0]), y = str(v2[1]), z = str(v2[2])) - xml_vertex3 = ET.SubElement(vertices, "vertex", x = str(v3[0]), y = str(v3[1]), z = str(v3[2])) - - triangles = ET.SubElement(mesh, "triangles") - for face in mesh_data.getIndices(): - triangle = ET.SubElement(triangles, "triangle", v1 = str(face[0]) , v2 = str(face[1]), v3 = str(face[2])) - else: - triangles = ET.SubElement(mesh, "triangles") - for idx, vert in enumerate(verts): - xml_vertex = ET.SubElement(vertices, "vertex", x = str(vert[0]), y = str(vert[1]), z = str(vert[2])) - - # If we have no faces defined, assume that every three subsequent vertices form a face. - if idx % 3 == 0: - triangle = ET.SubElement(triangles, "triangle", v1 = str(idx), v2 = str(idx + 1), v3 = str(idx + 2)) - - # Handle per object settings - stack = n.callDecoration("getStack") - if stack is not None: - changed_setting_keys = set(stack.getTop().getAllKeys()) - - # Ensure that we save the extruder used for this object. - if stack.getProperty("machine_extruder_count", "value") > 1: - changed_setting_keys.add("extruder_nr") - - settings_xml = ET.SubElement(object, "settings", xmlns=self._namespaces["cura"]) - - # Get values for all changed settings & save them. - for key in changed_setting_keys: - setting_xml = ET.SubElement(settings_xml, "setting", key = key) - setting_xml.text = str(stack.getProperty(key, "value")) - - # Add one to the index as we haven't incremented the last iteration. - index += 1 - nodes_to_add = set() - - for node in added_nodes: - # Check the parents of the nodes with mesh_data and ensure that they are also added. - parent_node = node.getParent() - while parent_node is not None: - if parent_node.callDecoration("isGroup"): - nodes_to_add.add(parent_node) - parent_node = parent_node.getParent() - else: - parent_node = None - - # Sort all the nodes by depth (so nodes with the highest depth are done first) - sorted_nodes_to_add = sorted(nodes_to_add, key=lambda node: node.getDepth(), reverse = True) - - # We have already saved the nodes with mesh data, but now we also want to save nodes required for the scene - for node in sorted_nodes_to_add: - object = ET.SubElement(resources, "object", id=str(index + 1), type="model") - components = ET.SubElement(object, "components") - for child in node.getChildren(): - if child in added_nodes: - component = ET.SubElement(components, "component", objectid = str(added_nodes.index(child) + 1), transform = self._convertMatrixToString(child.getLocalTransformation())) - index += 1 - added_nodes.append(node) - - # Create a transformation Matrix to convert from our worldspace into 3MF. - # First step: flip the y and z axis. + savitar_scene = Savitar.Scene() transformation_matrix = Matrix() transformation_matrix._data[1, 1] = 0 transformation_matrix._data[1, 2] = -1 @@ -186,14 +142,23 @@ class ThreeMFWriter(MeshWriter): translation_matrix.setByTranslation(translation_vector) transformation_matrix.preMultiply(translation_matrix) - # Find out what the final build items are and add them. - for node in added_nodes: - if node.getParent().callDecoration("isGroup") is None: - node_matrix = node.getLocalTransformation() - ET.SubElement(build, "item", objectid = str(added_nodes.index(node) + 1), transform = self._convertMatrixToString(node_matrix.preMultiply(transformation_matrix))) + root_node = UM.Application.getInstance().getController().getScene().getRoot() + for node in nodes: + if node == root_node: + for root_child in node.getChildren(): + savitar_node = self._convertUMNodeToSavitarNode(root_child, transformation_matrix) + if savitar_node: + savitar_scene.addSceneNode(savitar_node) + else: + savitar_node = self._convertUMNodeToSavitarNode(node, transformation_matrix) + if savitar_node: + savitar_scene.addSceneNode(savitar_node) - archive.writestr(model_file, b' \n' + ET.tostring(model)) + parser = Savitar.ThreeMFParser() + scene_string = parser.sceneToString(savitar_scene).encode('utf-8') + + archive.writestr(model_file, scene_string) archive.writestr(content_types_file, b' \n' + ET.tostring(content_types)) archive.writestr(relations_file, b' \n' + ET.tostring(relations_element)) except Exception as e: From 3d01d7bc548476003351ee6aa50c43862aceaa54 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 6 Feb 2017 14:26:02 +0100 Subject: [PATCH 021/146] Removed unneeded bytearray to string conversion --- plugins/3MFWriter/ThreeMFWriter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/3MFWriter/ThreeMFWriter.py b/plugins/3MFWriter/ThreeMFWriter.py index f7ea04ed0d..00bb8d9942 100644 --- a/plugins/3MFWriter/ThreeMFWriter.py +++ b/plugins/3MFWriter/ThreeMFWriter.py @@ -156,7 +156,7 @@ class ThreeMFWriter(MeshWriter): savitar_scene.addSceneNode(savitar_node) parser = Savitar.ThreeMFParser() - scene_string = parser.sceneToString(savitar_scene).encode('utf-8') + scene_string = parser.sceneToString(savitar_scene) archive.writestr(model_file, scene_string) archive.writestr(content_types_file, b' \n' + ET.tostring(content_types)) From 7681261b03f29e95e2b7055d05fc2b20e5041c4a Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Tue, 7 Feb 2017 09:55:15 +0000 Subject: [PATCH 022/146] Added anchor_skin_shrink_distance. Also, renamed anchor_skin_distance to anchor_skin_expand_distance. The idea behind the shrink distance is that when the slope of the model surface is steep, very slim skin areas are created close to the wall and if they are expanded we end up with skin inside the infill that isn't required. So by shrinking the skin polygons slightly first, the very slim areas are removed before the skin is expanded. The amount to shrink defaults to half the wall width which appears to work OK but may as well make it a setting so that it can be tweaked if required. --- resources/definitions/fdmprinter.def.json | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index bbb9d14e8d..a45a80b544 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1270,9 +1270,9 @@ "enabled": "anchor_skins_in_infill", "settable_per_mesh": true }, - "anchor_skin_distance": + "anchor_skin_expand_distance": { - "label": "Anchor Skin Distance", + "label": "Anchor Skin Expand Distance", "description": "The distance the skins are expanded into the infill. The default distance is enough to bridge the gap between the infill lines and will stop holes appearing in the skin where it meets the wall when the infill density is low. A smaller distance will often be sufficient.", "unit": "mm", "type": "float", @@ -1281,6 +1281,18 @@ "minimum_value": "0", "enabled": "anchor_skins_in_infill", "settable_per_mesh": true + }, + "anchor_skin_shrink_distance": + { + "label": "Anchor Skin Shrink Distance", + "description": "The distance the skins are shrunk before they are expanded. Shrinking the skins slightly first removes the very narrow skin areas that are created when the model surface has a slope close to the vertical.", + "unit": "mm", + "type": "float", + "default_value": 0, + "value": "wall_thickness * 0.5", + "minimum_value": "0", + "enabled": "anchor_skins_in_infill", + "settable_per_mesh": true } } } From 3e8789ae48247bb45a17d103059b656ac98a818e Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Thu, 9 Feb 2017 11:35:54 +0000 Subject: [PATCH 023/146] Renamed anchor_skin settings to equivalent expand_skins settings. Expand skins describes the operation better, the fact that the skins end up getting anchored in the infill is just one benefit of the expansion. --- resources/definitions/fdmprinter.def.json | 32 +++++++++++------------ 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index a45a80b544..ce9cd7a0c5 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1241,57 +1241,57 @@ "default_value": 0, "settable_per_mesh": true }, - "anchor_skins_in_infill": + "expand_skins_into_infill": { - "label": "Anchor Skins In Infill", + "label": "Expand Skins Into Infill", "description": "Expand skin areas into the infill behind walls. By default, skins stop under the wall lines that surround infill but this can lead to holes appearing when the infill density is low. This setting extends the skins beyond the wall lines so that the skins become anchored in the infill.", "type": "bool", "default_value": false, "settable_per_mesh": true, "children": { - "anchor_upper_skin_in_infill": + "expand_upper_skins": { - "label": "Anchor Upper Skin In Infill", + "label": "Expand Upper Skins", "description": "Expand upper skin areas (areas with air above) so that they are anchored by the infill layers above and below.", "type": "bool", "default_value": false, - "value": "anchor_skins_in_infill", - "enabled": "anchor_skins_in_infill", + "value": "expand_skins_into_infill", + "enabled": "expand_skins_into_infill", "settable_per_mesh": true }, - "anchor_lower_skin_in_infill": + "expand_lower_skins": { - "label": "Anchor Lower Skin In Infill", + "label": "Expand Lower Skins", "description": "Expand lower skin areas (areas with air below) so that they are anchored by the infill layers above and below.", "type": "bool", "default_value": false, - "value": "anchor_skins_in_infill", - "enabled": "anchor_skins_in_infill", + "value": "expand_skins_into_infill", + "enabled": "expand_skins_into_infill", "settable_per_mesh": true }, - "anchor_skin_expand_distance": + "expand_skins_expand_distance": { - "label": "Anchor Skin Expand Distance", + "label": "Expand Distance", "description": "The distance the skins are expanded into the infill. The default distance is enough to bridge the gap between the infill lines and will stop holes appearing in the skin where it meets the wall when the infill density is low. A smaller distance will often be sufficient.", "unit": "mm", "type": "float", "default_value": 1.0, "value": "infill_line_distance * 1.4", "minimum_value": "0", - "enabled": "anchor_skins_in_infill", + "enabled": "expand_skins_into_infill", "settable_per_mesh": true }, - "anchor_skin_shrink_distance": + "expand_skins_shrink_distance": { - "label": "Anchor Skin Shrink Distance", + "label": "Shrink Distance", "description": "The distance the skins are shrunk before they are expanded. Shrinking the skins slightly first removes the very narrow skin areas that are created when the model surface has a slope close to the vertical.", "unit": "mm", "type": "float", "default_value": 0, "value": "wall_thickness * 0.5", "minimum_value": "0", - "enabled": "anchor_skins_in_infill", + "enabled": "expand_skins_into_infill", "settable_per_mesh": true } } From c1a770877fe3d834f4370ad6b0d18784aa54ae98 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Sun, 12 Feb 2017 17:48:11 +0000 Subject: [PATCH 024/146] Add "Skin " prefix to "Expand Distance" and "Shrink Distance" labels. It's useful to know what is being expanded/shrunk when those labels are cited (for example if you are switching profiles without saving changes). --- resources/definitions/fdmprinter.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index ce9cd7a0c5..9fe25d7066 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1272,7 +1272,7 @@ }, "expand_skins_expand_distance": { - "label": "Expand Distance", + "label": "Skin Expand Distance", "description": "The distance the skins are expanded into the infill. The default distance is enough to bridge the gap between the infill lines and will stop holes appearing in the skin where it meets the wall when the infill density is low. A smaller distance will often be sufficient.", "unit": "mm", "type": "float", @@ -1284,7 +1284,7 @@ }, "expand_skins_shrink_distance": { - "label": "Shrink Distance", + "label": "Skin Shrink Distance", "description": "The distance the skins are shrunk before they are expanded. Shrinking the skins slightly first removes the very narrow skin areas that are created when the model surface has a slope close to the vertical.", "unit": "mm", "type": "float", From 61e0cd4ff5abbd25aa27a4f18221061ce3ad720d Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 20 Feb 2017 11:09:34 +0100 Subject: [PATCH 025/146] Move legacy options to layerview options --- plugins/LayerView/LayerView.qml | 20 ++++++++++++ resources/qml/Preferences/GeneralPage.qml | 40 ----------------------- 2 files changed, 20 insertions(+), 40 deletions(-) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 66fd6d3f7b..e2581a568c 100644 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -223,6 +223,8 @@ Item view_settings.show_adhesion = UM.Preferences.getValue("layerview/show_adhesion"); view_settings.show_skin = UM.Preferences.getValue("layerview/show_skin"); view_settings.show_infill = UM.Preferences.getValue("layerview/show_infill"); + view_settings.only_show_top_layers = UM.Preferences.getValue("view/only_show_top_layers"); + view_settings.top_layer_count = UM.Preferences.getValue("view/top_layer_count"); } } @@ -238,6 +240,8 @@ Item property bool show_adhesion: UM.Preferences.getValue("layerview/show_adhesion") property bool show_skin: UM.Preferences.getValue("layerview/show_skin") property bool show_infill: UM.Preferences.getValue("layerview/show_infill") + property bool only_show_top_layers: UM.Preferences.getValue("view/only_show_top_layers") + property int top_layer_count: UM.Preferences.getValue("view/only_show_top_layers") anchors.top: UM.LayerView.compatibilityMode ? compatibilityModeLabel.bottom : layerTypeCombobox.bottom anchors.topMargin: UM.Theme.getSize("default_margin").height @@ -315,6 +319,22 @@ Item } text: catalog.i18nc("@label", "Show Infill") } + CheckBox { + checked: view_settings.only_show_top_layers + onClicked: { + UM.Preferences.setValue("view/only_show_top_layers", checked ? 1.0 : 0.0); + } + text: catalog.i18nc("@label", "Only Show Top Layers") + visible: UM.LayerView.compatibilityMode + } + CheckBox { + checked: view_settings.top_layer_count == 5 + onClicked: { + UM.Preferences.setValue("view/top_layer_count", checked ? 5 : 1); + } + text: catalog.i18nc("@label", "Show 5 Detailed Layers On Top") + visible: UM.LayerView.compatibilityMode + } } } } diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index 94b589a636..fc178ec19e 100644 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -45,8 +45,6 @@ UM.PreferencesPage showOverhangCheckbox.checked = boolCheck(UM.Preferences.getValue("view/show_overhang")) UM.Preferences.resetPreference("view/center_on_select"); centerOnSelectCheckbox.checked = boolCheck(UM.Preferences.getValue("view/center_on_select")) - UM.Preferences.resetPreference("view/top_layer_count"); - topLayerCountCheckbox.checked = boolCheck(UM.Preferences.getValue("view/top_layer_count")) if (plugins.find("id", "SliceInfoPlugin") > -1) { UM.Preferences.resetPreference("info/send_slice_info") @@ -232,44 +230,6 @@ UM.PreferencesPage } } - UM.TooltipArea { - width: childrenRect.width; - height: childrenRect.height; - text: catalog.i18nc("@info:tooltip","Display 5 top layers in layer view or only the top-most layer. Rendering 5 layers takes longer, but may show more information.") - - CheckBox - { - id: topLayerCountCheckbox - text: catalog.i18nc("@action:button","Display five top layers in layer view compatibility mode"); - checked: UM.Preferences.getValue("view/top_layer_count") == 5 - onClicked: - { - if(UM.Preferences.getValue("view/top_layer_count") == 5) - { - UM.Preferences.setValue("view/top_layer_count", 1) - } - else - { - UM.Preferences.setValue("view/top_layer_count", 5) - } - } - } - } - - UM.TooltipArea { - width: childrenRect.width - height: childrenRect.height - text: catalog.i18nc("@info:tooltip", "Should only the top layers be displayed in layerview?") - - CheckBox - { - id: topLayersOnlyCheckbox - text: catalog.i18nc("@option:check", "Only display top layer(s) in layer view compatibility mode") - checked: boolCheck(UM.Preferences.getValue("view/only_show_top_layers")) - onCheckedChanged: UM.Preferences.setValue("view/only_show_top_layers", checked) - } - } - UM.TooltipArea { width: childrenRect.width height: childrenRect.height From f8a3c3b0ba9e5c2cca0b152d8027e53471943dc2 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 20 Feb 2017 12:20:54 +0100 Subject: [PATCH 026/146] Factor out repeated extruder visibility checkboxes --- plugins/LayerView/LayerView.py | 16 +++++----- plugins/LayerView/LayerView.qml | 55 ++++++++------------------------- 2 files changed, 21 insertions(+), 50 deletions(-) diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py index fc75026475..63831a4bb8 100644 --- a/plugins/LayerView/LayerView.py +++ b/plugins/LayerView/LayerView.py @@ -73,10 +73,7 @@ class LayerView(View): Preferences.getInstance().addPreference("view/force_layer_view_compatibility_mode", False) Preferences.getInstance().addPreference("layerview/layer_view_type", 0) - Preferences.getInstance().addPreference("layerview/extruder0_opacity", 1.0) - Preferences.getInstance().addPreference("layerview/extruder1_opacity", 1.0) - Preferences.getInstance().addPreference("layerview/extruder2_opacity", 1.0) - Preferences.getInstance().addPreference("layerview/extruder3_opacity", 1.0) + Preferences.getInstance().addPreference("layerview/extruder_opacities", "") Preferences.getInstance().addPreference("layerview/show_travel_moves", False) Preferences.getInstance().addPreference("layerview/show_support", True) @@ -392,10 +389,13 @@ class LayerView(View): self.setLayerViewType(int(float(Preferences.getInstance().getValue("layerview/layer_view_type")))); - self.setExtruderOpacity(0, float(Preferences.getInstance().getValue("layerview/extruder0_opacity"))) - self.setExtruderOpacity(1, float(Preferences.getInstance().getValue("layerview/extruder1_opacity"))) - self.setExtruderOpacity(2, float(Preferences.getInstance().getValue("layerview/extruder2_opacity"))) - self.setExtruderOpacity(3, float(Preferences.getInstance().getValue("layerview/extruder3_opacity"))) + extruder_nr = 0 + for extruder_opacity in Preferences.getInstance().getValue("layerview/extruder_opacities").split(","): + try: + opacity = float(extruder_opacity) + except ValueError: + opacity = 1.0 + self.setExtruderOpacity(extruder_nr, opacity) self.setShowTravelMoves(bool(Preferences.getInstance().getValue("layerview/show_travel_moves"))) self.setShowSupport(bool(Preferences.getInstance().getValue("layerview/show_support"))) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index e2581a568c..f9143a89ad 100644 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -214,10 +214,7 @@ Item onPreferenceChanged: { layerTypeCombobox.layer_view_type = UM.Preferences.getValue("layerview/layer_view_type"); - view_settings.extruder0_checked = UM.Preferences.getValue("layerview/extruder0_opacity") > 0.5; - view_settings.extruder1_checked = UM.Preferences.getValue("layerview/extruder1_opacity") > 0.5; - view_settings.extruder2_checked = UM.Preferences.getValue("layerview/extruder2_opacity") > 0.5; - view_settings.extruder3_checked = UM.Preferences.getValue("layerview/extruder3_opacity") > 0.5; + view_settings.extruder_opacities = UM.Preferences.getValue("layerview/extruder_opacities").split(","); view_settings.show_travel_moves = UM.Preferences.getValue("layerview/show_travel_moves"); view_settings.show_support = UM.Preferences.getValue("layerview/show_support"); view_settings.show_adhesion = UM.Preferences.getValue("layerview/show_adhesion"); @@ -231,10 +228,7 @@ Item ColumnLayout { id: view_settings - property bool extruder0_checked: UM.Preferences.getValue("layerview/extruder0_opacity") > 0.5 - property bool extruder1_checked: UM.Preferences.getValue("layerview/extruder1_opacity") > 0.5 - property bool extruder2_checked: UM.Preferences.getValue("layerview/extruder2_opacity") > 0.5 - property bool extruder3_checked: UM.Preferences.getValue("layerview/extruder3_opacity") > 0.5 + property var extruder_opacities: UM.Preferences.getValue("layerview/extruder_opacities").split(",") property bool show_travel_moves: UM.Preferences.getValue("layerview/show_travel_moves") property bool show_support: UM.Preferences.getValue("layerview/show_support") property bool show_adhesion: UM.Preferences.getValue("layerview/show_adhesion") @@ -248,42 +242,19 @@ Item anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("default_margin").width - CheckBox { - checked: view_settings.extruder0_checked - onClicked: { - UM.Preferences.setValue("layerview/extruder0_opacity", checked ? 1.0 : 0.0); + Repeater { + model: UM.LayerView.extruderCount + CheckBox { + checked: [undefined, ""].indexOf(view_settings.extruder_opacities[index]) >= 0 || view_settings.extruder_opacities[index] > 0.5 + onClicked: { + view_settings.extruder_opacities[index] = checked ? 1.0 : 0.0 + UM.Preferences.setValue("layerview/extruder_opacities", view_settings.extruder_opacities.toString()); + } + text: catalog.i18nc("@label", "Extruder %1").arg(index + 1) + visible: !UM.LayerView.compatibilityMode } - text: "Extruder 1" - visible: !UM.LayerView.compatibilityMode && (UM.LayerView.extruderCount >= 1) - } - CheckBox { - checked: view_settings.extruder1_checked - onClicked: { - UM.Preferences.setValue("layerview/extruder1_opacity", checked ? 1.0 : 0.0); - } - text: "Extruder 2" - visible: !UM.LayerView.compatibilityMode && (UM.LayerView.extruderCount >= 2) - } - CheckBox { - checked: view_settings.extruder2_checked - onClicked: { - UM.Preferences.setValue("layerview/extruder2_opacity", checked ? 1.0 : 0.0); - } - text: "Extruder 3" - visible: !UM.LayerView.compatibilityMode && (UM.LayerView.etruderCount >= 3) - } - CheckBox { - checked: view_settings.extruder3_checked - onClicked: { - UM.Preferences.setValue("layerview/extruder3_opacity", checked ? 1.0 : 0.0); - } - text: "Extruder 4" - visible: !UM.LayerView.compatibilityMode && (UM.LayerView.extruderCount >= 4) - } - Label { - text: "Other extruders always visible" - visible: !UM.LayerView.compatibilityMode && (UM.LayerView.extruderCount >= 5) } + CheckBox { checked: view_settings.show_travel_moves onClicked: { From 26fe46ce1f26f819cbfa8f6f4a6621fc4c501632 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 20 Feb 2017 12:32:49 +0100 Subject: [PATCH 027/146] Translate layerview mode types --- plugins/LayerView/LayerView.qml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index f9143a89ad..be2a0fdd7e 100644 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -160,14 +160,18 @@ Item ListModel // matches LayerView.py { id: layerViewTypes - ListElement { - text: "Material Color" + } + + Component.onCompleted: + { + layerViewTypes.append({ + text: catalog.i18nc("@title:layerview mode", "Material Color"), type_id: 0 - } - ListElement { - text: "Line Type" + }) + layerViewTypes.append({ + text: catalog.i18nc("@title:layerview mode", "Line Type"), type_id: 1 // these ids match the switching in the shader - } + }) } ComboBox From 73253d380704343f530471d0660cc6fb036a3cf3 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 20 Feb 2017 13:19:38 +0100 Subject: [PATCH 028/146] Fix loading opacities from preferences --- plugins/LayerView/LayerView.py | 1 + plugins/LayerView/LayerView.qml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py index 63831a4bb8..828030a076 100644 --- a/plugins/LayerView/LayerView.py +++ b/plugins/LayerView/LayerView.py @@ -396,6 +396,7 @@ class LayerView(View): except ValueError: opacity = 1.0 self.setExtruderOpacity(extruder_nr, opacity) + extruder_nr += 1 self.setShowTravelMoves(bool(Preferences.getInstance().getValue("layerview/show_travel_moves"))) self.setShowSupport(bool(Preferences.getInstance().getValue("layerview/show_support"))) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index be2a0fdd7e..a06a498158 100644 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -249,7 +249,7 @@ Item Repeater { model: UM.LayerView.extruderCount CheckBox { - checked: [undefined, ""].indexOf(view_settings.extruder_opacities[index]) >= 0 || view_settings.extruder_opacities[index] > 0.5 + checked: view_settings.extruder_opacities[index] > 0.5 || view_settings.extruder_opacities[index] == undefined || view_settings.extruder_opacities[index] == "" onClicked: { view_settings.extruder_opacities[index] = checked ? 1.0 : 0.0 UM.Preferences.setValue("layerview/extruder_opacities", view_settings.extruder_opacities.toString()); From 58e15848ebf3bf356c4b042eec2dc6c0ce60357e Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Mon, 20 Feb 2017 13:44:55 +0100 Subject: [PATCH 029/146] feat: machine_nozzle_temp_enabled; refactor: let settings depend on it (rather than on gcode flavor) (CURA-3101) --- resources/definitions/fdmprinter.def.json | 38 ++++++++++++++++------- resources/definitions/ultimaker2.def.json | 3 ++ 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 68f8040df9..100bbcfa07 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -93,6 +93,7 @@ "description": "Whether to wait until the nozzle temperature is reached at the start.", "default_value": true, "type": "bool", + "enabled": "machine_nozzle_temp_enabled", "settable_per_mesh": false, "settable_per_extruder": false, "settable_per_meshgroup": false @@ -103,6 +104,7 @@ "description": "Whether to include nozzle temperature commands at the start of the gcode. When the start_gcode already contains nozzle temperature commands Cura frontend will automatically disable this setting.", "default_value": true, "type": "bool", + "enabled": "machine_nozzle_temp_enabled", "settable_per_mesh": false, "settable_per_extruder": false, "settable_per_meshgroup": false @@ -249,6 +251,17 @@ "settable_per_extruder": true, "settable_per_meshgroup": false }, + "machine_nozzle_temp_enabled": + { + "label": "Enable Nozzle Temperature Control", + "description": "Whether to control temperature from Cura. Turn this off to control nozzle temperature from outside of Cura.", + "default_value": true, + "value": "machine_gcode_flavor != \"UltiGCode\"", + "type": "bool", + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false + }, "machine_nozzle_heat_up_speed": { "label": "Heat up speed", @@ -256,6 +269,7 @@ "default_value": 2.0, "unit": "°C/s", "type": "float", + "enabled": "machine_nozzle_temp_enabled", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -266,6 +280,7 @@ "default_value": 2.0, "unit": "°C/s", "type": "float", + "enabled": "machine_nozzle_temp_enabled", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -276,6 +291,7 @@ "default_value": 50.0, "unit": "s", "type": "float", + "enabled": "machine_nozzle_temp_enabled", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -1260,7 +1276,7 @@ "description": "Change the temperature for each layer automatically with the average flow speed of that layer.", "type": "bool", "default_value": false, - "enabled": "False", + "enabled": "machine_nozzle_temp_enabled and False", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -1271,14 +1287,14 @@ "unit": "°C", "type": "float", "default_value": 210, - "enabled": false, + "enabled": "machine_nozzle_temp_enabled", "settable_per_extruder": true, "minimum_value": "-273.15" }, "material_print_temperature": { "label": "Printing Temperature", - "description": "The temperature used for printing. If this is 0, the extruder will not heat up for this print.", + "description": "The temperature used for printing.", "unit": "°C", "type": "float", "default_value": 210, @@ -1286,7 +1302,7 @@ "minimum_value": "-273.15", "minimum_value_warning": "0", "maximum_value_warning": "260", - "enabled": "not (material_flow_dependent_temperature) and machine_gcode_flavor != \"UltiGCode\"", + "enabled": "machine_nozzle_temp_enabled and not (material_flow_dependent_temperature)", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -1301,7 +1317,7 @@ "minimum_value": "-273.15", "minimum_value_warning": "0", "maximum_value_warning": "260", - "enabled": "machine_gcode_flavor != \"UltiGCode\"", + "enabled": "machine_nozzle_temp_enabled", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -1316,7 +1332,7 @@ "minimum_value": "-273.15", "minimum_value_warning": "material_standby_temperature", "maximum_value_warning": "material_print_temperature", - "enabled": "machine_gcode_flavor != \"UltiGCode\"", + "enabled": "machine_nozzle_temp_enabled", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -1331,7 +1347,7 @@ "minimum_value": "-273.15", "minimum_value_warning": "material_standby_temperature", "maximum_value_warning": "material_print_temperature", - "enabled": "machine_gcode_flavor != \"UltiGCode\"", + "enabled": "machine_nozzle_temp_enabled", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -1342,8 +1358,7 @@ "unit": "[[mm³,°C]]", "type": "str", "default_value": "[[3.5,200],[7.0,240]]", - "enabled": "False", - "comments": "old enabled function: material_flow_dependent_temperature", + "enabled": "False and machine_nozzle_temp_enabled and material_flow_dependent_temperature", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -1357,8 +1372,7 @@ "minimum_value": "0", "maximum_value_warning": "10.0", "maximum_value": "machine_nozzle_heat_up_speed", - "enabled": "False", - "comments": "old enabled function: material_flow_dependent_temperature or machine_extruder_count > 1", + "enabled": "material_flow_dependent_temperature or (machine_extruder_count > 1 and material_final_print_temperature != material_print_temperature)", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -1565,7 +1579,7 @@ "minimum_value": "-273.15", "minimum_value_warning": "0", "maximum_value_warning": "260", - "enabled": "machine_extruder_count > 1 and machine_gcode_flavor != \"UltiGCode\"", + "enabled": "machine_extruder_count > 1 and machine_nozzle_temp_enabled", "settable_per_mesh": false, "settable_per_extruder": true }, diff --git a/resources/definitions/ultimaker2.def.json b/resources/definitions/ultimaker2.def.json index 84e09113f3..a52075fe5e 100644 --- a/resources/definitions/ultimaker2.def.json +++ b/resources/definitions/ultimaker2.def.json @@ -100,6 +100,9 @@ }, "machine_acceleration": { "default_value": 3000 + }, + "machine_nozzle_temp_enabled": { + "default_value": false } } } From aef34d468858d2e7256679caacb7600dc7cbedff Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 21 Feb 2017 22:28:47 +0100 Subject: [PATCH 030/146] Fix i18n context --- plugins/LayerView/LayerView.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index a06a498158..41e39ef2c3 100644 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -165,11 +165,11 @@ Item Component.onCompleted: { layerViewTypes.append({ - text: catalog.i18nc("@title:layerview mode", "Material Color"), + text: catalog.i18nc("@label:listbox", "Material Color"), type_id: 0 }) layerViewTypes.append({ - text: catalog.i18nc("@title:layerview mode", "Line Type"), + text: catalog.i18nc("@label:listbox", "Line Type"), type_id: 1 // these ids match the switching in the shader }) } From 7a336bbe679bc0782088746154065d2eb354d012 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 21 Feb 2017 22:37:32 +0100 Subject: [PATCH 031/146] Change separator for extruder_opacities to | Comma as a separator might cause confusion/(user-)errors with localised floating point numbers. --- plugins/LayerView/LayerView.qml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 41e39ef2c3..c254adcbb6 100644 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -218,7 +218,7 @@ Item onPreferenceChanged: { layerTypeCombobox.layer_view_type = UM.Preferences.getValue("layerview/layer_view_type"); - view_settings.extruder_opacities = UM.Preferences.getValue("layerview/extruder_opacities").split(","); + view_settings.extruder_opacities = UM.Preferences.getValue("layerview/extruder_opacities").split("|"); view_settings.show_travel_moves = UM.Preferences.getValue("layerview/show_travel_moves"); view_settings.show_support = UM.Preferences.getValue("layerview/show_support"); view_settings.show_adhesion = UM.Preferences.getValue("layerview/show_adhesion"); @@ -232,7 +232,7 @@ Item ColumnLayout { id: view_settings - property var extruder_opacities: UM.Preferences.getValue("layerview/extruder_opacities").split(",") + property var extruder_opacities: UM.Preferences.getValue("layerview/extruder_opacities").split("|") property bool show_travel_moves: UM.Preferences.getValue("layerview/show_travel_moves") property bool show_support: UM.Preferences.getValue("layerview/show_support") property bool show_adhesion: UM.Preferences.getValue("layerview/show_adhesion") @@ -252,7 +252,7 @@ Item checked: view_settings.extruder_opacities[index] > 0.5 || view_settings.extruder_opacities[index] == undefined || view_settings.extruder_opacities[index] == "" onClicked: { view_settings.extruder_opacities[index] = checked ? 1.0 : 0.0 - UM.Preferences.setValue("layerview/extruder_opacities", view_settings.extruder_opacities.toString()); + UM.Preferences.setValue("layerview/extruder_opacities", view_settings.extruder_opacities.join("|")); } text: catalog.i18nc("@label", "Extruder %1").arg(index + 1) visible: !UM.LayerView.compatibilityMode From 6f9fe60a6c9765f2e927145e0ee87de183ba9173 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20B=C3=A4ckdahl?= Date: Fri, 24 Feb 2017 20:57:46 +0100 Subject: [PATCH 032/146] Velleman Vertex K8400 single and dual head Definition files for single and dual head versions of Velleman Vertex K8400 printer. The machine uses printable coordinates x=0 to 200, y=20 to 200 and parking position 200, 200 regardless of how many extruders you use. Thereby the different machine_width for the two models. The g-code can probably be improved. USB connection not successful this far. --- resources/definitions/vertex_k8400.def.json | 84 ++++++++++++++++ .../definitions/vertex_k8400_dual.def.json | 92 ++++++++++++++++++ .../extruders/vertex_k8400_dual_1st.def.json | 26 +++++ .../extruders/vertex_k8400_dual_2nd.def.json | 26 +++++ resources/meshes/Vertex_build_panel.stl | Bin 0 -> 2284 bytes 5 files changed, 228 insertions(+) create mode 100644 resources/definitions/vertex_k8400.def.json create mode 100644 resources/definitions/vertex_k8400_dual.def.json create mode 100644 resources/extruders/vertex_k8400_dual_1st.def.json create mode 100644 resources/extruders/vertex_k8400_dual_2nd.def.json create mode 100644 resources/meshes/Vertex_build_panel.stl diff --git a/resources/definitions/vertex_k8400.def.json b/resources/definitions/vertex_k8400.def.json new file mode 100644 index 0000000000..3d1ca2d1a9 --- /dev/null +++ b/resources/definitions/vertex_k8400.def.json @@ -0,0 +1,84 @@ +{ + "id": "vertex_k8400", + "version": 2, + "name": "Vertex K8400", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "manufacturer": "Velleman", + "category": "Other", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker2", + "platform": "Vertex_build_panel.stl", + "platform_offset": [0, -2, 0], + "supports_usb_connection": true, + "supported_actions": ["MachineSettingsAction"] + }, + "overrides": { + "machine_name": { "default_value": "Vertex K8400" }, + "machine_heated_bed": { + "default_value": true + }, + "material_bed_temperature": { + "default_value": 0 + }, + "material_bed_temperature_layer_0": { + "default_value": 0 + }, + "machine_width": { + "default_value": 200 + }, + "machine_height": { + "default_value": 190 + }, + "machine_depth": { + "default_value": 200 + }, + "machine_disallowed_areas": { "default_value": [ + [[-100,100],[-100,80],[100,80],[100,100]] + ]}, + "machine_center_is_zero": { + "default_value": false + }, + "machine_nozzle_size": { + "default_value": 0.35 + }, + "material_diameter": { + "default_value": 1.75 + }, + "machine_head_polygon": { + "default_value": [ + [-60, -18], + [-60, 40], + [18, 40], + [18, -18] + ] + }, + "machine_head_with_fans_polygon": { + "default_value": [ + [-60, -40], + [-60, 40], + [18, 40], + [18, -40] + ] + }, + "gantry_height": { + "default_value": 18 + }, + "machine_nozzle_heat_up_speed": { + "default_value": 2 + }, + "machine_nozzle_cool_down_speed": { + "default_value": 2 + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": { + "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." + }, + "machine_end_gcode": { + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + } + } +} \ No newline at end of file diff --git a/resources/definitions/vertex_k8400_dual.def.json b/resources/definitions/vertex_k8400_dual.def.json new file mode 100644 index 0000000000..7b5efcee9c --- /dev/null +++ b/resources/definitions/vertex_k8400_dual.def.json @@ -0,0 +1,92 @@ +{ + "id": "vertex_k8400_dual", + "version": 2, + "name": "Vertex K8400 Dual", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "manufacturer": "Velleman", + "category": "Other", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker2", + "platform": "Vertex_build_panel.stl", + "platform_offset": [0, -2, 0], + "machine_extruder_trains": { + "0": "vertex_k8400_dual_1st", + "1": "vertex_k8400_dual_2nd" + } + }, + "overrides": { + "machine_name": { "default_value": "Vertex K8400 Dual" }, + "machine_heated_bed": { + "default_value": true + }, + "material_bed_temperature": { + "default_value": 0 + }, + "material_bed_temperature_layer_0": { + "default_value": 0 + }, + "machine_width": { + "default_value": 223.7 + }, + "machine_height": { + "default_value": 190 + }, + "machine_depth": { + "default_value": 200 + }, + "machine_disallowed_areas": { "default_value": [ + [[-111.85,100],[111.85,100],[-111.85,80],[111.85,80]] + ]}, + "machine_center_is_zero": { + "default_value": false + }, + "machine_use_extruder_offset_to_offset_coords": { + "default_value": true + }, + "machine_nozzle_size": { + "default_value": 0.35 + }, + "material_diameter": { + "default_value": 1.75 + }, + "machine_head_polygon": { + "default_value": [ + [-60, -18], + [-60, 40], + [18, 40], + [18, -18] + ] + }, + "machine_head_with_fans_polygon": { + "default_value": [ + [-60, -40], + [-60, 40], + [18, 40], + [18, -40] + ] + }, + "gantry_height": { + "default_value": 18 + }, + "machine_nozzle_heat_up_speed": { + "default_value": 2 + }, + "machine_nozzle_cool_down_speed": { + "default_value": 2 + }, + "machine_extruder_count": { + "default_value": 2 + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": { + "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." + }, + "machine_end_gcode": { + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + } + } +} \ No newline at end of file diff --git a/resources/extruders/vertex_k8400_dual_1st.def.json b/resources/extruders/vertex_k8400_dual_1st.def.json new file mode 100644 index 0000000000..74a9c557a5 --- /dev/null +++ b/resources/extruders/vertex_k8400_dual_1st.def.json @@ -0,0 +1,26 @@ +{ + "id": "vertex_k8400_dual_1st", + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": { + "machine": "vertex_k8400_dual", + "position": "0" + }, + + "overrides": { + "extruder_nr": { + "default_value": 0, + "maximum_value": "1" + }, + "machine_nozzle_offset_x": { "default_value": 23.7 }, + "machine_nozzle_offset_y": { "default_value": 0.0 }, + + "machine_extruder_start_pos_abs": { "default_value": true }, + "machine_extruder_start_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_start_pos_y": { "value": "prime_tower_position_y" }, + "machine_extruder_end_pos_abs": { "default_value": true }, + "machine_extruder_end_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_end_pos_y": { "value": "prime_tower_position_y" } + } +} diff --git a/resources/extruders/vertex_k8400_dual_2nd.def.json b/resources/extruders/vertex_k8400_dual_2nd.def.json new file mode 100644 index 0000000000..ffa4b77a1e --- /dev/null +++ b/resources/extruders/vertex_k8400_dual_2nd.def.json @@ -0,0 +1,26 @@ +{ + "id": "vertex_k8400_dual_2nd", + "version": 2, + "name": "Extruder 2", + "inherits": "fdmextruder", + "metadata": { + "machine": "vertex_k8400_dual", + "position": "1" + }, + + "overrides": { + "extruder_nr": { + "default_value": 1, + "maximum_value": "1" + }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 }, + + "machine_extruder_start_pos_abs": { "default_value": true }, + "machine_extruder_start_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_start_pos_y": { "value": "prime_tower_position_y" }, + "machine_extruder_end_pos_abs": { "default_value": true }, + "machine_extruder_end_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_end_pos_y": { "value": "prime_tower_position_y" } + } +} diff --git a/resources/meshes/Vertex_build_panel.stl b/resources/meshes/Vertex_build_panel.stl new file mode 100644 index 0000000000000000000000000000000000000000..bb50da0625d01a9e408dd0d8ab86a9778ff46b40 GIT binary patch literal 2284 zcmb`IJx&8b424}#(Q*waX=pZzghWHdh2|)^Nuup3QEm|-aRJ`*|13$zN*m11e13lR zZ1Vp4@%HroZy)!MBJ%S2u;4!OmT}pOoL7;9#p4UHoJ79&qA{L#VreUj(njoBChYmS zdtPvZ<(0XNFufjQ-wgsQS7|&C59&j{*Q|G3JcbX(;V*osd(R8^=^U{V_(eJ2W_)Kd@$#nxv6zx+NIMZ0UzA$#Aq6HjvYD!Wb1^_+$LylEtmN~tY?>=T%!@p z6)Vv<64r&(%g$m6m8^9dl1A+rBkK*qH1aHM38q)~Rr_wvs|57DyHK47ta$A;51%Fp zUd-;%08fqedLP~UJ~ZJfmLqNlIkZ91pM0uAp%oc0Yt4W1<@5Z@wZ=e3JILeG3a z)%{dn_R1^KE;J%`yYr~Ti1;3~nbQ+AHpFUfwO5_SZvT}qM24}IYw?*|UYmJo3^8J8 z?ez-~c}efL8k8EAH|9}Y*tIU~xKoCH7J+=iUE%2uf!vO?Nx@g2bIwEeCIK#2IuS8^ z@sxOai>z0u3Vp9Qob&li4DZR7AdP4B4*D##1Nj~xSH?$=*O++{^x^%XdJ+*QkzTC! X{-(|`2%gHipj9(Cd5rouXH0$phHu=M literal 0 HcmV?d00001 From fbc7e0f7c47f7527ac8df62094864b7301281f93 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 27 Feb 2017 13:13:34 +0100 Subject: [PATCH 033/146] Take retraction_hop_enabled into account for extra z clearance. CURA-2729 --- cura/BuildVolume.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 477f3d462d..c911844b58 100644 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -386,15 +386,19 @@ class BuildVolume(SceneNode): self.raftThicknessChanged.emit() def _updateExtraZClearance(self): - extra_z = None + extra_z = 0.0 extruders = ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId()) + use_extruders = False for extruder in extruders: - retraction_hop = extruder.getProperty("retraction_hop", "value") - if extra_z is None or retraction_hop > extra_z: - extra_z = retraction_hop - if extra_z is None: + if extruder.getProperty("retraction_hop_enabled", "value"): + retraction_hop = extruder.getProperty("retraction_hop", "value") + if extra_z is None or retraction_hop > extra_z: + extra_z = retraction_hop + use_extruders = True + if not use_extruders: # If no extruders, take global value. - extra_z = self._global_container_stack.getProperty("retraction_hop", "value") + if self._global_container_stack.getProperty("retraction_hop_enabled", "value"): + extra_z = self._global_container_stack.getProperty("retraction_hop", "value") if extra_z != self._extra_z_clearance: self._extra_z_clearance = extra_z @@ -890,7 +894,7 @@ class BuildVolume(SceneNode): _skirt_settings = ["adhesion_type", "skirt_gap", "skirt_line_count", "skirt_brim_line_width", "brim_width", "brim_line_count", "raft_margin", "draft_shield_enabled", "draft_shield_dist"] _raft_settings = ["adhesion_type", "raft_base_thickness", "raft_interface_thickness", "raft_surface_layers", "raft_surface_thickness", "raft_airgap"] - _extra_z_settings = ["retraction_hop"] + _extra_z_settings = ["retraction_hop_enabled", "retraction_hop"] _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"] From 8237421bcfcd8435fd6d9e883764064386cbe186 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 27 Feb 2017 13:33:55 +0100 Subject: [PATCH 034/146] Undo testing QVector3D. CURA-3334 --- cura/CuraApplication.py | 12 ------------ plugins/LayerView/LayerView.qml | 10 ---------- 2 files changed, 22 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index a71422aa7d..62bf6f0e4d 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1232,15 +1232,3 @@ class CuraApplication(QtApplication): def addNonSliceableExtension(self, extension): self._non_sliceable_extensions.append(extension) - - - @pyqtSlot("QVector3D") - def testQVector3D(self, vect): - Logger.log("d", "got QVector3D: %s : %s %s %s" % (vect, vect.x(), vect.y(), vect.z())) - - @pyqtProperty("QVector3D") - def getQVector3D(self): - from PyQt5.QtGui import QVector3D - vect = QVector3D(1.0, 2.0, 3.0) - Logger.log("d", "get QVector3D: %s" % vect) - return vect diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 9e51ab084d..9da7a0f0d2 100644 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -306,16 +306,6 @@ Item } text: catalog.i18nc("@label", "Show Infill") } - CheckBox { - checked: true - onClicked: { - CuraApplication.log("getting QVector3D"); - var v = CuraApplication.getQVector3D; - CuraApplication.log("getting QVector3D"); - CuraApplication.testQVector3D(v); - } - text: catalog.i18nc("@label", "test") - } } } } From 8602d984a9caf73dc40168e0e7937c9e930d035b Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Mon, 27 Feb 2017 13:36:20 +0100 Subject: [PATCH 035/146] Stop $PYTHONPATH from messing up the search path for DLLs. CURA-3418 Cura build on Win 64 fails due to $PYTHONPATH --- cura_app.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cura_app.py b/cura_app.py index 633110eff8..989c45b37a 100755 --- a/cura_app.py +++ b/cura_app.py @@ -17,6 +17,12 @@ if Platform.isLinux(): # Needed for platform.linux_distribution, which is not av libGL = find_library("GL") ctypes.CDLL(libGL, ctypes.RTLD_GLOBAL) +# When frozen, i.e. installer version, don't let PYTHONPATH mess up the search path for DLLs. +if Platform.isWindows() and hasattr(sys, "frozen"): + try: + del os.environ["PYTHONPATH"] + except KeyError: pass + #WORKAROUND: GITHUB-704 GITHUB-708 # It looks like setuptools creates a .pth file in # the default /usr/lib which causes the default site-packages From fa1b332733a80b88998f16bffc018b5a75698750 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 27 Feb 2017 14:06:17 +0100 Subject: [PATCH 036/146] Moved layer view menu to left, next to sliders. CURA-3321 --- plugins/LayerView/LayerView.qml | 275 ++++++++++++++++--------------- resources/themes/cura/theme.json | 2 +- 2 files changed, 139 insertions(+), 138 deletions(-) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 240aee705e..107cd8f0a1 100644 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -13,145 +13,12 @@ Item width: UM.Theme.getSize("button").width height: UM.Theme.getSize("slider_layerview_size").height - Slider - { - id: sliderMinimumLayer - width: UM.Theme.getSize("slider_layerview_size").width - height: UM.Theme.getSize("slider_layerview_size").height - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("slider_layerview_margin").width * 0.2 - orientation: Qt.Vertical - minimumValue: 0; - maximumValue: UM.LayerView.numLayers-1; - stepSize: 1 - - property real pixelsPerStep: ((height - UM.Theme.getSize("slider_handle").height) / (maximumValue - minimumValue)) * stepSize; - - value: UM.LayerView.minimumLayer - onValueChanged: { - UM.LayerView.setMinimumLayer(value) - if (value > UM.LayerView.currentLayer) { - UM.LayerView.setCurrentLayer(value); - } - } - - style: UM.Theme.styles.slider; - } - - Slider - { - id: slider - width: UM.Theme.getSize("slider_layerview_size").width - height: UM.Theme.getSize("slider_layerview_size").height - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("slider_layerview_margin").width * 0.8 - orientation: Qt.Vertical - minimumValue: 0; - maximumValue: UM.LayerView.numLayers; - stepSize: 1 - - property real pixelsPerStep: ((height - UM.Theme.getSize("slider_handle").height) / (maximumValue - minimumValue)) * stepSize; - - value: UM.LayerView.currentLayer - onValueChanged: { - UM.LayerView.setCurrentLayer(value); - if (value < UM.LayerView.minimumLayer) { - UM.LayerView.setMinimumLayer(value); - } - } - - style: UM.Theme.styles.slider; - - Rectangle - { - x: parent.width + UM.Theme.getSize("slider_layerview_background").width / 2; - y: parent.height - (parent.value * parent.pixelsPerStep) - UM.Theme.getSize("slider_handle").height * 1.25; - - height: UM.Theme.getSize("slider_handle").height + UM.Theme.getSize("default_margin").height - width: valueLabel.width + UM.Theme.getSize("default_margin").width - Behavior on height { NumberAnimation { duration: 50; } } - - border.width: UM.Theme.getSize("default_lining").width - border.color: UM.Theme.getColor("slider_groove_border") - color: UM.Theme.getColor("tool_panel_background") - - visible: UM.LayerView.layerActivity && Printer.platformActivity ? true : false - - TextField - { - id: valueLabel - property string maxValue: slider.maximumValue + 1 - text: slider.value + 1 - horizontalAlignment: TextInput.AlignRight; - onEditingFinished: - { - // Ensure that the cursor is at the first position. On some systems the text isn't fully visible - // Seems to have to do something with different dpi densities that QML doesn't quite handle. - // Another option would be to increase the size even further, but that gives pretty ugly results. - cursorPosition = 0; - if(valueLabel.text != '') - { - slider.value = valueLabel.text - 1; - } - } - validator: IntValidator { bottom: 1; top: slider.maximumValue + 1; } - - anchors.left: parent.left; - anchors.leftMargin: UM.Theme.getSize("default_margin").width / 2; - anchors.verticalCenter: parent.verticalCenter; - - width: Math.max(UM.Theme.getSize("line").width * maxValue.length + 2, 20); - style: TextFieldStyle - { - textColor: UM.Theme.getColor("setting_control_text"); - font: UM.Theme.getFont("default"); - background: Item { } - } - } - - BusyIndicator - { - id: busyIndicator; - anchors.left: parent.right; - anchors.leftMargin: UM.Theme.getSize("default_margin").width / 2; - anchors.verticalCenter: parent.verticalCenter; - - width: UM.Theme.getSize("slider_handle").height; - height: width; - - running: UM.LayerView.busy; - visible: UM.LayerView.busy; - } - } - } - Rectangle { - id: slider_background + id: layerViewMenu anchors.left: parent.left - anchors.verticalCenter: parent.verticalCenter - z: slider.z - 1 - width: UM.Theme.getSize("slider_layerview_background").width - height: slider.height + UM.Theme.getSize("default_margin").height * 2 - color: UM.Theme.getColor("tool_panel_background"); - border.width: UM.Theme.getSize("default_lining").width - border.color: UM.Theme.getColor("lining") - - MouseArea { - id: sliderMouseArea - property double manualStepSize: slider.maximumValue / 11 - anchors.fill: parent - onWheel: { - slider.value = wheel.angleDelta.y < 0 ? slider.value - sliderMouseArea.manualStepSize : slider.value + sliderMouseArea.manualStepSize - } - } - } - - Rectangle { - anchors.left: parent.right - anchors.bottom: slider_background.top - anchors.leftMargin: UM.Theme.getSize("default_margin").width + anchors.top: slider_background.top width: UM.Theme.getSize("layerview_menu_size").width - height: UM.Theme.getSize("layerview_menu_size").height + height: slider.height + UM.Theme.getSize("default_margin").height * 2 color: UM.Theme.getColor("tool_panel_background"); border.width: UM.Theme.getSize("default_lining").width border.color: UM.Theme.getColor("lining") @@ -296,7 +163,7 @@ Item onClicked: { UM.Preferences.setValue("layerview/show_travel_moves", checked); } - text: catalog.i18nc("@label", "Show Travel Moves") + text: catalog.i18nc("@label", "Show Travels") } CheckBox { checked: view_settings.show_helpers @@ -321,4 +188,138 @@ Item } } } + + Slider + { + id: sliderMinimumLayer + width: UM.Theme.getSize("slider_layerview_size").width + height: UM.Theme.getSize("slider_layerview_size").height + anchors.left: layerViewMenu.right + anchors.leftMargin: UM.Theme.getSize("slider_layerview_margin").width * 0.2 + orientation: Qt.Vertical + minimumValue: 0; + maximumValue: UM.LayerView.numLayers-1; + stepSize: 1 + + property real pixelsPerStep: ((height - UM.Theme.getSize("slider_handle").height) / (maximumValue - minimumValue)) * stepSize; + + value: UM.LayerView.minimumLayer + onValueChanged: { + UM.LayerView.setMinimumLayer(value) + if (value > UM.LayerView.currentLayer) { + UM.LayerView.setCurrentLayer(value); + } + } + + style: UM.Theme.styles.slider; + } + + Slider + { + id: slider + width: UM.Theme.getSize("slider_layerview_size").width + height: UM.Theme.getSize("slider_layerview_size").height + anchors.left: layerViewMenu.right + anchors.leftMargin: UM.Theme.getSize("slider_layerview_margin").width * 0.8 + orientation: Qt.Vertical + minimumValue: 0; + maximumValue: UM.LayerView.numLayers; + stepSize: 1 + + property real pixelsPerStep: ((height - UM.Theme.getSize("slider_handle").height) / (maximumValue - minimumValue)) * stepSize; + + value: UM.LayerView.currentLayer + onValueChanged: { + UM.LayerView.setCurrentLayer(value); + if (value < UM.LayerView.minimumLayer) { + UM.LayerView.setMinimumLayer(value); + } + } + + style: UM.Theme.styles.slider; + + Rectangle + { + x: parent.width + UM.Theme.getSize("slider_layerview_background").width / 2; + y: parent.height - (parent.value * parent.pixelsPerStep) - UM.Theme.getSize("slider_handle").height * 1.25; + + height: UM.Theme.getSize("slider_handle").height + UM.Theme.getSize("default_margin").height + width: valueLabel.width + UM.Theme.getSize("default_margin").width + Behavior on height { NumberAnimation { duration: 50; } } + + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("slider_groove_border") + color: UM.Theme.getColor("tool_panel_background") + + visible: UM.LayerView.layerActivity && Printer.platformActivity ? true : false + + TextField + { + id: valueLabel + property string maxValue: slider.maximumValue + 1 + text: slider.value + 1 + horizontalAlignment: TextInput.AlignRight; + onEditingFinished: + { + // Ensure that the cursor is at the first position. On some systems the text isn't fully visible + // Seems to have to do something with different dpi densities that QML doesn't quite handle. + // Another option would be to increase the size even further, but that gives pretty ugly results. + cursorPosition = 0; + if(valueLabel.text != '') + { + slider.value = valueLabel.text - 1; + } + } + validator: IntValidator { bottom: 1; top: slider.maximumValue + 1; } + + anchors.left: parent.left; + anchors.leftMargin: UM.Theme.getSize("default_margin").width / 2; + anchors.verticalCenter: parent.verticalCenter; + + width: Math.max(UM.Theme.getSize("line").width * maxValue.length + 2, 20); + style: TextFieldStyle + { + textColor: UM.Theme.getColor("setting_control_text"); + font: UM.Theme.getFont("default"); + background: Item { } + } + } + + BusyIndicator + { + id: busyIndicator; + anchors.left: parent.right; + anchors.leftMargin: UM.Theme.getSize("default_margin").width / 2; + anchors.verticalCenter: parent.verticalCenter; + + width: UM.Theme.getSize("slider_handle").height; + height: width; + + running: UM.LayerView.busy; + visible: UM.LayerView.busy; + } + } + } + + Rectangle { + id: slider_background + anchors.left: layerViewMenu.right + anchors.verticalCenter: parent.verticalCenter + z: slider.z - 1 + width: UM.Theme.getSize("slider_layerview_background").width + height: slider.height + UM.Theme.getSize("default_margin").height * 2 + color: UM.Theme.getColor("tool_panel_background"); + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + + MouseArea { + id: sliderMouseArea + property double manualStepSize: slider.maximumValue / 11 + anchors.fill: parent + onWheel: { + slider.value = wheel.angleDelta.y < 0 ? slider.value - sliderMouseArea.manualStepSize : slider.value + sliderMouseArea.manualStepSize + } + } + } + } diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index 8ac22e26f3..7efb8e5907 100644 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -295,7 +295,7 @@ "slider_layerview_background": [4.0, 0.0], "slider_layerview_margin": [3.0, 3.0], - "layerview_menu_size": [13.0, 25.0], + "layerview_menu_size": [11.0, 25.0], "checkbox": [2.0, 2.0], From 8b7aee166480496db98d9896aebefa4fc1a60cc2 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 27 Feb 2017 14:16:56 +0100 Subject: [PATCH 037/146] Adjusted menu, added View Mode: Layers. CURA-3321 --- plugins/LayerView/LayerView.qml | 13 ++++++++++++- resources/themes/cura/theme.json | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 107cd8f0a1..95e0fe61a1 100644 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -25,11 +25,22 @@ Item Label { - id: layerViewTypesLabel + id: layersLabel anchors.top: parent.top anchors.topMargin: UM.Theme.getSize("default_margin").height anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("default_margin").width + text: catalog.i18nc("@label","View Mode: Layers") + font.bold: true + } + + Label + { + id: layerViewTypesLabel + anchors.top: layersLabel.bottom + anchors.topMargin: UM.Theme.getSize("default_margin").height + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width text: catalog.i18nc("@label","Color scheme") } diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index 7efb8e5907..0a6a131eb5 100644 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -295,7 +295,7 @@ "slider_layerview_background": [4.0, 0.0], "slider_layerview_margin": [3.0, 3.0], - "layerview_menu_size": [11.0, 25.0], + "layerview_menu_size": [12.0, 25.0], "checkbox": [2.0, 2.0], From f5f02ead88094e130d31ee3b59600ddcda763a8f Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Mon, 27 Feb 2017 17:12:01 +0100 Subject: [PATCH 038/146] Added some debug. CURA-3418 Cura build on Win 64 fails due to $PYTHONPATH --- cura_app.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cura_app.py b/cura_app.py index 989c45b37a..2fc8752cee 100755 --- a/cura_app.py +++ b/cura_app.py @@ -60,6 +60,10 @@ if Platform.isWindows() and hasattr(sys, "frozen"): sys.stdout = open(os.path.join(dirpath, "stdout.log"), "w") sys.stderr = open(os.path.join(dirpath, "stderr.log"), "w") +if Platform.isWindows(): + print("sys.path: " + repr(sys.path)) + print("has sys.frozen: " + str(hasattr(sys, "frozen"))) + # Force an instance of CuraContainerRegistry to be created and reused later. cura.Settings.CuraContainerRegistry.CuraContainerRegistry.getInstance() From 2462699982f17febc706bd71b86f207a0786c12d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 28 Feb 2017 10:25:42 +0100 Subject: [PATCH 039/146] Switching profiles now shows a new dialog with all the changes. CURA-3221 --- cura/CuraApplication.py | 15 ++- cura/Settings/MachineManager.py | 5 +- cura/Settings/UserChangesModel.py | 112 ++++++++++++++++ resources/qml/Cura.qml | 15 +++ .../qml/DiscardOrKeepProfileChangesDialog.qml | 126 ++++++++++++++++++ 5 files changed, 270 insertions(+), 3 deletions(-) create mode 100644 cura/Settings/UserChangesModel.py create mode 100644 resources/qml/DiscardOrKeepProfileChangesDialog.qml diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index add7b4a143..a180c72366 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -53,7 +53,7 @@ from . import MachineActionManager from cura.Settings.MachineManager import MachineManager from cura.Settings.ExtruderManager import ExtruderManager -from cura.Settings.CuraContainerRegistry import CuraContainerRegistry +from cura.Settings.UserChangesModel import UserChangesModel from cura.Settings.ExtrudersModel import ExtrudersModel from cura.Settings.ContainerSettingsModel import ContainerSettingsModel from cura.Settings.MaterialSettingsVisibilityHandler import MaterialSettingsVisibilityHandler @@ -323,11 +323,23 @@ class CuraApplication(QtApplication): ## A reusable dialogbox # showMessageBox = pyqtSignal(str, str, str, str, int, int, arguments = ["title", "text", "informativeText", "detailedText", "buttons", "icon"]) + def messageBox(self, title, text, informativeText = "", detailedText = "", buttons = QMessageBox.Ok, icon = QMessageBox.NoIcon, callback = None, callback_arguments = []): self._message_box_callback = callback self._message_box_callback_arguments = callback_arguments self.showMessageBox.emit(title, text, informativeText, detailedText, buttons, icon) + showDiscardOrKeepProfileChanges = pyqtSignal() + + def discardOrKeepProfileChanges(self, callback = None, callback_arguments = []): + self._discard_or_keep_changes_callback = callback + self._discard_or_keep_changes_callback_arguments = callback_arguments + self.showDiscardOrKeepProfileChanges.emit() + + @pyqtSlot(int) + def discardOrKeepProfileChangesClosed(self, button): + pass + @pyqtSlot(int) def messageBoxClosed(self, button): if self._message_box_callback: @@ -653,6 +665,7 @@ class CuraApplication(QtApplication): qmlRegisterType(MaterialSettingsVisibilityHandler, "Cura", 1, 0, "MaterialSettingsVisibilityHandler") qmlRegisterType(QualitySettingsModel, "Cura", 1, 0, "QualitySettingsModel") qmlRegisterType(MachineNameValidator, "Cura", 1, 0, "MachineNameValidator") + qmlRegisterType(UserChangesModel, "Cura", 1, 1, "UserChangesModel") qmlRegisterSingletonType(ContainerManager, "Cura", 1, 0, "ContainerManager", ContainerManager.createContainerManager) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index ce42854d43..38e1ad4d6a 100644 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -957,7 +957,8 @@ class MachineManager(QObject): details = "\n ".join([details_text, ] + details_list) num_changed_settings = len(details_list) - Application.getInstance().messageBox( + Application.getInstance().discardOrKeepProfileChanges() + '''Application.getInstance().messageBox( catalog.i18nc("@window:title", "Switched profiles"), catalog.i18nc( "@label", @@ -968,7 +969,7 @@ class MachineManager(QObject): details, buttons=QMessageBox.Yes + QMessageBox.No, icon=QMessageBox.Question, - callback=self._keepUserSettingsDialogCallback) + callback=self._keepUserSettingsDialogCallback)''' def _keepUserSettingsDialogCallback(self, button): if button == QMessageBox.Yes: diff --git a/cura/Settings/UserChangesModel.py b/cura/Settings/UserChangesModel.py new file mode 100644 index 0000000000..1ff0a486b7 --- /dev/null +++ b/cura/Settings/UserChangesModel.py @@ -0,0 +1,112 @@ +from UM.Qt.ListModel import ListModel + +from PyQt5.QtCore import pyqtSlot, Qt +from UM.Application import Application +from cura.Settings.ExtruderManager import ExtruderManager +from UM.Settings.ContainerRegistry import ContainerRegistry +from UM.i18n import i18nCatalog + +import os + +class UserChangesModel(ListModel): + KeyRole = Qt.UserRole + 1 + LabelRole = Qt.UserRole + 2 + ExtruderRole = Qt.UserRole +3 + OriginalValueRole = Qt.UserRole + 4 + UserValueRole = Qt.UserRole + 6 + CategoryRole = Qt.UserRole + 7 + + def __init__(self, parent = None): + super().__init__(parent = parent) + self.addRoleName(self.KeyRole, "key") + self.addRoleName(self.LabelRole, "label") + self.addRoleName(self.ExtruderRole, "extruder") + self.addRoleName(self.OriginalValueRole, "original_value") + self.addRoleName(self.UserValueRole, "user_value") + self.addRoleName(self.CategoryRole, "category") + + Application.getInstance().globalContainerStackChanged.connect(self._update) + self._i18n_catalog = None + + self._update() + + @pyqtSlot() + def forceUpdate(self): + self._update() + + def _update(self): + items = [] + global_stack = Application.getInstance().getGlobalContainerStack() + stacks = ExtruderManager.getInstance().getUsedExtruderStacks() + + # Ensure that the global stack is in the list of stacks. + if global_stack.getProperty("machine_extruder_count", "value") > 1: + stacks.append(global_stack) + + # Check if the definition container has a translation file and ensure it's loaded. + definition = global_stack.getBottom() + + definition_suffix = ContainerRegistry.getMimeTypeForContainer(type(definition)).preferredSuffix + catalog = i18nCatalog(os.path.basename(definition.getId() + "." + definition_suffix)) + + if catalog.hasTranslationLoaded(): + self._i18n_catalog = catalog + + for file_name in definition.getInheritedFiles(): + catalog = i18nCatalog(os.path.basename(file_name)) + if catalog.hasTranslationLoaded(): + self._i18n_catalog = catalog + + for stack in stacks: + # Make a list of all containers in the stack. + containers = [] + latest_stack = stack + while latest_stack: + containers.extend(latest_stack.getContainers()) + latest_stack = latest_stack.getNextStack() + + # Drop the user container. + user_changes = containers.pop(0) + + for setting_key in user_changes.getAllKeys(): + original_value = None + + # Find the category of the instance by moving up until we find a category. + category = user_changes.getInstance(setting_key).definition + while category.type != "category": + category = category.parent + + # Handle translation (and fallback if we weren't able to find any translation files. + if self._i18n_catalog: + category_label = self._i18n_catalog.i18nc(category.key + " label", category.label) + else: + category_label = category.label + + if self._i18n_catalog: + label = self._i18n_catalog.i18nc(setting_key + " label", stack.getProperty(setting_key, "label")) + else: + label = stack.getProperty(setting_key, "label") + + for container in containers: + if stack == global_stack: + resolve = global_stack.getProperty(setting_key, "resolve") + if resolve is not None: + original_value = resolve + break + + original_value = container.getProperty(setting_key, "value") + if original_value is not None: + break + + item_to_add = {"key": setting_key, + "label": label, + "user_value": user_changes.getProperty(setting_key, "value"), + "original_value": original_value, + "extruder": "", + "category": category_label} + + if stack != global_stack: + item_to_add["extruder"] = stack.getName() + + items.append(item_to_add) + self.setItems(items) \ No newline at end of file diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index b73bd21600..8b70e293b4 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -882,6 +882,21 @@ UM.MainWindow } } + DiscardOrKeepProfileChangesDialog + { + id: discardOrKeepProfileChangesDialog + } + + Connections + { + target: Printer + onShowDiscardOrKeepProfileChanges: + { + discardOrKeepProfileChangesDialog.show() + } + + } + Connections { target: Cura.Actions.addMachine diff --git a/resources/qml/DiscardOrKeepProfileChangesDialog.qml b/resources/qml/DiscardOrKeepProfileChangesDialog.qml new file mode 100644 index 0000000000..2744ba3847 --- /dev/null +++ b/resources/qml/DiscardOrKeepProfileChangesDialog.qml @@ -0,0 +1,126 @@ +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Controls 1.1 +import QtQuick.Dialogs 1.2 + +import UM 1.2 as UM +import Cura 1.1 as Cura + +UM.Dialog +{ + id: base + title: catalog.i18nc("@title:window", "Discard or Keep changes") + + width: 500 + height: 500 + property var changesModel: Cura.UserChangesModel{ id: userChangesModel} + onVisibilityChanged: + { + if(visible) + { + changesModel.forceUpdate() + } + } + + Column + { + anchors.fill: parent + + UM.I18nCatalog + { + id: catalog; + name:"cura" + } + Label + { + text: "You have customized some default profile settings. Would you like to keep or discard those settings?" + anchors.margins: UM.Theme.getSize("default_margin").width + anchors.left: parent.left + anchors.right: parent.right + } + + TableView + { + anchors.margins: UM.Theme.getSize("default_margin").width + anchors.left: parent.left + anchors.right: parent.right + height: 200 + id: tableView + Component + { + id: labelDelegate + Label + { + property var extruder_name: userChangesModel.getItem(styleData.row).extruder + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + font: UM.Theme.getFont("default") + text: + { + var result = styleData.value + if (extruder_name!= "") + { + result += " (" + extruder_name + ")" + } + return result + } + } + } + + Component + { + id: defaultDelegate + Label + { + text: styleData.value + font: UM.Theme.getFont("default") + color: UM.Theme.getColor("setting_control_disabled_text") + } + } + + TableViewColumn + { + role: "label" + title: catalog.i18nc("@title:column", "Profile settings") + delegate: labelDelegate + width: tableView.width * 0.5 + } + + TableViewColumn + { + role: "original_value" + title: "default" + width: tableView.width * 0.25 + delegate: defaultDelegate + } + TableViewColumn + { + role: "user_value" + title: catalog.i18nc("@title:column", "Customized") + width: tableView.width * 0.25 - 1 + } + section.property: "category" + section.delegate: Label + { + text: section + font.bold: true + } + + model: base.changesModel + } + + Row + { + Button + { + text: catalog.i18nc("@action:button", "Keep"); + } + Button + { + text: catalog.i18nc("@action:button", "Discard"); + } + } + } +} \ No newline at end of file From 454a5969c2162ffd82ae079ab0f4ef9cb35fe798 Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Tue, 28 Feb 2017 10:25:44 +0100 Subject: [PATCH 040/146] Removed debug. CURA-3418 Cura build on Win 64 fails due to $PYTHONPATH --- cura_app.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/cura_app.py b/cura_app.py index 2fc8752cee..989c45b37a 100755 --- a/cura_app.py +++ b/cura_app.py @@ -60,10 +60,6 @@ if Platform.isWindows() and hasattr(sys, "frozen"): sys.stdout = open(os.path.join(dirpath, "stdout.log"), "w") sys.stderr = open(os.path.join(dirpath, "stderr.log"), "w") -if Platform.isWindows(): - print("sys.path: " + repr(sys.path)) - print("has sys.frozen: " + str(hasattr(sys, "frozen"))) - # Force an instance of CuraContainerRegistry to be created and reused later. cura.Settings.CuraContainerRegistry.CuraContainerRegistry.getInstance() From 27f013fd8143153440adde6f005065f0f20c5ebf Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 28 Feb 2017 11:52:51 +0100 Subject: [PATCH 041/146] Cleanup layout, finalizing --- plugins/LayerView/LayerView.qml | 543 +++++++++++++++++++------------ resources/themes/cura/theme.json | 9 +- 2 files changed, 332 insertions(+), 220 deletions(-) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 95e0fe61a1..8a47818c08 100644 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -10,111 +10,23 @@ import UM 1.0 as UM Item { - width: UM.Theme.getSize("button").width - height: UM.Theme.getSize("slider_layerview_size").height + width: UM.Theme.getSize("layerview_menu_size").width + height: { + if (UM.LayerView.compatibilityMode) { + return UM.Theme.getSize("layerview_menu_size").height + } else { + return UM.Theme.getSize("layerview_menu_size").height + UM.LayerView.extruderCount * (UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("layerview_row_spacing").height) + } + } Rectangle { id: layerViewMenu anchors.left: parent.left - anchors.top: slider_background.top - width: UM.Theme.getSize("layerview_menu_size").width - height: slider.height + UM.Theme.getSize("default_margin").height * 2 + anchors.top: parent.top + width: parent.width + height: parent.height + z: slider.z - 1 color: UM.Theme.getColor("tool_panel_background"); - border.width: UM.Theme.getSize("default_lining").width - border.color: UM.Theme.getColor("lining") - - Label - { - id: layersLabel - anchors.top: parent.top - anchors.topMargin: UM.Theme.getSize("default_margin").height - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - text: catalog.i18nc("@label","View Mode: Layers") - font.bold: true - } - - Label - { - id: layerViewTypesLabel - anchors.top: layersLabel.bottom - anchors.topMargin: UM.Theme.getSize("default_margin").height - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - text: catalog.i18nc("@label","Color scheme") - } - - ListModel // matches LayerView.py - { - id: layerViewTypes - ListElement { - text: "Material Color" - type_id: 0 - } - ListElement { - text: "Line Type" - type_id: 1 // these ids match the switching in the shader - } - } - - ComboBox - { - id: layerTypeCombobox - anchors.topMargin: UM.Theme.getSize("margin_small").height - anchors.top: layerViewTypesLabel.bottom - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width - model: layerViewTypes - visible: !UM.LayerView.compatibilityMode - property int layer_view_type: UM.Preferences.getValue("layerview/layer_view_type") - currentIndex: layer_view_type // index matches type_id - onActivated: { - // Combobox selection - var type_id = layerViewTypes.get(index).type_id; - UM.Preferences.setValue("layerview/layer_view_type", type_id); - updateLegend(); - } - onModelChanged: { - updateLegend(); - } - // Update visibility of legend. - function updateLegend() { - var type_id = layerViewTypes.get(currentIndex).type_id; - if (UM.LayerView.compatibilityMode || (type_id == 1)) { - // Line type - UM.LayerView.enableLegend(); - } else { - UM.LayerView.disableLegend(); - } - } - } - - Label - { - id: compatibilityModeLabel - anchors.top: parent.top - anchors.left: parent.left - text: catalog.i18nc("@label","Compatibility Mode") - visible: UM.LayerView.compatibilityMode - } - - Connections { - target: UM.Preferences - onPreferenceChanged: - { - layerTypeCombobox.layer_view_type = UM.Preferences.getValue("layerview/layer_view_type"); - view_settings.extruder0_checked = UM.Preferences.getValue("layerview/extruder0_opacity") > 0.5; - view_settings.extruder1_checked = UM.Preferences.getValue("layerview/extruder1_opacity") > 0.5; - view_settings.extruder2_checked = UM.Preferences.getValue("layerview/extruder2_opacity") > 0.5; - view_settings.extruder3_checked = UM.Preferences.getValue("layerview/extruder3_opacity") > 0.5; - view_settings.show_travel_moves = UM.Preferences.getValue("layerview/show_travel_moves"); - view_settings.show_helpers = UM.Preferences.getValue("layerview/show_helpers"); - view_settings.show_skin = UM.Preferences.getValue("layerview/show_skin"); - view_settings.show_infill = UM.Preferences.getValue("layerview/show_infill"); - } - } ColumnLayout { id: view_settings @@ -128,19 +40,132 @@ Item property bool show_skin: UM.Preferences.getValue("layerview/show_skin") property bool show_infill: UM.Preferences.getValue("layerview/show_infill") - anchors.top: UM.LayerView.compatibilityMode ? compatibilityModeLabel.bottom : layerTypeCombobox.bottom + anchors.top: parent.top anchors.topMargin: UM.Theme.getSize("default_margin").height anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("default_margin").width + spacing: UM.Theme.getValue("layerview_row_spacing").height + + Label + { + id: layersLabel + anchors.left: parent.left + text: catalog.i18nc("@label","View Mode: Layers") + font.bold: true + } + + Label + { + id: spaceLabel + anchors.left: parent.left + text: " " + font.pointSize: 0.5 + } + + Label + { + id: layerViewTypesLabel + anchors.left: parent.left + text: catalog.i18nc("@label","Color scheme") + visible: !UM.LayerView.compatibilityMode + Layout.fillWidth: true + } + + ListModel // matches LayerView.py + { + id: layerViewTypes + ListElement { + text: "Material Color" + type_id: 0 + } + ListElement { + text: "Line Type" + type_id: 1 // these ids match the switching in the shader + } + } + + ComboBox + { + id: layerTypeCombobox + anchors.left: parent.left + Layout.fillWidth: true + Layout.preferredWidth: UM.Theme.getValue("layerview_row").width + model: layerViewTypes + visible: !UM.LayerView.compatibilityMode + + property int layer_view_type: UM.Preferences.getValue("layerview/layer_view_type") + currentIndex: layer_view_type // index matches type_id + onActivated: { + // Combobox selection + var type_id = layerViewTypes.get(index).type_id; + UM.Preferences.setValue("layerview/layer_view_type", type_id); + updateLegend(); + } + onModelChanged: { + updateLegend(); + } + + // Update visibility of legend. + function updateLegend() { + var type_id = layerViewTypes.get(currentIndex).type_id; + if (UM.LayerView.compatibilityMode || (type_id == 1)) { + // Line type + UM.LayerView.enableLegend(); + } else { + UM.LayerView.disableLegend(); + } + } + } + + Label + { + id: compatibilityModeLabel + //anchors.top: layersLabel.bottom + anchors.left: parent.left + text: catalog.i18nc("@label","Compatibility Mode") + visible: UM.LayerView.compatibilityMode + Layout.fillWidth: true + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + Layout.preferredWidth: UM.Theme.getValue("layerview_row").width + } + + Label + { + id: space2Label + anchors.left: parent.left + text: " " + font.pointSize: 0.5 + } + + Connections { + target: UM.Preferences + onPreferenceChanged: + { + layerTypeCombobox.layer_view_type = UM.Preferences.getValue("layerview/layer_view_type"); + view_settings.extruder0_checked = UM.Preferences.getValue("layerview/extruder0_opacity") > 0.5; + view_settings.extruder1_checked = UM.Preferences.getValue("layerview/extruder1_opacity") > 0.5; + view_settings.extruder2_checked = UM.Preferences.getValue("layerview/extruder2_opacity") > 0.5; + view_settings.extruder3_checked = UM.Preferences.getValue("layerview/extruder3_opacity") > 0.5; + view_settings.show_travel_moves = UM.Preferences.getValue("layerview/show_travel_moves"); + view_settings.show_helpers = UM.Preferences.getValue("layerview/show_helpers"); + view_settings.show_skin = UM.Preferences.getValue("layerview/show_skin"); + view_settings.show_infill = UM.Preferences.getValue("layerview/show_infill"); + } + } CheckBox { + id: extruder0CheckBox checked: view_settings.extruder0_checked onClicked: { UM.Preferences.setValue("layerview/extruder0_opacity", checked ? 1.0 : 0.0); } text: "Extruder 1" visible: !UM.LayerView.compatibilityMode && (UM.LayerView.extruderCount >= 1) + Layout.fillWidth: true + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + Layout.preferredWidth: UM.Theme.getValue("layerview_row").width } + CheckBox { checked: view_settings.extruder1_checked onClicked: { @@ -148,6 +173,9 @@ Item } text: "Extruder 2" visible: !UM.LayerView.compatibilityMode && (UM.LayerView.extruderCount >= 2) + Layout.fillWidth: true + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + Layout.preferredWidth: UM.Theme.getValue("layerview_row").width } CheckBox { checked: view_settings.extruder2_checked @@ -155,7 +183,9 @@ Item UM.Preferences.setValue("layerview/extruder2_opacity", checked ? 1.0 : 0.0); } text: "Extruder 3" - visible: !UM.LayerView.compatibilityMode && (UM.LayerView.etruderCount >= 3) + visible: !UM.LayerView.compatibilityMode && (UM.LayerView.extruderCount >= 3) + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + Layout.preferredWidth: UM.Theme.getValue("layerview_row").width } CheckBox { checked: view_settings.extruder3_checked @@ -164,10 +194,14 @@ Item } text: "Extruder 4" visible: !UM.LayerView.compatibilityMode && (UM.LayerView.extruderCount >= 4) + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + Layout.preferredWidth: UM.Theme.getValue("layerview_row").width } Label { - text: "Other extruders always visible" + text: "Other extr. always visible" visible: !UM.LayerView.compatibilityMode && (UM.LayerView.extruderCount >= 5) + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + Layout.preferredWidth: UM.Theme.getValue("layerview_row").width } CheckBox { checked: view_settings.show_travel_moves @@ -175,6 +209,19 @@ Item UM.Preferences.setValue("layerview/show_travel_moves", checked); } text: catalog.i18nc("@label", "Show Travels") + Rectangle { + anchors.top: parent.top + anchors.topMargin: 2 + anchors.right: parent.right + width: UM.Theme.getSize("layerview_legend_size").width + height: UM.Theme.getSize("layerview_legend_size").height + color: "#00f" + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + } + Layout.fillWidth: true + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + Layout.preferredWidth: UM.Theme.getValue("layerview_row").width } CheckBox { checked: view_settings.show_helpers @@ -182,6 +229,19 @@ Item UM.Preferences.setValue("layerview/show_helpers", checked); } text: catalog.i18nc("@label", "Show Helpers") + Rectangle { + anchors.top: parent.top + anchors.topMargin: 2 + anchors.right: parent.right + width: UM.Theme.getSize("layerview_legend_size").width + height: UM.Theme.getSize("layerview_legend_size").height + color: "#0ff" + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + } + Layout.fillWidth: true + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + Layout.preferredWidth: UM.Theme.getValue("layerview_row").width } CheckBox { checked: view_settings.show_skin @@ -189,6 +249,19 @@ Item UM.Preferences.setValue("layerview/show_skin", checked); } text: catalog.i18nc("@label", "Show Shell") + Rectangle { + anchors.top: parent.top + anchors.topMargin: 2 + anchors.right: parent.right + width: UM.Theme.getSize("layerview_legend_size").width + height: UM.Theme.getSize("layerview_legend_size").height + color: "#f00" + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + } + Layout.fillWidth: true + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + Layout.preferredWidth: UM.Theme.getValue("layerview_row").width } CheckBox { checked: view_settings.show_infill @@ -196,141 +269,177 @@ Item UM.Preferences.setValue("layerview/show_infill", checked); } text: catalog.i18nc("@label", "Show Infill") + Rectangle { + anchors.top: parent.top + anchors.topMargin: 2 + anchors.right: parent.right + width: UM.Theme.getSize("layerview_legend_size").width + height: UM.Theme.getSize("layerview_legend_size").height + color: "#f80" + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + } + Layout.fillWidth: true + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + Layout.preferredWidth: UM.Theme.getValue("layerview_row").width } - } - } - Slider - { - id: sliderMinimumLayer - width: UM.Theme.getSize("slider_layerview_size").width - height: UM.Theme.getSize("slider_layerview_size").height - anchors.left: layerViewMenu.right - anchors.leftMargin: UM.Theme.getSize("slider_layerview_margin").width * 0.2 - orientation: Qt.Vertical - minimumValue: 0; - maximumValue: UM.LayerView.numLayers-1; - stepSize: 1 - - property real pixelsPerStep: ((height - UM.Theme.getSize("slider_handle").height) / (maximumValue - minimumValue)) * stepSize; - - value: UM.LayerView.minimumLayer - onValueChanged: { - UM.LayerView.setMinimumLayer(value) - if (value > UM.LayerView.currentLayer) { - UM.LayerView.setCurrentLayer(value); + Label + { + id: topBottomLabel + anchors.left: parent.left + text: catalog.i18nc("@label","Top / Bottom") + Rectangle { + anchors.top: parent.top + anchors.topMargin: 2 + anchors.right: parent.right + width: UM.Theme.getSize("layerview_legend_size").width + height: UM.Theme.getSize("layerview_legend_size").height + color: "#ff0" + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + } + Layout.fillWidth: true + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + Layout.preferredWidth: UM.Theme.getValue("layerview_row").width } + + Label + { + id: innerWallLabel + anchors.left: parent.left + text: catalog.i18nc("@label","Inner Wall") + Rectangle { + anchors.top: parent.top + anchors.topMargin: 2 + anchors.right: parent.right + width: UM.Theme.getSize("layerview_legend_size").width + height: UM.Theme.getSize("layerview_legend_size").height + color: "#0f0" + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + } + Layout.fillWidth: true + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + Layout.preferredWidth: UM.Theme.getValue("layerview_row").width + } + } - style: UM.Theme.styles.slider; - } + Slider + { + id: sliderMinimumLayer + width: UM.Theme.getSize("slider_layerview_size").width + height: parent.height - 2*UM.Theme.getSize("slider_layerview_margin").height // UM.Theme.getSize("slider_layerview_size").height + anchors.top: parent.top + anchors.topMargin: UM.Theme.getSize("slider_layerview_margin").height + anchors.right: layerViewMenu.right + anchors.rightMargin: UM.Theme.getSize("slider_layerview_margin").width * 0.8 + orientation: Qt.Vertical + minimumValue: 0; + maximumValue: UM.LayerView.numLayers-1; + stepSize: 1 - Slider - { - id: slider - width: UM.Theme.getSize("slider_layerview_size").width - height: UM.Theme.getSize("slider_layerview_size").height - anchors.left: layerViewMenu.right - anchors.leftMargin: UM.Theme.getSize("slider_layerview_margin").width * 0.8 - orientation: Qt.Vertical - minimumValue: 0; - maximumValue: UM.LayerView.numLayers; - stepSize: 1 + property real pixelsPerStep: ((height - UM.Theme.getSize("slider_handle").height) / (maximumValue - minimumValue)) * stepSize; - property real pixelsPerStep: ((height - UM.Theme.getSize("slider_handle").height) / (maximumValue - minimumValue)) * stepSize; - - value: UM.LayerView.currentLayer - onValueChanged: { - UM.LayerView.setCurrentLayer(value); - if (value < UM.LayerView.minimumLayer) { - UM.LayerView.setMinimumLayer(value); + value: UM.LayerView.minimumLayer + onValueChanged: { + UM.LayerView.setMinimumLayer(value) + if (value > UM.LayerView.currentLayer) { + UM.LayerView.setCurrentLayer(value); } } - style: UM.Theme.styles.slider; + style: UM.Theme.styles.slider; + } - Rectangle + Slider { - x: parent.width + UM.Theme.getSize("slider_layerview_background").width / 2; - y: parent.height - (parent.value * parent.pixelsPerStep) - UM.Theme.getSize("slider_handle").height * 1.25; + id: slider + width: UM.Theme.getSize("slider_layerview_size").width + height: parent.height - 2*UM.Theme.getSize("slider_layerview_margin").height //UM.Theme.getSize("slider_layerview_size").height + anchors.top: parent.top + anchors.topMargin: UM.Theme.getSize("slider_layerview_margin").height + anchors.right: layerViewMenu.right + anchors.rightMargin: UM.Theme.getSize("slider_layerview_margin").width * 0.2 + orientation: Qt.Vertical + minimumValue: 0; + maximumValue: UM.LayerView.numLayers; + stepSize: 1 - height: UM.Theme.getSize("slider_handle").height + UM.Theme.getSize("default_margin").height - width: valueLabel.width + UM.Theme.getSize("default_margin").width - Behavior on height { NumberAnimation { duration: 50; } } + property real pixelsPerStep: ((height - UM.Theme.getSize("slider_handle").height) / (maximumValue - minimumValue)) * stepSize; - border.width: UM.Theme.getSize("default_lining").width - border.color: UM.Theme.getColor("slider_groove_border") - color: UM.Theme.getColor("tool_panel_background") - - visible: UM.LayerView.layerActivity && Printer.platformActivity ? true : false - - TextField - { - id: valueLabel - property string maxValue: slider.maximumValue + 1 - text: slider.value + 1 - horizontalAlignment: TextInput.AlignRight; - onEditingFinished: - { - // Ensure that the cursor is at the first position. On some systems the text isn't fully visible - // Seems to have to do something with different dpi densities that QML doesn't quite handle. - // Another option would be to increase the size even further, but that gives pretty ugly results. - cursorPosition = 0; - if(valueLabel.text != '') - { - slider.value = valueLabel.text - 1; + value: UM.LayerView.currentLayer + onValueChanged: { + UM.LayerView.setCurrentLayer(value); + if (value < UM.LayerView.minimumLayer) { + UM.LayerView.setMinimumLayer(value); } } - validator: IntValidator { bottom: 1; top: slider.maximumValue + 1; } - anchors.left: parent.left; - anchors.leftMargin: UM.Theme.getSize("default_margin").width / 2; - anchors.verticalCenter: parent.verticalCenter; + style: UM.Theme.styles.slider; - width: Math.max(UM.Theme.getSize("line").width * maxValue.length + 2, 20); - style: TextFieldStyle + Rectangle + { + x: parent.width + UM.Theme.getSize("slider_layerview_background").width / 2; + y: parent.height - (parent.value * parent.pixelsPerStep) - UM.Theme.getSize("slider_handle").height * 1.25; + + height: UM.Theme.getSize("slider_handle").height + UM.Theme.getSize("default_margin").height + width: valueLabel.width + UM.Theme.getSize("default_margin").width + Behavior on height { NumberAnimation { duration: 50; } } + + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("slider_groove_border") + color: UM.Theme.getColor("tool_panel_background") + + visible: UM.LayerView.layerActivity && Printer.platformActivity ? true : false + + TextField { - textColor: UM.Theme.getColor("setting_control_text"); - font: UM.Theme.getFont("default"); - background: Item { } + id: valueLabel + property string maxValue: slider.maximumValue + 1 + text: slider.value + 1 + horizontalAlignment: TextInput.AlignRight; + onEditingFinished: + { + // Ensure that the cursor is at the first position. On some systems the text isn't fully visible + // Seems to have to do something with different dpi densities that QML doesn't quite handle. + // Another option would be to increase the size even further, but that gives pretty ugly results. + cursorPosition = 0; + if(valueLabel.text != '') + { + slider.value = valueLabel.text - 1; + } + } + validator: IntValidator { bottom: 1; top: slider.maximumValue + 1; } + + anchors.left: parent.left; + anchors.leftMargin: UM.Theme.getSize("default_margin").width / 2; + anchors.verticalCenter: parent.verticalCenter; + + width: Math.max(UM.Theme.getSize("line").width * maxValue.length + 2, 20); + style: TextFieldStyle + { + textColor: UM.Theme.getColor("setting_control_text"); + font: UM.Theme.getFont("default"); + background: Item { } + } + } + + BusyIndicator + { + id: busyIndicator; + anchors.left: parent.right; + anchors.leftMargin: UM.Theme.getSize("default_margin").width / 2; + anchors.verticalCenter: parent.verticalCenter; + + width: UM.Theme.getSize("slider_handle").height; + height: width; + + running: UM.LayerView.busy; + visible: UM.LayerView.busy; } } - - BusyIndicator - { - id: busyIndicator; - anchors.left: parent.right; - anchors.leftMargin: UM.Theme.getSize("default_margin").width / 2; - anchors.verticalCenter: parent.verticalCenter; - - width: UM.Theme.getSize("slider_handle").height; - height: width; - - running: UM.LayerView.busy; - visible: UM.LayerView.busy; - } } } - - Rectangle { - id: slider_background - anchors.left: layerViewMenu.right - anchors.verticalCenter: parent.verticalCenter - z: slider.z - 1 - width: UM.Theme.getSize("slider_layerview_background").width - height: slider.height + UM.Theme.getSize("default_margin").height * 2 - color: UM.Theme.getColor("tool_panel_background"); - border.width: UM.Theme.getSize("default_lining").width - border.color: UM.Theme.getColor("lining") - - MouseArea { - id: sliderMouseArea - property double manualStepSize: slider.maximumValue / 11 - anchors.fill: parent - onWheel: { - slider.value = wheel.angleDelta.y < 0 ? slider.value - sliderMouseArea.manualStepSize : slider.value + sliderMouseArea.manualStepSize - } - } - } - } diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index 0a6a131eb5..cb19d330e7 100644 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -291,11 +291,14 @@ "slider_groove": [0.5, 0.5], "slider_handle": [1.5, 1.5], - "slider_layerview_size": [1.0, 16.0], + "slider_layerview_size": [1.0, 22.0], "slider_layerview_background": [4.0, 0.0], - "slider_layerview_margin": [3.0, 3.0], + "slider_layerview_margin": [3.0, 1.0], - "layerview_menu_size": [12.0, 25.0], + "layerview_menu_size": [17.0, 20.0], + "layerview_legend_size": [1.0, 1.0], + "layerview_row": [11.0, 1.5], + "layerview_row_spacing": [0.0, 0.5], "checkbox": [2.0, 2.0], From 85b58c9296847e6a54b9c8d93de9f00268914154 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 28 Feb 2017 12:35:08 +0100 Subject: [PATCH 042/146] Pressing the discard button now actually discards the changes CURA-3221 --- cura/CuraApplication.py | 15 ++++--- cura/Settings/MachineManager.py | 42 ------------------- .../qml/DiscardOrKeepProfileChangesDialog.qml | 10 +++++ 3 files changed, 19 insertions(+), 48 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index a180c72366..d273285be3 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -331,14 +331,17 @@ class CuraApplication(QtApplication): showDiscardOrKeepProfileChanges = pyqtSignal() - def discardOrKeepProfileChanges(self, callback = None, callback_arguments = []): - self._discard_or_keep_changes_callback = callback - self._discard_or_keep_changes_callback_arguments = callback_arguments + def discardOrKeepProfileChanges(self): self.showDiscardOrKeepProfileChanges.emit() - @pyqtSlot(int) - def discardOrKeepProfileChangesClosed(self, button): - pass + @pyqtSlot(str) + def discardOrKeepProfileChangesClosed(self, option): + if option == "discard": + global_stack = self.getGlobalContainerStack() + for extruder in ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()): + extruder.getTop().clear() + + global_stack.getTop().clear() @pyqtSlot(int) def messageBoxClosed(self, button): diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 38e1ad4d6a..42f0edefe1 100644 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -939,49 +939,7 @@ class MachineManager(QObject): container.nameChanged.connect(self._onQualityNameChanged) def _askUserToKeepOrClearCurrentSettings(self): - # Ask the user if the user profile should be cleared or not (discarding the current settings) - # In Simple Mode we assume the user always wants to keep the (limited) current settings - details_text = catalog.i18nc("@label", "You made changes to the following setting(s)/override(s):") - - # user changes in global stack - details_list = [setting.definition.label for setting in self._global_container_stack.getTop().findInstances(**{})] - - # user changes in extruder stacks - stacks = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())) - for stack in stacks: - details_list.extend([ - "%s (%s)" % (setting.definition.label, stack.getName()) - for setting in stack.getTop().findInstances(**{})]) - - # Format to output string - details = "\n ".join([details_text, ] + details_list) - - num_changed_settings = len(details_list) Application.getInstance().discardOrKeepProfileChanges() - '''Application.getInstance().messageBox( - catalog.i18nc("@window:title", "Switched profiles"), - catalog.i18nc( - "@label", - "Do you want to transfer your %d changed setting(s)/override(s) to this profile?") % num_changed_settings, - catalog.i18nc( - "@label", - "If you transfer your settings they will override settings in the profile. If you don't transfer these settings, they will be lost."), - details, - buttons=QMessageBox.Yes + QMessageBox.No, - icon=QMessageBox.Question, - callback=self._keepUserSettingsDialogCallback)''' - - def _keepUserSettingsDialogCallback(self, button): - if button == QMessageBox.Yes: - # Yes, keep the settings in the user profile with this profile - pass - elif button == QMessageBox.No: - # No, discard the settings in the user profile - global_stack = Application.getInstance().getGlobalContainerStack() - for extruder in ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()): - extruder.getTop().clear() - - global_stack.getTop().clear() @pyqtProperty(str, notify = activeVariantChanged) def activeVariantName(self): diff --git a/resources/qml/DiscardOrKeepProfileChangesDialog.qml b/resources/qml/DiscardOrKeepProfileChangesDialog.qml index 2744ba3847..fac428aea1 100644 --- a/resources/qml/DiscardOrKeepProfileChangesDialog.qml +++ b/resources/qml/DiscardOrKeepProfileChangesDialog.qml @@ -116,10 +116,20 @@ UM.Dialog Button { text: catalog.i18nc("@action:button", "Keep"); + onClicked: + { + Printer.discardOrKeepProfileChangesClosed("keep") + base.hide() + } } Button { text: catalog.i18nc("@action:button", "Discard"); + onClicked: + { + Printer.discardOrKeepProfileChangesClosed("discard") + base.hide() + } } } } From ba6a8eb869c0f4637378dbc80ef645668c6db74b Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 28 Feb 2017 13:34:58 +0100 Subject: [PATCH 043/146] Legend is now in the switching layer type area, removed legend upper right. CURA-3321 --- cura/CuraApplication.py | 5 --- plugins/LayerView/LayerView.py | 11 ------ plugins/LayerView/LayerView.qml | 56 ++++++++++++++++------------- plugins/LayerView/LayerViewProxy.py | 15 +------- 4 files changed, 33 insertions(+), 54 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index add7b4a143..43ca0d3dc5 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -337,11 +337,6 @@ class CuraApplication(QtApplication): showPrintMonitor = pyqtSignal(bool, arguments = ["show"]) - def setViewLegendItems(self, items): - self.viewLegendItemsChanged.emit(items) - - viewLegendItemsChanged = pyqtSignal("QVariantList", arguments = ["items"]) - ## Cura has multiple locations where instance containers need to be saved, so we need to handle this differently. # # Note that the AutoSave plugin also calls this method. diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py index 0a315b5865..ca8d57926d 100644 --- a/plugins/LayerView/LayerView.py +++ b/plugins/LayerView/LayerView.py @@ -278,12 +278,6 @@ class LayerView(View): def endRendering(self): pass - def enableLegend(self): - Application.getInstance().setViewLegendItems(self._getLegendItems()) - - def disableLegend(self): - Application.getInstance().setViewLegendItems([]) - def event(self, event): modifiers = QApplication.keyboardModifiers() ctrl_is_active = modifiers == Qt.ControlModifier @@ -316,9 +310,6 @@ class LayerView(View): self._old_composite_shader = self._composite_pass.getCompositeShader() self._composite_pass.setCompositeShader(self._layerview_composite_shader) - if self.getLayerViewType() == self.LAYER_VIEW_TYPE_LINE_TYPE or self._compatibility_mode: - self.enableLegend() - elif event.type == Event.ViewDeactivateEvent: self._wireprint_warning_message.hide() Application.getInstance().globalContainerStackChanged.disconnect(self._onGlobalStackChanged) @@ -328,8 +319,6 @@ class LayerView(View): self._composite_pass.setLayerBindings(self._old_layer_bindings) self._composite_pass.setCompositeShader(self._old_composite_shader) - self.disableLegend() - def _onGlobalStackChanged(self): if self._global_container_stack: self._global_container_stack.propertyChanged.disconnect(self._onPropertyChanged) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 8a47818c08..d66e9ab436 100644 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -26,7 +26,7 @@ Item width: parent.width height: parent.height z: slider.z - 1 - color: UM.Theme.getColor("tool_panel_background"); + color: UM.Theme.getColor("tool_panel_background") ColumnLayout { id: view_settings @@ -39,12 +39,13 @@ Item property bool show_helpers: UM.Preferences.getValue("layerview/show_helpers") property bool show_skin: UM.Preferences.getValue("layerview/show_skin") property bool show_infill: UM.Preferences.getValue("layerview/show_infill") + property bool show_legend: false anchors.top: parent.top anchors.topMargin: UM.Theme.getSize("default_margin").height anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("default_margin").width - spacing: UM.Theme.getValue("layerview_row_spacing").height + spacing: UM.Theme.getSize("layerview_row_spacing").height Label { @@ -89,7 +90,7 @@ Item id: layerTypeCombobox anchors.left: parent.left Layout.fillWidth: true - Layout.preferredWidth: UM.Theme.getValue("layerview_row").width + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width model: layerViewTypes visible: !UM.LayerView.compatibilityMode @@ -110,9 +111,9 @@ Item var type_id = layerViewTypes.get(currentIndex).type_id; if (UM.LayerView.compatibilityMode || (type_id == 1)) { // Line type - UM.LayerView.enableLegend(); + view_settings.show_legend = true; } else { - UM.LayerView.disableLegend(); + view_settings.show_legend = false; } } } @@ -126,7 +127,7 @@ Item visible: UM.LayerView.compatibilityMode Layout.fillWidth: true Layout.preferredHeight: UM.Theme.getSize("layerview_row").height - Layout.preferredWidth: UM.Theme.getValue("layerview_row").width + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width } Label @@ -163,7 +164,7 @@ Item visible: !UM.LayerView.compatibilityMode && (UM.LayerView.extruderCount >= 1) Layout.fillWidth: true Layout.preferredHeight: UM.Theme.getSize("layerview_row").height - Layout.preferredWidth: UM.Theme.getValue("layerview_row").width + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width } CheckBox { @@ -175,7 +176,7 @@ Item visible: !UM.LayerView.compatibilityMode && (UM.LayerView.extruderCount >= 2) Layout.fillWidth: true Layout.preferredHeight: UM.Theme.getSize("layerview_row").height - Layout.preferredWidth: UM.Theme.getValue("layerview_row").width + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width } CheckBox { checked: view_settings.extruder2_checked @@ -185,7 +186,7 @@ Item text: "Extruder 3" visible: !UM.LayerView.compatibilityMode && (UM.LayerView.extruderCount >= 3) Layout.preferredHeight: UM.Theme.getSize("layerview_row").height - Layout.preferredWidth: UM.Theme.getValue("layerview_row").width + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width } CheckBox { checked: view_settings.extruder3_checked @@ -195,13 +196,13 @@ Item text: "Extruder 4" visible: !UM.LayerView.compatibilityMode && (UM.LayerView.extruderCount >= 4) Layout.preferredHeight: UM.Theme.getSize("layerview_row").height - Layout.preferredWidth: UM.Theme.getValue("layerview_row").width + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width } Label { text: "Other extr. always visible" visible: !UM.LayerView.compatibilityMode && (UM.LayerView.extruderCount >= 5) Layout.preferredHeight: UM.Theme.getSize("layerview_row").height - Layout.preferredWidth: UM.Theme.getValue("layerview_row").width + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width } CheckBox { checked: view_settings.show_travel_moves @@ -215,13 +216,14 @@ Item anchors.right: parent.right width: UM.Theme.getSize("layerview_legend_size").width height: UM.Theme.getSize("layerview_legend_size").height - color: "#00f" + color: UM.Theme.getColor("layerview_move_combing") border.width: UM.Theme.getSize("default_lining").width border.color: UM.Theme.getColor("lining") + visible: view_settings.show_legend } Layout.fillWidth: true Layout.preferredHeight: UM.Theme.getSize("layerview_row").height - Layout.preferredWidth: UM.Theme.getValue("layerview_row").width + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width } CheckBox { checked: view_settings.show_helpers @@ -235,13 +237,14 @@ Item anchors.right: parent.right width: UM.Theme.getSize("layerview_legend_size").width height: UM.Theme.getSize("layerview_legend_size").height - color: "#0ff" + color: UM.Theme.getColor("layerview_support") border.width: UM.Theme.getSize("default_lining").width border.color: UM.Theme.getColor("lining") + visible: view_settings.show_legend } Layout.fillWidth: true Layout.preferredHeight: UM.Theme.getSize("layerview_row").height - Layout.preferredWidth: UM.Theme.getValue("layerview_row").width + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width } CheckBox { checked: view_settings.show_skin @@ -255,13 +258,14 @@ Item anchors.right: parent.right width: UM.Theme.getSize("layerview_legend_size").width height: UM.Theme.getSize("layerview_legend_size").height - color: "#f00" + color: UM.Theme.getColor("layerview_inset_0") border.width: UM.Theme.getSize("default_lining").width border.color: UM.Theme.getColor("lining") + visible: view_settings.show_legend } Layout.fillWidth: true Layout.preferredHeight: UM.Theme.getSize("layerview_row").height - Layout.preferredWidth: UM.Theme.getValue("layerview_row").width + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width } CheckBox { checked: view_settings.show_infill @@ -275,13 +279,14 @@ Item anchors.right: parent.right width: UM.Theme.getSize("layerview_legend_size").width height: UM.Theme.getSize("layerview_legend_size").height - color: "#f80" + color: UM.Theme.getColor("layerview_infill") border.width: UM.Theme.getSize("default_lining").width border.color: UM.Theme.getColor("lining") + visible: view_settings.show_legend } Layout.fillWidth: true Layout.preferredHeight: UM.Theme.getSize("layerview_row").height - Layout.preferredWidth: UM.Theme.getValue("layerview_row").width + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width } Label @@ -295,13 +300,14 @@ Item anchors.right: parent.right width: UM.Theme.getSize("layerview_legend_size").width height: UM.Theme.getSize("layerview_legend_size").height - color: "#ff0" + color: UM.Theme.getColor("layerview_skin") border.width: UM.Theme.getSize("default_lining").width border.color: UM.Theme.getColor("lining") } Layout.fillWidth: true Layout.preferredHeight: UM.Theme.getSize("layerview_row").height - Layout.preferredWidth: UM.Theme.getValue("layerview_row").width + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width + visible: view_settings.show_legend } Label @@ -315,13 +321,15 @@ Item anchors.right: parent.right width: UM.Theme.getSize("layerview_legend_size").width height: UM.Theme.getSize("layerview_legend_size").height - color: "#0f0" + color: UM.Theme.getColor("layerview_inset_x") border.width: UM.Theme.getSize("default_lining").width border.color: UM.Theme.getColor("lining") + visible: view_settings.show_legend } Layout.fillWidth: true Layout.preferredHeight: UM.Theme.getSize("layerview_row").height - Layout.preferredWidth: UM.Theme.getValue("layerview_row").width + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width + visible: view_settings.show_legend } } @@ -330,7 +338,7 @@ Item { id: sliderMinimumLayer width: UM.Theme.getSize("slider_layerview_size").width - height: parent.height - 2*UM.Theme.getSize("slider_layerview_margin").height // UM.Theme.getSize("slider_layerview_size").height + height: parent.height - 2*UM.Theme.getSize("slider_layerview_margin").height anchors.top: parent.top anchors.topMargin: UM.Theme.getSize("slider_layerview_margin").height anchors.right: layerViewMenu.right diff --git a/plugins/LayerView/LayerViewProxy.py b/plugins/LayerView/LayerViewProxy.py index d214f36407..0c3998a334 100644 --- a/plugins/LayerView/LayerViewProxy.py +++ b/plugins/LayerView/LayerViewProxy.py @@ -30,8 +30,7 @@ class LayerViewProxy(QObject): active_view = self._controller.getActiveView() if type(active_view) == LayerView.LayerView.LayerView: return active_view.getMaxLayers() - #return 100 - + @pyqtProperty(int, notify = currentLayerChanged) def currentLayer(self): active_view = self._controller.getActiveView() @@ -124,18 +123,6 @@ class LayerViewProxy(QObject): return active_view.getExtruderCount() return 0 - @pyqtSlot() - def enableLegend(self): - active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: - active_view.enableLegend() - - @pyqtSlot() - def disableLegend(self): - active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: - active_view.disableLegend() - def _layerActivityChanged(self): self.activityChanged.emit() From 4d7133610de793755f46cf409ea7ef133c939d22 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 28 Feb 2017 13:38:15 +0100 Subject: [PATCH 044/146] Updated layout of dialog CURA-3221 --- .../qml/DiscardOrKeepProfileChangesDialog.qml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/resources/qml/DiscardOrKeepProfileChangesDialog.qml b/resources/qml/DiscardOrKeepProfileChangesDialog.qml index fac428aea1..4f7b1651cc 100644 --- a/resources/qml/DiscardOrKeepProfileChangesDialog.qml +++ b/resources/qml/DiscardOrKeepProfileChangesDialog.qml @@ -14,7 +14,7 @@ UM.Dialog title: catalog.i18nc("@title:window", "Discard or Keep changes") width: 500 - height: 500 + height: 300 property var changesModel: Cura.UserChangesModel{ id: userChangesModel} onVisibilityChanged: { @@ -39,6 +39,13 @@ UM.Dialog anchors.margins: UM.Theme.getSize("default_margin").width anchors.left: parent.left anchors.right: parent.right + font: UM.Theme.getFont("default_bold") + wrapMode: Text.WordWrap + } + Item // Spacer + { + height: UM.Theme.getSize("default_margin").height + width: UM.Theme.getSize("default_margin").width } TableView @@ -111,8 +118,15 @@ UM.Dialog model: base.changesModel } + Item // Spacer + { + height: UM.Theme.getSize("default_margin").height + width: UM.Theme.getSize("default_margin").width + } Row { + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("default_margin").width Button { text: catalog.i18nc("@action:button", "Keep"); From 4d32bbda99651d49a8a0462677cf2d57dc4fc53e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 28 Feb 2017 13:42:35 +0100 Subject: [PATCH 045/146] Values are now converted to string. For some reason this causes a different rounding to occur. I don't know why, but it does solve the problem CURA-3221 --- cura/Settings/UserChangesModel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/UserChangesModel.py b/cura/Settings/UserChangesModel.py index 1ff0a486b7..48296b9907 100644 --- a/cura/Settings/UserChangesModel.py +++ b/cura/Settings/UserChangesModel.py @@ -101,7 +101,7 @@ class UserChangesModel(ListModel): item_to_add = {"key": setting_key, "label": label, "user_value": user_changes.getProperty(setting_key, "value"), - "original_value": original_value, + "original_value": str(original_value), "extruder": "", "category": category_label} From af21146fef87bd631eff2f7fb8b3830f57a2061a Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 28 Feb 2017 14:07:12 +0100 Subject: [PATCH 046/146] Layout improvements CURA-3221 --- .../qml/DiscardOrKeepProfileChangesDialog.qml | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/resources/qml/DiscardOrKeepProfileChangesDialog.qml b/resources/qml/DiscardOrKeepProfileChangesDialog.qml index 4f7b1651cc..2b997cb00c 100644 --- a/resources/qml/DiscardOrKeepProfileChangesDialog.qml +++ b/resources/qml/DiscardOrKeepProfileChangesDialog.qml @@ -27,25 +27,36 @@ UM.Dialog Column { anchors.fill: parent + spacing: UM.Theme.getSize("default_margin").width UM.I18nCatalog { id: catalog; name:"cura" } - Label + + Row { - text: "You have customized some default profile settings. Would you like to keep or discard those settings?" + height: childrenRect.height anchors.margins: UM.Theme.getSize("default_margin").width anchors.left: parent.left anchors.right: parent.right - font: UM.Theme.getFont("default_bold") - wrapMode: Text.WordWrap - } - Item // Spacer - { - height: UM.Theme.getSize("default_margin").height - width: UM.Theme.getSize("default_margin").width + spacing: UM.Theme.getSize("default_margin").width + UM.RecolorImage + { + source: UM.Theme.getIcon("star") + width : 30 + height: width + color: UM.Theme.getColor("setting_control_button") + } + + Label + { + text: "You have customized some default profile settings.\nWould you like to keep or discard those settings?" + anchors.margins: UM.Theme.getSize("default_margin").width + font: UM.Theme.getFont("default_bold") + wrapMode: Text.WordWrap + } } TableView @@ -118,15 +129,11 @@ UM.Dialog model: base.changesModel } - Item // Spacer - { - height: UM.Theme.getSize("default_margin").height - width: UM.Theme.getSize("default_margin").width - } Row { anchors.right: parent.right anchors.rightMargin: UM.Theme.getSize("default_margin").width + spacing: UM.Theme.getSize("default_margin").width Button { text: catalog.i18nc("@action:button", "Keep"); From cae40da7aa025578a678e0d1ea2b28d4df003b8a Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Tue, 28 Feb 2017 14:23:46 +0100 Subject: [PATCH 047/146] JSON fix: put material_print_temperature_layer_0 back to normal print temp for all machines other than UM3 family (CURA-3359) --- resources/definitions/fdmprinter.def.json | 2 +- resources/definitions/ultimaker3.def.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 6c37477191..053de6f78b 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1297,7 +1297,7 @@ "unit": "°C", "type": "float", "default_value": 215, - "value": "material_print_temperature + 5", + "value": "material_print_temperature", "minimum_value": "-273.15", "minimum_value_warning": "0", "maximum_value_warning": "260", diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json index d7245e5178..27db3f19c7 100644 --- a/resources/definitions/ultimaker3.def.json +++ b/resources/definitions/ultimaker3.def.json @@ -106,6 +106,7 @@ "line_width": { "value": "machine_nozzle_size * 0.875" }, "machine_min_cool_heat_time_window": { "value": "15" }, "default_material_print_temperature": { "value": "200" }, + "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, "material_bed_temperature": { "maximum_value": "115" }, "material_bed_temperature_layer_0": { "maximum_value": "115" }, "material_standby_temperature": { "value": "100" }, From 807542cc1f79fffcd6ed751286d23fb7b1272b2e Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Tue, 28 Feb 2017 14:36:36 +0100 Subject: [PATCH 048/146] Fixed a merge problem. CURA-3431 Not possible to export a profile --- cura/Settings/ContainerManager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index 7bc2ff9efc..7e92b7dfd3 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -856,10 +856,10 @@ class ContainerManager(QObject): return self._container_registry.importProfile(path) @pyqtSlot("QVariantList", QUrl, str) - def exportProfile(self, instance_id, file_url, file_type): + def exportProfile(self, instance_id: str, file_url: QUrl, file_type: str) -> None: if not file_url.isValid(): return path = file_url.toLocalFile() if not path: return - self._container_registry.exportProfile(instance_id, path, file_type) + self._container_registry.exportProfile(instance_id, path, file_type) From f22299c80d85089ee7405360d085a09f1a8672ec Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 28 Feb 2017 14:43:46 +0100 Subject: [PATCH 049/146] Added option for show_travels in compatibility mode top layers. CURA-3321 --- plugins/LayerView/LayerPass.py | 8 ++++---- plugins/LayerView/LayerView.py | 13 +++++++++++-- resources/themes/cura/theme.json | 2 +- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/plugins/LayerView/LayerPass.py b/plugins/LayerView/LayerPass.py index 4fc5f66793..b706f21877 100644 --- a/plugins/LayerView/LayerPass.py +++ b/plugins/LayerView/LayerPass.py @@ -97,11 +97,11 @@ class LayerPass(RenderPass): # Create a new batch that is not range-limited batch = RenderBatch(self._layer_shader, type = RenderBatch.RenderType.Solid) - if self._layer_view._current_layer_mesh: - batch.addItem(node.getWorldTransformation(), self._layer_view._current_layer_mesh) + if self._layer_view.getCurrentLayerMesh(): + batch.addItem(node.getWorldTransformation(), self._layer_view.getCurrentLayerMesh()) - if self._layer_view._current_layer_jumps: - batch.addItem(node.getWorldTransformation(), self._layer_view._current_layer_jumps) + if self._layer_view.getCurrentLayerJumps(): + batch.addItem(node.getWorldTransformation(), self._layer_view.getCurrentLayerJumps()) if len(batch.items) > 0: batch.render(self._scene.getActiveCamera()) diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py index ca8d57926d..fb130cb3ff 100644 --- a/plugins/LayerView/LayerView.py +++ b/plugins/LayerView/LayerView.py @@ -67,6 +67,7 @@ class LayerView(View): self._resetSettings() self._legend_items = None + self._show_travel_moves = False Preferences.getInstance().addPreference("view/top_layer_count", 5) Preferences.getInstance().addPreference("view/only_show_top_layers", False) @@ -319,6 +320,12 @@ class LayerView(View): self._composite_pass.setLayerBindings(self._old_layer_bindings) self._composite_pass.setCompositeShader(self._old_composite_shader) + def getCurrentLayerMesh(self): + return self._current_layer_mesh + + def getCurrentLayerJumps(self): + return self._current_layer_jumps + def _onGlobalStackChanged(self): if self._global_container_stack: self._global_container_stack.propertyChanged.disconnect(self._onPropertyChanged) @@ -359,7 +366,8 @@ class LayerView(View): return self.resetLayerData() # Reset the layer data only when job is done. Doing it now prevents "blinking" data. self._current_layer_mesh = job.getResult().get("layers") - self._current_layer_jumps = job.getResult().get("jumps") + if self._show_travel_moves: + self._current_layer_jumps = job.getResult().get("jumps") self._controller.getScene().sceneChanged.emit(self._controller.getScene().getRoot()) self._top_layers_job = None @@ -377,7 +385,8 @@ class LayerView(View): self.setExtruderOpacity(2, float(Preferences.getInstance().getValue("layerview/extruder2_opacity"))) self.setExtruderOpacity(3, float(Preferences.getInstance().getValue("layerview/extruder3_opacity"))) - self.setShowTravelMoves(bool(Preferences.getInstance().getValue("layerview/show_travel_moves"))) + self._show_travel_moves = bool(Preferences.getInstance().getValue("layerview/show_travel_moves")) + self.setShowTravelMoves(self._show_travel_moves) self.setShowHelpers(bool(Preferences.getInstance().getValue("layerview/show_helpers"))) self.setShowSkin(bool(Preferences.getInstance().getValue("layerview/show_skin"))) self.setShowInfill(bool(Preferences.getInstance().getValue("layerview/show_infill"))) diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index cb19d330e7..52eff89011 100644 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -295,7 +295,7 @@ "slider_layerview_background": [4.0, 0.0], "slider_layerview_margin": [3.0, 1.0], - "layerview_menu_size": [17.0, 20.0], + "layerview_menu_size": [16.5, 20.0], "layerview_legend_size": [1.0, 1.0], "layerview_row": [11.0, 1.5], "layerview_row_spacing": [0.0, 0.5], From 212a2bc4f3edd02831470fe11c0374527fe3ff86 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 28 Feb 2017 14:47:25 +0100 Subject: [PATCH 050/146] Removed unused theme element. CURA-3321 --- resources/themes/cura/theme.json | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index 52eff89011..13fffb5bdf 100644 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -244,7 +244,6 @@ "default_lining": [0.08, 0.08], "default_arrow": [0.8, 0.8], "logo": [9.5, 2.0], - "margin_small": [0.5, 0.5], "sidebar": [35.0, 10.0], "sidebar_header": [0.0, 4.0], From 9ea7681ba033a1398007194124b1a01a165de6f9 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 1 Mar 2017 09:47:30 +0100 Subject: [PATCH 051/146] Fix selecting heated bed for UMO This was broken by the type hinting refactors. Contributes to issue CURA-3405. --- plugins/UltimakerMachineActions/UMOUpgradeSelection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UltimakerMachineActions/UMOUpgradeSelection.py b/plugins/UltimakerMachineActions/UMOUpgradeSelection.py index 238a13bf61..0428c0f5c2 100644 --- a/plugins/UltimakerMachineActions/UMOUpgradeSelection.py +++ b/plugins/UltimakerMachineActions/UMOUpgradeSelection.py @@ -45,7 +45,7 @@ class UMOUpgradeSelection(MachineAction): def _createDefinitionChangesContainer(self, global_container_stack): # Create a definition_changes container to store the settings in and add it to the stack - definition_changes_container = UM.Settings.InstanceContainer(global_container_stack.getName() + "_settings") + definition_changes_container = UM.Settings.InstanceContainer.InstanceContainer(global_container_stack.getName() + "_settings") definition = global_container_stack.getBottom() definition_changes_container.setDefinition(definition) definition_changes_container.addMetaDataEntry("type", "definition_changes") From 9b63f1237ab53cfead631b6d042ce43b62f23314 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 1 Mar 2017 09:48:26 +0100 Subject: [PATCH 052/146] Instead of the setting function we now show the calculated value for settingoverride dialog CURA-3221 --- cura/Settings/UserChangesModel.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cura/Settings/UserChangesModel.py b/cura/Settings/UserChangesModel.py index 48296b9907..81dfe5809b 100644 --- a/cura/Settings/UserChangesModel.py +++ b/cura/Settings/UserChangesModel.py @@ -5,6 +5,7 @@ from UM.Application import Application from cura.Settings.ExtruderManager import ExtruderManager from UM.Settings.ContainerRegistry import ContainerRegistry from UM.i18n import i18nCatalog +from UM.Settings.SettingFunction import SettingFunction import os @@ -98,9 +99,13 @@ class UserChangesModel(ListModel): if original_value is not None: break + # If a value is a function, ensure it's called with the stack it's in. + if isinstance(original_value, SettingFunction): + original_value = original_value(stack) + item_to_add = {"key": setting_key, "label": label, - "user_value": user_changes.getProperty(setting_key, "value"), + "user_value": str(user_changes.getProperty(setting_key, "value")), "original_value": str(original_value), "extruder": "", "category": category_label} From 82b2bc13e2be815dcf82d5f48defbb4b52a4fa45 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 1 Mar 2017 09:48:53 +0100 Subject: [PATCH 053/146] Don't cool bed if there is no heated bed Makes the line a bit unusable, but it was already unusable, really. Contributes to issue CURA-3405. --- resources/definitions/ultimaker_original.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker_original.def.json b/resources/definitions/ultimaker_original.def.json index 03b3b50a08..bb73622413 100644 --- a/resources/definitions/ultimaker_original.def.json +++ b/resources/definitions/ultimaker_original.def.json @@ -62,7 +62,7 @@ "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E6 ;extrude 6 mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." }, "machine_end_gcode": { - "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + "value": "'M104 S0 ;extruder heater off\\nM140 S0 ;heated bed heater off (if you have it)\\nG91 ;relative positioning\\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\\nM84 ;steppers off\\nG90 ;absolute positioning' if machine_heated_bed else 'M104 S0 ;extruder heater off\\nG91 ;relative positioning\\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\\nM84 ;steppers off\\nG90 ;absolute positioning'" } } } From 0eec48b9e30352161eeb08c716184164ea6b14f1 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 1 Mar 2017 10:53:53 +0100 Subject: [PATCH 054/146] Fix reslice when deleting nodes, fix moving groups. CURA-3412 --- .../CuraEngineBackend/CuraEngineBackend.py | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index f2023e270a..35d0aaef67 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -105,6 +105,7 @@ class CuraEngineBackend(QObject, Backend): self._backend_log_max_lines = 20000 # Maximum number of lines to buffer self._error_message = None # Pop-up message that shows errors. + self._last_num_objects = 0 # Count number of objects to see if there is something changed self.backendQuit.connect(self._onBackendQuit) self.backendConnected.connect(self._onBackendConnected) @@ -346,16 +347,28 @@ class CuraEngineBackend(QObject, Backend): if type(source) is not SceneNode: return - if source is self._scene.getRoot(): - return + root_scene_nodes_changed = False + if source == self._scene.getRoot(): + num_objects = 0 + for node in DepthFirstIterator(self._scene.getRoot()): + # For now this seems to be a reliable method to check for nodes that impact slicing + # From: SliceInfo, _onWriteStarted + if type(node) is not SceneNode or not node.getMeshData(): + continue + num_objects += 1 + if num_objects != self._last_num_objects: + self._last_num_objects = num_objects + root_scene_nodes_changed = True + else: + return self.determineAutoSlicing() - if source.getMeshData() is None: - return - - if source.getMeshData().getVertices() is None: - return + if not source.callDecoration("isGroup") and not root_scene_nodes_changed: + if source.getMeshData() is None: + return + if source.getMeshData().getVertices() is None: + return self.needsSlicing() self.stopSlicing() From a1281bc019e2505eb3a1239614d97be1073c938d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 1 Mar 2017 11:33:03 +0100 Subject: [PATCH 055/146] Clarified some of the text in the discard dialog CURA-3221 --- resources/qml/DiscardOrKeepProfileChangesDialog.qml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/qml/DiscardOrKeepProfileChangesDialog.qml b/resources/qml/DiscardOrKeepProfileChangesDialog.qml index 2b997cb00c..4f758d22eb 100644 --- a/resources/qml/DiscardOrKeepProfileChangesDialog.qml +++ b/resources/qml/DiscardOrKeepProfileChangesDialog.qml @@ -52,7 +52,7 @@ UM.Dialog Label { - text: "You have customized some default profile settings.\nWould you like to keep or discard those settings?" + text: "You have customized some profile settings.\nWould you like to keep or discard those settings?" anchors.margins: UM.Theme.getSize("default_margin").width font: UM.Theme.getFont("default_bold") wrapMode: Text.WordWrap @@ -101,7 +101,7 @@ UM.Dialog TableViewColumn { role: "label" - title: catalog.i18nc("@title:column", "Profile settings") + title: catalog.i18nc("@title:column", "Settings") delegate: labelDelegate width: tableView.width * 0.5 } @@ -109,7 +109,7 @@ UM.Dialog TableViewColumn { role: "original_value" - title: "default" + title: "Profile" width: tableView.width * 0.25 delegate: defaultDelegate } From 1ba8ee2051a4acd57816ebfaff321cf14c05b275 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 1 Mar 2017 11:35:06 +0100 Subject: [PATCH 056/146] Fixed issue that in some cases not all changed settings for all extruders were shown CURA-3221 --- cura/Settings/UserChangesModel.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/cura/Settings/UserChangesModel.py b/cura/Settings/UserChangesModel.py index 81dfe5809b..9f559d4b40 100644 --- a/cura/Settings/UserChangesModel.py +++ b/cura/Settings/UserChangesModel.py @@ -38,11 +38,7 @@ class UserChangesModel(ListModel): def _update(self): items = [] global_stack = Application.getInstance().getGlobalContainerStack() - stacks = ExtruderManager.getInstance().getUsedExtruderStacks() - - # Ensure that the global stack is in the list of stacks. - if global_stack.getProperty("machine_extruder_count", "value") > 1: - stacks.append(global_stack) + stacks = ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks() # Check if the definition container has a translation file and ensure it's loaded. definition = global_stack.getBottom() From 8a8b97d37120da9e050fbddefa93ea917d860318 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 1 Mar 2017 11:45:50 +0100 Subject: [PATCH 057/146] CuraEngineBackend now properly postpones onSceneChanged instead of ignoring some. CURA-3413 --- plugins/CuraEngineBackend/CuraEngineBackend.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 35d0aaef67..ab6e0a08a5 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -106,6 +106,7 @@ class CuraEngineBackend(QObject, Backend): self._backend_log_max_lines = 20000 # Maximum number of lines to buffer self._error_message = None # Pop-up message that shows errors. self._last_num_objects = 0 # Count number of objects to see if there is something changed + self._postponed_scene_change_sources = [] # scene change is postponed (by a tool) self.backendQuit.connect(self._onBackendQuit) self.backendConnected.connect(self._onBackendConnected) @@ -342,6 +343,8 @@ class CuraEngineBackend(QObject, Backend): # \param source The scene node that was changed. def _onSceneChanged(self, source): if self._tool_active: + # do it later + self._postponed_scene_change_sources.append(source) return if type(source) is not SceneNode: @@ -515,6 +518,10 @@ class CuraEngineBackend(QObject, Backend): def _onToolOperationStopped(self, tool): self._tool_active = False # React on scene change again self.determineAutoSlicing() + # Process all the postponed scene changes + while self._postponed_scene_change_sources: + source = self._postponed_scene_change_sources.pop(0) + self._onSceneChanged(source) ## Called when the user changes the active view mode. def _onActiveViewChanged(self): From 17e1fdf7a61f8044d49cb0c89de0d83d643fddab Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 1 Mar 2017 13:24:56 +0100 Subject: [PATCH 058/146] Increase warning temperature for initial layer as well It was already changed for normal printing temperature. Contributes to issue CURA-3433. --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 053de6f78b..d838109f88 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1300,7 +1300,7 @@ "value": "material_print_temperature", "minimum_value": "-273.15", "minimum_value_warning": "0", - "maximum_value_warning": "260", + "maximum_value_warning": "270", "enabled": "machine_gcode_flavor != \"UltiGCode\"", "settable_per_mesh": false, "settable_per_extruder": true From 6cf1fa412160df164b88b90ebf9939f4e6da41fe Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 1 Mar 2017 13:27:25 +0100 Subject: [PATCH 059/146] Removed uneeded global container changed signal hook CURA-3221 --- cura/Settings/UserChangesModel.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cura/Settings/UserChangesModel.py b/cura/Settings/UserChangesModel.py index 9f559d4b40..ed070d55a9 100644 --- a/cura/Settings/UserChangesModel.py +++ b/cura/Settings/UserChangesModel.py @@ -26,7 +26,6 @@ class UserChangesModel(ListModel): self.addRoleName(self.UserValueRole, "user_value") self.addRoleName(self.CategoryRole, "category") - Application.getInstance().globalContainerStackChanged.connect(self._update) self._i18n_catalog = None self._update() From 3f059ff1d45bfc8f1a06762bd466c53cb54b1ef7 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 1 Mar 2017 14:08:18 +0100 Subject: [PATCH 060/146] Reduce code duplication It stays unreadable though, because of JSON. Contributes to issue CURA-3405. --- resources/definitions/ultimaker_original.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker_original.def.json b/resources/definitions/ultimaker_original.def.json index bb73622413..f3f188dd48 100644 --- a/resources/definitions/ultimaker_original.def.json +++ b/resources/definitions/ultimaker_original.def.json @@ -62,7 +62,7 @@ "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E6 ;extrude 6 mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." }, "machine_end_gcode": { - "value": "'M104 S0 ;extruder heater off\\nM140 S0 ;heated bed heater off (if you have it)\\nG91 ;relative positioning\\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\\nM84 ;steppers off\\nG90 ;absolute positioning' if machine_heated_bed else 'M104 S0 ;extruder heater off\\nG91 ;relative positioning\\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\\nM84 ;steppers off\\nG90 ;absolute positioning'" + "value": "'M104 S0 ;extruder heater off' + ('\\nM140 S0 ;heated bed heater off' if machine_heated_bed else '') + '\\nG91 ;relative positioning\\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\\nM84 ;steppers off\\nG90 ;absolute positioning'" } } } From 9f38ae5b6808dd3ca52a20575881d21faf95eeae Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 1 Mar 2017 14:30:48 +0100 Subject: [PATCH 061/146] Add material_print_temperature back into profiles The optimisation script didn't know that the temperature settings in material profiles now refers to default_material_print_temperature rather than material_print_temperature. This caused a few things to go wrong here. Contributes to issue CURA-3433. --- .../quality/ultimaker3/um3_aa0.4_CPEP_Draft_Print.inst.cfg | 3 +++ .../quality/ultimaker3/um3_aa0.4_CPEP_Fast_Print.inst.cfg | 3 +++ .../quality/ultimaker3/um3_aa0.4_CPEP_High_Quality.inst.cfg | 2 ++ .../quality/ultimaker3/um3_aa0.4_CPEP_Normal_Quality.inst.cfg | 2 ++ resources/quality/ultimaker3/um3_aa0.4_PC_Draft_Print.inst.cfg | 3 +++ resources/quality/ultimaker3/um3_aa0.4_PC_Fast_Print.inst.cfg | 3 +++ .../quality/ultimaker3/um3_aa0.4_PC_High_Quality.inst.cfg | 2 ++ .../quality/ultimaker3/um3_aa0.4_PC_Normal_Quality.inst.cfg | 2 ++ .../quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg | 3 +++ resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg | 3 +++ .../quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg | 1 + 11 files changed, 27 insertions(+) diff --git a/resources/quality/ultimaker3/um3_aa0.4_CPEP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_CPEP_Draft_Print.inst.cfg index f99c3997f7..f566b17be3 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_CPEP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_CPEP_Draft_Print.inst.cfg @@ -17,6 +17,9 @@ infill_wipe_dist = 0 layer_height = 0.2 machine_nozzle_cool_down_speed = 0.9 machine_nozzle_heat_up_speed = 1.4 +material_initial_print_temperature = =material_print_temperature - 5 +material_final_print_temperature = =material_print_temperature - 10 +material_print_temperature = =default_material_print_temperature + 10 prime_tower_size = 17 retraction_combing = off retraction_hop = 0.2 diff --git a/resources/quality/ultimaker3/um3_aa0.4_CPEP_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_CPEP_Fast_Print.inst.cfg index c03e072c8e..003cf12a8c 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_CPEP_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_CPEP_Fast_Print.inst.cfg @@ -17,6 +17,9 @@ infill_wipe_dist = 0 layer_height = 0.15 machine_nozzle_cool_down_speed = 0.9 machine_nozzle_heat_up_speed = 1.4 +material_initial_print_temperature = =material_print_temperature - 5 +material_final_print_temperature = =material_print_temperature - 10 +material_print_temperature = =default_material_print_temperature + 10 prime_tower_size = 17 retraction_combing = off retraction_hop = 0.2 diff --git a/resources/quality/ultimaker3/um3_aa0.4_CPEP_High_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_CPEP_High_Quality.inst.cfg index c88fe1a56a..630352de41 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_CPEP_High_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_CPEP_High_Quality.inst.cfg @@ -14,6 +14,8 @@ brim_width = 7 cool_min_speed = 5 infill_wipe_dist = 0 layer_height = 0.06 +material_initial_print_temperature = =material_print_temperature - 5 +material_final_print_temperature = =material_print_temperature - 10 material_print_temperature = =default_material_print_temperature + 2 prime_tower_size = 17 retraction_combing = off diff --git a/resources/quality/ultimaker3/um3_aa0.4_CPEP_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_CPEP_Normal_Quality.inst.cfg index 9aaceb3a7a..4b70c9b967 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_CPEP_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_CPEP_Normal_Quality.inst.cfg @@ -13,6 +13,8 @@ weight = 0 brim_width = 7 cool_min_speed = 7 infill_wipe_dist = 0 +material_initial_print_temperature = =material_print_temperature - 5 +material_final_print_temperature = =material_print_temperature - 10 material_print_temperature = =default_material_print_temperature + 5 prime_tower_size = 17 retraction_combing = off diff --git a/resources/quality/ultimaker3/um3_aa0.4_PC_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PC_Draft_Print.inst.cfg index 0cc074b7a0..e9370877e7 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PC_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PC_Draft_Print.inst.cfg @@ -18,6 +18,9 @@ cool_min_speed = 6 infill_line_width = =round(line_width * 0.4 / 0.35, 2) infill_overlap_mm = 0.05 layer_height = 0.2 +material_final_print_temperature = =material_print_temperature - 10 +material_initial_print_temperature = =material_print_temperature - 5 +material_print_temperature = =default_material_print_temperature + 10 material_print_temperature_layer_0 = =material_print_temperature + 5 ooze_shield_angle = 40 raft_airgap = 0.25 diff --git a/resources/quality/ultimaker3/um3_aa0.4_PC_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PC_Fast_Print.inst.cfg index c887fb283d..cdb37b8f12 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PC_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PC_Fast_Print.inst.cfg @@ -19,6 +19,9 @@ infill_line_width = =round(line_width * 0.4 / 0.35, 2) infill_overlap = =0 infill_overlap_mm = 0.05 layer_height = 0.15 +material_initial_print_temperature = =material_print_temperature - 5 +material_final_print_temperature = =material_print_temperature - 10 +material_print_temperature = =default_material_print_temperature + 10 material_print_temperature_layer_0 = =material_print_temperature + 5 ooze_shield_angle = 40 raft_airgap = 0.25 diff --git a/resources/quality/ultimaker3/um3_aa0.4_PC_High_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PC_High_Quality.inst.cfg index 6555c13f74..f5e91fa71b 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PC_High_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PC_High_Quality.inst.cfg @@ -17,6 +17,8 @@ cool_min_speed = 8 infill_line_width = =round(line_width * 0.4 / 0.35, 2) infill_overlap_mm = 0.05 layer_height = 0.06 +material_initial_print_temperature = =material_print_temperature - 5 +material_final_print_temperature = =material_print_temperature - 10 material_print_temperature = =default_material_print_temperature - 10 material_print_temperature_layer_0 = =material_print_temperature + 5 ooze_shield_angle = 40 diff --git a/resources/quality/ultimaker3/um3_aa0.4_PC_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PC_Normal_Quality.inst.cfg index eeea96cd18..d391e9df4f 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PC_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PC_Normal_Quality.inst.cfg @@ -16,6 +16,8 @@ cool_min_layer_time_fan_speed_max = 5 cool_min_speed = 5 infill_line_width = =round(line_width * 0.4 / 0.35, 2) infill_overlap_mm = 0.05 +material_initial_print_temperature = =material_print_temperature - 5 +material_final_print_temperature = =material_print_temperature - 10 material_print_temperature = =default_material_print_temperature material_print_temperature_layer_0 = =material_print_temperature + 5 ooze_shield_angle = 40 diff --git a/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg index bcdd8044b8..73ea54bfb8 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg @@ -20,7 +20,10 @@ infill_pattern = tetrahedral infill_sparse_density = 96 layer_height = 0.2 line_width = =machine_nozzle_size * 0.95 +material_final_print_temperature = =material_print_temperature - 10 material_flow = 106 +material_initial_print_temperature = =material_print_temperature - 5 +material_print_temperature = =default_material_print_temperature + 2 material_print_temperature_layer_0 = =default_material_print_temperature + 2 retraction_count_max = 12 retraction_extra_prime_amount = 0.8 diff --git a/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg index 567d9273b5..89b4910c98 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg @@ -20,7 +20,10 @@ infill_pattern = tetrahedral infill_sparse_density = 96 layer_height = 0.15 line_width = =machine_nozzle_size * 0.95 +material_final_print_temperature = =material_print_temperature - 10 material_flow = 106 +material_initial_print_temperature = =material_print_temperature - 5 +material_print_temperature = =default_material_print_temperature + 2 material_print_temperature_layer_0 = =default_material_print_temperature + 2 retraction_amount = 7 retraction_count_max = 12 diff --git a/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg index 75d76a32f2..d01f07a24e 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg @@ -19,6 +19,7 @@ infill_line_width = =round(line_width * 0.38 / 0.38, 2) infill_pattern = tetrahedral infill_sparse_density = 96 line_width = =machine_nozzle_size * 0.95 +material_final_print_temperature = =material_print_temperature - 10 material_flow = 106 material_initial_print_temperature = =material_print_temperature - 10 material_print_temperature = =default_material_print_temperature From 4eca62370d86b6ad3269ea4c36efc2f80d8a0bd3 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 1 Mar 2017 14:33:55 +0100 Subject: [PATCH 062/146] Normalise print temperature so that normal quality is at default temperature All print temperatures go down 5 degrees and then in the material profile the temperature is increased by 5. This gives the normal profile a +0 instead of +5. Contributes to issue CURA-3433. --- .../quality/ultimaker3/um3_aa0.4_CPEP_Draft_Print.inst.cfg | 2 +- resources/quality/ultimaker3/um3_aa0.4_CPEP_Fast_Print.inst.cfg | 2 +- .../quality/ultimaker3/um3_aa0.4_CPEP_High_Quality.inst.cfg | 2 +- .../quality/ultimaker3/um3_aa0.4_CPEP_Normal_Quality.inst.cfg | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/quality/ultimaker3/um3_aa0.4_CPEP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_CPEP_Draft_Print.inst.cfg index f566b17be3..f8090e057c 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_CPEP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_CPEP_Draft_Print.inst.cfg @@ -19,7 +19,7 @@ machine_nozzle_cool_down_speed = 0.9 machine_nozzle_heat_up_speed = 1.4 material_initial_print_temperature = =material_print_temperature - 5 material_final_print_temperature = =material_print_temperature - 10 -material_print_temperature = =default_material_print_temperature + 10 +material_print_temperature = =default_material_print_temperature + 5 prime_tower_size = 17 retraction_combing = off retraction_hop = 0.2 diff --git a/resources/quality/ultimaker3/um3_aa0.4_CPEP_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_CPEP_Fast_Print.inst.cfg index 003cf12a8c..a8d989fbae 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_CPEP_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_CPEP_Fast_Print.inst.cfg @@ -19,7 +19,7 @@ machine_nozzle_cool_down_speed = 0.9 machine_nozzle_heat_up_speed = 1.4 material_initial_print_temperature = =material_print_temperature - 5 material_final_print_temperature = =material_print_temperature - 10 -material_print_temperature = =default_material_print_temperature + 10 +material_print_temperature = =default_material_print_temperature + 5 prime_tower_size = 17 retraction_combing = off retraction_hop = 0.2 diff --git a/resources/quality/ultimaker3/um3_aa0.4_CPEP_High_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_CPEP_High_Quality.inst.cfg index 630352de41..5495276f1c 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_CPEP_High_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_CPEP_High_Quality.inst.cfg @@ -16,7 +16,7 @@ infill_wipe_dist = 0 layer_height = 0.06 material_initial_print_temperature = =material_print_temperature - 5 material_final_print_temperature = =material_print_temperature - 10 -material_print_temperature = =default_material_print_temperature + 2 +material_print_temperature = =default_material_print_temperature - 3 prime_tower_size = 17 retraction_combing = off retraction_hop = 0.2 diff --git a/resources/quality/ultimaker3/um3_aa0.4_CPEP_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_CPEP_Normal_Quality.inst.cfg index 4b70c9b967..d18b878a4f 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_CPEP_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_CPEP_Normal_Quality.inst.cfg @@ -15,7 +15,7 @@ cool_min_speed = 7 infill_wipe_dist = 0 material_initial_print_temperature = =material_print_temperature - 5 material_final_print_temperature = =material_print_temperature - 10 -material_print_temperature = =default_material_print_temperature + 5 +material_print_temperature = =default_material_print_temperature prime_tower_size = 17 retraction_combing = off retraction_hop = 0.2 From 0bf0b29a50a41e0a8a5f0cf20c68ece3034b7cea Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 1 Mar 2017 14:42:18 +0100 Subject: [PATCH 063/146] Added Create new profile button to Discard or keep profile changes dialog CURA-3398 --- .../qml/DiscardOrKeepProfileChangesDialog.qml | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/resources/qml/DiscardOrKeepProfileChangesDialog.qml b/resources/qml/DiscardOrKeepProfileChangesDialog.qml index 4f758d22eb..570fd06013 100644 --- a/resources/qml/DiscardOrKeepProfileChangesDialog.qml +++ b/resources/qml/DiscardOrKeepProfileChangesDialog.qml @@ -129,29 +129,46 @@ UM.Dialog model: base.changesModel } - Row + Item { anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width - spacing: UM.Theme.getSize("default_margin").width - Button - { - text: catalog.i18nc("@action:button", "Keep"); - onClicked: - { - Printer.discardOrKeepProfileChangesClosed("keep") - base.hide() - } - } + anchors.left: parent.left + anchors.margins: UM.Theme.getSize("default_margin").width + height:childrenRect.height + Button { + id: discardButton text: catalog.i18nc("@action:button", "Discard"); + anchors.right: parent.right onClicked: { Printer.discardOrKeepProfileChangesClosed("discard") base.hide() } } + + Button + { + id: keepButton + text: catalog.i18nc("@action:button", "Keep"); + anchors.right: discardButton.left + anchors.rightMargin: UM.Theme.getSize("default_margin").width + onClicked: + { + Printer.discardOrKeepProfileChangesClosed("keep") + base.hide() + } + } + + Button + { + id: createNewProfileButton + text: catalog.i18nc("@action:button", "Create new profile"); + anchors.left: parent.left + action: Cura.Actions.addProfile + onClicked: base.hide() + } } } } \ No newline at end of file From 7658939198167e4950ec4c38412ac081335ccde2 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 1 Mar 2017 14:52:03 +0100 Subject: [PATCH 064/146] Make initial layer print temperature dependent on actual printing temperature Otherwise when you change the print temperatures the initial print temperature doesn't change along. Contributes to issue CURA-3433. --- resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg | 2 +- resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg | 2 +- .../quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg index 73ea54bfb8..03ea216f32 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg @@ -24,7 +24,7 @@ material_final_print_temperature = =material_print_temperature - 10 material_flow = 106 material_initial_print_temperature = =material_print_temperature - 5 material_print_temperature = =default_material_print_temperature + 2 -material_print_temperature_layer_0 = =default_material_print_temperature + 2 +material_print_temperature_layer_0 = =material_print_temperature retraction_count_max = 12 retraction_extra_prime_amount = 0.8 skin_overlap = 15 diff --git a/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg index 89b4910c98..b29483a44f 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg @@ -24,7 +24,7 @@ material_final_print_temperature = =material_print_temperature - 10 material_flow = 106 material_initial_print_temperature = =material_print_temperature - 5 material_print_temperature = =default_material_print_temperature + 2 -material_print_temperature_layer_0 = =default_material_print_temperature + 2 +material_print_temperature_layer_0 = =material_print_temperature retraction_amount = 7 retraction_count_max = 12 retraction_extra_prime_amount = 0.8 diff --git a/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg index d01f07a24e..99bd3a90da 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg @@ -23,7 +23,7 @@ material_final_print_temperature = =material_print_temperature - 10 material_flow = 106 material_initial_print_temperature = =material_print_temperature - 10 material_print_temperature = =default_material_print_temperature -material_print_temperature_layer_0 = =default_material_print_temperature +material_print_temperature_layer_0 = =material_print_temperature retraction_count_max = 12 retraction_extra_prime_amount = 0.8 skin_overlap = 15 From bdd07bd16089f791c90146c021c05110bf042db9 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 1 Mar 2017 14:54:12 +0100 Subject: [PATCH 065/146] Removed commented out stuff. CURA-3321 --- plugins/LayerView/LayerView.qml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 5dda1f8639..e72996598e 100644 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -44,18 +44,6 @@ Item property bool only_show_top_layers: UM.Preferences.getValue("view/only_show_top_layers") property int top_layer_count: UM.Preferences.getValue("view/only_show_top_layers") - /* - layerTypeCombobox.layer_view_type = UM.Preferences.getValue("layerview/layer_view_type"); - view_settings.extruder_opacities = UM.Preferences.getValue("layerview/extruder_opacities").split("|"); - view_settings.show_travel_moves = UM.Preferences.getValue("layerview/show_travel_moves"); - view_settings.show_support = UM.Preferences.getValue("layerview/show_support"); - view_settings.show_adhesion = UM.Preferences.getValue("layerview/show_adhesion"); - view_settings.show_skin = UM.Preferences.getValue("layerview/show_skin"); - view_settings.show_infill = UM.Preferences.getValue("layerview/show_infill"); - view_settings.only_show_top_layers = UM.Preferences.getValue("view/only_show_top_layers"); - view_settings.top_layer_count = UM.Preferences.getValue("view/top_layer_count"); - */ - anchors.top: parent.top anchors.topMargin: UM.Theme.getSize("default_margin").height anchors.left: parent.left From c0fc8287c023e733b1a02e6c5ccb11c2480eccbc Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Wed, 1 Mar 2017 14:47:56 +0000 Subject: [PATCH 066/146] Rename expand_skins_shrink_distance setting to min_skin_width_for_expansion. --- resources/definitions/fdmprinter.def.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 6bab81ae84..9b89f07bff 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1285,10 +1285,10 @@ "enabled": "expand_skins_into_infill", "settable_per_mesh": true }, - "expand_skins_shrink_distance": + "min_skin_width_for_expansion": { - "label": "Skin Shrink Distance", - "description": "The distance the skins are shrunk before they are expanded. Shrinking the skins slightly first removes the very narrow skin areas that are created when the model surface has a slope close to the vertical.", + "label": "Minimum Skin Width For Expansion", + "description": "Skin areas narrower than this are not expanded. This avoids expanding the narrow skin areas that are created when the model surface has a slope close to the vertical.", "unit": "mm", "type": "float", "default_value": 0, From d6bed392e4d3f6acc408f64cf75a3f90e4086e11 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Thu, 2 Mar 2017 07:46:55 +0000 Subject: [PATCH 067/146] Disable skin_angles setting when top_bottom_pattern is concentric. --- resources/definitions/fdmprinter.def.json | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index a802ea1ca6..133c0b0dfb 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -914,6 +914,7 @@ "description": "A list of integer line directions to use when the top/bottom layers use the lines or zig zag pattern. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees).", "type": "[int]", "default_value": "[ ]", + "enabled": "top_bottom_pattern != 'concentric'", "settable_per_mesh": true }, "wall_0_inset": From aef39991a2e78c4f05731be0eb618349593a1871 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Thu, 2 Mar 2017 07:47:41 +0000 Subject: [PATCH 068/146] Disable infill_angles setting when infill_pattern is concentric, concentric_3d or cubicsubdiv. --- resources/definitions/fdmprinter.def.json | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 133c0b0dfb..a79ac58547 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1104,6 +1104,7 @@ "description": "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees for the lines and zig zag patterns and 45 degrees for all other patterns).", "type": "[int]", "default_value": "[ ]", + "enabled": "infill_pattern != 'concentric' and infill_pattern != 'concentric_3d' and infill_pattern != 'cubicsubdiv'", "settable_per_mesh": true }, "sub_div_rad_mult": From d372e73eda7938e26859da9fe77ed8704bb3aa6d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 2 Mar 2017 10:35:22 +0100 Subject: [PATCH 069/146] Adjust warning values for temperatures We know that some printers (e.g. UM3) are able to reach at least 285 degrees so we set that to be our warning value now. The warning value for the bed temperature was probably mixed up with the warning value for nozzle temperature. Fixed that too. --- resources/definitions/fdmprinter.def.json | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index d838109f88..96aac81885 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1271,6 +1271,8 @@ "unit": "°C", "type": "float", "default_value": 210, + "minimum_value_warning": "0", + "maximum_value_warning": "285", "enabled": false, "settable_per_extruder": true, "minimum_value": "-273.15" @@ -1285,7 +1287,7 @@ "value": "default_material_print_temperature", "minimum_value": "-273.15", "minimum_value_warning": "0", - "maximum_value_warning": "270", + "maximum_value_warning": "285", "enabled": "not (material_flow_dependent_temperature) and machine_gcode_flavor != \"UltiGCode\"", "settable_per_mesh": false, "settable_per_extruder": true @@ -1300,7 +1302,7 @@ "value": "material_print_temperature", "minimum_value": "-273.15", "minimum_value_warning": "0", - "maximum_value_warning": "270", + "maximum_value_warning": "285", "enabled": "machine_gcode_flavor != \"UltiGCode\"", "settable_per_mesh": false, "settable_per_extruder": true @@ -1372,7 +1374,7 @@ "default_value": 60, "minimum_value": "-273.15", "minimum_value_warning": "0", - "maximum_value_warning": "260", + "maximum_value_warning": "130", "enabled": "machine_heated_bed and machine_gcode_flavor != \"UltiGCode\"", "settable_per_mesh": false, "settable_per_extruder": false, @@ -1389,7 +1391,7 @@ "value": "resolveOrValue('material_bed_temperature')", "minimum_value": "-273.15", "minimum_value_warning": "max(extruderValues('material_bed_temperature'))", - "maximum_value_warning": "260", + "maximum_value_warning": "130", "enabled": "machine_heated_bed and machine_gcode_flavor != \"UltiGCode\"", "settable_per_mesh": false, "settable_per_extruder": false, From 3e4ee0639c5180bd66575d832223bd9634d65a75 Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Thu, 2 Mar 2017 11:46:28 +0100 Subject: [PATCH 070/146] Fixed case of the button text. CURA-3398 --- resources/qml/DiscardOrKeepProfileChangesDialog.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/DiscardOrKeepProfileChangesDialog.qml b/resources/qml/DiscardOrKeepProfileChangesDialog.qml index 570fd06013..a19400de5e 100644 --- a/resources/qml/DiscardOrKeepProfileChangesDialog.qml +++ b/resources/qml/DiscardOrKeepProfileChangesDialog.qml @@ -164,7 +164,7 @@ UM.Dialog Button { id: createNewProfileButton - text: catalog.i18nc("@action:button", "Create new profile"); + text: catalog.i18nc("@action:button", "Create New Profile"); anchors.left: parent.left action: Cura.Actions.addProfile onClicked: base.hide() From c54d5ce707e704e297a8212bbf757338febb8023 Mon Sep 17 00:00:00 2001 From: "U-ULTIMAKER\\j.ha" Date: Thu, 2 Mar 2017 13:15:29 +0100 Subject: [PATCH 071/146] Fixed compatibility mode active extruder. CURA-3321 --- cura/LayerDataBuilder.py | 2 +- plugins/CuraEngineBackend/CuraEngineBackend.py | 1 - plugins/LayerView/LayerPass.py | 0 plugins/LayerView/layers.shader | 0 plugins/LayerView/layers3d.shader | 4 ++-- 5 files changed, 3 insertions(+), 4 deletions(-) mode change 100644 => 100755 cura/LayerDataBuilder.py mode change 100644 => 100755 plugins/CuraEngineBackend/CuraEngineBackend.py mode change 100644 => 100755 plugins/LayerView/LayerPass.py mode change 100644 => 100755 plugins/LayerView/layers.shader mode change 100644 => 100755 plugins/LayerView/layers3d.shader diff --git a/cura/LayerDataBuilder.py b/cura/LayerDataBuilder.py old mode 100644 new mode 100755 index 7cb6f75df3..df4b9e3218 --- a/cura/LayerDataBuilder.py +++ b/cura/LayerDataBuilder.py @@ -63,7 +63,7 @@ class LayerDataBuilder(MeshBuilder): line_dimensions = numpy.empty((vertex_count, 2), numpy.float32) colors = numpy.empty((vertex_count, 4), numpy.float32) indices = numpy.empty((index_count, 2), numpy.int32) - extruders = numpy.empty((vertex_count), numpy.int32) # Only usable for newer OpenGL versions + extruders = numpy.empty((vertex_count), numpy.float32) line_types = numpy.empty((vertex_count), numpy.float32) vertex_offset = 0 diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py old mode 100644 new mode 100755 index ab6e0a08a5..3aa226c518 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -517,7 +517,6 @@ class CuraEngineBackend(QObject, Backend): # \param tool The tool that the user was using. def _onToolOperationStopped(self, tool): self._tool_active = False # React on scene change again - self.determineAutoSlicing() # Process all the postponed scene changes while self._postponed_scene_change_sources: source = self._postponed_scene_change_sources.pop(0) diff --git a/plugins/LayerView/LayerPass.py b/plugins/LayerView/LayerPass.py old mode 100644 new mode 100755 diff --git a/plugins/LayerView/layers.shader b/plugins/LayerView/layers.shader old mode 100644 new mode 100755 diff --git a/plugins/LayerView/layers3d.shader b/plugins/LayerView/layers3d.shader old mode 100644 new mode 100755 index 5bc6066152..2108d85eb2 --- a/plugins/LayerView/layers3d.shader +++ b/plugins/LayerView/layers3d.shader @@ -16,7 +16,7 @@ vertex41core = in lowp vec4 a_material_color; in highp vec4 a_normal; in highp vec2 a_line_dim; // line width and thickness - in highp int a_extruder; // Note: cannot use this in compatibility, int is only available in newer OpenGL. + in highp float a_extruder; in highp float a_line_type; out lowp vec4 v_color; @@ -53,7 +53,7 @@ vertex41core = v_vertex = world_space_vert.xyz; v_normal = (u_normalMatrix * normalize(a_normal)).xyz; v_line_dim = a_line_dim; - v_extruder = a_extruder; + v_extruder = int(a_extruder); v_line_type = a_line_type; v_extruder_opacity = u_extruder_opacity; From c0b4d4399591ed81ee907b0af77eeff86a23ad02 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 2 Mar 2017 15:42:36 +0100 Subject: [PATCH 072/146] Add hotkey for reload all models Small change. I can't be bothered to make an issue for this. --- resources/qml/Actions.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 8d74f1b67c..1a345deafa 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -262,6 +262,7 @@ Item id: reloadAllAction; text: catalog.i18nc("@action:inmenu menubar:file","Re&load All Models"); iconName: "document-revert"; + shortcut: "F5" onTriggered: Printer.reloadAll(); } From 1029fb4dddae90fbfee8900cf3c0786612e31e95 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 2 Mar 2017 16:38:31 +0100 Subject: [PATCH 073/146] Not to trigger reslice happy anymore, only retrigger if necessary. Also using isSliceable instead of property check when inspecting root node. CURA-3413 CURA-3412 --- cura/CuraApplication.py | 18 ++------------- .../CuraEngineBackend/CuraEngineBackend.py | 22 +++++++++---------- plugins/SliceInfoPlugin/SliceInfo.py | 0 3 files changed, 12 insertions(+), 28 deletions(-) mode change 100644 => 100755 cura/CuraApplication.py mode change 100644 => 100755 plugins/SliceInfoPlugin/SliceInfo.py diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py old mode 100644 new mode 100755 index f28d2e4896..bd38bd8045 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1094,18 +1094,6 @@ class CuraApplication(QtApplication): fileLoaded = pyqtSignal(str) - def _onFileLoaded(self, job): - nodes = job.getResult() - for node in nodes: - if node is not None: - self.fileLoaded.emit(job.getFileName()) - node.setSelectable(True) - node.setName(os.path.basename(job.getFileName())) - op = AddSceneNodeOperation(node, self.getController().getScene().getRoot()) - op.push() - - self.getController().getScene().sceneChanged.emit(node) #Force scene change. - def _onJobFinished(self, job): if type(job) is not ReadMeshJob or not job.getResult(): return @@ -1133,10 +1121,8 @@ class CuraApplication(QtApplication): else: Logger.log("w", "Could not find a mesh in reloaded node.") - def _openFile(self, file): - job = ReadMeshJob(os.path.abspath(file)) - job.finished.connect(self._onFileLoaded) - job.start() + def _openFile(self, filename): + self.readLocalFile(QUrl.fromLocalFile(filename)) def _addProfileReader(self, profile_reader): # TODO: Add the profile reader to the list of plug-ins that can be used when importing profiles. diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 3aa226c518..981145bebd 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -342,11 +342,6 @@ class CuraEngineBackend(QObject, Backend): # # \param source The scene node that was changed. def _onSceneChanged(self, source): - if self._tool_active: - # do it later - self._postponed_scene_change_sources.append(source) - return - if type(source) is not SceneNode: return @@ -354,25 +349,27 @@ class CuraEngineBackend(QObject, Backend): if source == self._scene.getRoot(): num_objects = 0 for node in DepthFirstIterator(self._scene.getRoot()): - # For now this seems to be a reliable method to check for nodes that impact slicing - # From: SliceInfo, _onWriteStarted - if type(node) is not SceneNode or not node.getMeshData(): - continue - num_objects += 1 + # Only count sliceable objects + if node.callDecoration("isSliceable"): + num_objects += 1 if num_objects != self._last_num_objects: self._last_num_objects = num_objects root_scene_nodes_changed = True else: return - self.determineAutoSlicing() - if not source.callDecoration("isGroup") and not root_scene_nodes_changed: if source.getMeshData() is None: return if source.getMeshData().getVertices() is None: return + if self._tool_active: + # do it later, each source only has to be done once + if source not in self._postponed_scene_change_sources: + self._postponed_scene_change_sources.append(source) + return + self.needsSlicing() self.stopSlicing() self._onChanged() @@ -517,6 +514,7 @@ class CuraEngineBackend(QObject, Backend): # \param tool The tool that the user was using. def _onToolOperationStopped(self, tool): self._tool_active = False # React on scene change again + self.determineAutoSlicing() # Switch timer on if appropriate # Process all the postponed scene changes while self._postponed_scene_change_sources: source = self._postponed_scene_change_sources.pop(0) diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py old mode 100644 new mode 100755 From bedb41b6d340d368fa6464542e50f60ad027ea88 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 2 Mar 2017 16:44:40 +0100 Subject: [PATCH 074/146] SliceInfo now only sends sliceable model hashes (layer data was also sent) --- plugins/SliceInfoPlugin/SliceInfo.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 05f7c0e6f5..50ca1dbd06 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -90,9 +90,8 @@ class SliceInfo(Extension): # Listing all files placed on the buildplate modelhashes = [] for node in DepthFirstIterator(CuraApplication.getInstance().getController().getScene().getRoot()): - if type(node) is not SceneNode or not node.getMeshData(): - continue - modelhashes.append(node.getMeshData().getHash()) + if node.callDecoration("isSliceable"): + modelhashes.append(node.getMeshData().getHash()) # Creating md5sums and formatting them as discussed on JIRA modelhash_formatted = ",".join(modelhashes) From e89b1afa2cf61d3fad4ab4a3ba58fd3b0e1ef67b Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 2 Mar 2017 16:55:54 +0100 Subject: [PATCH 075/146] Initial layer view color mode -> legend. CURA-3321 --- plugins/LayerView/LayerView.qml | 2 +- resources/themes/cura/theme.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) mode change 100644 => 100755 plugins/LayerView/LayerView.qml mode change 100644 => 100755 resources/themes/cura/theme.json diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml old mode 100644 new mode 100755 index e72996598e..0cc1678f06 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -40,7 +40,7 @@ Item property bool show_helpers: UM.Preferences.getValue("layerview/show_helpers") property bool show_skin: UM.Preferences.getValue("layerview/show_skin") property bool show_infill: UM.Preferences.getValue("layerview/show_infill") - property bool show_legend: false + property bool show_legend: UM.LayerView.compatibilityMode || UM.Preferences.getValue("layerview/layer_view_type") == 1 property bool only_show_top_layers: UM.Preferences.getValue("view/only_show_top_layers") property int top_layer_count: UM.Preferences.getValue("view/only_show_top_layers") diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json old mode 100644 new mode 100755 index eb112fc50b..92597cfcf6 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -294,7 +294,7 @@ "slider_layerview_background": [4.0, 0.0], "slider_layerview_margin": [3.0, 1.0], - "layerview_menu_size": [16.5, 17.0], + "layerview_menu_size": [16.5, 21.0], "layerview_legend_size": [1.0, 1.0], "layerview_row": [11.0, 1.5], "layerview_row_spacing": [0.0, 0.5], From bae7af1ea0eeee1cab39215f863c3af94111eccc Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 2 Mar 2017 17:06:10 +0100 Subject: [PATCH 076/146] Dots in the ID no longer confuse workspace reader CURA-3450 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index b0d0da66c4..707238ab26 100644 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -476,7 +476,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader): return nodes def _stripFileToId(self, file): - return file.replace("Cura/", "").split(".")[0] + mime_type = MimeTypeDatabase.getMimeTypeForFile(file) + file = mime_type.stripExtension(file) + return file.replace("Cura/", "") def _getXmlProfileClass(self): return self._container_registry.getContainerForMimeType(MimeTypeDatabase.getMimeType("application/x-ultimaker-material-profile")) From 87336c4c013e032c6dd4f1b798d9554f775bcfd1 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 2 Mar 2017 17:11:33 +0100 Subject: [PATCH 077/146] Fixed exception for clean start --- cura/Settings/UserChangesModel.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/Settings/UserChangesModel.py b/cura/Settings/UserChangesModel.py index ed070d55a9..526529ff6f 100644 --- a/cura/Settings/UserChangesModel.py +++ b/cura/Settings/UserChangesModel.py @@ -37,6 +37,8 @@ class UserChangesModel(ListModel): def _update(self): items = [] global_stack = Application.getInstance().getGlobalContainerStack() + if not global_stack: + return stacks = ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks() # Check if the definition container has a translation file and ensure it's loaded. From 8e4f650746f84f7177b8a6e4cff40622e6b9c983 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 3 Mar 2017 09:47:58 +0100 Subject: [PATCH 078/146] Added a tiny bit of spacing between machine action buttons --- resources/qml/Preferences/MachinesPage.qml | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/resources/qml/Preferences/MachinesPage.qml b/resources/qml/Preferences/MachinesPage.qml index e6ddef7979..239e1a2aad 100644 --- a/resources/qml/Preferences/MachinesPage.qml +++ b/resources/qml/Preferences/MachinesPage.qml @@ -89,15 +89,20 @@ UM.ManagementPage id: machineActionRepeater model: base.currentItem ? Cura.MachineActionManager.getSupportedActions(Cura.MachineManager.getDefinitionByMachineId(base.currentItem.id)) : null - Button + Item { - text: machineActionRepeater.model[index].label - onClicked: + width: childrenRect.width + 2 + height: childrenRect.height + Button { - actionDialog.content = machineActionRepeater.model[index].displayItem; - machineActionRepeater.model[index].displayItem.reset(); - actionDialog.title = machineActionRepeater.model[index].label; - actionDialog.show(); + text: machineActionRepeater.model[index].label + onClicked: + { + actionDialog.content = machineActionRepeater.model[index].displayItem; + machineActionRepeater.model[index].displayItem.reset(); + actionDialog.title = machineActionRepeater.model[index].label; + actionDialog.show(); + } } } } From cd9a8dbca5c3de7b989d5cb7696855d8a0257120 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 3 Mar 2017 10:19:53 +0100 Subject: [PATCH 079/146] Listbox now scales with window CURA-3221 --- resources/qml/DiscardOrKeepProfileChangesDialog.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/DiscardOrKeepProfileChangesDialog.qml b/resources/qml/DiscardOrKeepProfileChangesDialog.qml index a19400de5e..89327bfe1c 100644 --- a/resources/qml/DiscardOrKeepProfileChangesDialog.qml +++ b/resources/qml/DiscardOrKeepProfileChangesDialog.qml @@ -64,7 +64,7 @@ UM.Dialog anchors.margins: UM.Theme.getSize("default_margin").width anchors.left: parent.left anchors.right: parent.right - height: 200 + height: base.height - 100 id: tableView Component { From 4514f53ea4455e5825e3214d1f73c41be44fd9ce Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 3 Mar 2017 10:22:06 +0100 Subject: [PATCH 080/146] Formulas are no longer shown in discard changes dialog CURA-3221 --- cura/Settings/UserChangesModel.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cura/Settings/UserChangesModel.py b/cura/Settings/UserChangesModel.py index 526529ff6f..66ff88251d 100644 --- a/cura/Settings/UserChangesModel.py +++ b/cura/Settings/UserChangesModel.py @@ -93,13 +93,14 @@ class UserChangesModel(ListModel): break original_value = container.getProperty(setting_key, "value") - if original_value is not None: - break # If a value is a function, ensure it's called with the stack it's in. if isinstance(original_value, SettingFunction): original_value = original_value(stack) + if original_value is not None: + break + item_to_add = {"key": setting_key, "label": label, "user_value": str(user_changes.getProperty(setting_key, "value")), From 3a92bf73a8c4080626e5dd2bae45e107b9e04c4a Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 3 Mar 2017 12:37:06 +0100 Subject: [PATCH 081/146] JSON fix: moved expand_skins_expand_distance and min_skin_width_for_expansion out of illegitimate parent (CURA-3440) --- resources/definitions/fdmprinter.def.json | 48 +++++++++++------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index d1ef90ab6a..c0f4536eb0 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1272,32 +1272,32 @@ "value": "expand_skins_into_infill", "enabled": "expand_skins_into_infill", "settable_per_mesh": true - }, - "expand_skins_expand_distance": - { - "label": "Skin Expand Distance", - "description": "The distance the skins are expanded into the infill. The default distance is enough to bridge the gap between the infill lines and will stop holes appearing in the skin where it meets the wall when the infill density is low. A smaller distance will often be sufficient.", - "unit": "mm", - "type": "float", - "default_value": 1.0, - "value": "infill_line_distance * 1.4", - "minimum_value": "0", - "enabled": "expand_skins_into_infill", - "settable_per_mesh": true - }, - "min_skin_width_for_expansion": - { - "label": "Minimum Skin Width For Expansion", - "description": "Skin areas narrower than this are not expanded. This avoids expanding the narrow skin areas that are created when the model surface has a slope close to the vertical.", - "unit": "mm", - "type": "float", - "default_value": 0, - "value": "wall_thickness * 0.5", - "minimum_value": "0", - "enabled": "expand_skins_into_infill", - "settable_per_mesh": true } } + }, + "expand_skins_expand_distance": + { + "label": "Skin Expand Distance", + "description": "The distance the skins are expanded into the infill. The default distance is enough to bridge the gap between the infill lines and will stop holes appearing in the skin where it meets the wall when the infill density is low. A smaller distance will often be sufficient.", + "unit": "mm", + "type": "float", + "default_value": 1.0, + "value": "infill_line_distance * 1.4", + "minimum_value": "0", + "enabled": "expand_skins_into_infill", + "settable_per_mesh": true + }, + "min_skin_width_for_expansion": + { + "label": "Minimum Skin Width For Expansion", + "description": "Skin areas narrower than this are not expanded. This avoids expanding the narrow skin areas that are created when the model surface has a slope close to the vertical.", + "unit": "mm", + "type": "float", + "default_value": 0, + "value": "wall_thickness * 0.5", + "minimum_value": "0", + "enabled": "expand_skins_into_infill", + "settable_per_mesh": true } } }, From 5550dbf53f605afa8ae8cc69a8ff6e017a5e5f13 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 3 Mar 2017 12:41:14 +0100 Subject: [PATCH 082/146] JSON fix: don't expand bottom skins by default (CURA-3440) --- resources/definitions/fdmprinter.def.json | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index c0f4536eb0..cadbc55f38 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1269,7 +1269,6 @@ "description": "Expand lower skin areas (areas with air below) so that they are anchored by the infill layers above and below.", "type": "bool", "default_value": false, - "value": "expand_skins_into_infill", "enabled": "expand_skins_into_infill", "settable_per_mesh": true } From a7e08f10a40ddd21779f68d942e3424e37a4a0ec Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 3 Mar 2017 12:41:54 +0100 Subject: [PATCH 083/146] JSON fix: only enable skin expansion settings when we have it enabled (CURA-3440) --- resources/definitions/fdmprinter.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index cadbc55f38..0fd49ee446 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1283,7 +1283,7 @@ "default_value": 1.0, "value": "infill_line_distance * 1.4", "minimum_value": "0", - "enabled": "expand_skins_into_infill", + "enabled": "expand_upper_skins or expand_lower_skins", "settable_per_mesh": true }, "min_skin_width_for_expansion": @@ -1295,7 +1295,7 @@ "default_value": 0, "value": "wall_thickness * 0.5", "minimum_value": "0", - "enabled": "expand_skins_into_infill", + "enabled": "expand_upper_skins or expand_lower_skins", "settable_per_mesh": true } } From 7997ae55eac332869b371db7fc3dacabce389c3b Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 2 Mar 2017 11:50:47 +0100 Subject: [PATCH 084/146] CURA-3397 Make discard button default --- resources/qml/DiscardOrKeepProfileChangesDialog.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/qml/DiscardOrKeepProfileChangesDialog.qml b/resources/qml/DiscardOrKeepProfileChangesDialog.qml index a19400de5e..f869352f68 100644 --- a/resources/qml/DiscardOrKeepProfileChangesDialog.qml +++ b/resources/qml/DiscardOrKeepProfileChangesDialog.qml @@ -146,6 +146,7 @@ UM.Dialog Printer.discardOrKeepProfileChangesClosed("discard") base.hide() } + isDefault: true } Button From 67b57129ed1c861a91032e450473179b2833a762 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 2 Mar 2017 18:02:01 +0100 Subject: [PATCH 085/146] CURA-3397 Add options for profile override dialog --- cura/CuraApplication.py | 12 ++++++- .../qml/DiscardOrKeepProfileChangesDialog.qml | 21 +++++++++++ resources/qml/Preferences/GeneralPage.qml | 36 +++++++++++++++++++ 3 files changed, 68 insertions(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index f28d2e4896..2d431da1ed 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -243,6 +243,7 @@ class CuraApplication(QtApplication): Preferences.getInstance().addPreference("mesh/scale_tiny_meshes", True) Preferences.getInstance().addPreference("cura/dialog_on_project_save", True) Preferences.getInstance().addPreference("cura/asked_dialog_on_project_save", False) + Preferences.getInstance().addPreference("cura/choice_on_profile_override", 0) Preferences.getInstance().addPreference("cura/currency", "€") Preferences.getInstance().addPreference("cura/material_settings", "{}") @@ -334,7 +335,16 @@ class CuraApplication(QtApplication): showDiscardOrKeepProfileChanges = pyqtSignal() def discardOrKeepProfileChanges(self): - self.showDiscardOrKeepProfileChanges.emit() + choice = Preferences.getInstance().getValue("cura/choice_on_profile_override") + if choice == 1: + # don't show dialog and DISCARD the profile + self.discardOrKeepProfileChangesClosed("discard") + elif choice == 2: + # don't show dialog and KEEP the profile + self.discardOrKeepProfileChangesClosed("keep") + else: + # ALWAYS ask whether to keep or discard the profile + self.showDiscardOrKeepProfileChanges.emit() @pyqtSlot(str) def discardOrKeepProfileChangesClosed(self, option): diff --git a/resources/qml/DiscardOrKeepProfileChangesDialog.qml b/resources/qml/DiscardOrKeepProfileChangesDialog.qml index f869352f68..ef7c9305c6 100644 --- a/resources/qml/DiscardOrKeepProfileChangesDialog.qml +++ b/resources/qml/DiscardOrKeepProfileChangesDialog.qml @@ -129,6 +129,27 @@ UM.Dialog model: base.changesModel } + Item + { + anchors.right: parent.right + anchors.left: parent.left + anchors.margins: UM.Theme.getSize("default_margin").width + height:childrenRect.height + + ComboBox + { + id: discardOrKeepProfileChangesDropDownButton + model: [ + catalog.i18nc("@option:discardOrKeep", "Always ask me this"), + catalog.i18nc("@option:discardOrKeep", "Discard and never ask again"), + catalog.i18nc("@option:discardOrKeep", "Keep and never ask again") + ] + width: 300 + currentIndex: UM.Preferences.getValue("cura/choice_on_profile_override") + onCurrentIndexChanged: UM.Preferences.setValue("cura/choice_on_profile_override", currentIndex) + } + } + Item { anchors.right: parent.right diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index 017de45521..b0646d5287 100644 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -47,6 +47,8 @@ UM.PreferencesPage centerOnSelectCheckbox.checked = boolCheck(UM.Preferences.getValue("view/center_on_select")) UM.Preferences.resetPreference("view/top_layer_count"); topLayerCountCheckbox.checked = boolCheck(UM.Preferences.getValue("view/top_layer_count")) + UM.Preferences.resetPreference("cura/choice_on_profile_override") + choiceOnProfileOverrideDropDownButton.currentIndex = UM.Preferences.getValue("cura/choice_on_profile_override") if (plugins.find("id", "SliceInfoPlugin") > -1) { UM.Preferences.resetPreference("info/send_slice_info") @@ -377,6 +379,40 @@ UM.PreferencesPage } } + Item + { + //: Spacer + height: UM.Theme.getSize("default_margin").height + width: UM.Theme.getSize("default_margin").width + } + + Label + { + font.bold: true + text: catalog.i18nc("@label", "Override Profile") + } + + UM.TooltipArea + { + width: childrenRect.width; + height: childrenRect.height; + + text: catalog.i18nc("@info:tooltip", "When you have made changes to a profile and switched to a different one, a dialog will be shown asking whether you want to keep your modifications or not, or you can choose a default behaviour and never show that dialog again.") + + ComboBox + { + id: choiceOnProfileOverrideDropDownButton + + model: [ + catalog.i18nc("@option:discardOrKeep", "Always ask me this"), + catalog.i18nc("@option:discardOrKeep", "Discard and never ask again"), + catalog.i18nc("@option:discardOrKeep", "Keep and never ask again") + ] + width: 300 + currentIndex: UM.Preferences.getValue("cura/choice_on_profile_override") + onCurrentIndexChanged: UM.Preferences.setValue("cura/choice_on_profile_override", currentIndex) + } + } Item { From b65d950181ef88f4730ebb75f4c8039d2a9b9e39 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 3 Mar 2017 08:31:30 +0100 Subject: [PATCH 086/146] CURA-3397 Change headers in override profile table --- resources/qml/DiscardOrKeepProfileChangesDialog.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/DiscardOrKeepProfileChangesDialog.qml b/resources/qml/DiscardOrKeepProfileChangesDialog.qml index ef7c9305c6..c1d167a5b6 100644 --- a/resources/qml/DiscardOrKeepProfileChangesDialog.qml +++ b/resources/qml/DiscardOrKeepProfileChangesDialog.qml @@ -101,7 +101,7 @@ UM.Dialog TableViewColumn { role: "label" - title: catalog.i18nc("@title:column", "Settings") + title: catalog.i18nc("@title:column", "Profile settings") delegate: labelDelegate width: tableView.width * 0.5 } @@ -109,7 +109,7 @@ UM.Dialog TableViewColumn { role: "original_value" - title: "Profile" + title: "Default" width: tableView.width * 0.25 delegate: defaultDelegate } From 2f3998b9dbf4aa812415ab2db42a050946792225 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 3 Mar 2017 14:46:40 +0100 Subject: [PATCH 087/146] Fixed layout of discard dialog --- resources/qml/DiscardOrKeepProfileChangesDialog.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/DiscardOrKeepProfileChangesDialog.qml b/resources/qml/DiscardOrKeepProfileChangesDialog.qml index 0261e88da1..4c88801bb0 100644 --- a/resources/qml/DiscardOrKeepProfileChangesDialog.qml +++ b/resources/qml/DiscardOrKeepProfileChangesDialog.qml @@ -64,7 +64,7 @@ UM.Dialog anchors.margins: UM.Theme.getSize("default_margin").width anchors.left: parent.left anchors.right: parent.right - height: base.height - 100 + height: base.height - 130 id: tableView Component { From 4878a50b6164c4f7d4e8fb4d6a8f9aa074138657 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 3 Mar 2017 14:50:46 +0100 Subject: [PATCH 088/146] JSON refactor: skin expansion descriptions, defaults and new min_skin_angle_for_expansion settings (CURA-3440) --- resources/definitions/fdmprinter.def.json | 38 ++++++++++++++++------- 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 0fd49ee446..1d4b549059 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1247,7 +1247,7 @@ "expand_skins_into_infill": { "label": "Expand Skins Into Infill", - "description": "Expand skin areas into the infill behind walls. By default, skins stop under the wall lines that surround infill but this can lead to holes appearing when the infill density is low. This setting extends the skins beyond the wall lines so that the skins become anchored in the infill.", + "description": "Expand skin areas of top and/or bottom skin of flat surfaces. By default, skins stop under the wall lines that surround infill but this can lead to holes appearing when the infill density is low. This setting extends the skins beyond the wall lines so that the infill on the next layer rests on skin.", "type": "bool", "default_value": false, "settable_per_mesh": true, @@ -1256,11 +1256,10 @@ "expand_upper_skins": { "label": "Expand Upper Skins", - "description": "Expand upper skin areas (areas with air above) so that they are anchored by the infill layers above and below.", + "description": "Expand upper skin areas (areas with air above) so that they support infill above.", "type": "bool", "default_value": false, "value": "expand_skins_into_infill", - "enabled": "expand_skins_into_infill", "settable_per_mesh": true }, "expand_lower_skins": @@ -1269,7 +1268,6 @@ "description": "Expand lower skin areas (areas with air below) so that they are anchored by the infill layers above and below.", "type": "bool", "default_value": false, - "enabled": "expand_skins_into_infill", "settable_per_mesh": true } } @@ -1280,23 +1278,39 @@ "description": "The distance the skins are expanded into the infill. The default distance is enough to bridge the gap between the infill lines and will stop holes appearing in the skin where it meets the wall when the infill density is low. A smaller distance will often be sufficient.", "unit": "mm", "type": "float", - "default_value": 1.0, + "default_value": 2.8, "value": "infill_line_distance * 1.4", "minimum_value": "0", "enabled": "expand_upper_skins or expand_lower_skins", "settable_per_mesh": true }, - "min_skin_width_for_expansion": + "min_skin_angle_for_expansion": { - "label": "Minimum Skin Width For Expansion", - "description": "Skin areas narrower than this are not expanded. This avoids expanding the narrow skin areas that are created when the model surface has a slope close to the vertical.", - "unit": "mm", + "label": "Minimum Skin Angle for Expansion", + "description": "Top and or bottom surfaces of your object with an angle larger than this setting, won't have their top/bottom skin expanded. This avoids expanding the narrow skin areas that are created when the model surface has a near vertical slope.", + "unit": "°", "type": "float", - "default_value": 0, - "value": "wall_thickness * 0.5", "minimum_value": "0", + "maximum_value": "90", + "maximum_value_warning": "45", + "default_value": 20, "enabled": "expand_upper_skins or expand_lower_skins", - "settable_per_mesh": true + "settable_per_mesh": true, + "children": + { + "min_skin_width_for_expansion": + { + "label": "Minimum Skin Width for Expansion", + "description": "Skin areas narrower than this are not expanded. This avoids expanding the narrow skin areas that are created when the model surface has a slope close to the vertical.", + "unit": "mm", + "type": "float", + "default_value": 2.24, + "value": "top_layers * layer_height / math.tan(math.radians(min_skin_angle_for_expansion))", + "minimum_value": "0", + "enabled": "expand_upper_skins or expand_lower_skins", + "settable_per_mesh": true + } + } } } }, From 54c1c995eddb70aeaad2093a4bfb5d7ec352ea93 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 3 Mar 2017 12:37:06 +0100 Subject: [PATCH 089/146] JSON fix: moved expand_skins_expand_distance and min_skin_width_for_expansion out of illegitimate parent (CURA-3440) --- resources/definitions/fdmprinter.def.json | 48 +++++++++++------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 9b89f07bff..bd7ecfd672 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1272,32 +1272,32 @@ "value": "expand_skins_into_infill", "enabled": "expand_skins_into_infill", "settable_per_mesh": true - }, - "expand_skins_expand_distance": - { - "label": "Skin Expand Distance", - "description": "The distance the skins are expanded into the infill. The default distance is enough to bridge the gap between the infill lines and will stop holes appearing in the skin where it meets the wall when the infill density is low. A smaller distance will often be sufficient.", - "unit": "mm", - "type": "float", - "default_value": 1.0, - "value": "infill_line_distance * 1.4", - "minimum_value": "0", - "enabled": "expand_skins_into_infill", - "settable_per_mesh": true - }, - "min_skin_width_for_expansion": - { - "label": "Minimum Skin Width For Expansion", - "description": "Skin areas narrower than this are not expanded. This avoids expanding the narrow skin areas that are created when the model surface has a slope close to the vertical.", - "unit": "mm", - "type": "float", - "default_value": 0, - "value": "wall_thickness * 0.5", - "minimum_value": "0", - "enabled": "expand_skins_into_infill", - "settable_per_mesh": true } } + }, + "expand_skins_expand_distance": + { + "label": "Skin Expand Distance", + "description": "The distance the skins are expanded into the infill. The default distance is enough to bridge the gap between the infill lines and will stop holes appearing in the skin where it meets the wall when the infill density is low. A smaller distance will often be sufficient.", + "unit": "mm", + "type": "float", + "default_value": 1.0, + "value": "infill_line_distance * 1.4", + "minimum_value": "0", + "enabled": "expand_skins_into_infill", + "settable_per_mesh": true + }, + "min_skin_width_for_expansion": + { + "label": "Minimum Skin Width For Expansion", + "description": "Skin areas narrower than this are not expanded. This avoids expanding the narrow skin areas that are created when the model surface has a slope close to the vertical.", + "unit": "mm", + "type": "float", + "default_value": 0, + "value": "wall_thickness * 0.5", + "minimum_value": "0", + "enabled": "expand_skins_into_infill", + "settable_per_mesh": true } } }, From 016a25ce35c0851cd2bd5727f4d5c642c6f34874 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 3 Mar 2017 12:41:14 +0100 Subject: [PATCH 090/146] JSON fix: don't expand bottom skins by default (CURA-3440) --- resources/definitions/fdmprinter.def.json | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index bd7ecfd672..8a5424a7a7 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1269,7 +1269,6 @@ "description": "Expand lower skin areas (areas with air below) so that they are anchored by the infill layers above and below.", "type": "bool", "default_value": false, - "value": "expand_skins_into_infill", "enabled": "expand_skins_into_infill", "settable_per_mesh": true } From e5090f70aad39f237864160ed0b740fe356d158c Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 3 Mar 2017 12:41:54 +0100 Subject: [PATCH 091/146] JSON fix: only enable skin expansion settings when we have it enabled (CURA-3440) --- resources/definitions/fdmprinter.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 8a5424a7a7..cc5d147b98 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1283,7 +1283,7 @@ "default_value": 1.0, "value": "infill_line_distance * 1.4", "minimum_value": "0", - "enabled": "expand_skins_into_infill", + "enabled": "expand_upper_skins or expand_lower_skins", "settable_per_mesh": true }, "min_skin_width_for_expansion": @@ -1295,7 +1295,7 @@ "default_value": 0, "value": "wall_thickness * 0.5", "minimum_value": "0", - "enabled": "expand_skins_into_infill", + "enabled": "expand_upper_skins or expand_lower_skins", "settable_per_mesh": true } } From 396198797e8a0120d69dbd43c99a5063d819d743 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 3 Mar 2017 14:50:46 +0100 Subject: [PATCH 092/146] JSON refactor: skin expansion descriptions, defaults and new min_skin_angle_for_expansion settings (CURA-3440) --- resources/definitions/fdmprinter.def.json | 38 ++++++++++++++++------- 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index cc5d147b98..870f5ba7ff 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1247,7 +1247,7 @@ "expand_skins_into_infill": { "label": "Expand Skins Into Infill", - "description": "Expand skin areas into the infill behind walls. By default, skins stop under the wall lines that surround infill but this can lead to holes appearing when the infill density is low. This setting extends the skins beyond the wall lines so that the skins become anchored in the infill.", + "description": "Expand skin areas of top and/or bottom skin of flat surfaces. By default, skins stop under the wall lines that surround infill but this can lead to holes appearing when the infill density is low. This setting extends the skins beyond the wall lines so that the infill on the next layer rests on skin.", "type": "bool", "default_value": false, "settable_per_mesh": true, @@ -1256,11 +1256,10 @@ "expand_upper_skins": { "label": "Expand Upper Skins", - "description": "Expand upper skin areas (areas with air above) so that they are anchored by the infill layers above and below.", + "description": "Expand upper skin areas (areas with air above) so that they support infill above.", "type": "bool", "default_value": false, "value": "expand_skins_into_infill", - "enabled": "expand_skins_into_infill", "settable_per_mesh": true }, "expand_lower_skins": @@ -1269,7 +1268,6 @@ "description": "Expand lower skin areas (areas with air below) so that they are anchored by the infill layers above and below.", "type": "bool", "default_value": false, - "enabled": "expand_skins_into_infill", "settable_per_mesh": true } } @@ -1280,23 +1278,39 @@ "description": "The distance the skins are expanded into the infill. The default distance is enough to bridge the gap between the infill lines and will stop holes appearing in the skin where it meets the wall when the infill density is low. A smaller distance will often be sufficient.", "unit": "mm", "type": "float", - "default_value": 1.0, + "default_value": 2.8, "value": "infill_line_distance * 1.4", "minimum_value": "0", "enabled": "expand_upper_skins or expand_lower_skins", "settable_per_mesh": true }, - "min_skin_width_for_expansion": + "min_skin_angle_for_expansion": { - "label": "Minimum Skin Width For Expansion", - "description": "Skin areas narrower than this are not expanded. This avoids expanding the narrow skin areas that are created when the model surface has a slope close to the vertical.", - "unit": "mm", + "label": "Minimum Skin Angle for Expansion", + "description": "Top and or bottom surfaces of your object with an angle larger than this setting, won't have their top/bottom skin expanded. This avoids expanding the narrow skin areas that are created when the model surface has a near vertical slope.", + "unit": "°", "type": "float", - "default_value": 0, - "value": "wall_thickness * 0.5", "minimum_value": "0", + "maximum_value": "90", + "maximum_value_warning": "45", + "default_value": 20, "enabled": "expand_upper_skins or expand_lower_skins", - "settable_per_mesh": true + "settable_per_mesh": true, + "children": + { + "min_skin_width_for_expansion": + { + "label": "Minimum Skin Width for Expansion", + "description": "Skin areas narrower than this are not expanded. This avoids expanding the narrow skin areas that are created when the model surface has a slope close to the vertical.", + "unit": "mm", + "type": "float", + "default_value": 2.24, + "value": "top_layers * layer_height / math.tan(math.radians(min_skin_angle_for_expansion))", + "minimum_value": "0", + "enabled": "expand_upper_skins or expand_lower_skins", + "settable_per_mesh": true + } + } } } }, From e05236ed72939fc34dfcbf73783e5210b571a800 Mon Sep 17 00:00:00 2001 From: probonopd Date: Sun, 5 Mar 2017 14:16:36 +0100 Subject: [PATCH 093/146] Add WirelessPrinting Plugin --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0ab3de61a4..28c0f13496 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,7 @@ Third party plugins * [X3G Writer](https://github.com/Ghostkeeper/X3GWriter): Adds support for exporting X3G files. * [Auto orientation](https://github.com/nallath/CuraOrientationPlugin): Calculate the optimal orientation for a model. * [OctoPrint Plugin](https://github.com/fieldofview/OctoPrintPlugin): Send printjobs directly to OctoPrint and monitor their progress in Cura. +* [WirelessPrinting Plugin](https://github.com/probonopd/WirelessPrinting): Print wirelessly from Cura to your 3D printer connected to an ESP8266 module. Making profiles for other printers ---------------------------------- From 44859210cc758ced2c8503dec6aa49249b312bcb Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 6 Mar 2017 11:13:20 +0100 Subject: [PATCH 094/146] Tweak bed adhesion settings These settings are said to improve bed adhesion. See https://github.com/Ultimaker/Cura/pull/1350#issuecomment-284247064 --- resources/definitions/renkforce_rf100.def.json | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/resources/definitions/renkforce_rf100.def.json b/resources/definitions/renkforce_rf100.def.json index 7df1fa46fd..bdbc44ea8c 100644 --- a/resources/definitions/renkforce_rf100.def.json +++ b/resources/definitions/renkforce_rf100.def.json @@ -18,8 +18,8 @@ "bottom_thickness": { "value": "0.5" }, - "brim_line_count": { - "value": "20.0" + "brim_width": { + "value": "2.0" }, "cool_fan_enabled": { "value": "True" @@ -81,6 +81,9 @@ "material_diameter": { "value": "1.75" }, + "material_flow": { + "value": "110" + }, "material_print_temperature": { "value": "210.0" }, @@ -151,13 +154,13 @@ "value": "3.0" }, "skirt_line_count": { - "value": "1.0" + "value": "3" }, "speed_infill": { "value": "50.0" }, "speed_layer_0": { - "value": "30.0" + "value": "15.0" }, "speed_print": { "value": "50.0" From 1c40c94c447232727e9c1abb3d9fb7aa8b46aa36 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 6 Mar 2017 11:55:39 +0100 Subject: [PATCH 095/146] Fix compatibility options. CURA-3321 --- plugins/LayerView/LayerView.py | 0 plugins/LayerView/LayerView.qml | 48 +++++++++++++++-------------- plugins/LayerView/LayerViewProxy.py | 2 +- resources/themes/cura/theme.json | 1 + 4 files changed, 27 insertions(+), 24 deletions(-) mode change 100644 => 100755 plugins/LayerView/LayerView.py mode change 100644 => 100755 plugins/LayerView/LayerViewProxy.py diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py old mode 100644 new mode 100755 diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 0cc1678f06..bbb9b4c80e 100755 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -10,10 +10,16 @@ import UM 1.0 as UM Item { - width: UM.Theme.getSize("layerview_menu_size").width + width: { + if (UM.LayerView.compatibilityMode) { + return UM.Theme.getSize("layerview_menu_size_compatibility").width; + } else { + return UM.Theme.getSize("layerview_menu_size").width; + } + } height: { if (UM.LayerView.compatibilityMode) { - return UM.Theme.getSize("layerview_menu_size").height + return UM.Theme.getSize("layerview_menu_size_compatibility").height; } else { return UM.Theme.getSize("layerview_menu_size").height + UM.LayerView.extruderCount * (UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("layerview_row_spacing").height) } @@ -31,10 +37,6 @@ Item ColumnLayout { id: view_settings - property bool extruder0_checked: UM.Preferences.getValue("layerview/extruder0_opacity") > 0.5 - property bool extruder1_checked: UM.Preferences.getValue("layerview/extruder1_opacity") > 0.5 - property bool extruder2_checked: UM.Preferences.getValue("layerview/extruder2_opacity") > 0.5 - property bool extruder3_checked: UM.Preferences.getValue("layerview/extruder3_opacity") > 0.5 property var extruder_opacities: UM.Preferences.getValue("layerview/extruder_opacities").split("|") property bool show_travel_moves: UM.Preferences.getValue("layerview/show_travel_moves") property bool show_helpers: UM.Preferences.getValue("layerview/show_helpers") @@ -42,7 +44,7 @@ Item property bool show_infill: UM.Preferences.getValue("layerview/show_infill") property bool show_legend: UM.LayerView.compatibilityMode || UM.Preferences.getValue("layerview/layer_view_type") == 1 property bool only_show_top_layers: UM.Preferences.getValue("view/only_show_top_layers") - property int top_layer_count: UM.Preferences.getValue("view/only_show_top_layers") + property int top_layer_count: UM.Preferences.getValue("view/top_layer_count") anchors.top: parent.top anchors.topMargin: UM.Theme.getSize("default_margin").height @@ -260,6 +262,22 @@ Item Layout.preferredHeight: UM.Theme.getSize("layerview_row").height Layout.preferredWidth: UM.Theme.getSize("layerview_row").width } + CheckBox { + checked: view_settings.only_show_top_layers + onClicked: { + UM.Preferences.setValue("view/only_show_top_layers", checked ? 1.0 : 0.0); + } + text: catalog.i18nc("@label", "Only Show Top Layers") + visible: UM.LayerView.compatibilityMode + } + CheckBox { + checked: view_settings.top_layer_count == 5 + onClicked: { + UM.Preferences.setValue("view/top_layer_count", checked ? 5 : 1); + } + text: catalog.i18nc("@label", "Show 5 Detailed Layers On Top") + visible: UM.LayerView.compatibilityMode + } Label { @@ -420,22 +438,6 @@ Item visible: UM.LayerView.busy; } } - CheckBox { - checked: view_settings.only_show_top_layers - onClicked: { - UM.Preferences.setValue("view/only_show_top_layers", checked ? 1.0 : 0.0); - } - text: catalog.i18nc("@label", "Only Show Top Layers") - visible: UM.LayerView.compatibilityMode - } - CheckBox { - checked: view_settings.top_layer_count == 5 - onClicked: { - UM.Preferences.setValue("view/top_layer_count", checked ? 5 : 1); - } - text: catalog.i18nc("@label", "Show 5 Detailed Layers On Top") - visible: UM.LayerView.compatibilityMode - } } } } diff --git a/plugins/LayerView/LayerViewProxy.py b/plugins/LayerView/LayerViewProxy.py old mode 100644 new mode 100755 index 0c3998a334..bc372aeaf8 --- a/plugins/LayerView/LayerViewProxy.py +++ b/plugins/LayerView/LayerViewProxy.py @@ -129,7 +129,7 @@ class LayerViewProxy(QObject): def _onLayerChanged(self): self.currentLayerChanged.emit() self._layerActivityChanged() - + def _onMaxLayersChanged(self): self.maxLayersChanged.emit() diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index 92597cfcf6..bd3fbb6dc6 100755 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -295,6 +295,7 @@ "slider_layerview_margin": [3.0, 1.0], "layerview_menu_size": [16.5, 21.0], + "layerview_menu_size_compatibility": [22, 23.0], "layerview_legend_size": [1.0, 1.0], "layerview_row": [11.0, 1.5], "layerview_row_spacing": [0.0, 0.5], From c9254a3095ad4fc7654cf8dc3a628912c7186668 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 6 Mar 2017 12:15:58 +0100 Subject: [PATCH 096/146] CURA-3397 Enable/disable "keep" and "discard" buttons according to the choice --- .../qml/DiscardOrKeepProfileChangesDialog.qml | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/resources/qml/DiscardOrKeepProfileChangesDialog.qml b/resources/qml/DiscardOrKeepProfileChangesDialog.qml index 4c88801bb0..ed720adafa 100644 --- a/resources/qml/DiscardOrKeepProfileChangesDialog.qml +++ b/resources/qml/DiscardOrKeepProfileChangesDialog.qml @@ -146,7 +146,25 @@ UM.Dialog ] width: 300 currentIndex: UM.Preferences.getValue("cura/choice_on_profile_override") - onCurrentIndexChanged: UM.Preferences.setValue("cura/choice_on_profile_override", currentIndex) + onCurrentIndexChanged: + { + UM.Preferences.setValue("cura/choice_on_profile_override", currentIndex) + if (currentIndex == 1) { + // 1 == "Discard and never ask again", so only enable the "Discard" button + discardButton.enabled = true + keepButton.enabled = false + } + else if (currentIndex == 2) { + // 2 == "Keep and never ask again", so only enable the "Keep" button + keepButton.enabled = true + discardButton.enabled = false + } + else { + // 0 == "Always ask me this", so show both + keepButton.enabled = true + discardButton.enabled = true + } + } } } From 1c15d24e5bc1d650c27467a8852e3012741f6994 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 6 Mar 2017 12:37:29 +0100 Subject: [PATCH 097/146] CURA-3397 Reduce tableView height to show buttons --- resources/qml/DiscardOrKeepProfileChangesDialog.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/DiscardOrKeepProfileChangesDialog.qml b/resources/qml/DiscardOrKeepProfileChangesDialog.qml index ed720adafa..26c343ad5c 100644 --- a/resources/qml/DiscardOrKeepProfileChangesDialog.qml +++ b/resources/qml/DiscardOrKeepProfileChangesDialog.qml @@ -64,7 +64,7 @@ UM.Dialog anchors.margins: UM.Theme.getSize("default_margin").width anchors.left: parent.left anchors.right: parent.right - height: base.height - 130 + height: base.height - 200 id: tableView Component { From aca2faa6968b994b55a03aa245064d14c18c3e4f Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Mon, 6 Mar 2017 12:56:27 +0100 Subject: [PATCH 098/146] fix: combing_retract_before_outer_wall always causes retraction now (CURA-3438) --- resources/definitions/fdmprinter.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 72f165a93d..4457ecfda4 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2423,10 +2423,10 @@ "combing_retract_before_outer_wall": { "label": "Retract Before Outer Wall", - "description": "When combing is enabled, always retract when moving to start an outer wall.", + "description": "Always retract when moving to start an outer wall.", "type": "bool", "default_value": false, - "enabled": "resolveOrValue('retraction_combing') != 'off'", + "enabled": "retraction_enable", "settable_per_mesh": false, "settable_per_extruder": false }, From 1f61017946fba94657b1abeace717fa8f5cf8e9d Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 6 Mar 2017 13:20:14 +0100 Subject: [PATCH 099/146] Fix updateLegend function. CURA-3321 --- plugins/LayerView/LayerView.qml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index bbb9b4c80e..061aadc4ee 100755 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -107,17 +107,16 @@ Item currentIndex: layer_view_type // index matches type_id onActivated: { // Combobox selection - var type_id = index; // layerViewTypes.get(index).type_id; + var type_id = index; UM.Preferences.setValue("layerview/layer_view_type", type_id); - updateLegend(); + updateLegend(type_id); } onModelChanged: { - updateLegend(); + updateLegend(UM.Preferences.getValue("layerview/layer_view_type")); } // Update visibility of legend. - function updateLegend() { - var type_id = model.get(currentIndex).type_id; + function updateLegend(type_id) { if (UM.LayerView.compatibilityMode || (type_id == 1)) { // Line type view_settings.show_legend = true; From b2e06bed3788858925aeb7d237d8e463219dacb9 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 6 Mar 2017 14:03:42 +0100 Subject: [PATCH 100/146] Fix 'inverting slider' when switching between Layer view and a different view. CURA-3321 --- plugins/LayerView/LayerView.qml | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 061aadc4ee..a24409e8d6 100755 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -10,6 +10,7 @@ import UM 1.0 as UM Item { + id: base width: { if (UM.LayerView.compatibilityMode) { return UM.Theme.getSize("layerview_menu_size_compatibility").width; @@ -326,18 +327,21 @@ Item Slider { id: sliderMinimumLayer + + anchors { + top: parent.top + bottom: parent.bottom + right: layerViewMenu.right + margins: UM.Theme.getSize("slider_layerview_margin").height + rightMargin: UM.Theme.getSize("slider_layerview_margin").width * 0.8 + } width: UM.Theme.getSize("slider_layerview_size").width - height: parent.height - 2*UM.Theme.getSize("slider_layerview_margin").height - anchors.top: parent.top - anchors.topMargin: UM.Theme.getSize("slider_layerview_margin").height - anchors.right: layerViewMenu.right - anchors.rightMargin: UM.Theme.getSize("slider_layerview_margin").width * 0.8 orientation: Qt.Vertical minimumValue: 0; - maximumValue: UM.LayerView.numLayers-1; + maximumValue: UM.LayerView.numLayers - 1; stepSize: 1 - property real pixelsPerStep: ((height - UM.Theme.getSize("slider_handle").height) / (maximumValue - minimumValue)) * stepSize; + property real pixelsPerStep: ((height - UM.Theme.getSize("slider_handle").height) / (maximumValue - minimumValue)) * stepSize value: UM.LayerView.minimumLayer onValueChanged: { @@ -353,12 +357,16 @@ Item Slider { id: slider + + anchors { + top: parent.top + bottom: parent.bottom + right: layerViewMenu.right + margins: UM.Theme.getSize("slider_layerview_margin").height + rightMargin: UM.Theme.getSize("slider_layerview_margin").width * 0.2 + } width: UM.Theme.getSize("slider_layerview_size").width - height: parent.height - 2*UM.Theme.getSize("slider_layerview_margin").height //UM.Theme.getSize("slider_layerview_size").height - anchors.top: parent.top - anchors.topMargin: UM.Theme.getSize("slider_layerview_margin").height - anchors.right: layerViewMenu.right - anchors.rightMargin: UM.Theme.getSize("slider_layerview_margin").width * 0.2 + orientation: Qt.Vertical minimumValue: 0; maximumValue: UM.LayerView.numLayers; From a0df6bf54254fa641c84205ad109ea8fd1628a9b Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 6 Mar 2017 14:23:53 +0100 Subject: [PATCH 101/146] Jerry-rig single slider to replace dual slider design --- plugins/LayerView/LayerView.qml | 174 ++++++++++++++++++++++++------- resources/themes/cura/theme.json | 2 +- 2 files changed, 139 insertions(+), 37 deletions(-) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 061aadc4ee..2712c2f59d 100755 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -323,58 +323,160 @@ Item } - Slider + Item { - id: sliderMinimumLayer - width: UM.Theme.getSize("slider_layerview_size").width + id: slider + width: handleSize height: parent.height - 2*UM.Theme.getSize("slider_layerview_margin").height anchors.top: parent.top anchors.topMargin: UM.Theme.getSize("slider_layerview_margin").height anchors.right: layerViewMenu.right - anchors.rightMargin: UM.Theme.getSize("slider_layerview_margin").width * 0.8 - orientation: Qt.Vertical - minimumValue: 0; - maximumValue: UM.LayerView.numLayers-1; - stepSize: 1 + anchors.rightMargin: UM.Theme.getSize("slider_layerview_margin").width - property real pixelsPerStep: ((height - UM.Theme.getSize("slider_handle").height) / (maximumValue - minimumValue)) * stepSize; + property real handleSize: UM.Theme.getSize("slider_handle").width + property real handleRadius: handleSize / 2 + property real minimumRangeHandleSize: UM.Theme.getSize("slider_handle").width / 2 + property real trackThickness: UM.Theme.getSize("slider_groove").width + property real trackRadius: trackThickness / 2 + property real trackBorderWidth: UM.Theme.getSize("default_lining").width + property color upperHandleColor: UM.Theme.getColor("slider_handle") + property color lowerHandleColor: UM.Theme.getColor("slider_handle") + property color rangeHandleColor: UM.Theme.getColor("slider_groove_fill") + property color trackColor: UM.Theme.getColor("slider_groove") + property color trackBorderColor: UM.Theme.getColor("slider_groove_border") - value: UM.LayerView.minimumLayer - onValueChanged: { - UM.LayerView.setMinimumLayer(value) - if (value > UM.LayerView.currentLayer) { - UM.LayerView.setCurrentLayer(value); + property real to: UM.LayerView.numLayers + property real from: 0 + property real minimumRange: 0 + property bool roundValues: true + + property real upper: + { + var result = upperHandle.y / (height - (2 * handleSize + minimumRangeHandleSize)); + result = to + result * (from - (to - minimumRange)); + result = roundValues ? Math.round(result) | 0 : result; + return result; + } + property real lower: + { + var result = (lowerHandle.y - (handleSize + minimumRangeHandleSize)) / (height - (2 * handleSize + minimumRangeHandleSize)); + result = to - minimumRange + result * (from - (to - minimumRange)); + result = roundValues ? Math.round(result) : result; + return result; + } + property real range: upper - lower + property var activeHandle: upperHandle + + onLowerChanged: + { + UM.LayerView.setMinimumLayer(lower) + } + onUpperChanged: + { + UM.LayerView.setCurrentLayer(upper); + } + + Rectangle { + width: parent.trackThickness + height: parent.height - parent.handleSize + radius: parent.trackRadius + anchors.centerIn: parent + color: parent.trackColor + border.width: parent.trackBorderWidth; + border.color: parent.trackBorderColor; + } + + Item { + id: rangeHandle + y: upperHandle.y + upperHandle.height + width: parent.handleSize + height: parent.minimumRangeHandleSize + anchors.horizontalCenter: parent.horizontalCenter + property real value: parent.upper + + Rectangle { + anchors.centerIn: parent + width: parent.parent.trackThickness - 2 * parent.parent.trackBorderWidth + height: parent.height + parent.parent.handleSize + color: parent.parent.rangeHandleColor + } + + MouseArea { + anchors.fill: parent + + drag.target: parent + drag.axis: Drag.YAxis + drag.minimumY: upperHandle.height + drag.maximumY: parent.parent.height - (parent.height + lowerHandle.height) + + onPressed: parent.parent.activeHandle = rangeHandle + onPositionChanged: + { + upperHandle.y = parent.y - upperHandle.height + lowerHandle.y = parent.y + parent.height + } } } - style: UM.Theme.styles.slider; - } + Rectangle { + id: upperHandle + y: parent.height - (parent.minimumRangeHandleSize + 2 * parent.handleSize) + width: parent.handleSize + height: parent.handleSize + anchors.horizontalCenter: parent.horizontalCenter + radius: parent.handleRadius + color: parent.upperHandleColor + property real value: parent.upper - Slider - { - id: slider - width: UM.Theme.getSize("slider_layerview_size").width - height: parent.height - 2*UM.Theme.getSize("slider_layerview_margin").height //UM.Theme.getSize("slider_layerview_size").height - anchors.top: parent.top - anchors.topMargin: UM.Theme.getSize("slider_layerview_margin").height - anchors.right: layerViewMenu.right - anchors.rightMargin: UM.Theme.getSize("slider_layerview_margin").width * 0.2 - orientation: Qt.Vertical - minimumValue: 0; - maximumValue: UM.LayerView.numLayers; - stepSize: 1 + MouseArea { + anchors.fill: parent - property real pixelsPerStep: ((height - UM.Theme.getSize("slider_handle").height) / (maximumValue - minimumValue)) * stepSize; + drag.target: parent + drag.axis: Drag.YAxis + drag.minimumY: 0 + drag.maximumY: parent.parent.height - (2 * parent.parent.handleSize + parent.parent.minimumRangeHandleSize) - value: UM.LayerView.currentLayer - onValueChanged: { - UM.LayerView.setCurrentLayer(value); - if (value < UM.LayerView.minimumLayer) { - UM.LayerView.setMinimumLayer(value); + onPressed: parent.parent.activeHandle = upperHandle + onPositionChanged: + { + if(lowerHandle.y - (upperHandle.y + upperHandle.height) < parent.parent.minimumRangeHandleSize) + { + lowerHandle.y = upperHandle.y + upperHandle.height + parent.parent.minimumRangeHandleSize; + } + rangeHandle.height = lowerHandle.y - (upperHandle.y + upperHandle.height); } } + } - style: UM.Theme.styles.slider; + Rectangle { + id: lowerHandle + y: parent.height - parent.handleSize + width: parent.handleSize + height: parent.handleSize + anchors.horizontalCenter: parent.horizontalCenter + radius: parent.handleRadius + color: parent.lowerHandleColor + property real value: parent.lower + + MouseArea { + anchors.fill: parent + + drag.target: parent + drag.axis: Drag.YAxis + drag.minimumY: upperHandle.height + parent.parent.minimumRangeHandleSize + drag.maximumY: parent.parent.height - parent.height + + onPressed: parent.parent.activeHandle = lowerHandle + onPositionChanged: + { + if(lowerHandle.y - (upperHandle.y + upperHandle.height) < parent.parent.minimumRangeHandleSize) + { + upperHandle.y = lowerHandle.y - (upperHandle.height + parent.parent.minimumRangeHandleSize); + } + rangeHandle.height = lowerHandle.y - (upperHandle.y + upperHandle.height) + } + } + } Rectangle { diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index bd3fbb6dc6..fa4bf2ee92 100755 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -292,7 +292,7 @@ "slider_handle": [1.5, 1.5], "slider_layerview_size": [1.0, 22.0], "slider_layerview_background": [4.0, 0.0], - "slider_layerview_margin": [3.0, 1.0], + "slider_layerview_margin": [1.0, 1.0], "layerview_menu_size": [16.5, 21.0], "layerview_menu_size_compatibility": [22, 23.0], From 694da25bb7fe2359e0a7609d20d187b73624c7fa Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 6 Mar 2017 14:35:36 +0100 Subject: [PATCH 102/146] Show proper values of the active handle of the slider --- plugins/LayerView/LayerView.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 2712c2f59d..ad2a27fb0b 100755 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -481,7 +481,7 @@ Item Rectangle { x: parent.width + UM.Theme.getSize("slider_layerview_background").width / 2; - y: parent.height - (parent.value * parent.pixelsPerStep) - UM.Theme.getSize("slider_handle").height * 1.25; + y: slider.activeHandle.y + slider.activeHandle.height / 2 - valueLabel.height / 2; height: UM.Theme.getSize("slider_handle").height + UM.Theme.getSize("default_margin").height width: valueLabel.width + UM.Theme.getSize("default_margin").width @@ -497,7 +497,7 @@ Item { id: valueLabel property string maxValue: slider.maximumValue + 1 - text: slider.value + 1 + text: slider.activeHandle.value + 1 horizontalAlignment: TextInput.AlignRight; onEditingFinished: { From 356d4f9288b85622d99657bd89f1bd93c6f56350 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 6 Mar 2017 14:41:33 +0100 Subject: [PATCH 103/146] Heated bed timeout time now hides correctly if time ran out CURA-3360 --- cura/PrinterOutputDevice.py | 8 ++++++-- plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py | 1 - 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 7f0b7c4c07..f411190fd5 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -47,8 +47,8 @@ class PrinterOutputDevice(QObject, OutputDevice): self._job_name = "" self._error_text = "" self._accepts_commands = True - self._preheat_bed_timeout = 900 #Default time-out for pre-heating the bed, in seconds. - self._preheat_bed_timer = QTimer() #Timer that tracks how long to preheat still. + self._preheat_bed_timeout = 900 # Default time-out for pre-heating the bed, in seconds. + self._preheat_bed_timer = QTimer() # Timer that tracks how long to preheat still. self._preheat_bed_timer.setSingleShot(True) self._preheat_bed_timer.timeout.connect(self.cancelPreheatBed) @@ -232,11 +232,15 @@ class PrinterOutputDevice(QObject, OutputDevice): # \return The duration of the time-out to pre-heat the bed, formatted. @pyqtProperty(str, notify = preheatBedRemainingTimeChanged) def preheatBedRemainingTime(self): + if not self._preheat_bed_timer.isActive(): + return "" period = self._preheat_bed_timer.remainingTime() if period <= 0: return "" minutes, period = divmod(period, 60000) #60000 milliseconds in a minute. seconds, _ = divmod(period, 1000) #1000 milliseconds in a second. + if minutes <= 0 and seconds <= 0: + return "" return "%d:%02d" % (minutes, seconds) ## Time the print has been printing. diff --git a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py index a7223128b4..ea8917ed9f 100644 --- a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py @@ -558,7 +558,6 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice): self._preheat_bed_timer.stop() self.preheatBedRemainingTimeChanged.emit() - def close(self): Logger.log("d", "Closing connection of printer %s with ip %s", self._key, self._address) self._updateJobState("") From 38a9df9d76a83e966110bfa1bf20302c8863715f Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Mon, 6 Mar 2017 14:42:11 +0100 Subject: [PATCH 104/146] fix: more lenient int-list validator parsing (CURA-3275) allow for empty integers allow the brackets to be omitted --- resources/qml/Settings/SettingTextField.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index 05c99d7e25..ce376e1c77 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -100,7 +100,7 @@ SettingItem maximumLength: (definition.type == "[int]") ? 20 : 10; - validator: RegExpValidator { regExp: (definition.type == "[int]") ? /^\[(\s*-?[0-9]+\s*,)*(\s*-?[0-9]+)\s*\]$/ : (definition.type == "int") ? /^-?[0-9]{0,10}$/ : /^-?[0-9]{0,9}[.,]?[0-9]{0,10}$/ } // definition.type property from parent loader used to disallow fractional number entry + validator: RegExpValidator { regExp: (definition.type == "[int]") ? /^\[?(\s*-?[0-9]{0,9}\s*,)*(\s*-?[0-9]{0,9})\s*\]?$/ : (definition.type == "int") ? /^-?[0-9]{0,10}$/ : /^-?[0-9]{0,9}[.,]?[0-9]{0,10}$/ } // definition.type property from parent loader used to disallow fractional number entry Binding { From a664ee88b7aed9bb03848785cd69b11e292bfc82 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 6 Mar 2017 16:01:00 +0100 Subject: [PATCH 105/146] Fix setting upper value --- plugins/LayerView/LayerView.qml | 79 ++++++++++++++++++++++++++------- 1 file changed, 63 insertions(+), 16 deletions(-) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index ad2a27fb0b..7fabdd07bc 100755 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -345,35 +345,67 @@ Item property color trackColor: UM.Theme.getColor("slider_groove") property color trackBorderColor: UM.Theme.getColor("slider_groove_border") - property real to: UM.LayerView.numLayers - property real from: 0 + property real maximumValue: UM.LayerView.numLayers + property real minimumValue: 0 property real minimumRange: 0 property bool roundValues: true - property real upper: + function getUpperValueFromHandle() { var result = upperHandle.y / (height - (2 * handleSize + minimumRangeHandleSize)); - result = to + result * (from - (to - minimumRange)); + result = maximumValue + result * (minimumValue - (maximumValue - minimumRange)); result = roundValues ? Math.round(result) | 0 : result; return result; } - property real lower: + function getLowerValueFromHandle() { var result = (lowerHandle.y - (handleSize + minimumRangeHandleSize)) / (height - (2 * handleSize + minimumRangeHandleSize)); - result = to - minimumRange + result * (from - (to - minimumRange)); + result = maximumValue - minimumRange + result * (minimumValue - (maximumValue - minimumRange)); result = roundValues ? Math.round(result) : result; return result; } - property real range: upper - lower property var activeHandle: upperHandle - onLowerChanged: + function setLowerValue(value) { - UM.LayerView.setMinimumLayer(lower) + } - onUpperChanged: + + function setUpperValue(value) { - UM.LayerView.setCurrentLayer(upper); + print("!!!!!!", value) + + var value = (value - maximumValue) / (minimumValue - maximumValue); + print("a ", value) + var new_upper_y = Math.round(value * (height - (2 * handleSize + minimumRangeHandleSize))); + print("b ", new_upper_y, upperHandle.y) + var new_lower = lowerHandle.value + if(UM.LayerView.currentLayer - lowerHandle.value < minimumRange) + { + new_lower = UM.LayerView.currentLayer - minimumRange + } else if(activeHandle == rangeHandle) + { + new_lower = UM.LayerView.currentLayer - (upperHandle.value - lowerHandle.value) + } + new_lower = Math.max(minimumValue, new_lower) + + if(new_upper_y != upperHandle.y) + { + upperHandle.y = new_upper_y + } + if(new_lower != lowerHandle.value) + { + value = (new_lower - maximumValue) / (minimumValue - maximumValue) + lowerHandle.y = Math.round((handleSize + minimumRangeHandleSize) + value * (height - (2 * handleSize + minimumRangeHandleSize))) + } + rangeHandle.height = lowerHandle.y - (upperHandle.y + upperHandle.height); + } + + Connections + { + target: UM.LayerView + onMinimumLayerChanged: slider.setLowerValue(UM.LayerView.minimumLayer) + onCurrentLayerChanged: slider.setUpperValue(UM.LayerView.currentLayer) } Rectangle { @@ -392,7 +424,7 @@ Item width: parent.handleSize height: parent.minimumRangeHandleSize anchors.horizontalCenter: parent.horizontalCenter - property real value: parent.upper + property real value: UM.LayerView.currentLayer Rectangle { anchors.centerIn: parent @@ -414,6 +446,9 @@ Item { upperHandle.y = parent.y - upperHandle.height lowerHandle.y = parent.y + parent.height + + UM.LayerView.setCurrentLayer(slider.getUpperValueFromHandle()); + UM.LayerView.setMinimumLayer(slider.getLowerValueFromHandle()); } } } @@ -426,7 +461,7 @@ Item anchors.horizontalCenter: parent.horizontalCenter radius: parent.handleRadius color: parent.upperHandleColor - property real value: parent.upper + property real value: UM.LayerView.currentLayer MouseArea { anchors.fill: parent @@ -444,8 +479,14 @@ Item lowerHandle.y = upperHandle.y + upperHandle.height + parent.parent.minimumRangeHandleSize; } rangeHandle.height = lowerHandle.y - (upperHandle.y + upperHandle.height); + + UM.LayerView.setCurrentLayer(slider.getUpperValueFromHandle()); } } + function setValue(value) + { + UM.LayerView.setCurrentLayer(value); + } } Rectangle { @@ -456,7 +497,7 @@ Item anchors.horizontalCenter: parent.horizontalCenter radius: parent.handleRadius color: parent.lowerHandleColor - property real value: parent.lower + property real value: UM.LayerView.minimumLayer MouseArea { anchors.fill: parent @@ -474,14 +515,20 @@ Item upperHandle.y = lowerHandle.y - (upperHandle.height + parent.parent.minimumRangeHandleSize); } rangeHandle.height = lowerHandle.y - (upperHandle.y + upperHandle.height) + + UM.LayerView.setMinimumLayer(slider.getLowerValueFromHandle()); } } + function setValue(value) + { + UM.LayerView.setMinimumLayer(value); + } } Rectangle { x: parent.width + UM.Theme.getSize("slider_layerview_background").width / 2; - y: slider.activeHandle.y + slider.activeHandle.height / 2 - valueLabel.height / 2; + y: Math.floor(slider.activeHandle.y + slider.activeHandle.height / 2 - valueLabel.height / 2); height: UM.Theme.getSize("slider_handle").height + UM.Theme.getSize("default_margin").height width: valueLabel.width + UM.Theme.getSize("default_margin").width @@ -507,7 +554,7 @@ Item cursorPosition = 0; if(valueLabel.text != '') { - slider.value = valueLabel.text - 1; + slider.activeHandle.setValue(valueLabel.text - 1); } } validator: IntValidator { bottom: 1; top: slider.maximumValue + 1; } From a6bc2b07f8836dc436d1623759fa2a10c4a4a201 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 6 Mar 2017 16:35:00 +0100 Subject: [PATCH 106/146] Fix setting lower value --- plugins/LayerView/LayerView.py | 6 +++++ plugins/LayerView/LayerView.qml | 44 ++++++++++++++------------------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py index da58c526fe..390c2dcc7d 100755 --- a/plugins/LayerView/LayerView.py +++ b/plugins/LayerView/LayerView.py @@ -163,6 +163,8 @@ class LayerView(View): self._current_layer_num = 0 if self._current_layer_num > self._max_layers: self._current_layer_num = self._max_layers + if self._current_layer_num < self._minimum_layer_num: + self._minimum_layer_num = self._current_layer_num self._startUpdateTopLayers() @@ -173,6 +175,10 @@ class LayerView(View): self._minimum_layer_num = value if self._minimum_layer_num < 0: self._minimum_layer_num = 0 + if self._minimum_layer_num > self._max_layers: + self._minimum_layer_num = self._max_layers + if self._minimum_layer_num > self._current_layer_num: + self._current_layer_num = self._minimum_layer_num self._startUpdateTopLayers() diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 7fabdd07bc..894c29b454 100755 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -366,41 +366,31 @@ Item } property var activeHandle: upperHandle - function setLowerValue(value) - { - - } - function setUpperValue(value) { - print("!!!!!!", value) - var value = (value - maximumValue) / (minimumValue - maximumValue); - print("a ", value) var new_upper_y = Math.round(value * (height - (2 * handleSize + minimumRangeHandleSize))); - print("b ", new_upper_y, upperHandle.y) - var new_lower = lowerHandle.value - if(UM.LayerView.currentLayer - lowerHandle.value < minimumRange) - { - new_lower = UM.LayerView.currentLayer - minimumRange - } else if(activeHandle == rangeHandle) - { - new_lower = UM.LayerView.currentLayer - (upperHandle.value - lowerHandle.value) - } - new_lower = Math.max(minimumValue, new_lower) if(new_upper_y != upperHandle.y) { - upperHandle.y = new_upper_y - } - if(new_lower != lowerHandle.value) - { - value = (new_lower - maximumValue) / (minimumValue - maximumValue) - lowerHandle.y = Math.round((handleSize + minimumRangeHandleSize) + value * (height - (2 * handleSize + minimumRangeHandleSize))) + upperHandle.y = new_upper_y; } rangeHandle.height = lowerHandle.y - (upperHandle.y + upperHandle.height); } + function setLowerValue(value) + { + var value = (value - maximumValue) / (minimumValue - maximumValue); + var new_lower_y = Math.round((handleSize + minimumRangeHandleSize) + value * (height - (2 * handleSize + minimumRangeHandleSize))); + + if(new_lower_y != lowerHandle.y) + { + lowerHandle.y = new_lower_y; + } + rangeHandle.height = lowerHandle.y - (upperHandle.y + upperHandle.height); + } + + Connections { target: UM.LayerView @@ -447,8 +437,10 @@ Item upperHandle.y = parent.y - upperHandle.height lowerHandle.y = parent.y + parent.height - UM.LayerView.setCurrentLayer(slider.getUpperValueFromHandle()); - UM.LayerView.setMinimumLayer(slider.getLowerValueFromHandle()); + var upper_value = slider.getUpperValueFromHandle(); + var lower_value = upper_value - (upperHandle.value - lowerHandle.value); + UM.LayerView.setCurrentLayer(upper_value); + UM.LayerView.setMinimumLayer(lower_value); } } } From 0fa32c3c167d6fa7047811b824c7afef5b469495 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 6 Mar 2017 16:48:59 +0100 Subject: [PATCH 107/146] Step by 10 layers with shift key down --- plugins/LayerView/LayerView.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py index 390c2dcc7d..56c02a3a26 100755 --- a/plugins/LayerView/LayerView.py +++ b/plugins/LayerView/LayerView.py @@ -285,13 +285,15 @@ class LayerView(View): def event(self, event): modifiers = QApplication.keyboardModifiers() - ctrl_is_active = modifiers == Qt.ControlModifier + ctrl_is_active = modifiers & Qt.ControlModifier + shift_is_active = modifiers & Qt.ShiftModifier if event.type == Event.KeyPressEvent and ctrl_is_active: + amount = 10 if shift_is_active else 1 if event.key == KeyEvent.UpKey: - self.setLayer(self._current_layer_num + 1) + self.setLayer(self._current_layer_num + amount) return True if event.key == KeyEvent.DownKey: - self.setLayer(self._current_layer_num - 1) + self.setLayer(self._current_layer_num - amount) return True if event.type == Event.ViewActivateEvent: From d0c8b05314f3149bfc6b0f0bb20704385c3eed74 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 6 Mar 2017 17:16:36 +0100 Subject: [PATCH 108/146] Fix setting central value --- plugins/LayerView/LayerView.qml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 894c29b454..31459ae2f8 100755 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -443,6 +443,14 @@ Item UM.LayerView.setMinimumLayer(lower_value); } } + function setValue(value) + { + var range = upperHandle.value - lowerHandle.value; + value = Math.min(value, slider.maximumValue); + value = Math.max(value, slider.minimumValue + range); + UM.LayerView.setCurrentLayer(value); + UM.LayerView.setMinimumLayer(value - range); + } } Rectangle { From 8a77dd66fc1408dc5c7929fa0b5a2e3f64b73759 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 6 Mar 2017 17:24:53 +0100 Subject: [PATCH 109/146] Properly handle CMake options that are enabled but not "ON" Contributes to CURA-2787 --- CMakeLists.txt | 3 +++ cura/CuraVersion.py.in | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ab08a4d624..8105b677ef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,9 @@ add_custom_target(tests) add_custom_command(TARGET tests POST_BUILD COMMAND "PYTHONPATH=${CMAKE_SOURCE_DIR}/../Uranium/:${CMAKE_SOURCE_DIR}" ${PYTHON_EXECUTABLE} -m pytest -r a --junitxml=${CMAKE_BINARY_DIR}/junit.xml ${CMAKE_SOURCE_DIR} || exit 0) option(CURA_DEBUGMODE "Enable debug dialog and other debug features" OFF) +if(CURA_DEBUGMODE) + set(_cura_debugmode "ON") +endif() set(CURA_VERSION "master" CACHE STRING "Version name of Cura") set(CURA_BUILDTYPE "" CACHE STRING "Build type of Cura, eg. 'PPA'") diff --git a/cura/CuraVersion.py.in b/cura/CuraVersion.py.in index 8a4d13e526..fb66275395 100644 --- a/cura/CuraVersion.py.in +++ b/cura/CuraVersion.py.in @@ -3,4 +3,4 @@ CuraVersion = "@CURA_VERSION@" CuraBuildType = "@CURA_BUILDTYPE@" -CuraDebugMode = True if "@CURA_DEBUGMODE@" == "ON" else False +CuraDebugMode = True if "@_cura_debugmode@" == "ON" else False From af265be9000d7e94f66ed43919742ec24e4ca66f Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 6 Mar 2017 17:27:37 +0100 Subject: [PATCH 110/146] Add up/down key navigation to layernum box --- plugins/LayerView/LayerView.qml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 31459ae2f8..cde1b40373 100755 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -570,6 +570,9 @@ Item font: UM.Theme.getFont("default"); background: Item { } } + + Keys.onUpPressed: slider.activeHandle.setValue(slider.activeHandle.value + ((event.modifiers & Qt.ShiftModifier) ? 10 : 1)) + Keys.onDownPressed: slider.activeHandle.setValue(slider.activeHandle.value - ((event.modifiers & Qt.ShiftModifier) ? 10 : 1)) } BusyIndicator From 2b49484dc7fdac2d101140e80b20bca4fc1a351d Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 6 Mar 2017 17:46:42 +0100 Subject: [PATCH 111/146] Hide the slider controls when there are no layers (and code cleanup) --- plugins/LayerView/LayerView.qml | 49 ++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index cde1b40373..4fe08ce271 100755 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -350,6 +350,9 @@ Item property real minimumRange: 0 property bool roundValues: true + property var activeHandle: upperHandle + property bool layersVisible: UM.LayerView.layerActivity && Printer.platformActivity ? true : false + function getUpperValueFromHandle() { var result = upperHandle.y / (height - (2 * handleSize + minimumRangeHandleSize)); @@ -357,6 +360,7 @@ Item result = roundValues ? Math.round(result) | 0 : result; return result; } + function getLowerValueFromHandle() { var result = (lowerHandle.y - (handleSize + minimumRangeHandleSize)) / (height - (2 * handleSize + minimumRangeHandleSize)); @@ -364,7 +368,6 @@ Item result = roundValues ? Math.round(result) : result; return result; } - property var activeHandle: upperHandle function setUpperValue(value) { @@ -390,7 +393,6 @@ Item rangeHandle.height = lowerHandle.y - (upperHandle.y + upperHandle.height); } - Connections { target: UM.LayerView @@ -414,7 +416,18 @@ Item width: parent.handleSize height: parent.minimumRangeHandleSize anchors.horizontalCenter: parent.horizontalCenter + + visible: slider.layersVisible + property real value: UM.LayerView.currentLayer + function setValue(value) + { + var range = upperHandle.value - lowerHandle.value; + value = Math.min(value, slider.maximumValue); + value = Math.max(value, slider.minimumValue + range); + UM.LayerView.setCurrentLayer(value); + UM.LayerView.setMinimumLayer(value - range); + } Rectangle { anchors.centerIn: parent @@ -443,14 +456,6 @@ Item UM.LayerView.setMinimumLayer(lower_value); } } - function setValue(value) - { - var range = upperHandle.value - lowerHandle.value; - value = Math.min(value, slider.maximumValue); - value = Math.max(value, slider.minimumValue + range); - UM.LayerView.setCurrentLayer(value); - UM.LayerView.setMinimumLayer(value - range); - } } Rectangle { @@ -461,7 +466,14 @@ Item anchors.horizontalCenter: parent.horizontalCenter radius: parent.handleRadius color: parent.upperHandleColor + + visible: slider.layersVisible + property real value: UM.LayerView.currentLayer + function setValue(value) + { + UM.LayerView.setCurrentLayer(value); + } MouseArea { anchors.fill: parent @@ -483,10 +495,6 @@ Item UM.LayerView.setCurrentLayer(slider.getUpperValueFromHandle()); } } - function setValue(value) - { - UM.LayerView.setCurrentLayer(value); - } } Rectangle { @@ -497,7 +505,14 @@ Item anchors.horizontalCenter: parent.horizontalCenter radius: parent.handleRadius color: parent.lowerHandleColor + + visible: slider.layersVisible + property real value: UM.LayerView.minimumLayer + function setValue(value) + { + UM.LayerView.setMinimumLayer(value); + } MouseArea { anchors.fill: parent @@ -519,10 +534,6 @@ Item UM.LayerView.setMinimumLayer(slider.getLowerValueFromHandle()); } } - function setValue(value) - { - UM.LayerView.setMinimumLayer(value); - } } Rectangle @@ -538,7 +549,7 @@ Item border.color: UM.Theme.getColor("slider_groove_border") color: UM.Theme.getColor("tool_panel_background") - visible: UM.LayerView.layerActivity && Printer.platformActivity ? true : false + visible: slider.layersVisible TextField { From 34ac02f5bd339cd6a54d48e998261199a854c1c3 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 6 Mar 2017 18:23:08 +0100 Subject: [PATCH 112/146] Use Pointing Rectangle for layer number indicator --- plugins/LayerView/LayerView.qml | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 4fe08ce271..cb8a27d55d 100755 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -536,21 +536,36 @@ Item } } - Rectangle + UM.PointingRectangle { x: parent.width + UM.Theme.getSize("slider_layerview_background").width / 2; - y: Math.floor(slider.activeHandle.y + slider.activeHandle.height / 2 - valueLabel.height / 2); + y: Math.floor(slider.activeHandle.y + slider.activeHandle.height / 2 - height / 2); - height: UM.Theme.getSize("slider_handle").height + UM.Theme.getSize("default_margin").height + target: Qt.point(0, slider.activeHandle.y + slider.activeHandle.height / 2) + arrowSize: UM.Theme.getSize("default_arrow").width + + height: (Math.floor(UM.Theme.getSize("slider_handle").height + UM.Theme.getSize("default_margin").height) / 2) * 2 // Make sure height has an integer middle so drawing a pointy border is easier width: valueLabel.width + UM.Theme.getSize("default_margin").width Behavior on height { NumberAnimation { duration: 50; } } - border.width: UM.Theme.getSize("default_lining").width - border.color: UM.Theme.getColor("slider_groove_border") - color: UM.Theme.getColor("tool_panel_background") + color: UM.Theme.getColor("lining"); visible: slider.layersVisible + UM.PointingRectangle + { + color: UM.Theme.getColor("tool_panel_background") + target: Qt.point(0, height / 2 + UM.Theme.getSize("default_lining").width) + arrowSize: UM.Theme.getSize("default_arrow").width + anchors.fill: parent + anchors.margins: UM.Theme.getSize("default_lining").width + + MouseArea //Catch all mouse events (so scene doesnt handle them) + { + anchors.fill: parent + } + } + TextField { id: valueLabel From 3468bae732312a6c10541971f7c1945c5affe047 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 7 Mar 2017 10:31:11 +0100 Subject: [PATCH 113/146] Add result type. --- cura/BuildVolume.py | 2 +- resources/qml/Cura.qml | 0 2 files changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 cura/BuildVolume.py mode change 100644 => 100755 resources/qml/Cura.qml diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py old mode 100644 new mode 100755 index c911844b58..1b04e0390a --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -385,7 +385,7 @@ class BuildVolume(SceneNode): self.setPosition(Vector(0, -self._raft_thickness, 0), SceneNode.TransformSpace.World) self.raftThicknessChanged.emit() - def _updateExtraZClearance(self): + def _updateExtraZClearance(self) -> None: extra_z = 0.0 extruders = ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId()) use_extruders = False diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml old mode 100644 new mode 100755 From c10dc2f07cbd392239b9ed39c1d80a2fba5b0060 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 7 Mar 2017 10:36:30 +0100 Subject: [PATCH 114/146] Set old permissions back. CURA-3321 --- plugins/LayerView/LayerView.py | 0 plugins/LayerView/LayerView.qml | 0 plugins/LayerView/LayerViewProxy.py | 0 resources/themes/cura/theme.json | 0 4 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 plugins/LayerView/LayerView.py mode change 100755 => 100644 plugins/LayerView/LayerView.qml mode change 100755 => 100644 plugins/LayerView/LayerViewProxy.py mode change 100755 => 100644 resources/themes/cura/theme.json diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py old mode 100755 new mode 100644 diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml old mode 100755 new mode 100644 diff --git a/plugins/LayerView/LayerViewProxy.py b/plugins/LayerView/LayerViewProxy.py old mode 100755 new mode 100644 diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json old mode 100755 new mode 100644 From efbc624ea8768ca0f9d59b93b746e6bb6ec4500b Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 7 Mar 2017 10:40:59 +0100 Subject: [PATCH 115/146] More defensive setExtruderOpacity, removed unnecessary part. CURA-3321 --- plugins/LayerView/LayerView.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) mode change 100644 => 100755 plugins/LayerView/LayerView.py diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py old mode 100644 new mode 100755 index da58c526fe..c696081ca3 --- a/plugins/LayerView/LayerView.py +++ b/plugins/LayerView/LayerView.py @@ -194,7 +194,7 @@ class LayerView(View): # \param extruder_nr 0..3 # \param opacity 0.0 .. 1.0 def setExtruderOpacity(self, extruder_nr, opacity): - if extruder_nr <= 3: + if 0 <= extruder_nr <= 3: self._extruder_opacity[extruder_nr] = opacity self.currentLayerNumChanged.emit() @@ -385,8 +385,7 @@ class LayerView(View): opacity = 1.0 self.setExtruderOpacity(extruder_nr, opacity) - self._show_travel_moves = bool(Preferences.getInstance().getValue("layerview/show_travel_moves")) - self.setShowTravelMoves(self._show_travel_moves) + self.setShowTravelMoves(bool(Preferences.getInstance().getValue("layerview/show_travel_moves"))) self.setShowHelpers(bool(Preferences.getInstance().getValue("layerview/show_helpers"))) self.setShowSkin(bool(Preferences.getInstance().getValue("layerview/show_skin"))) self.setShowInfill(bool(Preferences.getInstance().getValue("layerview/show_infill"))) From 73dff094432e109b4959044fe5faa2b41a127669 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 7 Mar 2017 10:47:34 +0100 Subject: [PATCH 116/146] Travel moves now have a width of 0.1. CURA-3321 --- plugins/LayerView/layers3d.shader | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/LayerView/layers3d.shader b/plugins/LayerView/layers3d.shader index 2108d85eb2..6f5e986eec 100755 --- a/plugins/LayerView/layers3d.shader +++ b/plugins/LayerView/layers3d.shader @@ -128,7 +128,7 @@ geometry41core = if ((v_line_type[0] == 8) || (v_line_type[0] == 9)) { // fixed size for movements - size_x = 0.2; + size_x = 0.05; } else { size_x = v_line_dim[0].x / 2 + 0.01; // radius, and make it nicely overlapping } From 414337dead2b84eac4cd84243ff6f3a997d3d714 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 7 Mar 2017 11:01:03 +0100 Subject: [PATCH 117/146] Fixed 3mf writing The type hinting changes also changed the way we handle certain imports, which caused saving to fail. CURA-3215 --- plugins/3MFWriter/ThreeMFWriter.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/3MFWriter/ThreeMFWriter.py b/plugins/3MFWriter/ThreeMFWriter.py index 7ce75bf60e..34d47f527b 100644 --- a/plugins/3MFWriter/ThreeMFWriter.py +++ b/plugins/3MFWriter/ThreeMFWriter.py @@ -144,8 +144,7 @@ class ThreeMFWriter(MeshWriter): translation_matrix.setByTranslation(translation_vector) transformation_matrix.preMultiply(translation_matrix) - - root_node = UM.Application.getInstance().getController().getScene().getRoot() + root_node = UM.Application.Application.getInstance().getController().getScene().getRoot() for node in nodes: if node == root_node: for root_child in node.getChildren(): From e9ae531de2fa3994d2146bf544a4e8c206bad411 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 7 Mar 2017 11:15:47 +0100 Subject: [PATCH 118/146] CURA-3397 Set override profile preference option upon visibility change --- resources/qml/DiscardOrKeepProfileChangesDialog.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/qml/DiscardOrKeepProfileChangesDialog.qml b/resources/qml/DiscardOrKeepProfileChangesDialog.qml index 26c343ad5c..c239a9f491 100644 --- a/resources/qml/DiscardOrKeepProfileChangesDialog.qml +++ b/resources/qml/DiscardOrKeepProfileChangesDialog.qml @@ -22,6 +22,8 @@ UM.Dialog { changesModel.forceUpdate() } + + discardOrKeepProfileChangesDropDownButton.currentIndex = UM.Preferences.getValue("cura/choice_on_profile_override") } Column From 85d979cf5007be4ac77dab667cddf04027c12e8f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 7 Mar 2017 11:41:18 +0100 Subject: [PATCH 119/146] Removed unneeded check from network printing. We used to not have a printer_state so this check was needed. --- plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py index ea8917ed9f..2d9192414b 100644 --- a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py @@ -600,10 +600,6 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice): # \param filter_by_machine Whether to filter MIME types by machine. This # is ignored. def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None): - if self._progress != 0: - self._error_message = Message(i18n_catalog.i18nc("@info:status", "Unable to start a new print job because the printer is busy. Please check the printer.")) - self._error_message.show() - return if self._printer_state != "idle": self._error_message = Message( i18n_catalog.i18nc("@info:status", "Unable to start a new print job, printer is busy. Current printer status is %s.") % self._printer_state) From 6dcd3b44b6c24de2afa2154c6787f71f79c7a453 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 7 Mar 2017 11:44:40 +0100 Subject: [PATCH 120/146] Removed uneeded debug code The method is always put, so no need to log it. --- .../UM3NetworkPrinting/NetworkPrinterOutputDevice.py | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py index 2d9192414b..9f0a8b20f5 100644 --- a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py @@ -1059,17 +1059,7 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice): if status_code in [200, 201, 202, 204]: pass # Request was successful! else: - operation_type = "Unknown" - if reply.operation() == QNetworkAccessManager.GetOperation: - operation_type = "Get" - elif reply.operation() == QNetworkAccessManager.PutOperation: - operation_type = "Put" - elif reply.operation() == QNetworkAccessManager.PostOperation: - operation_type = "Post" - elif reply.operation() == QNetworkAccessManager.DeleteOperation: - operation_type = "Delete" - - Logger.log("d", "Something went wrong when trying to update data of API (%s). Message: %s Statuscode: %s, operation: %s", reply_url, reply.readAll(), status_code, operation_type) + Logger.log("d", "Something went wrong when trying to update data of API (%s). Message: %s Statuscode: %s", reply_url, reply.readAll(), status_code) else: Logger.log("d", "NetworkPrinterOutputDevice got an unhandled operation %s", reply.operation()) From c06ffe6cae5d7bf03e4e3f3bbd143c48d3015d70 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 7 Mar 2017 11:55:29 +0100 Subject: [PATCH 121/146] Moved auth state changed check to first thing set auth checks This should contribute to the windows authentication issues. Most windows devices seemed to get all the auth state messages twice. --- plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py index 9f0a8b20f5..b89ed58f18 100644 --- a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py @@ -327,6 +327,9 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice): ## Set the authentication state. # \param auth_state \type{AuthState} Enum value representing the new auth state def setAuthenticationState(self, auth_state): + if auth_state == self._authentication_state: + return # Nothing to do here. + if auth_state == AuthState.AuthenticationRequested: Logger.log("d", "Authentication state changed to authentication requested.") self.setAcceptsCommands(False) @@ -367,9 +370,8 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice): self._authentication_timer.stop() self._authentication_counter = 0 - if auth_state != self._authentication_state: - self._authentication_state = auth_state - self.authenticationStateChanged.emit() + self._authentication_state = auth_state + self.authenticationStateChanged.emit() authenticationStateChanged = pyqtSignal() From 0abf4550842ede93f2df11ceb7dca8a0d5c173e2 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 7 Mar 2017 12:41:53 +0100 Subject: [PATCH 122/146] Don't always offset with 0.5mm This is no longer needed, since before this happens we would already get an error with calculating the 3D model. Perhaps we should introduce a minkowski offset there but performing Minkowski on a 3D model is fairly expensive. --- cura/ConvexHullDecorator.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/cura/ConvexHullDecorator.py b/cura/ConvexHullDecorator.py index 2b97feec82..0006f7ff6c 100644 --- a/cura/ConvexHullDecorator.py +++ b/cura/ConvexHullDecorator.py @@ -253,14 +253,11 @@ class ConvexHullDecorator(SceneNodeDecorator): ## Offset the convex hull with settings that influence the collision area. # - # This also applies a minimum offset of 0.5mm, because of edge cases due - # to the rounding we apply. - # # \param convex_hull Polygon of the original convex hull. # \return New Polygon instance that is offset with everything that # influences the collision area. def _offsetHull(self, convex_hull): - horizontal_expansion = max(0.5, self._getSettingProperty("xy_offset", "value")) + horizontal_expansion = self._getSettingProperty("xy_offset", "value") expansion_polygon = Polygon(numpy.array([ [-horizontal_expansion, -horizontal_expansion], [-horizontal_expansion, horizontal_expansion], From b25a6423df655e957c9ffed00b574b4f988d8e1b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 7 Mar 2017 12:47:13 +0100 Subject: [PATCH 123/146] Don't offset hull if offset is 0 This might speed things up a bit. --- cura/ConvexHullDecorator.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/cura/ConvexHullDecorator.py b/cura/ConvexHullDecorator.py index 0006f7ff6c..7065b71735 100644 --- a/cura/ConvexHullDecorator.py +++ b/cura/ConvexHullDecorator.py @@ -258,13 +258,16 @@ class ConvexHullDecorator(SceneNodeDecorator): # influences the collision area. def _offsetHull(self, convex_hull): horizontal_expansion = self._getSettingProperty("xy_offset", "value") - expansion_polygon = Polygon(numpy.array([ - [-horizontal_expansion, -horizontal_expansion], - [-horizontal_expansion, horizontal_expansion], - [horizontal_expansion, horizontal_expansion], - [horizontal_expansion, -horizontal_expansion] - ], numpy.float32)) - return convex_hull.getMinkowskiHull(expansion_polygon) + if horizontal_expansion != 0: + expansion_polygon = Polygon(numpy.array([ + [-horizontal_expansion, -horizontal_expansion], + [-horizontal_expansion, horizontal_expansion], + [horizontal_expansion, horizontal_expansion], + [horizontal_expansion, -horizontal_expansion] + ], numpy.float32)) + return convex_hull.getMinkowskiHull(expansion_polygon) + else: + return convex_hull def _onChanged(self, *args): self._raft_thickness = self._build_volume.getRaftThickness() From 79de5eebb71f151f2dca310a4392a2c3e0405af3 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 7 Mar 2017 11:33:02 +0100 Subject: [PATCH 124/146] CURA-3221 Use "default" theme for description text --- resources/qml/DiscardOrKeepProfileChangesDialog.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/DiscardOrKeepProfileChangesDialog.qml b/resources/qml/DiscardOrKeepProfileChangesDialog.qml index 26c343ad5c..1f47709303 100644 --- a/resources/qml/DiscardOrKeepProfileChangesDialog.qml +++ b/resources/qml/DiscardOrKeepProfileChangesDialog.qml @@ -54,7 +54,7 @@ UM.Dialog { text: "You have customized some profile settings.\nWould you like to keep or discard those settings?" anchors.margins: UM.Theme.getSize("default_margin").width - font: UM.Theme.getFont("default_bold") + font: UM.Theme.getFont("default") wrapMode: Text.WordWrap } } From 9c5404401acfd71e349be9ff4b5caf8aaf683497 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 7 Mar 2017 11:57:07 +0100 Subject: [PATCH 125/146] CURA-3221 Remove star image --- resources/qml/DiscardOrKeepProfileChangesDialog.qml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/resources/qml/DiscardOrKeepProfileChangesDialog.qml b/resources/qml/DiscardOrKeepProfileChangesDialog.qml index 1f47709303..01d9d7a8c0 100644 --- a/resources/qml/DiscardOrKeepProfileChangesDialog.qml +++ b/resources/qml/DiscardOrKeepProfileChangesDialog.qml @@ -42,13 +42,6 @@ UM.Dialog anchors.left: parent.left anchors.right: parent.right spacing: UM.Theme.getSize("default_margin").width - UM.RecolorImage - { - source: UM.Theme.getIcon("star") - width : 30 - height: width - color: UM.Theme.getColor("setting_control_button") - } Label { From d2c03b3554e8a5b8d3948f0d6c7f3ce522285e37 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 7 Mar 2017 12:05:10 +0100 Subject: [PATCH 126/146] CURA-3221 Larger window size for override profile dialog --- resources/qml/DiscardOrKeepProfileChangesDialog.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/DiscardOrKeepProfileChangesDialog.qml b/resources/qml/DiscardOrKeepProfileChangesDialog.qml index 01d9d7a8c0..8ce09d7a4e 100644 --- a/resources/qml/DiscardOrKeepProfileChangesDialog.qml +++ b/resources/qml/DiscardOrKeepProfileChangesDialog.qml @@ -13,8 +13,8 @@ UM.Dialog id: base title: catalog.i18nc("@title:window", "Discard or Keep changes") - width: 500 - height: 300 + width: 800 + height: 400 property var changesModel: Cura.UserChangesModel{ id: userChangesModel} onVisibilityChanged: { From 85bc79bde27f3e188bf02bf4a0b399ab392fc29e Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 7 Mar 2017 12:05:57 +0100 Subject: [PATCH 127/146] CURA-3221 Smaller settings column width for override profile dialog --- resources/qml/DiscardOrKeepProfileChangesDialog.qml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/qml/DiscardOrKeepProfileChangesDialog.qml b/resources/qml/DiscardOrKeepProfileChangesDialog.qml index 8ce09d7a4e..278f0dda2f 100644 --- a/resources/qml/DiscardOrKeepProfileChangesDialog.qml +++ b/resources/qml/DiscardOrKeepProfileChangesDialog.qml @@ -96,21 +96,21 @@ UM.Dialog role: "label" title: catalog.i18nc("@title:column", "Profile settings") delegate: labelDelegate - width: tableView.width * 0.5 + width: tableView.width * 0.4 } TableViewColumn { role: "original_value" title: "Default" - width: tableView.width * 0.25 + width: tableView.width * 0.3 delegate: defaultDelegate } TableViewColumn { role: "user_value" title: catalog.i18nc("@title:column", "Customized") - width: tableView.width * 0.25 - 1 + width: tableView.width * 0.3 - 1 } section.property: "category" section.delegate: Label From adb37de51c38d827172c6c15dd04e2ca1854e210 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 7 Mar 2017 12:06:30 +0100 Subject: [PATCH 128/146] Code style fixes --- resources/qml/DiscardOrKeepProfileChangesDialog.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/DiscardOrKeepProfileChangesDialog.qml b/resources/qml/DiscardOrKeepProfileChangesDialog.qml index 278f0dda2f..a1c6a8210f 100644 --- a/resources/qml/DiscardOrKeepProfileChangesDialog.qml +++ b/resources/qml/DiscardOrKeepProfileChangesDialog.qml @@ -32,7 +32,7 @@ UM.Dialog UM.I18nCatalog { id: catalog; - name:"cura" + name: "cura" } Row @@ -71,7 +71,7 @@ UM.Dialog text: { var result = styleData.value - if (extruder_name!= "") + if (extruder_name != "") { result += " (" + extruder_name + ")" } From 897791b0d28100d97c55d5f47cbfbfd0eb29ab25 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 7 Mar 2017 12:52:48 +0100 Subject: [PATCH 129/146] CURA-3221 Use "system" font so texts fit in rows --- resources/qml/DiscardOrKeepProfileChangesDialog.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/DiscardOrKeepProfileChangesDialog.qml b/resources/qml/DiscardOrKeepProfileChangesDialog.qml index a1c6a8210f..94bc3efa8a 100644 --- a/resources/qml/DiscardOrKeepProfileChangesDialog.qml +++ b/resources/qml/DiscardOrKeepProfileChangesDialog.qml @@ -67,7 +67,7 @@ UM.Dialog property var extruder_name: userChangesModel.getItem(styleData.row).extruder anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("default_margin").width - font: UM.Theme.getFont("default") + font: UM.Theme.getFont("system") text: { var result = styleData.value @@ -86,7 +86,7 @@ UM.Dialog Label { text: styleData.value - font: UM.Theme.getFont("default") + font: UM.Theme.getFont("system") color: UM.Theme.getColor("setting_control_disabled_text") } } From 3047ff26f18f41d9d5b67c223b93660cac45915b Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Tue, 7 Mar 2017 13:09:30 +0100 Subject: [PATCH 130/146] fix: min warning for skin angle (CURA-3440) --- resources/definitions/fdmprinter.def.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 7f75c8361e..008e332eca 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1325,8 +1325,9 @@ "unit": "°", "type": "float", "minimum_value": "0", - "maximum_value": "90", + "minimum_value_warning": "2", "maximum_value_warning": "45", + "maximum_value": "90", "default_value": 20, "enabled": "expand_upper_skins or expand_lower_skins", "settable_per_mesh": true, From ba79f44783a1a6ddf9b3140bdfef44cd9c581fb6 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 7 Mar 2017 16:42:56 +0100 Subject: [PATCH 131/146] CURA-3470 Return list instead of set for QVariantList --- cura/MachineActionManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/MachineActionManager.py b/cura/MachineActionManager.py index 74b1d3bd08..ad9c91ec46 100644 --- a/cura/MachineActionManager.py +++ b/cura/MachineActionManager.py @@ -105,7 +105,7 @@ class MachineActionManager(QObject): if definition_id in self._supported_actions: return list(self._supported_actions[definition_id]) else: - return set() + return list() ## Get all actions required by given machine # \param definition_id The ID of the definition you want the required actions of From a3dce9f6d1da379808f6402b4b249be643ad5aca Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 7 Mar 2017 20:17:09 +0100 Subject: [PATCH 132/146] CURA-3471 importProfiles() takes QVariantList --- cura/Settings/ContainerManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index 7e92b7dfd3..bac11f78cf 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -823,7 +823,7 @@ class ContainerManager(QObject): # # \param QVariant, essentially a list with QUrl objects. # \return Dict with keys status, text - @pyqtSlot(QVariant, result="QVariantMap") + @pyqtSlot("QVariantList", result="QVariantMap") def importProfiles(self, file_urls): status = "ok" results = {"ok": [], "error": []} From a20fb7a4796256e72bca76c38972c5f43e10fa04 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 7 Mar 2017 20:18:31 +0100 Subject: [PATCH 133/146] Fix some coding style --- resources/qml/Cura.qml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 5573b97e5d..1d998f0fee 100755 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -266,11 +266,11 @@ UM.MainWindow anchors.fill: parent; onDropped: { - if(drop.urls.length > 0) + if (drop.urls.length > 0) { // Import models var imported_model = -1; - for(var i in drop.urls) + for (var i in drop.urls) { // There is no endsWith in this version of JS... if ((drop.urls[i].length <= 12) || (drop.urls[i].substring(drop.urls[i].length-12) !== ".curaprofile")) { @@ -287,7 +287,7 @@ UM.MainWindow var import_result = Cura.ContainerManager.importProfiles(drop.urls); if (import_result.message !== "") { messageDialog.text = import_result.message - if(import_result.status == "ok") + if (import_result.status == "ok") { messageDialog.icon = StandardIcon.Information } From 5a7812b4b7c3fb21decde4105629b2980dc18586 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Wed, 8 Mar 2017 09:30:58 +0000 Subject: [PATCH 134/146] Rename combing_retract_before_outer_wall setting to travel_retract_before_outer_wall. The forced retraction can now occur irrespective of whether combing is in use or not. --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index d808984117..017b4deb8e 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2520,7 +2520,7 @@ "settable_per_mesh": false, "settable_per_extruder": false }, - "combing_retract_before_outer_wall": + "travel_retract_before_outer_wall": { "label": "Retract Before Outer Wall", "description": "Always retract when moving to start an outer wall.", From 0f5f163fdf458f4ff472147db28c05c1294fe53b Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Wed, 8 Mar 2017 11:05:37 +0100 Subject: [PATCH 135/146] fix: prime tower thickness has rounding (CURA-3180) --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 008e332eca..a7461d0cde 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3886,7 +3886,7 @@ "unit": "mm", "type": "float", "default_value": 2, - "value": "max(2 * min(extruderValues('prime_tower_line_width')), 0.5 * (resolveOrValue('prime_tower_size') - math.sqrt(max(0, resolveOrValue('prime_tower_size') ** 2 - max(extruderValues('prime_tower_min_volume')) / resolveOrValue('layer_height')))))", + "value": "round(max(2 * min(extruderValues('prime_tower_line_width')), 0.5 * (resolveOrValue('prime_tower_size') - math.sqrt(max(0, resolveOrValue('prime_tower_size') ** 2 - max(extruderValues('prime_tower_min_volume')) / resolveOrValue('layer_height'))))), 3)", "resolve": "max(extruderValues('prime_tower_wall_thickness'))", "minimum_value": "0.001", "minimum_value_warning": "2 * min(extruderValues('prime_tower_line_width'))", From fc8bd75ffe2df12e510056278c27064aa50eb530 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 8 Mar 2017 12:56:47 +0100 Subject: [PATCH 136/146] Added changelog line for layerview slider. --- plugins/ChangeLogPlugin/ChangeLog.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) mode change 100644 => 100755 plugins/ChangeLogPlugin/ChangeLog.txt diff --git a/plugins/ChangeLogPlugin/ChangeLog.txt b/plugins/ChangeLogPlugin/ChangeLog.txt old mode 100644 new mode 100755 index 83114bf342..bcbdb73f13 --- a/plugins/ChangeLogPlugin/ChangeLog.txt +++ b/plugins/ChangeLogPlugin/ChangeLog.txt @@ -1,5 +1,9 @@ [2.5.0] -*Included PauseBackendPlugin. This enables pausing the backend and manually start the backend. Thanks to community member Aldo Hoeben for this feature. +*Layerview double slider. +The layerview now has a nice slider with double handles where you can drag maximum layer, minimum layer and the layer range. Thansk to community member Aldo Hoeben for this feature. + +*Included PauseBackendPlugin. +This enables pausing the backend and manually start the backend. Thanks to community member Aldo Hoeben for this feature. [2.4.0] *Project saving & opening From 5724ee71d0fa7f3943b810508d21ddc697ac510e Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 8 Mar 2017 15:08:45 +0100 Subject: [PATCH 137/146] CURA-3221 Group items into categories for the profile change summary --- cura/Settings/UserChangesModel.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/cura/Settings/UserChangesModel.py b/cura/Settings/UserChangesModel.py index 66ff88251d..37aa86675e 100644 --- a/cura/Settings/UserChangesModel.py +++ b/cura/Settings/UserChangesModel.py @@ -7,6 +7,7 @@ from UM.Settings.ContainerRegistry import ContainerRegistry from UM.i18n import i18nCatalog from UM.Settings.SettingFunction import SettingFunction +from collections import OrderedDict import os class UserChangesModel(ListModel): @@ -35,7 +36,8 @@ class UserChangesModel(ListModel): self._update() def _update(self): - items = [] + item_dict = OrderedDict() + item_list = [] global_stack = Application.getInstance().getGlobalContainerStack() if not global_stack: return @@ -111,5 +113,9 @@ class UserChangesModel(ListModel): if stack != global_stack: item_to_add["extruder"] = stack.getName() - items.append(item_to_add) - self.setItems(items) \ No newline at end of file + if category_label not in item_dict: + item_dict[category_label] = [] + item_dict[category_label].append(item_to_add) + for each_item_list in item_dict.values(): + item_list += each_item_list + self.setItems(item_list) From 8b8fb8db95e51ac67582cc5654e0a2e631f7c7c3 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 8 Mar 2017 15:09:02 +0100 Subject: [PATCH 138/146] Coding style fixes --- cura/Settings/UserChangesModel.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cura/Settings/UserChangesModel.py b/cura/Settings/UserChangesModel.py index 37aa86675e..8b61186650 100644 --- a/cura/Settings/UserChangesModel.py +++ b/cura/Settings/UserChangesModel.py @@ -10,10 +10,11 @@ from UM.Settings.SettingFunction import SettingFunction from collections import OrderedDict import os + class UserChangesModel(ListModel): KeyRole = Qt.UserRole + 1 LabelRole = Qt.UserRole + 2 - ExtruderRole = Qt.UserRole +3 + ExtruderRole = Qt.UserRole + 3 OriginalValueRole = Qt.UserRole + 4 UserValueRole = Qt.UserRole + 6 CategoryRole = Qt.UserRole + 7 From e67aecb04183a7d1afdac09ca1edfe0d06a9bc88 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 8 Mar 2017 15:36:11 +0100 Subject: [PATCH 139/146] CURA-3221 Translate column name "Default" --- resources/qml/DiscardOrKeepProfileChangesDialog.qml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/qml/DiscardOrKeepProfileChangesDialog.qml b/resources/qml/DiscardOrKeepProfileChangesDialog.qml index 480d68dc7a..23fabb8d6c 100644 --- a/resources/qml/DiscardOrKeepProfileChangesDialog.qml +++ b/resources/qml/DiscardOrKeepProfileChangesDialog.qml @@ -100,11 +100,10 @@ UM.Dialog delegate: labelDelegate width: tableView.width * 0.4 } - TableViewColumn { role: "original_value" - title: "Default" + title: catalog.i18nc("@title:column", "Default") width: tableView.width * 0.3 delegate: defaultDelegate } From fa71f22bf62ce97a5474d07da862362ef6842122 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 9 Mar 2017 14:14:05 +0100 Subject: [PATCH 140/146] CURA-3480 Fix boolean values for Cartesio config files --- resources/variants/cartesio_0.25.inst.cfg | 6 +++--- resources/variants/cartesio_0.4.inst.cfg | 6 +++--- resources/variants/cartesio_0.8.inst.cfg | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/resources/variants/cartesio_0.25.inst.cfg b/resources/variants/cartesio_0.25.inst.cfg index 1e46c1eb0e..1aa490beff 100644 --- a/resources/variants/cartesio_0.25.inst.cfg +++ b/resources/variants/cartesio_0.25.inst.cfg @@ -45,19 +45,19 @@ speed_travel_layer_0 = =round(speed_travel) speed_support_interface = =round(speed_topbottom) retraction_combing = off -retraction_hop_enabled = true +retraction_hop_enabled = True retraction_hop = 1 support_z_distance = 0 support_xy_distance = 0.5 support_join_distance = 10 -support_interface_enable = true +support_interface_enable = True adhesion_type = skirt skirt_gap = 0.5 skirt_brim_minimal_length = 50 -coasting_enable = true +coasting_enable = True coasting_volume = 0.1 coasting_min_volume = 0.17 coasting_speed = 90 diff --git a/resources/variants/cartesio_0.4.inst.cfg b/resources/variants/cartesio_0.4.inst.cfg index c3ba238726..3a818469b9 100644 --- a/resources/variants/cartesio_0.4.inst.cfg +++ b/resources/variants/cartesio_0.4.inst.cfg @@ -45,19 +45,19 @@ speed_travel_layer_0 = =round(speed_travel) speed_support_interface = =round(speed_topbottom) retraction_combing = off -retraction_hop_enabled = true +retraction_hop_enabled = True retraction_hop = 1 support_z_distance = 0 support_xy_distance = 0.5 support_join_distance = 10 -support_interface_enable = true +support_interface_enable = True adhesion_type = skirt skirt_gap = 0.5 skirt_brim_minimal_length = 50 -coasting_enable = true +coasting_enable = True coasting_volume = 0.1 coasting_min_volume = 0.17 coasting_speed = 90 diff --git a/resources/variants/cartesio_0.8.inst.cfg b/resources/variants/cartesio_0.8.inst.cfg index 851a36256b..3f6502667c 100644 --- a/resources/variants/cartesio_0.8.inst.cfg +++ b/resources/variants/cartesio_0.8.inst.cfg @@ -46,19 +46,19 @@ speed_travel_layer_0 = =round(speed_travel) speed_support_interface = =round(speed_topbottom) retraction_combing = off -retraction_hop_enabled = true +retraction_hop_enabled = True retraction_hop = 1 support_z_distance = 0 support_xy_distance = 0.5 support_join_distance = 10 -support_interface_enable = true +support_interface_enable = True adhesion_type = skirt skirt_gap = 0.5 skirt_brim_minimal_length = 50 -coasting_enable = true +coasting_enable = True coasting_volume = 0.1 coasting_min_volume = 0.17 coasting_speed = 90 From 2ac4a7aca981ed996b94fba2f0d3617827df709a Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 9 Mar 2017 12:41:20 +0100 Subject: [PATCH 141/146] CURA-3482 _onMaterialMetaDataChanged() should take argument(s) --- cura/PrintInformation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 5d540628af..486a3d185b 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -177,7 +177,7 @@ class PrintInformation(QObject): self._active_material_container = active_material_containers[0] self._active_material_container.metaDataChanged.connect(self._onMaterialMetaDataChanged) - def _onMaterialMetaDataChanged(self): + def _onMaterialMetaDataChanged(self, *args, **kwargs): self._calculateInformation() @pyqtSlot(str) From 039c1b92de3ed97112973b12abf37cd0a9aefa69 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 9 Mar 2017 18:11:06 +0100 Subject: [PATCH 142/146] Add profiles for 0.8mm nozzle sizes --- .../um3_aa0.8_Nylon_Draft_Print.inst.cfg | 26 +++++++ .../um3_aa0.8_Nylon_Superdraft_Print.inst.cfg | 27 +++++++ .../um3_aa0.8_Nylon_Verydraft_Print.inst.cfg | 27 +++++++ .../um3_aa0.8_PLA_Draft_Print.inst.cfg | 34 +++++++++ .../um3_aa0.8_PLA_Superdraft_Print.inst.cfg | 35 +++++++++ .../um3_aa0.8_PLA_Verydraft_Print.inst.cfg | 35 +++++++++ .../um3_bb0.8_PVA_Draft_Print.inst.cfg | 14 ++++ .../um3_bb0.8_PVA_Superdraft_Print.inst.cfg | 14 ++++ .../um3_bb0.8_PVA_Verydraft_Print.inst.cfg | 14 ++++ resources/variants/ultimaker3_aa0.8.inst.cfg | 64 ++++++++++++++++ resources/variants/ultimaker3_bb0.8.inst.cfg | 74 +++++++++++++++++++ .../ultimaker3_extended_aa0.8.inst.cfg | 64 ++++++++++++++++ .../ultimaker3_extended_bb0.8.inst.cfg | 74 +++++++++++++++++++ 13 files changed, 502 insertions(+) create mode 100644 resources/quality/ultimaker3/um3_aa0.8_Nylon_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_aa0.8_Nylon_Superdraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_aa0.8_Nylon_Verydraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_aa0.8_PLA_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_aa0.8_PLA_Superdraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_aa0.8_PLA_Verydraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_bb0.8_PVA_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_bb0.8_PVA_Superdraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_bb0.8_PVA_Verydraft_Print.inst.cfg create mode 100644 resources/variants/ultimaker3_aa0.8.inst.cfg create mode 100644 resources/variants/ultimaker3_bb0.8.inst.cfg create mode 100644 resources/variants/ultimaker3_extended_aa0.8.inst.cfg create mode 100644 resources/variants/ultimaker3_extended_bb0.8.inst.cfg diff --git a/resources/quality/ultimaker3/um3_aa0.8_Nylon_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_Nylon_Draft_Print.inst.cfg new file mode 100644 index 0000000000..eb69e804c0 --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.8_Nylon_Draft_Print.inst.cfg @@ -0,0 +1,26 @@ +[general] +version = 2 +name = Draft Print +definition = ultimaker3 + +[metadata] +type = quality +quality_type = draft +material = generic_nylon_ultimaker3_AA_0.8 +weight = -2 + +[values] +brim_width = 8.0 +cool_fan_full_at_height = =layer_height_0 + 4 * layer_height +cool_min_layer_time_fan_speed_max = 20 +infill_before_walls = True +infill_pattern = triangles +machine_nozzle_cool_down_speed = 0.9 +material_standby_temperature = 100 +raft_airgap = =round(layer_height_0 * 0.85, 2) +raft_interface_thickness = =round(machine_nozzle_size * 0.3 / 0.4, 2) +raft_surface_thickness = =round(machine_nozzle_size * 0.2 / 0.4, 2) +switch_extruder_retraction_amount = 30 +switch_extruder_retraction_speeds = 40 +wall_line_width_x = =wall_line_width + diff --git a/resources/quality/ultimaker3/um3_aa0.8_Nylon_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_Nylon_Superdraft_Print.inst.cfg new file mode 100644 index 0000000000..4a226996b3 --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.8_Nylon_Superdraft_Print.inst.cfg @@ -0,0 +1,27 @@ +[general] +version = 2 +name = Superdraft Print +definition = ultimaker3 + +[metadata] +type = quality +quality_type = superdraft +material = generic_nylon_ultimaker3_AA_0.8 +weight = -2 + +[values] +brim_width = 8.0 +cool_fan_full_at_height = =layer_height_0 + 4 * layer_height +cool_min_layer_time_fan_speed_max = 20 +infill_before_walls = True +infill_pattern = triangles +layer_height = 0.4 +machine_nozzle_cool_down_speed = 0.9 +material_standby_temperature = 100 +raft_airgap = =round(layer_height_0 * 0.85, 2) +raft_interface_thickness = =round(machine_nozzle_size * 0.3 / 0.4, 2) +raft_surface_thickness = =round(machine_nozzle_size * 0.2 / 0.4, 2) +switch_extruder_retraction_amount = 30 +switch_extruder_retraction_speeds = 40 +wall_line_width_x = =wall_line_width + diff --git a/resources/quality/ultimaker3/um3_aa0.8_Nylon_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_Nylon_Verydraft_Print.inst.cfg new file mode 100644 index 0000000000..444aac8eda --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.8_Nylon_Verydraft_Print.inst.cfg @@ -0,0 +1,27 @@ +[general] +version = 2 +name = Verydraft Print +definition = ultimaker3 + +[metadata] +type = quality +quality_type = verydraft +material = generic_nylon_ultimaker3_AA_0.8 +weight = -2 + +[values] +brim_width = 8.0 +cool_fan_full_at_height = =layer_height_0 + 4 * layer_height +cool_min_layer_time_fan_speed_max = 20 +infill_before_walls = True +infill_pattern = triangles +layer_height = 0.3 +machine_nozzle_cool_down_speed = 0.9 +material_standby_temperature = 100 +raft_airgap = =round(layer_height_0 * 0.85, 2) +raft_interface_thickness = =round(machine_nozzle_size * 0.3 / 0.4, 2) +raft_surface_thickness = =round(machine_nozzle_size * 0.2 / 0.4, 2) +switch_extruder_retraction_amount = 30 +switch_extruder_retraction_speeds = 40 +wall_line_width_x = =wall_line_width + diff --git a/resources/quality/ultimaker3/um3_aa0.8_PLA_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PLA_Draft_Print.inst.cfg new file mode 100644 index 0000000000..74f7f47a4d --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.8_PLA_Draft_Print.inst.cfg @@ -0,0 +1,34 @@ +[general] +version = 2 +name = Draft Print +definition = ultimaker3 + +[metadata] +type = quality +quality_type = draft +material = generic_pla_ultimaker3_AA_0.8 +weight = 0 + +[values] +brim_line_count = =math.ceil(brim_width / skirt_brim_line_width) +cool_fan_speed_max = =cool_fan_speed +cool_min_speed = 2 +gradual_infill_step_height = =3 * layer_height +gradual_infill_steps = 4 +infill_line_width = =round(line_width * 0.535 / 0.75, 2) +infill_sparse_density = 80 +line_width = =machine_nozzle_size * 0.9375 +machine_nozzle_heat_up_speed = 1.6 +material_final_print_temperature = =max(-273.15, material_print_temperature - 15) +material_initial_print_temperature = =max(-273.15, material_print_temperature - 10) +material_print_temperature = =default_material_print_temperature + 10 +material_standby_temperature = 100 +ooze_shield_angle = 60 +raft_acceleration = =acceleration_print +raft_jerk = =jerk_print +raft_margin = 15 +switch_extruder_prime_speed = =switch_extruder_retraction_speeds +top_bottom_thickness = =layer_height * 4 +wall_line_width = =round(line_width * 0.75 / 0.75, 2) +wall_thickness = =wall_line_width_0 + wall_line_width_x + diff --git a/resources/quality/ultimaker3/um3_aa0.8_PLA_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PLA_Superdraft_Print.inst.cfg new file mode 100644 index 0000000000..4702d382c7 --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.8_PLA_Superdraft_Print.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 2 +name = Superdraft Print +definition = ultimaker3 + +[metadata] +type = quality +quality_type = superdraft +material = generic_pla_ultimaker3_AA_0.8 +weight = 1 + +[values] +brim_line_count = =math.ceil(brim_width / skirt_brim_line_width) +cool_fan_speed_max = =cool_fan_speed +cool_min_speed = 2 +gradual_infill_step_height = =3 * layer_height +gradual_infill_steps = 4 +infill_line_width = =round(line_width * 0.535 / 0.75, 2) +infill_sparse_density = 80 +layer_height = 0.4 +line_width = =machine_nozzle_size * 0.9375 +machine_nozzle_heat_up_speed = 1.6 +material_final_print_temperature = =max(-273.15, material_print_temperature - 15) +material_initial_print_temperature = =max(-273.15, material_print_temperature - 10) +material_print_temperature = =default_material_print_temperature + 15 +material_standby_temperature = 100 +ooze_shield_angle = 60 +raft_acceleration = =acceleration_print +raft_jerk = =jerk_print +raft_margin = 15 +switch_extruder_prime_speed = =switch_extruder_retraction_speeds +top_bottom_thickness = =layer_height * 4 +wall_line_width = =round(line_width * 0.75 / 0.75, 2) +wall_thickness = =wall_line_width_0 + wall_line_width_x + diff --git a/resources/quality/ultimaker3/um3_aa0.8_PLA_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PLA_Verydraft_Print.inst.cfg new file mode 100644 index 0000000000..174882aa68 --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.8_PLA_Verydraft_Print.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 2 +name = Verydraft Print +definition = ultimaker3 + +[metadata] +type = quality +quality_type = verydraft +material = generic_pla_ultimaker3_AA_0.8 +weight = 1 + +[values] +brim_line_count = =math.ceil(brim_width / skirt_brim_line_width) +cool_fan_speed_max = =cool_fan_speed +cool_min_speed = 2 +gradual_infill_step_height = =3 * layer_height +gradual_infill_steps = 4 +infill_line_width = =round(line_width * 0.535 / 0.75, 2) +infill_sparse_density = 80 +layer_height = 0.3 +line_width = =machine_nozzle_size * 0.9375 +machine_nozzle_heat_up_speed = 1.6 +material_final_print_temperature = =max(-273.15, material_print_temperature - 15) +material_initial_print_temperature = =max(-273.15, material_print_temperature - 10) +material_print_temperature = =default_material_print_temperature + 10 +material_standby_temperature = 100 +ooze_shield_angle = 60 +raft_acceleration = =acceleration_print +raft_jerk = =jerk_print +raft_margin = 15 +switch_extruder_prime_speed = =switch_extruder_retraction_speeds +top_bottom_thickness = =layer_height * 4 +wall_line_width = =round(line_width * 0.75 / 0.75, 2) +wall_thickness = =wall_line_width_0 + wall_line_width_x + diff --git a/resources/quality/ultimaker3/um3_bb0.8_PVA_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PVA_Draft_Print.inst.cfg new file mode 100644 index 0000000000..c02e307b47 --- /dev/null +++ b/resources/quality/ultimaker3/um3_bb0.8_PVA_Draft_Print.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 2 +name = Draft Print +definition = ultimaker3 + +[metadata] +type = quality +quality_type = draft +weight = -2 +material = generic_pva_ultimaker3_BB_0.8 + +[values] +material_print_temperature = =default_material_print_temperature + 5 + diff --git a/resources/quality/ultimaker3/um3_bb0.8_PVA_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PVA_Superdraft_Print.inst.cfg new file mode 100644 index 0000000000..84075aa4b9 --- /dev/null +++ b/resources/quality/ultimaker3/um3_bb0.8_PVA_Superdraft_Print.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 2 +name = Superdraft Print +definition = ultimaker3 + +[metadata] +type = quality +quality_type = superdraft +weight = -2 +material = generic_pva_ultimaker3_BB_0.8 + +[values] +layer_height = 0.4 + diff --git a/resources/quality/ultimaker3/um3_bb0.8_PVA_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PVA_Verydraft_Print.inst.cfg new file mode 100644 index 0000000000..db10f3d848 --- /dev/null +++ b/resources/quality/ultimaker3/um3_bb0.8_PVA_Verydraft_Print.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 2 +name = Verydraft Print +definition = ultimaker3 + +[metadata] +type = quality +quality_type = verydraft +weight = -2 +material = generic_pva_ultimaker3_BB_0.8 + +[values] +layer_height = 0.3 + diff --git a/resources/variants/ultimaker3_aa0.8.inst.cfg b/resources/variants/ultimaker3_aa0.8.inst.cfg new file mode 100644 index 0000000000..c73e22db20 --- /dev/null +++ b/resources/variants/ultimaker3_aa0.8.inst.cfg @@ -0,0 +1,64 @@ +[general] +name = AA 0.8 +version = 2 +definition = ultimaker3 + +[metadata] +author = ultimaker +type = variant + +[values] +acceleration_enabled = True +acceleration_print = 4000 +brim_line_count = 7 +brim_width = 7 +cool_fan_full_at_height = =layer_height_0 + 2 * layer_height +cool_fan_speed = 100 +cool_fan_speed_max = 100 +default_material_print_temperature = 200 +infill_before_walls = False +infill_overlap = 0 +infill_pattern = cubic +infill_wipe_dist = 0 +jerk_enabled = True +jerk_print = 25 +jerk_topbottom = =math.ceil(jerk_print * 25 / 25) +jerk_wall = =math.ceil(jerk_print * 25 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 25 / 25) +layer_height = 0.2 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_size = 0.8 +material_final_print_temperature = =material_print_temperature - 10 +material_initial_print_temperature = =material_print_temperature - 5 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +ooze_shield_angle = 40 +raft_acceleration = =acceleration_layer_0 +raft_margin = 10 +retract_at_layer_change = True +retraction_count_max = 25 +retraction_extrusion_window = 1 +retraction_hop = 2 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +skin_overlap = 5 +speed_equalize_flow_enabled = True +speed_layer_0 = 20 +speed_print = 35 +speed_topbottom = =math.ceil(speed_print * 25 / 35) +speed_wall_0 = =math.ceil(speed_wall * 25 / 30) +support_angle = 70 +support_bottom_distance = =support_z_distance / 2 +support_line_width = =line_width * 0.75 +support_top_distance = =support_z_distance +support_xy_distance = =wall_line_width_0 * 1.5 +support_z_distance = =layer_height * 2 +switch_extruder_prime_speed = 30 +switch_extruder_retraction_amount = 16.5 +top_bottom_thickness = 1.4 +travel_avoid_distance = 3 +wall_0_inset = 0 +wall_line_width_x = =round(wall_line_width * 0.625 / 0.75, 2) +wall_thickness = 2 + diff --git a/resources/variants/ultimaker3_bb0.8.inst.cfg b/resources/variants/ultimaker3_bb0.8.inst.cfg new file mode 100644 index 0000000000..a88c3ef6b7 --- /dev/null +++ b/resources/variants/ultimaker3_bb0.8.inst.cfg @@ -0,0 +1,74 @@ +[general] +name = BB 0.8 +version = 2 +definition = ultimaker3 + +[metadata] +author = ultimaker +type = variant + +[values] +acceleration_enabled = True +acceleration_print = 4000 +acceleration_support_interface = =math.ceil(acceleration_topbottom * 100 / 500) +brim_width = 3 +cool_fan_speed = 50 +cool_min_speed = 5 +infill_line_width = =round(line_width * 0.8 / 0.7, 2) +infill_overlap = 0 +infill_pattern = triangles +infill_wipe_dist = 0 +jerk_enabled = True +jerk_print = 25 +jerk_support_interface = =math.ceil(jerk_topbottom * 1 / 5) +layer_height = 0.2 +machine_min_cool_heat_time_window = 15 +machine_nozzle_heat_up_speed = 1.5 +machine_nozzle_size = 0.8 +material_print_temperature = =default_material_print_temperature + 10 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +raft_acceleration = =acceleration_layer_0 +raft_airgap = 0 +raft_base_speed = 20 +raft_base_thickness = 0.3 +raft_interface_line_spacing = 0.5 +raft_interface_line_width = 0.5 +raft_interface_speed = 20 +raft_interface_thickness = 0.2 +raft_margin = 10 +raft_speed = 25 +raft_surface_layers = 1 +retraction_amount = 4.5 +retraction_count_max = 15 +retraction_hop = 2 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 5 +retraction_prime_speed = 15 +skin_overlap = 5 +speed_layer_0 = 20 +speed_print = 35 +speed_support_interface = =math.ceil(speed_topbottom * 15 / 20) +speed_wall_0 = =math.ceil(speed_wall * 25 / 30) +support_angle = 60 +support_bottom_height = =layer_height * 2 +support_bottom_stair_step_height = =layer_height +support_infill_rate = 25 +support_interface_enable = True +support_interface_height = =layer_height * 5 +support_join_distance = 3 +support_line_width = =round(line_width * 0.4 / 0.35, 2) +support_offset = 1.5 +support_pattern = triangles +support_use_towers = False +support_xy_distance = =wall_line_width_0 / 2 +support_xy_distance_overhang = =wall_line_width_0 / 4 +support_z_distance = 0 +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 12 +top_bottom_thickness = 1 +travel_avoid_distance = 3 +wall_0_inset = 0 +wall_thickness = 1 + diff --git a/resources/variants/ultimaker3_extended_aa0.8.inst.cfg b/resources/variants/ultimaker3_extended_aa0.8.inst.cfg new file mode 100644 index 0000000000..98860889b3 --- /dev/null +++ b/resources/variants/ultimaker3_extended_aa0.8.inst.cfg @@ -0,0 +1,64 @@ +[general] +name = AA 0.8 +version = 2 +definition = ultimaker3_extended + +[metadata] +author = ultimaker +type = variant + +[values] +acceleration_enabled = True +acceleration_print = 4000 +brim_line_count = 7 +brim_width = 7 +cool_fan_full_at_height = =layer_height_0 + 2 * layer_height +cool_fan_speed = 100 +cool_fan_speed_max = 100 +default_material_print_temperature = 200 +infill_before_walls = False +infill_overlap = 0 +infill_pattern = cubic +infill_wipe_dist = 0 +jerk_enabled = True +jerk_print = 25 +jerk_topbottom = =math.ceil(jerk_print * 25 / 25) +jerk_wall = =math.ceil(jerk_print * 25 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 25 / 25) +layer_height = 0.2 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_size = 0.8 +material_final_print_temperature = =material_print_temperature - 10 +material_initial_print_temperature = =material_print_temperature - 5 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +ooze_shield_angle = 40 +raft_acceleration = =acceleration_layer_0 +raft_margin = 10 +retract_at_layer_change = True +retraction_count_max = 25 +retraction_extrusion_window = 1 +retraction_hop = 2 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +skin_overlap = 5 +speed_equalize_flow_enabled = True +speed_layer_0 = 20 +speed_print = 35 +speed_topbottom = =math.ceil(speed_print * 25 / 35) +speed_wall_0 = =math.ceil(speed_wall * 25 / 30) +support_angle = 70 +support_bottom_distance = =support_z_distance / 2 +support_line_width = =line_width * 0.75 +support_top_distance = =support_z_distance +support_xy_distance = =wall_line_width_0 * 1.5 +support_z_distance = =layer_height * 2 +switch_extruder_prime_speed = 30 +switch_extruder_retraction_amount = 16.5 +top_bottom_thickness = 1.4 +travel_avoid_distance = 3 +wall_0_inset = 0 +wall_line_width_x = =round(wall_line_width * 0.625 / 0.75, 2) +wall_thickness = 2 + diff --git a/resources/variants/ultimaker3_extended_bb0.8.inst.cfg b/resources/variants/ultimaker3_extended_bb0.8.inst.cfg new file mode 100644 index 0000000000..ea12c850ef --- /dev/null +++ b/resources/variants/ultimaker3_extended_bb0.8.inst.cfg @@ -0,0 +1,74 @@ +[general] +name = BB 0.8 +version = 2 +definition = ultimaker3_extended + +[metadata] +author = ultimaker +type = variant + +[values] +acceleration_enabled = True +acceleration_print = 4000 +acceleration_support_interface = =math.ceil(acceleration_topbottom * 100 / 500) +brim_width = 3 +cool_fan_speed = 50 +cool_min_speed = 5 +infill_line_width = =round(line_width * 0.8 / 0.7, 2) +infill_overlap = 0 +infill_pattern = triangles +infill_wipe_dist = 0 +jerk_enabled = True +jerk_print = 25 +jerk_support_interface = =math.ceil(jerk_topbottom * 1 / 5) +layer_height = 0.2 +machine_min_cool_heat_time_window = 15 +machine_nozzle_heat_up_speed = 1.5 +machine_nozzle_size = 0.8 +material_print_temperature = =default_material_print_temperature + 10 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +raft_acceleration = =acceleration_layer_0 +raft_airgap = 0 +raft_base_speed = 20 +raft_base_thickness = 0.3 +raft_interface_line_spacing = 0.5 +raft_interface_line_width = 0.5 +raft_interface_speed = 20 +raft_interface_thickness = 0.2 +raft_margin = 10 +raft_speed = 25 +raft_surface_layers = 1 +retraction_amount = 4.5 +retraction_count_max = 15 +retraction_hop = 2 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 5 +retraction_prime_speed = 15 +skin_overlap = 5 +speed_layer_0 = 20 +speed_print = 35 +speed_support_interface = =math.ceil(speed_topbottom * 15 / 20) +speed_wall_0 = =math.ceil(speed_wall * 25 / 30) +support_angle = 60 +support_bottom_height = =layer_height * 2 +support_bottom_stair_step_height = =layer_height +support_infill_rate = 25 +support_interface_enable = True +support_interface_height = =layer_height * 5 +support_join_distance = 3 +support_line_width = =round(line_width * 0.4 / 0.35, 2) +support_offset = 1.5 +support_pattern = triangles +support_use_towers = False +support_xy_distance = =wall_line_width_0 / 2 +support_xy_distance_overhang = =wall_line_width_0 / 4 +support_z_distance = 0 +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 12 +top_bottom_thickness = 1 +travel_avoid_distance = 3 +wall_0_inset = 0 +wall_thickness = 1 + From c9d223acd46f982e1e5dc91d31e9f102ea5908e2 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 10 Mar 2017 10:55:19 +0100 Subject: [PATCH 143/146] CURA-3452 Save spool cost and weight upon change --- resources/qml/Preferences/MaterialView.qml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/resources/qml/Preferences/MaterialView.qml b/resources/qml/Preferences/MaterialView.qml index 17f76466ab..ba36674b40 100644 --- a/resources/qml/Preferences/MaterialView.qml +++ b/resources/qml/Preferences/MaterialView.qml @@ -155,8 +155,10 @@ TabView decimals: 2 maximumValue: 1000 - onEditingFinished: base.setMaterialPreferenceValue(properties.guid, "spool_cost", parseFloat(value)) - onValueChanged: updateCostPerMeter() + onValueChanged: { + base.setMaterialPreferenceValue(properties.guid, "spool_cost", parseFloat(value)) + updateCostPerMeter() + } } Label { width: base.firstColumnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Filament weight") } @@ -170,8 +172,10 @@ TabView decimals: 0 maximumValue: 10000 - onEditingFinished: base.setMaterialPreferenceValue(properties.guid, "spool_weight", parseFloat(value)) - onValueChanged: updateCostPerMeter() + onValueChanged: { + base.setMaterialPreferenceValue(properties.guid, "spool_weight", parseFloat(value)) + updateCostPerMeter() + } } Label { width: base.firstColumnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Filament length") } From d93b137c954530fc14c6648ca7bb754b26afce21 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 10 Mar 2017 15:48:29 +0100 Subject: [PATCH 144/146] No longer add nodes that don't have children or MeshData CURA-3493 --- plugins/3MFReader/ThreeMFReader.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index 38e7130070..2aa6fb27d3 100644 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -92,7 +92,12 @@ class ThreeMFReader(MeshReader): um_node.setMeshData(mesh_data) for child in savitar_node.getChildren(): - um_node.addChild(self._convertSavitarNodeToUMNode(child)) + child_node = self._convertSavitarNodeToUMNode(child) + if child_node: + um_node.addChild(child_node) + + if um_node.getMeshData() is None and len(um_node.getChildren()) == 0: + return None settings = savitar_node.getSettings() @@ -152,6 +157,8 @@ class ThreeMFReader(MeshReader): self._unit = scene_3mf.getUnit() for node in scene_3mf.getSceneNodes(): um_node = self._convertSavitarNodeToUMNode(node) + if um_node is None: + continue # compensate for original center position, if object(s) is/are not around its zero position transform_matrix = Matrix() From b03ac3ea784b30ef18cec0f6cf2a559bd7535b1a Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 10 Mar 2017 15:59:47 +0100 Subject: [PATCH 145/146] JSON fix: skin angle for expansion is max angle; better description (CURA-3440) --- resources/definitions/fdmprinter.def.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 3c9a946eef..f25899a065 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1318,10 +1318,10 @@ "enabled": "expand_upper_skins or expand_lower_skins", "settable_per_mesh": true }, - "min_skin_angle_for_expansion": + "max_skin_angle_for_expansion": { - "label": "Minimum Skin Angle for Expansion", - "description": "Top and or bottom surfaces of your object with an angle larger than this setting, won't have their top/bottom skin expanded. This avoids expanding the narrow skin areas that are created when the model surface has a near vertical slope.", + "label": "Maximum Skin Angle for Expansion", + "description": "Top and or bottom surfaces of your object with an angle larger than this setting, won't have their top/bottom skin expanded. This avoids expanding the narrow skin areas that are created when the model surface has a near vertical slope. An angle of 0° is horizontal, while an angle of 90° is vertical.", "unit": "°", "type": "float", "minimum_value": "0", From 5e782ae85b0636f1b168aa885a0c059716bab0db Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 10 Mar 2017 16:03:23 +0100 Subject: [PATCH 146/146] fix: type fix for last commit (CURA-3440) --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index f25899a065..d03f4327f6 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1340,7 +1340,7 @@ "unit": "mm", "type": "float", "default_value": 2.24, - "value": "top_layers * layer_height / math.tan(math.radians(min_skin_angle_for_expansion))", + "value": "top_layers * layer_height / math.tan(math.radians(max_skin_angle_for_expansion))", "minimum_value": "0", "enabled": "expand_upper_skins or expand_lower_skins", "settable_per_mesh": true