diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 3dd4c34815..756dae2704 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -902,6 +902,7 @@ class CuraApplication(QtApplication): not issubclass(type(node), CuraSceneNode) or (not node.getMeshData() and not node.callDecoration("getLayerData")) or (node.callDecoration("getBuildPlateNumber") != active_build_plate)): + continue if node.callDecoration("isBlockSlicing"): is_block_slicing_node = True @@ -1018,7 +1019,7 @@ class CuraApplication(QtApplication): Selection.clear() for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode): + if not isinstance(node, SceneNode): continue if not node.getMeshData() and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. @@ -1040,10 +1041,12 @@ class CuraApplication(QtApplication): nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if type(node) not in {SceneNode, CuraSceneNode}: + if not isinstance(node, SceneNode): continue if (not node.getMeshData() and not node.callDecoration("getLayerData")) and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. + if not node.isSelectable(): + continue # Only remove nodes that are selectable. if node.getParent() and node.getParent().callDecoration("isGroup"): continue # Grouped nodes don't need resetting as their parent (the group) is resetted) nodes.append(node) @@ -1064,7 +1067,7 @@ class CuraApplication(QtApplication): Logger.log("i", "Resetting all scene translations") nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode): + if not isinstance(node, SceneNode): continue if not node.getMeshData() and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. @@ -1092,7 +1095,7 @@ class CuraApplication(QtApplication): Logger.log("i", "Resetting all scene transformations") nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode): + if not isinstance(node, SceneNode): continue if not node.getMeshData() and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. @@ -1119,7 +1122,7 @@ class CuraApplication(QtApplication): def arrangeObjectsToAllBuildPlates(self): nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode): + if not isinstance(node, SceneNode): continue if not node.getMeshData() and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. @@ -1140,7 +1143,7 @@ class CuraApplication(QtApplication): nodes = [] active_build_plate = self.getBuildPlateModel().activeBuildPlate for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode): + if not isinstance(node, SceneNode): continue if not node.getMeshData() and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. @@ -1164,7 +1167,7 @@ class CuraApplication(QtApplication): # What nodes are on the build plate and are not being moved fixed_nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode): + if not isinstance(node, SceneNode): continue if not node.getMeshData() and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. @@ -1192,7 +1195,7 @@ class CuraApplication(QtApplication): Logger.log("i", "Reloading all loaded mesh data.") nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode) or not node.getMeshData(): + if not isinstance(node, SceneNode) or not node.getMeshData(): continue nodes.append(node) diff --git a/cura/ObjectsModel.py b/cura/ObjectsModel.py index 5218127fc5..1516b3ee33 100644 --- a/cura/ObjectsModel.py +++ b/cura/ObjectsModel.py @@ -28,7 +28,7 @@ class ObjectsModel(ListModel): active_build_plate_number = self._build_plate_number group_nr = 1 for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode): + if not isinstance(node, SceneNode): continue if (not node.getMeshData() and not node.callDecoration("getLayerData")) and not node.callDecoration("isGroup"): continue diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index 0ad3cf1328..69890178e4 100755 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -61,7 +61,7 @@ class PlatformPhysics: random.shuffle(nodes) for node in nodes: - if node is root or not issubclass(type(node), SceneNode) or node.getBoundingBox() is None: + if node is root or not isinstance(node, SceneNode) or node.getBoundingBox() is None: continue bbox = node.getBoundingBox() diff --git a/cura/Scene/BuildPlateDecorator.py b/cura/Scene/BuildPlateDecorator.py index 44372976f0..c2fd3145dd 100644 --- a/cura/Scene/BuildPlateDecorator.py +++ b/cura/Scene/BuildPlateDecorator.py @@ -13,7 +13,7 @@ class BuildPlateDecorator(SceneNodeDecorator): # Make sure that groups are set correctly # setBuildPlateForSelection in CuraActions makes sure that no single childs are set. self._build_plate_number = nr - if issubclass(type(self._node), CuraSceneNode): + if isinstance(self._node, CuraSceneNode): self._node.transformChanged() # trigger refresh node without introducing a new signal if self._node and self._node.callDecoration("isGroup"): for child in self._node.getChildren(): diff --git a/cura/Scene/ConvexHullNode.py b/cura/Scene/ConvexHullNode.py index 02d8ed833c..c8106b5d15 100644 --- a/cura/Scene/ConvexHullNode.py +++ b/cura/Scene/ConvexHullNode.py @@ -65,7 +65,7 @@ class ConvexHullNode(SceneNode): ConvexHullNode.shader.setUniformValue("u_opacity", 0.6) if self.getParent(): - if self.getMeshData() and issubclass(type(self._node), SceneNode) and self._node.callDecoration("getBuildPlateNumber") == Application.getInstance().getBuildPlateModel().activeBuildPlate: + if self.getMeshData() and isinstance(self._node, SceneNode) and self._node.callDecoration("getBuildPlateNumber") == Application.getInstance().getBuildPlateModel().activeBuildPlate: renderer.queueNode(self, transparent = True, shader = ConvexHullNode.shader, backface_cull = True, sort = -8) if self._convex_hull_head_mesh: renderer.queueNode(self, shader = ConvexHullNode.shader, transparent = True, mesh = self._convex_hull_head_mesh, backface_cull = True, sort = -8) diff --git a/cura/Scene/CuraSceneController.py b/cura/Scene/CuraSceneController.py index 97cffcdd7d..a93a8769d0 100644 --- a/cura/Scene/CuraSceneController.py +++ b/cura/Scene/CuraSceneController.py @@ -33,7 +33,7 @@ class CuraSceneController(QObject): source = args[0] else: source = None - if not issubclass(type(source), SceneNode): + if not isinstance(source, SceneNode): return max_build_plate = self._calcMaxBuildPlate() changed = False diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 40d64590f5..5c62c361c3 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -609,7 +609,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): instance_container.setName(self._container_registry.uniqueName(instance_container.getName())) new_changes_container_id = self.getNewId(instance_container.getId()) - instance_container._id = new_changes_container_id + instance_container.setMetaDataEntry("id", new_changes_container_id) # TODO: we don't know the following is correct or not, need to verify # AND REFACTOR!!! diff --git a/plugins/3MFWriter/ThreeMFWriter.py b/plugins/3MFWriter/ThreeMFWriter.py index 79b821fe31..c4b7035cf1 100644 --- a/plugins/3MFWriter/ThreeMFWriter.py +++ b/plugins/3MFWriter/ThreeMFWriter.py @@ -6,8 +6,9 @@ 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 -from cura.Scene.CuraSceneNode import CuraSceneNode +from UM.Scene.SceneNode import SceneNode + +from cura.CuraApplication import CuraApplication import Savitar @@ -62,11 +63,15 @@ class ThreeMFWriter(MeshWriter): self._store_archive = store_archive ## Convenience function that converts an Uranium SceneNode object to a SavitarSceneNode - # \returns Uranium Scenen node. + # \returns Uranium Scene node. def _convertUMNodeToSavitarNode(self, um_node, transformation = Matrix()): - if type(um_node) not in [UM.Scene.SceneNode.SceneNode, CuraSceneNode]: + if not isinstance(um_node, SceneNode): return None + active_build_plate_nr = CuraApplication.getInstance().getBuildPlateModel().activeBuildPlate + if um_node.callDecoration("getBuildPlateNumber") != active_build_plate_nr: + return + savitar_node = Savitar.SceneNode() node_matrix = um_node.getLocalTransformation() @@ -97,6 +102,9 @@ class ThreeMFWriter(MeshWriter): savitar_node.setSetting(key, str(stack.getProperty(key, "value"))) for child_node in um_node.getChildren(): + # only save the nodes on the active build plate + if child_node.callDecoration("getBuildPlateNumber") != active_build_plate_nr: + continue savitar_child_node = self._convertUMNodeToSavitarNode(child_node) if savitar_child_node is not None: savitar_node.addChild(savitar_child_node) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 3272fb019d..97463e07da 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -422,7 +422,7 @@ class CuraEngineBackend(QObject, Backend): # # \param source The scene node that was changed. def _onSceneChanged(self, source): - if not issubclass(type(source), SceneNode): + if not isinstance(source, SceneNode): return build_plate_changed = set() diff --git a/plugins/SimulationView/SimulationPass.py b/plugins/SimulationView/SimulationPass.py index c9c1443bfe..76d7127534 100644 --- a/plugins/SimulationView/SimulationPass.py +++ b/plugins/SimulationView/SimulationPass.py @@ -106,7 +106,7 @@ class SimulationPass(RenderPass): nozzle_node = node nozzle_node.setVisible(False) - elif issubclass(type(node), SceneNode) and (node.getMeshData() or node.callDecoration("isBlockSlicing")) and node.isVisible(): + elif isinstance(node, SceneNode) and (node.getMeshData() or node.callDecoration("isBlockSlicing")) and node.isVisible(): layer_data = node.callDecoration("getLayerData") if not layer_data: continue diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index dc24cc4700..bf44a29cf5 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -170,8 +170,8 @@ Item { tooltip: [1, 5].indexOf(base.backendState) != -1 ? catalog.i18nc("@info:tooltip","Slice current printjob") : catalog.i18nc("@info:tooltip","Cancel slicing process") // 1 = not started, 2 = Processing - enabled: base.backendState != "undefined" && (base.backendState == 1 || base.backendState == 2) && base.activity == true - visible: base.backendState != "undefined" && !autoSlice && (base.backendState == 1 || base.backendState == 2) && base.activity == true + enabled: base.backendState != "undefined" && ([1, 2].indexOf(base.backendState) != -1) && base.activity + visible: base.backendState != "undefined" && !autoSlice && ([1, 2, 4].indexOf(base.backendState) != -1) && base.activity property bool autoSlice height: UM.Theme.getSize("save_button_save_to_button").height @@ -179,8 +179,8 @@ Item { anchors.right: parent.right anchors.rightMargin: UM.Theme.getSize("sidebar_margin").width - // 1 = not started, 5 = disabled - text: [1, 5].indexOf(base.backendState) != -1 ? catalog.i18nc("@label:Printjob", "Prepare") : catalog.i18nc("@label:Printjob", "Cancel") + // 1 = not started, 4 = error, 5 = disabled + text: [1, 4, 5].indexOf(base.backendState) != -1 ? catalog.i18nc("@label:Printjob", "Prepare") : catalog.i18nc("@label:Printjob", "Cancel") onClicked: { sliceOrStopSlicing();