diff --git a/arshipdesign/ui/widgets/viewer_lines.py b/arshipdesign/ui/widgets/viewer_lines.py index 7080714..ed337bb 100644 --- a/arshipdesign/ui/widgets/viewer_lines.py +++ b/arshipdesign/ui/widgets/viewer_lines.py @@ -307,18 +307,17 @@ class _BaseViewer(QWidget): def _draw_cnet_bodyplan(p: QPainter, ot, w2s_fn) -> None: """Dibuja la malla de control en el Body Plan. - Capa visual entre la grilla de referencia y las curvas del casco: - • Aristas transversales — polilínea de control de cada sección - (equal to the section control polyline, muted, drawn BEFORE the - actual hull-curve so the colored curve reads on top of it). - • Aristas longitudinales — segmentos horizontales a la altura de cada - línea de agua, conectando todos los nodos de esa LdA en ambas bandas. - Permiten ver cómo varía la manga de proa a popa en cada calado. + En el body plan TODAS las secciones se superponen en el mismo plano + y-z, por lo que las aristas longitudinales (mismo índice de LdA a + través de todas las estaciones) producen líneas diagonales en abanico + que carecen de sentido visual. Aquí solo se dibujan las aristas + TRANSVERSALES: la polilínea de control de cada sección, idéntica a la + curva del casco pero dibujada en color muted ANTES que la curva bold, + de forma que el ojo ve claramente «control net → curva encima». """ n_sta = ot.n_stations n_wl = ot.n_waterlines - # ── Aristas transversales (a lo largo de cada sección) ──────────── pen_t = QPen(_CNET_TRAN, 0.8, Qt.PenStyle.SolidLine) p.setPen(pen_t) p.setBrush(Qt.BrushStyle.NoBrush) @@ -335,62 +334,26 @@ def _draw_cnet_bodyplan(p: QPainter, ot, w2s_fn) -> None: path.lineTo(w2s_fn(0.0, 0.0)) p.drawPath(path) - # ── Aristas longitudinales (a lo largo de cada LdA) ─────────────── - # Para cada LdA j: una polilínea a través de todas las estaciones, en - # cada banda por separado (proa=+y, popa=−y). Se ve como un arco a - # la altura z[j], mostrando la variación de manga longitudinalmente. - pen_l = QPen(_CNET_LONG, 0.7, Qt.PenStyle.SolidLine) - p.setPen(pen_l) - for j in range(n_wl): - z = ot.z_waterlines[j] - # Banda de proa (estribor, sign=+1) - path_fwd = QPainterPath() - path_aft = QPainterPath() - for i in range(n_sta): - sign = 1.0 if i >= n_sta // 2 else -1.0 - pt = w2s_fn(sign * ot.data[i, j], z) - if i == 0: - path_aft.moveTo(pt) - elif i == n_sta // 2: - path_fwd.moveTo(pt) - if i < n_sta // 2: - path_aft.lineTo(pt) - else: - path_fwd.lineTo(pt) - p.drawPath(path_fwd) - p.drawPath(path_aft) - def _draw_cnet_planview(p: QPainter, ot, w2s_fn) -> None: """Dibuja la malla de control en la Vista de Planta. - • Aristas longitudinales — waterlines (conectan todas las estaciones - en una LdA = las curvas de contorno, dibujadas muted ANTES de las - curvas reales). - • Aristas transversales — polilínea vertical por estación, - conectando los nodos de esa estación a lo largo de todas las LdA. - Muestra cómo cambia la manga con el calado para cada estación. + Solo aristas TRANSVERSALES: por cada estación i, una polilínea + vertical que conecta sus nodos a lo largo de todas las LdA + (x constante, y varía de 0 a manga máxima en esa estación). + Esto muestra claramente «este nodo pertenece a esta estación» y + distingue los nodos longitudinales (en la waterline) de los + transversales (en la estación). + + Las aristas longitudinales (waterlines) se omiten aquí porque la + Capa 3 ya las dibuja como las propias curvas del casco, más bold. """ n_sta = ot.n_stations n_wl = ot.n_waterlines - # ── Aristas longitudinales (contornos de LdA) ───────────────────── - pen_l = QPen(_CNET_LONG, 0.7, Qt.PenStyle.SolidLine) - p.setPen(pen_l) - p.setBrush(Qt.BrushStyle.NoBrush) - for j in range(n_wl): - path = QPainterPath() - for i in range(n_sta): - pt = w2s_fn(ot.x_stations[i], ot.data[i, j]) - if i == 0: - path.moveTo(pt) - else: - path.lineTo(pt) - p.drawPath(path) - - # ── Aristas transversales (polilínea de sección en planta) ───────── pen_t = QPen(_CNET_TRAN, 0.7, Qt.PenStyle.SolidLine) p.setPen(pen_t) + p.setBrush(Qt.BrushStyle.NoBrush) for i in range(n_sta): path = QPainterPath() for j in range(n_wl):