_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>
_StepBar:
- setFixedHeight(40→54) — label text (cy+r+4=34, h=16) ya no se recorta
- cy fijado a 20 en lugar de h//2 para dejar margen inferior al texto
- drawText rect ampliado a 112×16 para labels más largos (esp. "Refinamiento")
- setStyleSheet background:_PANEL para que coincida con el header
NewShipWizard content area:
- QStackedWidget: stylesheet "background:_BG" para el widget contenedor
- Cada página de paso: autoFillBackground=True + palette Window→_BG
(palette en vez de setStyleSheet evita que el fondo cascadee a los
hijos QDoubleSpinBox/QLineEdit que tienen sus propios estilos inline)
- QPalette añadido al import de PySide6.QtGui
282 tests, 0 fallos.
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>