feat(stability): Módulo 3 — Curva GZ + criterios IMO IS Code 2008

- gz_integrator.py: GZCurve, GZPoint, compute_gz_wall_sided (fórmula
  pared lateral), compute_gz_direct (integración Sutherland-Hodgman)
- imo_is2008.py: IMOCriterion, IMOResult, check_imo_is2008 —
  6 criterios A.2.1.1–A.2.1.6 del IS Code 2008 Cap.2
- gz_curve_widget.py: GZCurveWidget QPainter — curva cian, áreas
  sombreadas, líneas IMO, marcador AVS, tabla PASS/FAIL integrada
- main_window.py: GZCurveWidget en MOD_STABILITY, _compute_and_show_gz,
  _on_show_stability conectado al ribbon
- dark.qss: estilos GZCurveWidget
- test_module3_stability.py: 33 tests S-01..S-28 (315 total, todos pasan)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-27 13:59:32 -04:00
parent 62de89d63c
commit 0f85935fc8
7 changed files with 1871 additions and 3 deletions
+26
View File
@@ -514,3 +514,29 @@ QLabel#hydroPlaceholder {
background-color: #1a1d30;
padding: 40px;
}
/* ─── Módulo 3: Estabilidad ─── */
GZCurveWidget {
background: #0A0E1A;
border: 1px solid #1A2540;
border-radius: 4px;
}
#gzChartTitle {
color: #00FFCC;
font-family: "Rajdhani", "Segoe UI", sans-serif;
font-size: 11px;
font-weight: 600;
letter-spacing: 1px;
}
#gzPassLabel {
color: #00FF88;
font-family: "Consolas", "Courier New", monospace;
font-size: 11px;
font-weight: bold;
}
#gzFailLabel {
color: #FF4444;
font-family: "Consolas", "Courier New", monospace;
font-size: 11px;
font-weight: bold;
}