Color palette:
- Control net (nodes + connecting lines): neutral grey (#A8B8D0 / 110,120,140)
— matches DELFTship convention for control polygon handles
- Forward stations (proa): bright green #22CC58
- Aft stations (popa): amber #C8A010
- Midship: orange #FF7020
- Node size reduced 4.5→3.0 px so hull curves dominate visually
Plan view (Vista de Planta):
- World bbox now symmetric: y ∈ [−B/2·1.22, +B/2·1.22] shows BOTH halves
- Waterlines drawn as closed contours: CL-AP → starboard curve → CL-FP
→ port curve (mirrored) → close at CL-AP
Every waterline terminates at the centerline at bow and stern
- Control net grid: both directions (station-arm + waterline-arm) drawn
on port AND starboard — same visual language as DELFTship control polygon
- Station reference lines span full beam (both sides)
- Centerline (eje de crujía) drawn as solid line dividing the two halves
- Edit nodes remain on starboard only; port updates symmetrically
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Root cause: base _w2s mapped world-Z directly to screen-Y (which
increases downward), placing the keel at the TOP of every viewer.
BodyPlanViewer:
- Override _w2s/_s2w/_fit_to_view to invert Y axis (keel now at bottom)
- Fix section drawing: remove keel-appended B-spline closure that
distorted the curve; close section with a straight lineTo(0,0) instead
ProfileViewer:
- Same Y-inversion overrides as BodyPlanViewer
- Add _compute_buttock_pts() helper (interpolates Z at constant Y_b
across all stations) and draw 3 buttock lines (B/4, B/2, 3B/4)
as smooth curves in the profile view
Buttocks, stations and waterlines now appear in their correct views:
Body Plan → station cross-section curves, keel at bottom
Profile → buttock curves (vertical long. sections), keel at bottom
Plan View → waterline contours (unchanged)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- viewer_3d.py: add `ready` Signal emitted once QtInteractor finishes init
- main_window.py: connect ready signal to sync active hull into 3D viewer on startup
- viewer_lines.py: add _smooth_pts helper; replace straight polylines in BodyPlanViewer
and PlanViewer CAPA 3 with B-spline interpolated curves (80 sample points)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
_draw_cnet_bodyplan: eliminated the longitudinal edges (same WL index
across all stations) — in the body plan all sections are overlaid in
the same y-z plane so those connections produce confusing diagonal
spoke patterns radiating from bow/stern. Now only transverse section
polylines are drawn as the muted control-net underlay.
_draw_cnet_planview: likewise removed the redundant longitudinal layer
(waterline contours) because layer-3 already draws them bold on top.
Only the transverse station-direction edges are kept, which are the
genuinely new information in plan view.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- viewer_lines.py: añade toggle curvatura (tecla C), señal offsets_dragging,
método update_offsets (sin resetear zoom/pan), keyPressEvent, hint overlay,
funciones _curvature_comb_data y _draw_curvature_comb para BodyPlan y Plan
- main_window.py: conecta offsets_dragging → slot ligero _on_offsets_dragging
que actualiza vistas 2D en vivo; _on_offsets_edited_from_viewer usa
update_offsets en lugar de set_hull para preservar zoom/pan al soltar
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>