diff --git a/plugins/SimulationView/SimulationPass.py b/plugins/SimulationView/SimulationPass.py index cd0eda2929..f9bbb808c4 100644 --- a/plugins/SimulationView/SimulationPass.py +++ b/plugins/SimulationView/SimulationPass.py @@ -93,7 +93,6 @@ class SimulationPass(RenderPass): self.bind() tool_handle_batch = RenderBatch(self._tool_handle_shader, type = RenderBatch.RenderType.Overlay, backface_cull = True) - active_build_plate = Application.getInstance().getMultiBuildPlateModel().activeBuildPlate head_position = None # Indicates the current position of the print head nozzle_node = None @@ -113,29 +112,21 @@ class SimulationPass(RenderPass): # Render all layers below a certain number as line mesh instead of vertices. if self._layer_view._current_layer_num > -1 and ((not self._layer_view._only_show_top_layers) or (not self._layer_view.getCompatibilityMode())): - start = 0 - end = 0 - element_counts = layer_data.getElementCounts() - for layer in sorted(element_counts.keys()): - # In the current layer, we show just the indicated paths - if layer == self._layer_view._current_layer_num: - # We look for the position of the head, searching the point of the current path - index = self._layer_view._current_path_num - offset = 0 - for polygon in layer_data.getLayer(layer).polygons: - # The size indicates all values in the two-dimension array, and the second dimension is - # always size 3 because we have 3D points. - if index >= polygon.data.size // 3 - offset: - index -= polygon.data.size // 3 - offset - offset = 1 # This is to avoid the first point when there is more than one polygon, since has the same value as the last point in the previous polygon - continue - # The head position is calculated and translated - head_position = Vector(polygon.data[index+offset][0], polygon.data[index+offset][1], polygon.data[index+offset][2]) + node.getWorldPosition() - break - break - if self._layer_view._minimum_layer_num > layer: - start += element_counts[layer] - end += element_counts[layer] + start = self._layer_view.start_elements_index + end = self._layer_view.end_elements_index + index = self._layer_view._current_path_num + offset = 0 + for polygon in layer_data.getLayer(self._layer_view._current_layer_num).polygons: + # The size indicates all values in the two-dimension array, and the second dimension is + # always size 3 because we have 3D points. + if index >= polygon.data.size // 3 - offset: + index -= polygon.data.size // 3 - offset + offset = 1 # This is to avoid the first point when there is more than one polygon, since has the same value as the last point in the previous polygon + continue + # The head position is calculated and translated + head_position = Vector(polygon.data[index + offset][0], polygon.data[index + offset][1], + polygon.data[index + offset][2]) + node.getWorldPosition() + break # Calculate the range of paths in the last layer current_layer_start = end diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 4282806ff5..95a3ac3f43 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -71,6 +71,8 @@ class SimulationView(CuraView): self._max_paths = 0 self._current_path_num = 0 self._minimum_path_num = 0 + self.start_elements_index = 0 + self.end_elements_index = 0 self.currentLayerNumChanged.connect(self._onCurrentLayerNumChanged) self._busy = False @@ -243,6 +245,7 @@ class SimulationView(CuraView): self._minimum_layer_num = self._current_layer_num self._startUpdateTopLayers() + self.recalculateStartEndElements() self.currentLayerNumChanged.emit() @@ -257,7 +260,7 @@ class SimulationView(CuraView): self._current_layer_num = self._minimum_layer_num self._startUpdateTopLayers() - + self.recalculateStartEndElements() self.currentLayerNumChanged.emit() def setPath(self, value: int) -> None: @@ -359,6 +362,24 @@ class SimulationView(CuraView): return 0.0 # If it's still max-float, there are no measurements. Use 0 then. return self._min_thickness + def recalculateStartEndElements(self): + self.start_elements_index = 0 + self.end_elements_index = 0 + scene = self.getController().getScene() + for node in DepthFirstIterator(scene.getRoot()): # type: ignore + layer_data = node.callDecoration("getLayerData") + if not layer_data: + continue + + # Found a the layer data! + element_counts = layer_data.getElementCounts() + for layer in sorted(element_counts.keys()): + if layer == self._current_layer_num: + break + if self._minimum_layer_num > layer: + self.start_elements_index += element_counts[layer] + self.end_elements_index += element_counts[layer] + def getMaxThickness(self) -> float: return self._max_thickness