From 4973d53057d1a968c7122c6bec752557e5e80954 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Sun, 6 Jun 2021 09:00:00 +0100 Subject: [PATCH 1/4] Rework calculation of min/max flow rates for simulation view colour scheme. The max value was being calculated as the product of the max line width, max layer thickness and max feedrate but it should be calculated as the maximum of the products of the width, thickness and feedrate for each individual line. i.e. calculate the flow for each line and use the min and max values of the flows. --- plugins/SimulationView/SimulationView.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index adc64c5072..4c9d7e6ddd 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -90,11 +90,12 @@ class SimulationView(CuraView): self._max_feedrate = sys.float_info.min self._min_feedrate = sys.float_info.max - self._max_feedrate_with_extrusion = sys.float_info.min self._max_thickness = sys.float_info.min self._min_thickness = sys.float_info.max self._max_line_width = sys.float_info.min self._min_line_width = sys.float_info.max + self._min_flow_rate = sys.float_info.max + self._max_flow_rate = sys.float_info.min self._global_container_stack = None # type: Optional[ContainerStack] self._proxy = None @@ -413,10 +414,10 @@ class SimulationView(CuraView): return self._min_line_width def getMaxFlowRate(self) -> float: - return self._max_line_width * self._max_thickness * self._max_feedrate_with_extrusion + return self._max_flow_rate def getMinFlowRate(self) -> float: - min_flow_rate = self._min_line_width * self._min_thickness * self._min_feedrate + min_flow_rate = self._min_flow_rate if abs(min_flow_rate - sys.float_info.max) < 10: # Some lenience due to floating point rounding. return 0.0 # If it's still max-float, there are no measurements. Use 0 then. return min_flow_rate @@ -474,7 +475,6 @@ class SimulationView(CuraView): # Before we start, save the old values so that we can tell if any of the spectrums need to change. old_min_feedrate = self._min_feedrate old_max_feedrate = self._max_feedrate - old_max_feedrate_with_extrusion = self._max_feedrate_with_extrusion old_min_linewidth = self._min_line_width old_max_linewidth = self._max_line_width old_min_thickness = self._min_thickness @@ -482,7 +482,6 @@ class SimulationView(CuraView): self._min_feedrate = sys.float_info.max self._max_feedrate = sys.float_info.min - self._max_feedrate_with_extrusion = sys.float_info.min self._min_line_width = sys.float_info.max self._max_line_width = sys.float_info.min self._min_thickness = sys.float_info.max @@ -522,10 +521,13 @@ class SimulationView(CuraView): visible_feedrates = numpy.take(polyline.lineFeedrates, visible_indices) visible_feedrates_with_extrusion = numpy.take(polyline.lineFeedrates, visible_indicies_with_extrusion) visible_linewidths = numpy.take(polyline.lineWidths, visible_indices) + visible_linewidths_with_extrusion = numpy.take(polyline.lineWidths, visible_indicies_with_extrusion) visible_thicknesses = numpy.take(polyline.lineThicknesses, visible_indices) + visible_thicknesses_with_extrusion = numpy.take(polyline.lineThicknesses, visible_indicies_with_extrusion) self._max_feedrate = max(float(visible_feedrates.max()), self._max_feedrate) - if visible_feedrates_with_extrusion.size != 0: - self._max_feedrate_with_extrusion = max(float(visible_feedrates_with_extrusion.max()), self._max_feedrate_with_extrusion) + flow_rates = visible_feedrates_with_extrusion * visible_linewidths_with_extrusion * visible_thicknesses_with_extrusion + self._min_flow_rate = min(float(flow_rates.min()), self._min_flow_rate) + self._max_flow_rate = max(float(flow_rates.max()), self._max_flow_rate) self._min_feedrate = min(float(visible_feedrates.min()), self._min_feedrate) self._max_line_width = max(float(visible_linewidths.max()), self._max_line_width) self._min_line_width = min(float(visible_linewidths.min()), self._min_line_width) @@ -538,8 +540,7 @@ class SimulationView(CuraView): if old_min_feedrate != self._min_feedrate or old_max_feedrate != self._max_feedrate \ or old_min_linewidth != self._min_line_width or old_max_linewidth != self._max_line_width \ - or old_min_thickness != self._min_thickness or old_max_thickness != self._max_thickness \ - or old_max_feedrate_with_extrusion != self._max_feedrate_with_extrusion: + or old_min_thickness != self._min_thickness or old_max_thickness != self._max_thickness: self.colorSchemeLimitsChanged.emit() def calculateMaxPathsOnLayer(self, layer_num: int) -> None: From 2f1f370fe04113c38bd9996d2e924736679261b2 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Sun, 6 Jun 2021 12:15:31 +0100 Subject: [PATCH 2/4] Remove local variable. --- plugins/SimulationView/SimulationView.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 4c9d7e6ddd..bbc819babe 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -417,10 +417,9 @@ class SimulationView(CuraView): return self._max_flow_rate def getMinFlowRate(self) -> float: - min_flow_rate = self._min_flow_rate - if abs(min_flow_rate - sys.float_info.max) < 10: # Some lenience due to floating point rounding. + if abs(self._min_flow_rate - sys.float_info.max) < 10: # Some lenience due to floating point rounding. return 0.0 # If it's still max-float, there are no measurements. Use 0 then. - return min_flow_rate + return self._min_flow_rate def calculateMaxLayers(self) -> None: """ From f65731e4c2ac06e3f2fcccd54c82ba20a4ed5e81 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Sun, 6 Jun 2021 12:16:25 +0100 Subject: [PATCH 3/4] Reset min/max flow rates in calculateColorSchemeLimits(). --- plugins/SimulationView/SimulationView.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index bbc819babe..d29189861d 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -478,6 +478,8 @@ class SimulationView(CuraView): old_max_linewidth = self._max_line_width old_min_thickness = self._min_thickness old_max_thickness = self._max_thickness + old_min_flow_rate = self._min_flow_rate + old_max_flow_rate = self._max_flow_rate self._min_feedrate = sys.float_info.max self._max_feedrate = sys.float_info.min @@ -485,6 +487,8 @@ class SimulationView(CuraView): self._max_line_width = sys.float_info.min self._min_thickness = sys.float_info.max self._max_thickness = sys.float_info.min + self._min_flow_rate = sys.float_info.max + self._max_flow_rate = sys.float_info.min # The colour scheme is only influenced by the visible lines, so filter the lines by if they should be visible. visible_line_types = [] @@ -539,7 +543,8 @@ class SimulationView(CuraView): if old_min_feedrate != self._min_feedrate or old_max_feedrate != self._max_feedrate \ or old_min_linewidth != self._min_line_width or old_max_linewidth != self._max_line_width \ - or old_min_thickness != self._min_thickness or old_max_thickness != self._max_thickness: + or old_min_thickness != self._min_thickness or old_max_thickness != self._max_thickness \ + or old_min_flow_rate != self._min_flow_rate or old_max_flow_rate != self._max_flow_rate: self.colorSchemeLimitsChanged.emit() def calculateMaxPathsOnLayer(self, layer_num: int) -> None: From d2a7a4186afe9ed7b2fb4d4b0a9df9c584f560ac Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Mon, 7 Jun 2021 07:51:06 +0100 Subject: [PATCH 4/4] Avoid crash calculating max/min flow rates if there are no visible lines with extrusion. --- plugins/SimulationView/SimulationView.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index d29189861d..57209f2678 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -528,9 +528,10 @@ class SimulationView(CuraView): visible_thicknesses = numpy.take(polyline.lineThicknesses, visible_indices) visible_thicknesses_with_extrusion = numpy.take(polyline.lineThicknesses, visible_indicies_with_extrusion) self._max_feedrate = max(float(visible_feedrates.max()), self._max_feedrate) - flow_rates = visible_feedrates_with_extrusion * visible_linewidths_with_extrusion * visible_thicknesses_with_extrusion - self._min_flow_rate = min(float(flow_rates.min()), self._min_flow_rate) - self._max_flow_rate = max(float(flow_rates.max()), self._max_flow_rate) + if visible_feedrates_with_extrusion.size != 0: + flow_rates = visible_feedrates_with_extrusion * visible_linewidths_with_extrusion * visible_thicknesses_with_extrusion + self._min_flow_rate = min(float(flow_rates.min()), self._min_flow_rate) + self._max_flow_rate = max(float(flow_rates.max()), self._max_flow_rate) self._min_feedrate = min(float(visible_feedrates.min()), self._min_feedrate) self._max_line_width = max(float(visible_linewidths.max()), self._max_line_width) self._min_line_width = min(float(visible_linewidths.min()), self._min_line_width)