"""Paso 3: dimensiones físicas del buque.""" from __future__ import annotations from PySide6.QtWidgets import ( QDoubleSpinBox, QFormLayout, QLabel, QVBoxLayout, QWidget, QWizardPage, ) from vmssailor.studio.theme import C_FOG, ui_font class Step03Dimensions(QWizardPage): def __init__(self, parent: QWidget | None = None) -> None: super().__init__(parent) self.setTitle("Paso 3 · Dimensiones principales") self.setSubTitle( "Edita las dimensiones principales del buque. Los valores se pre-rellenan " "desde la plantilla del paso 2 si elegiste una." ) layout = QVBoxLayout(self) layout.setSpacing(18) intro = QLabel( "Todas las medidas en metros (sistema internacional). " "Estos valores se usan en core para validar coordenadas de equipos y tarjetas." ) intro.setWordWrap(True) intro.setStyleSheet(f"color: {C_FOG};") intro.setFont(ui_font(10)) layout.addWidget(intro) form = QFormLayout() form.setHorizontalSpacing(20) form.setVerticalSpacing(14) self._loa = self._make_spin(1.0, 200.0, 24.0, " m", 1) form.addRow("Eslora total (LOA):", self._loa) self._beam = self._make_spin(1.0, 30.0, 5.5, " m", 2) form.addRow("Manga máxima:", self._beam) self._draft = self._make_spin(0.3, 10.0, 1.8, " m", 2) form.addRow("Calado:", self._draft) self._bh_aft = self._make_spin(0.0, 200.0, 4.0, " m desde Pp", 1) form.addRow("Mamparo popa sala máquinas:", self._bh_aft) self._bh_fwd = self._make_spin(0.0, 200.0, 8.0, " m desde Pp", 1) form.addRow("Mamparo proa sala máquinas:", self._bh_fwd) layout.addLayout(form) layout.addStretch(1) from vmssailor.studio.wizard.wizard import ( F_BEAM, F_BULKHEAD_AFT, F_BULKHEAD_FWD, F_DRAFT, F_LOA, ) self.registerField(F_LOA, self._loa, "value", "valueChanged") self.registerField(F_BEAM, self._beam, "value", "valueChanged") self.registerField(F_DRAFT, self._draft, "value", "valueChanged") self.registerField(F_BULKHEAD_AFT, self._bh_aft, "value", "valueChanged") self.registerField(F_BULKHEAD_FWD, self._bh_fwd, "value", "valueChanged") def _make_spin(self, lo: float, hi: float, default: float, suffix: str, decimals: int) -> QDoubleSpinBox: s = QDoubleSpinBox() s.setRange(lo, hi) s.setDecimals(decimals) s.setSingleStep(0.1 if decimals >= 1 else 1) s.setSuffix(suffix) s.setValue(default) s.setMinimumWidth(180) return s def initializePage(self) -> None: # If the user picked a template in step 2, pre-fill from it. from vmssailor.studio.wizard.wizard import F_TEMPLATE_ID wizard = self.wizard() tpl_id = self.field(F_TEMPLATE_ID) if not tpl_id or not wizard: return # Look up the step 2 page to get the template dict from vmssailor.studio.wizard.step_02_template import Step02Template for pid in range(8): page = wizard.page(pid) if isinstance(page, Step02Template): tpl = page.get_template() if tpl: self._loa.setValue(tpl["length_overall_m"]) self._beam.setValue(tpl["beam_max_m"]) self._draft.setValue(tpl["draft_m"]) self._bh_aft.setValue(max(2.0, tpl["length_overall_m"] * 0.15)) self._bh_fwd.setValue(max(5.0, tpl["length_overall_m"] * 0.30)) break