Просмотр исходного кода

Fix typing ignore for breath frist iterator

Jaime van Kessel 5 лет назад
Родитель
Сommit
d8ddcba091

+ 2 - 2
cura/CuraApplication.py

@@ -1289,7 +1289,7 @@ class CuraApplication(QtApplication):
     def arrangeAll(self) -> None:
         nodes_to_arrange = []
         active_build_plate = self.getMultiBuildPlateModel().activeBuildPlate
-        for node in DepthFirstIterator(self.getController().getScene().getRoot()):  # type: ignore
+        for node in DepthFirstIterator(self.getController().getScene().getRoot()):
             if not isinstance(node, SceneNode):
                 continue
 
@@ -1327,7 +1327,7 @@ class CuraApplication(QtApplication):
         Logger.log("i", "Reloading all loaded mesh data.")
         nodes = []
         has_merged_nodes = False
-        for node in DepthFirstIterator(self.getController().getScene().getRoot()):  # type: ignore
+        for node in DepthFirstIterator(self.getController().getScene().getRoot()):
             if not isinstance(node, CuraSceneNode) or not node.getMeshData():
                 if node.getName() == "MergedMesh":
                     has_merged_nodes = True

+ 1 - 1
cura/Settings/ExtruderManager.py

@@ -115,7 +115,7 @@ class ExtruderManager(QObject):
             selected_nodes = []  # type: List["SceneNode"]
             for node in Selection.getAllSelectedObjects():
                 if node.callDecoration("isGroup"):
-                    for grouped_node in BreadthFirstIterator(node): #type: ignore #Ignore type error because iter() should get called automatically by Python syntax.
+                    for grouped_node in BreadthFirstIterator(node):
                         if grouped_node.callDecoration("isGroup"):
                             continue
 

+ 1 - 1
cura/Settings/MachineManager.py

@@ -949,7 +949,7 @@ class MachineManager(QObject):
 
         # Check to see if any objects are set to print with an extruder that will no longer exist
         root_node = self._application.getController().getScene().getRoot()
-        for node in DepthFirstIterator(root_node): #type: ignore #Ignore type error because iter() should get called automatically by Python syntax.
+        for node in DepthFirstIterator(root_node):
             if node.getMeshData():
                 extruder_nr = node.callDecoration("getActiveExtruderPosition")
 

+ 6 - 5
plugins/CuraEngineBackend/CuraEngineBackend.py

@@ -369,7 +369,7 @@ class CuraEngineBackend(QObject, Backend):
 
         elif job.getResult() == StartJobResult.ObjectSettingError:
             errors = {}
-            for node in DepthFirstIterator(self._application.getController().getScene().getRoot()): #type: ignore #Ignore type error because iter() should get called automatically by Python syntax.
+            for node in DepthFirstIterator(self._application.getController().getScene().getRoot()):
                 stack = node.callDecoration("getStack")
                 if not stack:
                     continue
@@ -438,7 +438,7 @@ class CuraEngineBackend(QObject, Backend):
 
         if not self._application.getPreferences().getValue("general/auto_slice"):
             enable_timer = False
-        for node in DepthFirstIterator(self._scene.getRoot()): #type: ignore #Ignore type error because iter() should get called automatically by Python syntax.
+        for node in DepthFirstIterator(self._scene.getRoot()):
             if node.callDecoration("isBlockSlicing"):
                 enable_timer = False
                 self.setState(BackendState.Disabled)
@@ -460,7 +460,7 @@ class CuraEngineBackend(QObject, Backend):
     ##  Return a dict with number of objects per build plate
     def _numObjectsPerBuildPlate(self) -> Dict[int, int]:
         num_objects = defaultdict(int) #type: Dict[int, int]
-        for node in DepthFirstIterator(self._scene.getRoot()): #type: ignore #Ignore type error because iter() should get called automatically by Python syntax.
+        for node in DepthFirstIterator(self._scene.getRoot()):
             # Only count sliceable objects
             if node.callDecoration("isSliceable"):
                 build_plate_number = node.callDecoration("getBuildPlateNumber")
@@ -548,10 +548,11 @@ class CuraEngineBackend(QObject, Backend):
         # Clear out any old gcode
         self._scene.gcode_dict = {}  # type: ignore
 
-        for node in DepthFirstIterator(self._scene.getRoot()): #type: ignore #Ignore type error because iter() should get called automatically by Python syntax.
+        for node in DepthFirstIterator(self._scene.getRoot()):
             if node.callDecoration("getLayerData"):
                 if not build_plate_numbers or node.callDecoration("getBuildPlateNumber") in build_plate_numbers:
-                    node.getParent().removeChild(node)
+                    # We can asume that all nodes have a parent as we're looping through the scene (and filter out root)
+                    cast(SceneNode, node.getParent()).removeChild(node)
 
     def markSliceAll(self) -> None:
         for build_plate_number in range(self._application.getMultiBuildPlateModel().maxBuildPlate + 1):

+ 19 - 11
plugins/CuraEngineBackend/StartSliceJob.py

@@ -11,6 +11,7 @@ import Arcus #For typing.
 
 from UM.Job import Job
 from UM.Logger import Logger
+from UM.Scene.SceneNode import SceneNode
 from UM.Settings.ContainerStack import ContainerStack #For typing.
 from UM.Settings.SettingRelation import SettingRelation #For typing.
 
@@ -150,7 +151,7 @@ class StartSliceJob(Job):
 
 
         # Don't slice if there is a per object setting with an error value.
-        for node in DepthFirstIterator(self._scene.getRoot()): #type: ignore #Ignore type error because iter() should get called automatically by Python syntax.
+        for node in DepthFirstIterator(self._scene.getRoot()):
             if not isinstance(node, CuraSceneNode) or not node.isSelectable():
                 continue
 
@@ -160,15 +161,16 @@ class StartSliceJob(Job):
 
         with self._scene.getSceneLock():
             # Remove old layer data.
-            for node in DepthFirstIterator(self._scene.getRoot()): #type: ignore #Ignore type error because iter() should get called automatically by Python syntax.
+            for node in DepthFirstIterator(self._scene.getRoot()):
                 if node.callDecoration("getLayerData") and node.callDecoration("getBuildPlateNumber") == self._build_plate_number:
-                    node.getParent().removeChild(node)
+                    # Singe we walk through all nodes in the scene, they always have a parent.
+                    cast(SceneNode, node.getParent()).removeChild(node)
                     break
 
             # Get the objects in their groups to print.
             object_groups = []
             if stack.getProperty("print_sequence", "value") == "one_at_a_time":
-                for node in OneAtATimeIterator(self._scene.getRoot()): #type: ignore #Ignore type error because iter() should get called automatically by Python syntax.
+                for node in OneAtATimeIterator(self._scene.getRoot()):
                     temp_list = []
 
                     # Node can't be printed, so don't bother sending it.
@@ -183,7 +185,8 @@ class StartSliceJob(Job):
                     children = node.getAllChildren()
                     children.append(node)
                     for child_node in children:
-                        if child_node.getMeshData() and child_node.getMeshData().getVertices() is not None:
+                        mesh_data = child_node.getMeshData()
+                        if mesh_data and mesh_data.getVertices() is not None:
                             temp_list.append(child_node)
 
                     if temp_list:
@@ -194,8 +197,9 @@ class StartSliceJob(Job):
             else:
                 temp_list = []
                 has_printing_mesh = False
-                for node in DepthFirstIterator(self._scene.getRoot()): #type: ignore #Ignore type error because iter() should get called automatically by Python syntax.
-                    if node.callDecoration("isSliceable") and node.getMeshData() and node.getMeshData().getVertices() is not None:
+                for node in DepthFirstIterator(self._scene.getRoot()):
+                    mesh_data = node.getMeshData()
+                    if node.callDecoration("isSliceable") and mesh_data and mesh_data.getVertices() is not None:
                         is_non_printing_mesh = bool(node.callDecoration("isNonPrintingMesh"))
 
                         # Find a reason not to add the node
@@ -210,7 +214,7 @@ class StartSliceJob(Job):
 
                     Job.yieldThread()
 
-                #If the list doesn't have any model with suitable settings then clean the list
+                # If the list doesn't have any model with suitable settings then clean the list
                 # otherwise CuraEngine will crash
                 if not has_printing_mesh:
                     temp_list.clear()
@@ -261,10 +265,14 @@ class StartSliceJob(Job):
 
             for group in filtered_object_groups:
                 group_message = self._slice_message.addRepeatedMessage("object_lists")
-                if group[0].getParent() is not None and group[0].getParent().callDecoration("isGroup"):
-                    self._handlePerObjectSettings(group[0].getParent(), group_message)
+                parent = group[0].getParent()
+                if parent is not None and parent.callDecoration("isGroup"):
+                    self._handlePerObjectSettings(cast(CuraSceneNode, parent), group_message)
+
                 for object in group:
                     mesh_data = object.getMeshData()
+                    if mesh_data is None:
+                        continue
                     rot_scale = object.getWorldTransformation().getTransposed().getData()[0:3, 0:3]
                     translate = object.getWorldTransformation().getData()[:3, 3]
 
@@ -288,7 +296,7 @@ class StartSliceJob(Job):
 
                     obj.vertices = flat_verts
 
-                    self._handlePerObjectSettings(object, obj)
+                    self._handlePerObjectSettings(cast(CuraSceneNode, object), obj)
 
                     Job.yieldThread()
 

+ 2 - 2
plugins/SimulationView/SimulationView.py

@@ -218,10 +218,10 @@ class SimulationView(CuraView):
             if theme is not None:
                 self._ghost_shader.setUniformValue("u_color", Color(*theme.getColor("layerview_ghost").getRgb()))
 
-        for node in DepthFirstIterator(scene.getRoot()):  # type: ignore
+        for node in DepthFirstIterator(scene.getRoot()):
             # We do not want to render ConvexHullNode as it conflicts with the bottom layers.
             # However, it is somewhat relevant when the node is selected, so do render it then.
-            if type(node) is ConvexHullNode and not Selection.isSelected(node.getWatchedNode()):
+            if type(node) is ConvexHullNode and not Selection.isSelected(cast(ConvexHullNode, node).getWatchedNode()):
                 continue
 
             if not node.render(renderer):