Source code for sec_interp.gui.ui.pages.structure_page

from __future__ import annotations

"""Structural configuration page."""

from typing import Any

from qgis.core import QgsMapLayerProxyModel
from qgis.gui import QgsDoubleSpinBox, QgsFieldComboBox, QgsMapLayerComboBox
from qgis.PyQt.QtCore import QCoreApplication, pyqtSignal
from qgis.PyQt.QtWidgets import QGridLayout, QLabel

from sec_interp.core.validation.project_validator import (
    ProjectValidator,
    ValidationParams,
)
from sec_interp.gui.main_dialog_config import DialogDefaults

from .base_page import BasePage


[docs] class StructurePage(BasePage): """Configuration page for Structural Measurements.""" dataChanged = pyqtSignal() def __init__(self, parent: Any = None) -> None: super().__init__( QCoreApplication.translate("StructurePage", "Structural Measurements"), parent, ) def _setup_ui(self) -> None: super()._setup_ui() self.group_layout = QGridLayout(self.group_box) self.group_layout.setSpacing(6) # Row 0: Structural Layer self.group_layout.addWidget(QLabel(self.tr("Structural Layer")), 0, 0) self.layer_combo = QgsMapLayerComboBox() # Use modern flags if available (QGIS 3.32+) try: from qgis.core import Qgis # noqa: PLC0415 self.layer_combo.setFilters(Qgis.LayerFilters(Qgis.LayerFilter.PointLayer)) except (ImportError, AttributeError, TypeError): self.layer_combo.setFilters(QgsMapLayerProxyModel.PointLayer) self.layer_combo.setAllowEmptyLayer(True) self.layer_combo.setToolTip(self.tr("Select the point layer with structural measurements")) self.layer_combo.setCurrentIndex(0) self.group_layout.addWidget(self.layer_combo, 0, 1) # Row 1: Dip Field self.group_layout.addWidget(QLabel(self.tr("Dip Field")), 1, 0) self.dip_combo = QgsFieldComboBox() self.dip_combo.setToolTip(self.tr("Select field with dip values (0-90)")) self.group_layout.addWidget(self.dip_combo, 1, 1) # Row 2: Strike Field self.group_layout.addWidget(QLabel(self.tr("Strike Field")), 2, 0) self.strike_combo = QgsFieldComboBox() self.strike_combo.setToolTip(self.tr("Select field with strike values (0-360)")) self.group_layout.addWidget(self.strike_combo, 2, 1) # Row 3: Dip Line Scale self.group_layout.addWidget(QLabel(self.tr("Dip Line Scale")), 3, 0) self.scale_spin = QgsDoubleSpinBox() self.scale_spin.setRange(0.1, 100.0) self.scale_spin.setValue(float(DialogDefaults.DIP_SCALE_FACTOR)) self.scale_spin.setSingleStep(0.5) self.scale_spin.setToolTip(self.tr("Length factor for drawing dip lines")) self.group_layout.addWidget(self.scale_spin, 3, 1) # Connections: update fields when layer changes self.layer_combo.layerChanged.connect(self._on_layer_changed) # Emit dataChanged when selections change self.layer_combo.layerChanged.connect(self.dataChanged.emit) self.dip_combo.fieldChanged.connect(self.dataChanged.emit) self.strike_combo.fieldChanged.connect(self.dataChanged.emit) def _on_layer_changed(self, layer: Any) -> None: """Update both field combos when layer changes.""" self.dip_combo.setLayer(layer) self.strike_combo.setLayer(layer)
[docs] def get_data(self) -> dict[str, Any]: """Get structural configuration.""" return { "structural_layer": self.layer_combo.currentLayer(), "dip_field": self.dip_combo.currentField(), "strike_field": self.strike_combo.currentField(), "dip_scale_factor": self.scale_spin.value(), }
[docs] def is_complete(self) -> bool: """Check if required fields are filled if a layer is selected.""" data = self.get_data() params = ValidationParams( struct_layer=data["structural_layer"], struct_dip_field=data["dip_field"], struct_strike_field=data["strike_field"], ) return ProjectValidator.is_structure_complete(params)