fix graph and white background added

This commit is contained in:
Ayzen
2026-10-15 14:46:06 +03:00
parent 5102ed751c
commit 9a9b8ce5c7
35 changed files with 730 additions and 463 deletions
+45 -26
View File
@@ -2,6 +2,7 @@
from collections.abc import Callable
import pyqtgraph as pg
from PyQt6.QtCore import QSignalBlocker
from PyQt6.QtWidgets import QComboBox, QPushButton, QStackedWidget, QWidget
@@ -14,8 +15,12 @@ from python_app.models.dataset_model import ResultCollection, TraceData
from python_app.models.gui_profile_schema import GuiProcessingStateModel
from python_app.models.run_config_schema import GprModel
Renderer = BscanRenderer | GprRenderer | Sar3dRenderer | TraceRenderer
class PlotController:
"""Own the plot views: renderers draw and clear only through it, and it counts image changes."""
def __init__(
self, history: HistoryController, settings: Callable[[], GuiProcessingStateModel],
geometry: Callable[[], GprModel], running: Callable[[], bool],
@@ -36,9 +41,28 @@ class PlotController:
for renderer in (self.bscan, self.gpr, self.sar3d, self.trace):
self.stack.addWidget(renderer.widget)
self.stack.setCurrentWidget(self.trace.widget)
# Counts changes of the shown image (drawing, page, size, view range, a legend click
# hiding a curve) for observers such as the web stream. QGraphicsScene.changed must stay
# unconnected: it switches Qt to a legacy update path that leaves stale pixels behind.
self.revision = 0
self.stack.currentChanged.connect(self._changed)
for plot in self.stack.findChildren(pg.PlotWidget):
item = plot.getPlotItem()
assert item is not None
view = item.getViewBox()
view.sigResized.connect(self._changed)
view.sigRangeChanged.connect(self._changed)
for panel in (self.trace.magnitude, self.trace.phase):
panel.legend.sigSampleClicked.connect(self._changed)
self._combo: QComboBox | None = None
self._next: QPushButton | None = None
def _changed(self, *_args: object) -> None:
self.revision += 1
def _renderer(self, mode: str) -> Renderer:
return {"bscan": self.bscan, "gpr": self.gpr, "sar3d": self.sar3d}.get(mode, self.trace)
def bind_display_controls(self, combo: QComboBox, next_button: QPushButton) -> None:
self._combo, self._next = combo, next_button
combo.currentIndexChanged.connect(self.on_display_combo_changed)
@@ -55,8 +79,7 @@ class PlotController:
return self.sar3d.grid if current is self.sar3d.widget else current
def set_mode(self, mode: str) -> None:
renderer = {"bscan": self.bscan, "gpr": self.gpr, "sar3d": self.sar3d}.get(mode, self.trace)
self.stack.setCurrentWidget(renderer.widget)
self.stack.setCurrentWidget(self._renderer(mode).widget)
self.sync_display_combos()
def select_combo(self, input_pos: int, output_pos: int) -> None:
@@ -96,6 +119,7 @@ class PlotController:
self.sync_display_combos()
def draw_bscan(self) -> bool:
self._changed()
self.sync_bscan()
window, retained = self.window_scans(), len(self.history.preprocessed)
if retained < window and self.bscan.history_by_combo:
@@ -119,6 +143,7 @@ class PlotController:
return False
if mode == "bscan":
return self.draw_bscan()
self._changed()
if mode == "gpr":
return self.gpr.draw(collection, settings.gpr, self._geometry())
if mode == "sar3d":
@@ -126,42 +151,36 @@ class PlotController:
return self.trace.draw(collection, settings.pass_through)
def redraw(self, *_args: object) -> None:
"""Show the newest result with the current settings."""
mode = self._settings().selected_mode
if mode == "bscan":
self.draw_bscan()
elif mode == "sar3d":
self.sar3d.clear()
if self.history.results:
self.draw(self.history.results[-1])
elif not self.history.results or not self.draw(self.history.results[-1]):
self.clear_current()
return
# Cleared first: a result of another settings revision is not drawn and must not
# leave the previous image, while a renderer's own failure message is kept.
self._changed()
self._renderer(mode).clear()
if self.history.results:
self.draw(self.history.results[-1])
def draw_trace(self, trace: TraceData, title: str) -> None:
self._changed()
self.trace.draw_trace(trace, title, self._settings().pass_through)
def clear_trace(self) -> None:
self._changed()
self.trace.clear()
def clear_bscan(self) -> None:
self._changed()
self.bscan.clear()
self.sync_display_combos()
def clear_gpr(self) -> None:
self.gpr.clear()
def clear_current(self) -> None:
mode = self._settings().selected_mode
if mode == "bscan":
self.clear_bscan()
elif mode == "gpr":
self.clear_gpr()
elif mode == "sar3d":
self.sar3d.clear()
else:
self.trace.clear()
def clear(self) -> None:
self.clear_bscan()
self.clear_gpr()
self.sar3d.clear()
self.trace.clear()
self._changed()
for renderer in (self.bscan, self.gpr, self.sar3d, self.trace):
renderer.clear()
self.sync_display_combos()
@staticmethod
def has_output(collection: ResultCollection) -> bool: