Commit Graph

8 Commits

Author SHA1 Message Date
alro65 bdfd5ac4ca Módulo 1: visores 2D del plano de líneas + hidrostáticos en vivo
- 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>
2026-05-27 08:25:09 -04:00
alro65 002c00aff3 feat(sprint2): wizard 'Nuevo Proyecto' + 5 generadores paramétricos de casco
Generadores paramétricos (arshipdesign/parametric/):
  - wizard_planing.py    → V-fondo, chine dura, deadrise variable AP→FP
  - wizard_cruiser.py    → Carena redonda, plan form Lackenby, Cm ajustable
  - wizard_workboat.py   → Sección cajón, pantoque duro, fondo plano
  - wizard_sailing_mono.py → Velero fin keel, sección fina, LCB a popa
  - series60.py          → Serie 60 / mercante full, Cm ~ 0.96
  - __init__.py          → API unificada generate_hull(family, lpp, beam, draft)
                           + HullFamily enum con labels, rangos Cb, descripciones

Wizard UI (arshipdesign/ui/dialogs/wizards.py):
  - NewShipWizard: QDialog 4 pasos con barra de progreso animada
  - _StepDimensions:  nombre, Lpp, B, puntal, calado + ratios L/B y B/T en vivo
  - _StepFamily:      6 FamilyCard con HullThumbnail QPainter (sección maestra)
  - _StepRefine:      sliders Cb y LCB, spinboxes discretización
  - _StepPreview:     tabla hidrostáticos completa (V, D, Cb, LCB, KB, Awp...)
  - Al aceptar → Hull cargado en visor 3D del viewport Perspectiva

MainWindow:
  - _on_new_project() abre NewShipWizard (antes creaba proyecto vacío)
  - Tras accept(): carga hull en Viewer3DWidget si disponible

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-27 07:52:46 -04:00
alro65 503e00bfc9 feat(sprint1): motor NURBS, modelos de casco, visor 3D PyVista
Geometría:
  - BSplineCurve: interpolación scipy, arc_length, tangente, chord-length
  - LoftedSurface: lofting de secciones → RectBivariateSpline bivariate

Core (casco Wigley como caso de prueba):
  - Section: área, centroide_z, max_half_breadth, curva B-spline
  - OffsetsTable: from_wigley(), to_sections(), interpolación xy
  - Hull: volumen, Awp, LCB, VCB, Cb, Cm, Cp, desplazamiento, to_mesh()

UI:
  - Viewer3DWidget (pyvistaqt.QtInteractor): casco Wigley por defecto
    al arrancar, fondo navy, waterplane semi-transparente, fallback
    graceful si PyVista no disponible
  - MainWindow: Viewer3DWidget inyectado en viewport Perspectiva 3D

Tests: 39 nuevos tests, fórmulas analíticas Wigley verificadas (±1%)
  V = 4BLT/9, Cb = 4/9, Awp = 2BL/3 (derivación correcta)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-27 01:07:35 -04:00
alro65 135f097079 fix(ribbon): calcular ancho mínimo de botones desde métricas de texto
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>
2026-05-27 00:35:03 -04:00
alro65 0c15b5aeeb fix(ui): Ocean Slate theme — legibilidad, 4 viewports diferenciados
Problema 1 — texto oscuro ilegible
  - ribbonButton disabled: #555c6e → #7a8ba8 (contraste ≥3.5:1)
  - ribbonGroupTitle: #6b7385 → #9aa3bc (legible)
  - placeholderTitle/Desc/Msg: colores más claros y visibles

Problema 2 — 4 viewports indistinguibles (negro monótono)
  - Cada viewport tiene objectName propio (viewportTitleBar_perspective etc.)
  - 4 barras de título con colores únicos:
      perspective → azul profundo   #1e2550 / texto #6888d8
      profile     → teal marino     #143040 / texto #40a8b8
      bodyplan    → índigo          #28183c / texto #8868c8
      plan        → verde oscuro    #142814 / texto #48a858
  - QFrame viewport: borde 2px solid #2a3060 (claramente visible)
  - setHandleWidth(5) en Python (3→5 px) + QSS hover acento

Problema 3 — fondo negro de muertos
  - Main bg: #252a38 → #2c3042 (slate medio, claramente gris-azul)
  - Paneles:  #2e3342 → #343848
  - Viewport canvas: #1a1e2c → #1a1d30 (navy, no neutral)
  - Línea acento (#4da8ff) bajo ribbon y sobre hidrostáticos

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 00:14:20 -04:00
alro65 d0d47ec5fb fix(theme): palette Deep Navy Slate + legibilidad ribbon + capa indicadores
- 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>
2026-05-26 23:43:29 -04:00
alro65 0dc1050e5a feat(ui): ribbon bar + 4-viewport layout + layers panel
- 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>
2026-05-26 23:30:08 -04:00
alro65 0dbc2a4518 v0.1-sprint0: Esqueleto completo AR-ShipDesign
- Estructura completa de carpetas (236 módulos stub + implementados)
- pyproject.toml, requirements, .gitignore, LICENSE (propietario)
- core/project.py: serialización .arsd (ZIP con JSON)
- core/units.py: conversiones SI <-> imperial completas
- ui/main_window.py: layout DELFTship-style con todos los paneles
  - Árbol de proyecto (dock izquierda)
  - Tabs de módulos (centro)
  - Panel de propiedades (dock derecha)
  - Panel hidrostáticos en vivo (inferior, fijo)
- ui/i18n: español e inglés
- ui/themes: tema claro y oscuro
- utils/logger.py, settings.py, validation.py
- data/liquids.json: 15 líquidos navales
- data/stability_criteria.json: IMO IS Code 2008, A.749(18), USCG
- tests/test_startup.py: 12 tests, todos PASSED
- Módulo scantling/ ISO 12215 (stubs Sprint 2.5)
- Módulo fabrication/molds/ para moldes FRP (stubs Sprint 13B)
- Módulo fabrication/ para CNC plasma/router/laser (stubs Sprint 13)
2026-05-26 22:10:18 -04:00