From de4609ea003213c074fb3417083de1fd0532aa33 Mon Sep 17 00:00:00 2001 From: andrey Date: Sun, 27 Sep 2026 02:53:37 +0300 Subject: [PATCH] Keep interpolation results when sources are hidden and allow individual removal --- .../set_devices/qt_ports/plot_processing.py | 23 +++++++++++++++++++ python/tests/test_plot_processing_qt.py | 10 ++++++++ 2 files changed, 33 insertions(+) diff --git a/python/set_devices/qt_ports/plot_processing.py b/python/set_devices/qt_ports/plot_processing.py index 4ab4faa..25c8ac3 100644 --- a/python/set_devices/qt_ports/plot_processing.py +++ b/python/set_devices/qt_ports/plot_processing.py @@ -145,6 +145,10 @@ class SignalProcessingPanel(QWidget): for result in self._results: request = result.request source = replace(snapshot, x_range=request.x_range) if self.preserve_on_view_change else snapshot + # Visibility selects inputs for NEW calculations; existing results + # depend on samples/units, not the source curve's checkbox. + source = replace(source, series=tuple(replace(series, visible=True) + for series in source.series)) if prepare(source, request.series.key, request.method, request.output_count, request.degree) == request: retained.append(result) if len(retained) != len(self._results): @@ -185,6 +189,25 @@ class SignalProcessingPanel(QWidget): self.status.setText("Нажмите «Рассчитать», чтобы добавить кривую. Предыдущие результаты сохраняются.") self._update_actions() + def remove_curve(self, key): + for curve in self._results: + index = self._result_ids[id(curve)] + curve_key = self.RESULT_KEY if index == 0 else f"{self.RESULT_KEY}_{index}" + if curve_key != key: + continue + if self._job is not None and self._job.signature == curve.request: + self._revision += 1 + self._results.remove(curve) + del self._result_ids[id(curve)] + if self._result is curve: + self._result = self._results[-1] if self._results else None + self._result_signature = self._result.request if self._result is not None else None + self.status.setText(f"Расчётная кривая удалена. Осталось: {len(self._results)}.") + self._update_actions() + self.changed.emit() + return True + return False + def calculate(self): if self._job is not None or self._snapshot.blocked_reason: return diff --git a/python/tests/test_plot_processing_qt.py b/python/tests/test_plot_processing_qt.py index 040de12..d846863 100644 --- a/python/tests/test_plot_processing_qt.py +++ b/python/tests/test_plot_processing_qt.py @@ -112,6 +112,16 @@ class ProcessingQtTests(unittest.TestCase): self.panel._finished(self.panel._job.signature, None, "test error") self.assertEqual((previous,), self.panel.curves) + def test_hidden_source_preserves_result_but_changed_samples_invalidate_it(self): + self.calculate() + curve = self.panel.curve + hidden = replace(self.snapshot, series=(replace(self.snapshot.series[0], visible=False),)) + self.panel.set_snapshot(hidden) + self.assertEqual((curve,), self.panel.curves) + self.assertTrue(self.panel.export_button.isEnabled()) + self.panel.set_snapshot(replace(hidden, series=(replace(hidden.series[0], points=((0, 2), (1, 3))),))) + self.assertEqual((), self.panel.curves) + def test_source_units_and_blocking_invalidate_result(self): for changed in (replace(self.snapshot, axis=Axis("Frequency", "Hz")), replace(self.snapshot, source="new file"),