test_iacs_rec34.py: 29 tests organizados en 6 clases segun IACS Rec.34:
A. par.4.3 Verificacion analitica (V001-V009):
V, Cb, Awp, Cw, LCB, KB, IT, TPC, KMT vs. solucion analitica Wigley.
B. par.4.4 Convergencia de malla (V010-V012):
Error de V y Awp decrece monotonamente n=11->21->41->81.
C. par.4.5 Simetria (V013-V015):
LCB=L/2, areas de cuadernas simetricas, offsets simetricos.
D. Geometria NURBS (V016-V019):
BSplineCurve (linea recta exacta, semicirculo); superficie Wigley
(semi-manga correcta en midship, cero en AP/FP).
E. Serializacion / trazabilidad par.6 (V020-V023):
V, IT, tabla de offsets identica tras round-trip; JSON legible
por auditor externo (sin base64, floats decimales).
F. Cobertura (meta-test V001-V023 documentados en el modulo).
Tolerancias explicitas por tipo de integral (par.6.3):
integrales directas < 0.5 %, momentos 1er orden < 1 %,
momentos 2do orden < 2 %, coeficientes adim. < 0.005.
Suite total: 141 tests -- 141 passed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- hull.py: Hull.to_dict() serializa a dict JSON con formato hull_v1
(arrays numpy -> listas Python); Hull.from_dict() deserializa con
validacion de claves y forma de array.
- project.py: Project.hull (property lazy) deserializa el Hull desde
ship_data; Project.set_hull() persiste el Hull y marca is_modified.
- main_window.py: _on_new_project guarda el Hull en el proyecto;
_on_project_loaded restaura el Hull en todos los visores al abrir
un archivo .arsd; _on_hull_changed_from_editor mantiene el proyecto
sincronizado con ediciones en el editor de offsets.
- test_serialization.py: 26 tests (round-trip dict, round-trip ZIP,
5 familias parametricas, escritura atomica, proyecto sin Hull).
Suite total: 112 tests -- 112 passed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- offsets_editor.py: OffsetsEditor (QTableWidget editable con zoom de
celdas modificadas en ambar, invalidas en rojo; Aplicar reconstruye Hull
y emite hull_changed; importar/exportar CSV; info bar con dimensiones).
- main_window.py: OffsetsEditor inyectado como MOD_OFFSETS (F4);
_load_hull_viewers recibe _skip_offsets_editor para evitar bucle;
_on_hull_changed_from_editor propaga el Hull editado a todos los visores
y al panel de hidrostáticos en vivo; ModuleArea.set_module_widget()
para reemplazar placeholders en tiempo de setup.
86 tests pasan sin regresiones.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- viewer_lines.py: BodyPlanViewer, ProfileViewer, PlanViewer (QPainter,
zoom/paneo, tema dark navy); conectados a los tres viewports 2D del
layout 4-viewport (bodyplan / profile / plan).
- hull.py: añadidos waterplane_coefficient (Cw), it_waterplane (IT),
il_waterplane (IL), bm_transverse (BMT), bm_longitudinal (BML),
km_transverse (KMT), tpc, mct1cm — todos verificados analíticamente
contra el casco Wigley (IACS Rec.34 §4.3).
- main_window.py: _load_hull_viewers() conecta los 4 visores y el panel
hidrostáticos al crear un nuevo proyecto; _update_hydrostatics() puebla
los 11 campos de la barra inferior en vivo.
- test_module1_hydrostatics.py: 35 tests nuevos (IT analítico exacto,
consistencia BMT=IT/V, KMT=KB+BMT, TPC=Awp·ρ/1e5, visores headless).
Suite total: 86 tests — 86 passed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Qt dimensiona QToolButton por el ícono (22px), no por el texto, lo que
causaba que etiquetas como 'Nuevo Tq.' se cortaran al renderizar.
Ahora add_button() usa fontMetrics().horizontalAdvance(text)+20 para
establecer setMinimumWidth() correcto en cada botón.
Además: RibbonBar.setFixedHeight(110) (antes 92), padding y font-size
del ribbonButton QSS aumentados ligeramente para mejor legibilidad.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Reemplaza fondos casi-negros (#0e1117, #1e2128) por paleta
azul-gris marino profesional (#252a38 main, #1a1e2c viewport canvas)
- Elimina max-width:72px de ribbonButton — texto como "C. Incendio",
"Post-Proc.", "Agua Dulce" ya no se corta
- layerVisBtn: indicador visual por color (azul=#0d99ff visible /
gris=#363b4e oculta) sin depender de texto ni ícono
- layerLockBtn: ámbar=#fbbf24 bloqueada / gris libre
- Mejora contraste de ribbonGroupTitle, viewportTitle,
placeholderTitle, placeholderDesc y viewportPlaceholder
- Agrega border-bottom a ribbonContent para separación visual
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Replace simple QToolBar with 6-tab functional RibbonBar
(Home / Geometría / Análisis / Tanques / Sistemas / Fabricación)
Each tab shows relevant button groups with icons + text below.
- Replace single 3D placeholder with FourViewport layout
(Perspectiva 3D · Vista Lateral · Body Plan · Vista de Planta)
divided by draggable cyan splitters — standard naval CAD layout.
- Replace ProjectTreePanel with DELFTship-style LayersPanel:
10 preset layers with visibility toggle, lock toggle, and color swatch.
- Add pipe/cable routing modules (MOD_ROUTING_PIPES=21, MOD_ROUTING_CABLES=22)
visible in Sistemas ribbon tab and main menu under Sistemas → Routing 3D.
- Move Units/Language info from toolbar to status bar (cleaner ribbon).
- Update dark.qss: new styles for ribbon tabs, viewports, layers panel,
viewport splitter handles (accent blue), placeholder text.
- All 12 Sprint 0 tests pass.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>