From 09827b4d44236c120d14261d5e89b89c2c297062 Mon Sep 17 00:00:00 2001 From: linuswck Date: Fri, 24 Jan 2025 16:59:13 +0800 Subject: [PATCH] gui: Configure graph's range width and bound - Upgrade to pglive v0.8 - Add a new patch for new options for specifying display range width and bound --- flake.nix | 6 +- ...or-setting-min-range-span-for-y-axis.patch | 61 ----------------- patches/pg_live_range_width.patch | 67 +++++++++++++++++++ pykirdy/kirdy_qt.py | 4 +- 4 files changed, 73 insertions(+), 65 deletions(-) delete mode 100644 patches/0001-Add-option-for-setting-min-range-span-for-y-axis.patch create mode 100644 patches/pg_live_range_width.patch diff --git a/flake.nix b/flake.nix index 62b2d6f..0b49a59 100644 --- a/flake.nix +++ b/flake.nix @@ -57,13 +57,13 @@ pglive = pkgs.python3Packages.buildPythonPackage rec { pname = "pglive"; - version = "0.7.2"; + version = "0.8.0"; format = "pyproject"; src = pkgs.fetchPypi { inherit pname version; - hash = "sha256-jqj8X6H1N5mJQ4OrY5ANqRB0YJByqg/bNneEALWmH1A="; + hash = "sha256-2aECN/3zlsYRv7Ja8OlrnqlqqSCvJ08S2TaMYoMPst8="; }; - patches = ./patches/0001-Add-option-for-setting-min-range-span-for-y-axis.patch; + patches = ./patches/pg_live_range_width.patch; buildInputs = [ pkgs.python3Packages.poetry-core ]; propagatedBuildInputs = with pkgs.python3Packages; [ pyqtgraph numpy ]; }; diff --git a/patches/0001-Add-option-for-setting-min-range-span-for-y-axis.patch b/patches/0001-Add-option-for-setting-min-range-span-for-y-axis.patch deleted file mode 100644 index eeaad4d..0000000 --- a/patches/0001-Add-option-for-setting-min-range-span-for-y-axis.patch +++ /dev/null @@ -1,61 +0,0 @@ -From 59a14e06320fd42d56cd7d953da337c0fe4357fa Mon Sep 17 00:00:00 2001 -From: linuswck -Date: Tue, 22 Oct 2024 17:30:36 +0800 -Subject: [PATCH] Add option for setting min range span for y-axis - ---- - pglive/sources/live_axis_range.py | 17 ++++++++++++++++- - 1 file changed, 16 insertions(+), 1 deletion(-) - -diff --git a/pglive/sources/live_axis_range.py b/pglive/sources/live_axis_range.py -index afbd806..9b62ba5 100644 ---- a/pglive/sources/live_axis_range.py -+++ b/pglive/sources/live_axis_range.py -@@ -5,7 +5,7 @@ from typing import Optional, List, Tuple, Dict - class LiveAxisRange: - - def __init__(self, roll_on_tick: int = 1, offset_left: float = 0., offset_right: float = 0., offset_top: float = 0., -- offset_bottom: float = 0., fixed_range: Optional[List[float]] = None) -> None: -+ offset_bottom: float = 0., fixed_range: Optional[List[float]] = None, min_y_range_span: Optional[List[float]] = [None, None]) -> None: - self.roll_on_tick = roll_on_tick - self.offset_left = offset_left - self.offset_right = offset_right -@@ -21,6 +21,7 @@ class LiveAxisRange: - self.final_x_range = [0., 0.] - self.final_y_range = [0., 0.] - self.ignored_data_connectors: List[str] = [] -+ self.min_y_range_span = min_y_range_span - - def get_x_range(self, data_connector, tick: int) -> List[float]: - x, _ = data_connector.plot.getData() -@@ -116,6 +117,13 @@ class LiveAxisRange: - # therefore in that case we must set some range - final_range[0] -= 0.4 - final_range[1] += 0.4 -+ -+ if self.min_y_range_span[0] is not None: -+ final_range[0] = min(self.min_y_range_span[0], final_range[0]) -+ -+ if self.min_y_range_span[1] is not None: -+ final_range[1] = max(self.min_y_range_span[1], final_range[1]) -+ - if self.final_y_range != final_range: - self.final_y_range = final_range - return self.final_y_range -@@ -139,6 +147,13 @@ class LiveAxisRange: - # therefore in that case we must set some range - final_range[0] -= 0.4 - final_range[1] += 0.4 -+ -+ if self.min_y_range_span[0] is not None: -+ final_range[0] = min(self.min_y_range_span[0], final_range[0]) -+ -+ if self.min_y_range_span[1] is not None: -+ final_range[1] = max(self.min_y_range_span[1], final_range[1]) -+ - if self.final_y_range != final_range: - self.final_y_range = final_range - return self.final_y_range --- -2.44.1 - diff --git a/patches/pg_live_range_width.patch b/patches/pg_live_range_width.patch new file mode 100644 index 0000000..49fd2f8 --- /dev/null +++ b/patches/pg_live_range_width.patch @@ -0,0 +1,67 @@ +diff --git a/pglive/sources/live_axis_range.py b/pglive/sources/live_axis_range.py +index cd3a7fc..102a48f 100755 +--- a/pglive/sources/live_axis_range.py ++++ b/pglive/sources/live_axis_range.py +@@ -13,6 +13,10 @@ class LiveAxisRange: + offset_top: float = 0.0, + offset_bottom: float = 0.0, + fixed_range: Optional[List[float]] = None, ++ x_range_width: Optional[float] = None, ++ x_bound: Optional[List[float]] = None, ++ y_range_width: Optional[float] = None, ++ y_bound: Optional[List[float]] = None, + ) -> None: + self.roll_on_tick = roll_on_tick + self.offset_left = offset_left +@@ -24,6 +28,10 @@ class LiveAxisRange: + self.crop_top_offset_to_data = False + self.crop_bottom_offset_to_data = False + self.fixed_range = fixed_range ++ self.x_range_width = x_range_width ++ self.x_bound = x_bound ++ self.y_range_width = y_range_width ++ self.y_bound = y_bound + self.x_range: Dict[str, List[float]] = {} + self.y_range: Dict[str, List[float]] = {} + self.final_x_range = [0.0, 0.0] +@@ -70,6 +78,7 @@ class LiveAxisRange: + # therefore in that case we must set some range + final_range[0] -= 0.4 + final_range[1] += 0.4 ++ final_range = self._update_range_width(self.x_bound, self.x_range_width, final_range) + if self.final_x_range != final_range: + self.final_x_range = final_range + return self.final_x_range +@@ -137,6 +146,7 @@ class LiveAxisRange: + # therefore in that case we must set some range + final_range[0] -= 0.4 + final_range[1] += 0.4 ++ final_range = self._update_range_width(self.y_bound, self.y_range_width, final_range) + if self.final_y_range != final_range: + self.final_y_range = final_range + return self.final_y_range +@@ -199,6 +209,24 @@ class LiveAxisRange: + else: + return None + ++ def _update_range_width(self, bound, range_width, final_range): ++ if range_width is not None: ++ if abs(final_range[0] - final_range[1]) < range_width: ++ center_pt = (final_range[0] + final_range[1]) / 2 ++ final_range[0] = center_pt - range_width / 2 ++ final_range[1] = center_pt + range_width / 2 ++ ++ if bound is not None: ++ final_range_width = abs(final_range[0] - final_range[1]) ++ bound_width = abs(bound[0] - bound[1]) ++ if bound_width < final_range_width: ++ final_range = bound ++ if final_range[0] < bound[0]: ++ final_range = [bound[0], bound[0] + final_range_width] ++ elif final_range[1] > bound[1]: ++ final_range = [bound[0] - final_range_width, bound[1]] ++ return final_range ++ + def ignore_connector(self, data_connector, flag: bool) -> None: + if not flag: + self.ignored_data_connectors.append(data_connector.__hash__()) diff --git a/pykirdy/kirdy_qt.py b/pykirdy/kirdy_qt.py index 0426756..4336ee8 100644 --- a/pykirdy/kirdy_qt.py +++ b/pykirdy/kirdy_qt.py @@ -203,7 +203,7 @@ class Graphs: pd_mon_pwr_axis = LiveAxis('left', text="Power", units="W") pd_mon_pwr_axis.showLabel() - pd_mon_pwr_graph.y_range_controller = LiveAxisRange(min_y_range_span=[0.0, 100 / 1000 / 1000]) + pd_mon_pwr_graph.y_range_controller = LiveAxisRange(y_range_width=0.0005, y_bound=[0.0, float("inf")]) pd_mon_pwr_graph.setAxisItems({'left': pd_mon_pwr_axis}) pd_mon_pwr_graph.addItem(self._pd_mon_pwr_plot) self.pd_mon_pwr_connector = DataConnector(self._pd_mon_pwr_plot, plot_rate=10.0, update_rate=10.0, max_points=self.max_samples) @@ -211,6 +211,7 @@ class Graphs: tec_temp_axis = LiveAxis('left', text="Temperature", units="℃") tec_temp_axis.showLabel() + tec_temp_graph.y_range_controller = LiveAxisRange(y_range_width=0.002) tec_temp_graph.setAxisItems({'left': tec_temp_axis}) tec_temp_graph.addItem(self._tec_setpoint_plot) tec_temp_graph.addItem(self._tec_temp_plot) @@ -224,6 +225,7 @@ class Graphs: tec_i_graph.addLegend(brush=(50, 50, 200, 150)) tec_i_graph.addItem(self._tec_i_target_plot) tec_i_graph.addItem(self._tec_i_measure_plot) + tec_i_graph.y_range_controller = LiveAxisRange(y_range_width=0.05) self.tec_i_target_connector = DataConnector(self._tec_i_target_plot, plot_rate=10.0, update_rate=10.0, max_points=self.max_samples) self.tec_i_measure_connector = DataConnector(self._tec_i_measure_plot, plot_rate=10.0, update_rate=10.0, max_points=self.max_samples) self.connectors += [self.tec_i_target_connector, self.tec_i_measure_connector]