Keep interpolation results when sources are hidden and allow individual removal

This commit is contained in:
2026-09-27 02:53:37 +03:00
parent caf30f2ed6
commit de4609ea00
2 changed files with 33 additions and 0 deletions

View File

@@ -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

View File

@@ -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"),