- 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>