little refactoring done

This commit is contained in:
Ayzen
2026-03-10 17:33:25 +03:00
parent 9c745f304e
commit 1f715ce22c
10 changed files with 520 additions and 245 deletions
+87 -63
View File
@@ -6,7 +6,6 @@ from PyQt6.QtCore import pyqtSignal
from PyQt6.QtWidgets import (
QComboBox,
QDialog,
QFormLayout,
QGridLayout,
QGroupBox,
QHBoxLayout,
@@ -23,7 +22,13 @@ from python_app.models.dataset_model import TraceData
class PreprocessDialog(QDialog):
"""Standalone dialog for preprocessing capture workflows."""
"""Standalone dialog for preprocessing capture workflows.
The dialog combines three concerns:
1. Set selection (calibration/reference).
2. Sequential capture controls for filling all N*M combinations.
3. Quick preview of the last captured trace.
"""
refresh_requested = pyqtSignal()
selection_changed = pyqtSignal(str, str)
@@ -32,64 +37,97 @@ class PreprocessDialog(QDialog):
abort_sequence_requested = pyqtSignal()
def __init__(self, parent=None) -> None:
"""Create dialog and build all widgets."""
"""Initialize window metadata and compose dialog UI."""
super().__init__(parent)
self.setWindowTitle("Preprocessing Setup")
self.resize(1040, 760)
self._init_window()
self._build_ui()
def _init_window(self) -> None:
"""Set static window properties."""
self.setWindowTitle("Preprocessing Setup")
self.resize(1040, 760)
def _build_ui(self) -> None:
"""Build dialog layout, controls, and preview plot."""
layout = QVBoxLayout(self)
"""Build root dialog layout and all sections."""
root_layout = QVBoxLayout(self)
root_layout.addWidget(self._build_sets_group())
root_layout.addWidget(self._build_sequence_group())
self._build_status_line(root_layout)
self._build_preview_plot(root_layout)
sets_group = QGroupBox("Calibration / Reference Sets", self)
sets_layout = QGridLayout(sets_group)
def _build_sets_group(self) -> QGroupBox:
"""Build set-management controls used for preprocessing snapshots."""
group = QGroupBox("Calibration / Reference Sets", self)
layout = QGridLayout(group)
self._set_name_input = QLineEdit("set_001", sets_group)
self._calibration_combo = QComboBox(sets_group)
self._reference_combo = QComboBox(sets_group)
self._set_name_input = QLineEdit("set_001", group)
self._calibration_combo = QComboBox(group)
self._reference_combo = QComboBox(group)
refresh_button = QPushButton("Refresh Sets", sets_group)
refresh_button = QPushButton("Refresh Sets", group)
refresh_button.clicked.connect(self.refresh_requested.emit)
self._calibration_combo.currentTextChanged.connect(self._emit_selection_changed)
self._reference_combo.currentTextChanged.connect(self._emit_selection_changed)
sets_layout.addWidget(QLabel("Set name"), 0, 0)
sets_layout.addWidget(self._set_name_input, 0, 1)
sets_layout.addWidget(refresh_button, 0, 2)
layout.addWidget(QLabel("Set name"), 0, 0)
layout.addWidget(self._set_name_input, 0, 1)
layout.addWidget(refresh_button, 0, 2)
sets_layout.addWidget(QLabel("Calibration set"), 1, 0)
sets_layout.addWidget(self._calibration_combo, 1, 1, 1, 2)
layout.addWidget(QLabel("Calibration set"), 1, 0)
layout.addWidget(self._calibration_combo, 1, 1, 1, 2)
sets_layout.addWidget(QLabel("Reference set"), 2, 0)
sets_layout.addWidget(self._reference_combo, 2, 1, 1, 2)
layout.addWidget(QLabel("Reference set"), 2, 0)
layout.addWidget(self._reference_combo, 2, 1, 1, 2)
return group
layout.addWidget(sets_group)
def _build_sequence_group(self) -> QGroupBox:
"""Build sequential-capture controls and capture log."""
group = QGroupBox("Sequential Capture (Fill Full N*M)", self)
layout = QGridLayout(group)
sequence_group = QGroupBox("Sequential Capture (Fill Full N*M)", self)
sequence_layout = QGridLayout(sequence_group)
self._active_kind_label = QLabel("<none>", group)
self._progress_label = QLabel("0 / 0", group)
self._combo_label = QLabel("<none>", group)
self._active_kind_label = QLabel("<none>", sequence_group)
self._progress_label = QLabel("0 / 0", sequence_group)
self._combo_label = QLabel("<none>", sequence_group)
self._tx_antenna_label_input = QLineEdit(sequence_group)
self._rx_antenna_label_input = QLineEdit(sequence_group)
self._tx_antenna_label_input = QLineEdit(group)
self._rx_antenna_label_input = QLineEdit(group)
self._tx_antenna_label_input.setPlaceholderText("e.g. TX_A")
self._rx_antenna_label_input.setPlaceholderText("e.g. RX_B")
start_calibration_button = QPushButton("Start Calibration Sequence", sequence_group)
button_row = self._build_sequence_button_row(group)
layout.addWidget(QLabel("Active type"), 0, 0)
layout.addWidget(self._active_kind_label, 0, 1)
layout.addWidget(QLabel("Progress"), 1, 0)
layout.addWidget(self._progress_label, 1, 1)
layout.addWidget(QLabel("Current combo"), 2, 0)
layout.addWidget(self._combo_label, 2, 1)
layout.addWidget(QLabel("TX antenna label"), 3, 0)
layout.addWidget(self._tx_antenna_label_input, 3, 1)
layout.addWidget(QLabel("RX antenna label"), 4, 0)
layout.addWidget(self._rx_antenna_label_input, 4, 1)
layout.addLayout(button_row, 5, 0, 1, 2)
self._capture_log = QPlainTextEdit(group)
self._capture_log.setReadOnly(True)
self._capture_log.setPlaceholderText("Capture history per combo")
layout.addWidget(self._capture_log, 6, 0, 1, 2)
return group
def _build_sequence_button_row(self, parent: QGroupBox) -> QHBoxLayout:
"""Build action buttons for sequence flow control."""
start_calibration_button = QPushButton("Start Calibration Sequence", parent)
start_calibration_button.clicked.connect(lambda: self.start_sequence_requested.emit("calibration"))
start_reference_button = QPushButton("Start Reference Sequence", sequence_group)
start_reference_button = QPushButton("Start Reference Sequence", parent)
start_reference_button.clicked.connect(lambda: self.start_sequence_requested.emit("reference"))
self._capture_next_button = QPushButton("Capture Current Combo", sequence_group)
self._capture_next_button = QPushButton("Capture Current Combo", parent)
self._capture_next_button.clicked.connect(self.capture_next_requested.emit)
self._capture_next_button.setEnabled(False)
self._abort_button = QPushButton("Abort Sequence", sequence_group)
self._abort_button = QPushButton("Abort Sequence", parent)
self._abort_button.clicked.connect(self.abort_sequence_requested.emit)
self._abort_button.setEnabled(False)
@@ -98,34 +136,20 @@ class PreprocessDialog(QDialog):
button_row.addWidget(start_reference_button)
button_row.addWidget(self._capture_next_button)
button_row.addWidget(self._abort_button)
return button_row
sequence_layout.addWidget(QLabel("Active type"), 0, 0)
sequence_layout.addWidget(self._active_kind_label, 0, 1)
sequence_layout.addWidget(QLabel("Progress"), 1, 0)
sequence_layout.addWidget(self._progress_label, 1, 1)
sequence_layout.addWidget(QLabel("Current combo"), 2, 0)
sequence_layout.addWidget(self._combo_label, 2, 1)
sequence_layout.addWidget(QLabel("TX antenna label"), 3, 0)
sequence_layout.addWidget(self._tx_antenna_label_input, 3, 1)
sequence_layout.addWidget(QLabel("RX antenna label"), 4, 0)
sequence_layout.addWidget(self._rx_antenna_label_input, 4, 1)
sequence_layout.addLayout(button_row, 5, 0, 1, 2)
def _build_status_line(self, root_layout: QVBoxLayout) -> None:
"""Build one-line status output for dialog operations."""
self._status_label = QLabel("Ready", self)
root_layout.addWidget(self._status_label)
self._capture_log = QPlainTextEdit(sequence_group)
self._capture_log.setReadOnly(True)
self._capture_log.setPlaceholderText("Capture history per combo")
sequence_layout.addWidget(self._capture_log, 6, 0, 1, 2)
layout.addWidget(sequence_group)
self._status = QLabel("Ready", self)
layout.addWidget(self._status)
self._plot = pg.PlotWidget(background="#101418")
self._plot.showGrid(x=True, y=True, alpha=0.2)
self._plot.setLabel("bottom", "Frequency", units="Hz")
self._plot.setLabel("left", "Magnitude", units="dB")
layout.addWidget(self._plot, stretch=1)
def _build_preview_plot(self, root_layout: QVBoxLayout) -> None:
"""Build trace preview plot used after each successful capture."""
self._preview_plot = pg.PlotWidget(background="#101418")
self._preview_plot.showGrid(x=True, y=True, alpha=0.2)
self._preview_plot.setLabel("bottom", "Frequency", units="Hz")
self._preview_plot.setLabel("left", "Magnitude", units="dB")
root_layout.addWidget(self._preview_plot, stretch=1)
def set_name(self) -> str:
"""Return requested target set name."""
@@ -220,19 +244,19 @@ class PreprocessDialog(QDialog):
def set_status(self, message: str) -> None:
"""Set short human-readable status line."""
self._status.setText(message)
self._status_label.setText(message)
def draw_last_trace(self, trace: TraceData, title: str) -> None:
"""Draw the latest captured sweep trace in dB scale."""
magnitude_db = 20.0 * np.log10(np.maximum(np.abs(trace.s21), 1e-12))
self._plot.clear()
self._plot.plot(
self._preview_plot.clear()
self._preview_plot.plot(
trace.frequency_hz,
magnitude_db,
pen=pg.mkPen("#4cc9f0", width=1.8),
)
combo = trace.combo
self._status.setText(
self._status_label.setText(
f"{title}: input={combo.input_pos}, output={combo.output_pos}, points={trace.frequency_hz.size}"
)