From d1c79a3af20acb530379510a48f0b6fb7c5dec3d Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Apr 2020 10:53:43 +0200 Subject: [PATCH 01/11] Mark models that are outside the buildarea in the objectlist --- resources/qml/ObjectItemButton.qml | 1 + resources/qml/ObjectSelector.qml | 1 + 2 files changed, 2 insertions(+) diff --git a/resources/qml/ObjectItemButton.qml b/resources/qml/ObjectItemButton.qml index b454fd929a..d4cc88d535 100644 --- a/resources/qml/ObjectItemButton.qml +++ b/resources/qml/ObjectItemButton.qml @@ -35,6 +35,7 @@ Button text: objectItemButton.text font: UM.Theme.getFont("default") color: UM.Theme.getColor("text_scene") + opacity: (outsideBuildArea) ? 0.5 : 1.0 visible: text != "" renderType: Text.NativeRendering verticalAlignment: Text.AlignVCenter diff --git a/resources/qml/ObjectSelector.qml b/resources/qml/ObjectSelector.qml index 6757863e1c..2b589b4b19 100644 --- a/resources/qml/ObjectSelector.qml +++ b/resources/qml/ObjectSelector.qml @@ -120,6 +120,7 @@ Item } text: model.name width: listView.width + property bool outsideBuildArea: model.outside_build_area } } } From bba07d01fb5f8a7357274be048f95f0c0fbdbd6a Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 10 Apr 2020 19:13:36 +0200 Subject: [PATCH 02/11] Show mesh type and number of per model settings in ObjectSelector --- cura/UI/ObjectsModel.py | 19 ++++++++ resources/qml/ObjectItemButton.qml | 73 +++++++++++++++++++++++++++++- resources/qml/ObjectSelector.qml | 2 + 3 files changed, 92 insertions(+), 2 deletions(-) diff --git a/cura/UI/ObjectsModel.py b/cura/UI/ObjectsModel.py index 5526b41098..87efcf2e27 100644 --- a/cura/UI/ObjectsModel.py +++ b/cura/UI/ObjectsModel.py @@ -38,6 +38,8 @@ class ObjectsModel(ListModel): OutsideAreaRole = Qt.UserRole + 3 BuilplateNumberRole = Qt.UserRole + 4 NodeRole = Qt.UserRole + 5 + PerObjectSettingsCountRole = Qt.UserRole + 6 + MeshTypeRole = Qt.UserRole + 7 def __init__(self, parent = None) -> None: super().__init__(parent) @@ -46,6 +48,8 @@ class ObjectsModel(ListModel): self.addRoleName(self.SelectedRole, "selected") self.addRoleName(self.OutsideAreaRole, "outside_build_area") self.addRoleName(self.BuilplateNumberRole, "buildplate_number") + self.addRoleName(self.PerObjectSettingsCountRole, "per_object_settings_count") + self.addRoleName(self.MeshTypeRole, "mesh_type") self.addRoleName(self.NodeRole, "node") Application.getInstance().getController().getScene().sceneChanged.connect(self._updateSceneDelayed) @@ -172,11 +176,26 @@ class ObjectsModel(ListModel): node_build_plate_number = node.callDecoration("getBuildPlateNumber") + node_mesh_type = "" + per_object_settings_count = 0 + + per_object_stack = node.callDecoration("getStack") + if per_object_stack: + per_object_settings_count = per_object_stack.getTop().getNumInstances() + + for mesh_type in ["anti_overhang_mesh", "infill_mesh", "cutting_mesh", "support_mesh"]: + if per_object_stack.getProperty(mesh_type, "value"): + node_mesh_type = mesh_type + per_object_settings_count -= 1 # do not count this mesh type setting + break + nodes.append({ "name": node.getName(), "selected": Selection.isSelected(node), "outside_build_area": is_outside_build_area, "buildplate_number": node_build_plate_number, + "per_object_settings_count": per_object_settings_count, + "mesh_type": node_mesh_type, "node": node }) diff --git a/resources/qml/ObjectItemButton.qml b/resources/qml/ObjectItemButton.qml index d4cc88d535..925c2128e7 100644 --- a/resources/qml/ObjectItemButton.qml +++ b/resources/qml/ObjectItemButton.qml @@ -14,7 +14,7 @@ Button width: parent.width height: UM.Theme.getSize("action_button").height leftPadding: UM.Theme.getSize("thin_margin").width - rightPadding: UM.Theme.getSize("thin_margin").width + rightPadding: UM.Theme.getSize("default_lining").width checkable: true hoverEnabled: true @@ -29,7 +29,7 @@ Button anchors { left: parent.left - right: parent.right + right: perObjectSettingsInfo.left verticalCenter: parent.verticalCenter } text: objectItemButton.text @@ -41,6 +41,75 @@ Button verticalAlignment: Text.AlignVCenter elide: Text.ElideRight } + + Button + { + id: perObjectSettingsInfo + + anchors + { + right: parent.right + rightMargin: 0 + } + width: childrenRect.width + height: parent.height + padding: 0 + leftPadding: UM.Theme.getSize("thin_margin").width + + onClicked: + { + Cura.SceneController.changeSelection(index) + UM.Controller.setActiveTool("PerObjectSettingsTool") + } + + contentItem: Item + { + height: parent.height + width: childrenRect.width + + Cura.NotificationIcon + { + id: perObjectSettingsCountLabel + anchors + { + right: parent.right + rightMargin: 0 + } + visible: perObjectSettingsCount > 0 + color: UM.Theme.getColor("text_scene") + labelText: perObjectSettingsCount.toString() + } + + UM.RecolorImage + { + anchors + { + right: perObjectSettingsCountLabel.left + rightMargin: UM.Theme.getSize("narrow_margin").width + } + + width: parent.height + height: parent.height + color: UM.Theme.getColor("text_scene") + visible: meshType != "" + source: + { + switch (meshType) { + case "support_mesh": + return UM.Theme.getIcon("pos_print_as_support") + case "cutting_mesh": + case "infill_mesh": + return UM.Theme.getIcon("pos_modify_overlaps") + case "anti_overhang_mesh": + return UM.Theme.getIcon("pos_modify_dont_support_overlap") + } + return ""; + } + } + } + + background: Item {} + } } background: Rectangle diff --git a/resources/qml/ObjectSelector.qml b/resources/qml/ObjectSelector.qml index 2b589b4b19..0b8d168a79 100644 --- a/resources/qml/ObjectSelector.qml +++ b/resources/qml/ObjectSelector.qml @@ -121,6 +121,8 @@ Item text: model.name width: listView.width property bool outsideBuildArea: model.outside_build_area + property int perObjectSettingsCount: model.per_object_settings_count + property string meshType: model.mesh_type } } } From 2eeabec317f4e3934f4b8b546e9d730841a07992 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sat, 11 Apr 2020 20:39:21 +0200 Subject: [PATCH 03/11] Show support extruder for support meshes --- cura/Settings/SettingOverrideDecorator.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cura/Settings/SettingOverrideDecorator.py b/cura/Settings/SettingOverrideDecorator.py index 2fa5234ec3..03b4c181dd 100644 --- a/cura/Settings/SettingOverrideDecorator.py +++ b/cura/Settings/SettingOverrideDecorator.py @@ -94,6 +94,12 @@ class SettingOverrideDecorator(SceneNodeDecorator): # # \return An extruder's position, or None if no position info is available. def getActiveExtruderPosition(self): + # for support_meshes, always use the support_extruder + if self.getStack().getProperty("support_mesh", "value"): + global_container_stack = Application.getInstance().getGlobalContainerStack() + if global_container_stack: + return str(global_container_stack.getProperty("support_extruder_nr", "value")) + containers = ContainerRegistry.getInstance().findContainers(id = self.getActiveExtruder()) if containers: container_stack = containers[0] From e13a0bca4a63034c01a3e8e82819e25bf1becd24 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sat, 11 Apr 2020 20:48:06 +0200 Subject: [PATCH 04/11] Add extruder swatches to object selector --- cura/UI/ObjectsModel.py | 8 ++++++++ resources/qml/ObjectItemButton.qml | 17 +++++++++++++++-- resources/qml/ObjectSelector.qml | 21 +++++++++++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/cura/UI/ObjectsModel.py b/cura/UI/ObjectsModel.py index 87efcf2e27..dd5d556176 100644 --- a/cura/UI/ObjectsModel.py +++ b/cura/UI/ObjectsModel.py @@ -40,6 +40,7 @@ class ObjectsModel(ListModel): NodeRole = Qt.UserRole + 5 PerObjectSettingsCountRole = Qt.UserRole + 6 MeshTypeRole = Qt.UserRole + 7 + ExtruderNumberRole = Qt.UserRole + 8 def __init__(self, parent = None) -> None: super().__init__(parent) @@ -48,6 +49,7 @@ class ObjectsModel(ListModel): self.addRoleName(self.SelectedRole, "selected") self.addRoleName(self.OutsideAreaRole, "outside_build_area") self.addRoleName(self.BuilplateNumberRole, "buildplate_number") + self.addRoleName(self.ExtruderNumberRole, "extruder_number") self.addRoleName(self.PerObjectSettingsCountRole, "per_object_settings_count") self.addRoleName(self.MeshTypeRole, "mesh_type") self.addRoleName(self.NodeRole, "node") @@ -189,11 +191,17 @@ class ObjectsModel(ListModel): per_object_settings_count -= 1 # do not count this mesh type setting break + extruder_number = int(node.callDecoration("getActiveExtruderPosition")) + if node_mesh_type == "anti_overhang_mesh": + # for anti overhang meshes, the extruder nr is irrelevant + extruder_number = -1 + nodes.append({ "name": node.getName(), "selected": Selection.isSelected(node), "outside_build_area": is_outside_build_area, "buildplate_number": node_build_plate_number, + "extruder_number": extruder_number, "per_object_settings_count": per_object_settings_count, "mesh_type": node_mesh_type, "node": node diff --git a/resources/qml/ObjectItemButton.qml b/resources/qml/ObjectItemButton.qml index 925c2128e7..aef862ac7f 100644 --- a/resources/qml/ObjectItemButton.qml +++ b/resources/qml/ObjectItemButton.qml @@ -23,13 +23,26 @@ Button width: objectItemButton.width - objectItemButton.leftPadding height: UM.Theme.getSize("action_button").height + UM.RecolorImage + { + id: swatch + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + width: height + height: parent.height - UM.Theme.getSize("narrow_margin").height + source: UM.Theme.getIcon("extruder_button") + color: extruderColor + visible: showExtruderSwatches && extruderColor != "" + } + Label { id: buttonText anchors { - left: parent.left - right: perObjectSettingsInfo.left + left: showExtruderSwatches ? swatch.right : parent.left + leftMargin: showExtruderSwatches ? UM.Theme.getSize("narrow_margin").width : 0 + right: perObjectSettingsInfo.visible ? perObjectSettingsInfo.left : parent.right verticalCenter: parent.verticalCenter } text: objectItemButton.text diff --git a/resources/qml/ObjectSelector.qml b/resources/qml/ObjectSelector.qml index 0b8d168a79..b004095f74 100644 --- a/resources/qml/ObjectSelector.qml +++ b/resources/qml/ObjectSelector.qml @@ -87,6 +87,17 @@ Item anchors.bottom: parent.bottom + property var extrudersModel: CuraApplication.getExtrudersModel() + UM.SettingPropertyProvider + { + id: machineExtruderCount + + containerStack: Cura.MachineManager.activeMachine + key: "machine_extruder_count" + watchedProperties: [ "value" ] + storeIndex: 0 + } + ListView { id: listView @@ -123,6 +134,16 @@ Item property bool outsideBuildArea: model.outside_build_area property int perObjectSettingsCount: model.per_object_settings_count property string meshType: model.mesh_type + property int extruderNumber: model.extruder_number + property string extruderColor: + { + if (model.extruder_number == -1) + { + return ""; + } + return contents.extrudersModel.getItem(model.extruder_number).color; + } + property bool showExtruderSwatches: machineExtruderCount.properties.value > 1 } } } From ea805d9a026c62e82d98a09f4b8f076c93283392 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sat, 11 Apr 2020 20:55:35 +0200 Subject: [PATCH 05/11] Hide extruder swatch for groups --- cura/UI/ObjectsModel.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/UI/ObjectsModel.py b/cura/UI/ObjectsModel.py index dd5d556176..b4b1501ab7 100644 --- a/cura/UI/ObjectsModel.py +++ b/cura/UI/ObjectsModel.py @@ -192,8 +192,8 @@ class ObjectsModel(ListModel): break extruder_number = int(node.callDecoration("getActiveExtruderPosition")) - if node_mesh_type == "anti_overhang_mesh": - # for anti overhang meshes, the extruder nr is irrelevant + if node_mesh_type == "anti_overhang_mesh" or node.callDecoration("isGroup"): + # for anti overhang meshes and groups the extruder nr is irrelevant extruder_number = -1 nodes.append({ From a9ecec0d5ca728679cf1082e9e22f4f9e6c6a1b8 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 12 Apr 2020 09:20:46 +0200 Subject: [PATCH 06/11] Hide per object settings info when there is nothing to show --- resources/qml/ObjectItemButton.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/qml/ObjectItemButton.qml b/resources/qml/ObjectItemButton.qml index aef862ac7f..0cb63359d0 100644 --- a/resources/qml/ObjectItemButton.qml +++ b/resources/qml/ObjectItemButton.qml @@ -68,6 +68,7 @@ Button height: parent.height padding: 0 leftPadding: UM.Theme.getSize("thin_margin").width + visible: meshType != "" || perObjectSettingsCount > 0 onClicked: { From 4f0c24fecb19628faec2c58597d8a823bfc98ae5 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 12 Apr 2020 09:23:54 +0200 Subject: [PATCH 07/11] Reorder code for readability --- cura/UI/ObjectsModel.py | 2 +- resources/qml/ObjectItemButton.qml | 23 ++++++++++++----------- resources/qml/ObjectSelector.qml | 2 +- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/cura/UI/ObjectsModel.py b/cura/UI/ObjectsModel.py index b4b1501ab7..c87f1010a9 100644 --- a/cura/UI/ObjectsModel.py +++ b/cura/UI/ObjectsModel.py @@ -1,4 +1,4 @@ -# Copyright (c) 2019 Ultimaker B.V. +# Copyright (c) 2020 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from UM.Logger import Logger import re diff --git a/resources/qml/ObjectItemButton.qml b/resources/qml/ObjectItemButton.qml index 0cb63359d0..52f97ffe65 100644 --- a/resources/qml/ObjectItemButton.qml +++ b/resources/qml/ObjectItemButton.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2018 Ultimaker B.V. +// Copyright (c) 2020 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.10 @@ -18,6 +18,17 @@ Button checkable: true hoverEnabled: true + onClicked: Cura.SceneController.changeSelection(index) + + background: Rectangle + { + id: backgroundRect + color: objectItemButton.hovered ? UM.Theme.getColor("action_button_hovered") : "transparent" + radius: UM.Theme.getSize("action_button_radius").width + border.width: UM.Theme.getSize("default_lining").width + border.color: objectItemButton.checked ? UM.Theme.getColor("primary") : "transparent" + } + contentItem: Item { width: objectItemButton.width - objectItemButton.leftPadding @@ -126,15 +137,6 @@ Button } } - background: Rectangle - { - id: backgroundRect - color: objectItemButton.hovered ? UM.Theme.getColor("action_button_hovered") : "transparent" - radius: UM.Theme.getSize("action_button_radius").width - border.width: UM.Theme.getSize("default_lining").width - border.color: objectItemButton.checked ? UM.Theme.getColor("primary") : "transparent" - } - TextMetrics { id: buttonTextMetrics @@ -151,5 +153,4 @@ Button visible: objectItemButton.hovered && buttonTextMetrics.elidedText != buttonText.text } - onClicked: Cura.SceneController.changeSelection(index) } diff --git a/resources/qml/ObjectSelector.qml b/resources/qml/ObjectSelector.qml index b004095f74..15cb476e08 100644 --- a/resources/qml/ObjectSelector.qml +++ b/resources/qml/ObjectSelector.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2019 Ultimaker B.V. +// Copyright (c) 2020 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.10 From 0ed49310567aade4123106fad316b5a216b48a9d Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 12 Apr 2020 15:46:13 +0200 Subject: [PATCH 08/11] Add additional information to tooltips in object selector --- resources/qml/ObjectItemButton.qml | 54 ++++++++++++++++++++++++++---- 1 file changed, 47 insertions(+), 7 deletions(-) diff --git a/resources/qml/ObjectItemButton.qml b/resources/qml/ObjectItemButton.qml index 52f97ffe65..9244fa6391 100644 --- a/resources/qml/ObjectItemButton.qml +++ b/resources/qml/ObjectItemButton.qml @@ -14,7 +14,7 @@ Button width: parent.width height: UM.Theme.getSize("action_button").height leftPadding: UM.Theme.getSize("thin_margin").width - rightPadding: UM.Theme.getSize("default_lining").width + rightPadding: perObjectSettingsInfo.visible ? UM.Theme.getSize("default_lining").width : UM.Theme.getSize("thin_margin").width checkable: true hoverEnabled: true @@ -87,10 +87,44 @@ Button UM.Controller.setActiveTool("PerObjectSettingsTool") } + property string tooltipText: + { + var result = ""; + if (!visible) + { + return result; + } + if (meshType != "") + { + result += "
"; + switch (meshType) { + case "support_mesh": + result += catalog.i18nc("@label", "Is printed as support."); + break; + case "cutting_mesh": + result += catalog.i18nc("@label", "Other models overlapping with this model are modified."); + break; + case "infill_mesh": + result += catalog.i18nc("@label", "Infill overlapping with this model is modified."); + break; + case "anti_overhang_mesh": + result += catalog.i18nc("@label", "Overlaps with this model are not supported."); + break; + } + } + if (perObjectSettingsCount != "") + { + result += "
" + catalog.i18ncp( + "@label", "Overrides %1 setting.", "Overrides %1 settings.", perObjectSettingsCount + ).arg(perObjectSettingsCount); + } + return result; + } + contentItem: Item { height: parent.height - width: childrenRect.width + width: meshTypeIcon.width + perObjectSettingsCountLabel.width + UM.Theme.getSize("narrow_margin").width Cura.NotificationIcon { @@ -107,6 +141,7 @@ Button UM.RecolorImage { + id: meshTypeIcon anchors { right: perObjectSettingsCountLabel.left @@ -121,12 +156,12 @@ Button { switch (meshType) { case "support_mesh": - return UM.Theme.getIcon("pos_print_as_support") + return UM.Theme.getIcon("pos_print_as_support"); case "cutting_mesh": case "infill_mesh": - return UM.Theme.getIcon("pos_modify_overlaps") + return UM.Theme.getIcon("pos_modify_overlaps"); case "anti_overhang_mesh": - return UM.Theme.getIcon("pos_modify_dont_support_overlap") + return UM.Theme.getIcon("pos_modify_dont_support_overlap"); } return ""; } @@ -149,8 +184,13 @@ Button Cura.ToolTip { id: tooltip - tooltipText: objectItemButton.text - visible: objectItemButton.hovered && buttonTextMetrics.elidedText != buttonText.text + tooltipText: objectItemButton.text + perObjectSettingsInfo.tooltipText + visible: objectItemButton.hovered && (buttonTextMetrics.elidedText != buttonText.text || perObjectSettingsInfo.visible) } + UM.I18nCatalog + { + id: catalog + name: "cura" + } } From a3dea81d7da5a8b402fe613090e3ead7e10339a1 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 12 Apr 2020 16:11:52 +0200 Subject: [PATCH 09/11] Fix typing --- cura/UI/ObjectsModel.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cura/UI/ObjectsModel.py b/cura/UI/ObjectsModel.py index c87f1010a9..6a44e4ff5a 100644 --- a/cura/UI/ObjectsModel.py +++ b/cura/UI/ObjectsModel.py @@ -191,7 +191,11 @@ class ObjectsModel(ListModel): per_object_settings_count -= 1 # do not count this mesh type setting break - extruder_number = int(node.callDecoration("getActiveExtruderPosition")) + extruder_position = node.callDecoration("getActiveExtruderPosition") + if extruder_position is None: + extruder_number = -1 + else: + extruder_number = int(extruder_position) if node_mesh_type == "anti_overhang_mesh" or node.callDecoration("isGroup"): # for anti overhang meshes and groups the extruder nr is irrelevant extruder_number = -1 From 3e64ed155d80470aa7d24b2c727ad8464a73cdfa Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 13 Apr 2020 09:18:41 +0200 Subject: [PATCH 10/11] Fix tests for updated ObjectsModel Three roles were added to the ObjectsModel: "extruder_number", "per_object_settings_count" and "mesh_type" --- tests/TestObjectsModel.py | 73 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 68 insertions(+), 5 deletions(-) diff --git a/tests/TestObjectsModel.py b/tests/TestObjectsModel.py index caed4741bb..543334cea6 100644 --- a/tests/TestObjectsModel.py +++ b/tests/TestObjectsModel.py @@ -125,7 +125,16 @@ class Test_Update: application_with_mocked_scene.getController().getScene().getRoot = MagicMock(return_value = group_scene_node) with patch("UM.Application.Application.getInstance", MagicMock(return_value=application_with_mocked_scene)): objects_model._update() - assert objects_model.items == [{'name': 'Group #1', 'selected': False, 'outside_build_area': False, 'buildplate_number': None, 'node': group_scene_node}] + assert objects_model.items == [{ + 'name': 'Group #1', + 'selected': False, + 'outside_build_area': False, + 'buildplate_number': None, + 'node': group_scene_node, + "extruder_number": -1, + "per_object_settings_count": 0, + "mesh_type": "" + }] def test_updateWithNonGroup(self, objects_model, application_with_mocked_scene, slicable_scene_node): objects_model._shouldNodeBeHandled = MagicMock(return_value=True) @@ -133,7 +142,16 @@ class Test_Update: application_with_mocked_scene.getController().getScene().getRoot = MagicMock(return_value=slicable_scene_node) with patch("UM.Application.Application.getInstance", MagicMock(return_value=application_with_mocked_scene)): objects_model._update() - assert objects_model.items == [{'name': 'YAY(1)', 'selected': False, 'outside_build_area': False, 'buildplate_number': None, 'node': slicable_scene_node}] + assert objects_model.items == [{ + 'name': 'YAY(1)', + 'selected': False, + 'outside_build_area': False, + 'buildplate_number': None, + 'node': slicable_scene_node, + "extruder_number": -1, + "per_object_settings_count": 0, + "mesh_type": "" + }] def test_updateWithNonTwoNodes(self, objects_model, application_with_mocked_scene, slicable_scene_node): objects_model._shouldNodeBeHandled = MagicMock(return_value=True) @@ -143,7 +161,25 @@ class Test_Update: application_with_mocked_scene.getController().getScene().getRoot = MagicMock(return_value=slicable_scene_node) with patch("UM.Application.Application.getInstance", MagicMock(return_value=application_with_mocked_scene)): objects_model._update() - assert objects_model.items == [{'name': 'YAY', 'selected': False, 'outside_build_area': False, 'buildplate_number': None, 'node': slicable_scene_node}, {'name': 'YAY(1)', 'selected': False, 'outside_build_area': False, 'buildplate_number': None, 'node': copied_node}] + assert objects_model.items == [{ + 'name': 'YAY', + 'selected': False, + 'outside_build_area': False, + 'buildplate_number': None, + 'node': slicable_scene_node, + "extruder_number": -1, + "per_object_settings_count": 0, + "mesh_type": "" + }, { + 'name': 'YAY(1)', + 'selected': False, + 'outside_build_area': False, + 'buildplate_number': None, + 'node': copied_node, + "extruder_number": -1, + "per_object_settings_count": 0, + "mesh_type": "" + }] def test_updateWithNonTwoGroups(self, objects_model, application_with_mocked_scene, group_scene_node): objects_model._shouldNodeBeHandled = MagicMock(return_value=True) @@ -153,7 +189,25 @@ class Test_Update: application_with_mocked_scene.getController().getScene().getRoot = MagicMock(return_value=group_scene_node) with patch("UM.Application.Application.getInstance", MagicMock(return_value=application_with_mocked_scene)): objects_model._update() - assert objects_model.items == [{'name': 'Group #1', 'selected': False, 'outside_build_area': False, 'buildplate_number': None, 'node': group_scene_node}, {'name': 'Group #2', 'selected': False, 'outside_build_area': False, 'buildplate_number': None, 'node': copied_node}] + assert objects_model.items == [{ + 'name': 'Group #1', + 'selected': False, + 'outside_build_area': False, + 'buildplate_number': None, + 'node': group_scene_node, + "extruder_number": -1, + "per_object_settings_count": 0, + "mesh_type": "" + }, { + 'name': 'Group #2', + 'selected': False, + 'outside_build_area': False, + 'buildplate_number': None, + 'node': copied_node, + "extruder_number": -1, + "per_object_settings_count": 0, + "mesh_type": "" + }] def test_updateOutsideBuildplate(self, objects_model, application_with_mocked_scene, group_scene_node): objects_model._shouldNodeBeHandled = MagicMock(return_value=True) @@ -162,5 +216,14 @@ class Test_Update: application_with_mocked_scene.getController().getScene().getRoot = MagicMock(return_value=group_scene_node) with patch("UM.Application.Application.getInstance", MagicMock(return_value=application_with_mocked_scene)): objects_model._update() - assert objects_model.items == [{'name': 'Group #1', 'selected': False, 'outside_build_area': True, 'buildplate_number': None, 'node': group_scene_node}] + assert objects_model.items == [{ + 'name': 'Group #1', + 'selected': False, + 'outside_build_area': True, + 'buildplate_number': None, + 'node': group_scene_node, + "extruder_number": -1, + "per_object_settings_count": 0, + "mesh_type": "" + }] From dbc4c69142badc78100562fa56c7bde5e4480fb2 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 13 Apr 2020 09:51:54 +0200 Subject: [PATCH 11/11] Show correct number of settings for support and anti overhang meshes --- cura/UI/ObjectsModel.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/cura/UI/ObjectsModel.py b/cura/UI/ObjectsModel.py index 6a44e4ff5a..adfe8660a9 100644 --- a/cura/UI/ObjectsModel.py +++ b/cura/UI/ObjectsModel.py @@ -191,6 +191,17 @@ class ObjectsModel(ListModel): per_object_settings_count -= 1 # do not count this mesh type setting break + if per_object_settings_count > 0: + if node_mesh_type == "support_mesh": + # support meshes only allow support settings + per_object_settings_count = 0 + for key in per_object_stack.getTop().getAllKeys(): + if per_object_stack.getTop().getInstance(key).definition.isAncestor("support"): + per_object_settings_count += 1 + elif node_mesh_type == "anti_overhang_mesh": + # anti overhang meshes ignore per model settings + per_object_settings_count = 0 + extruder_position = node.callDecoration("getActiveExtruderPosition") if extruder_position is None: extruder_number = -1