fix(viewer): remove diagonal control-net fan lines from body plan
_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>
This commit is contained in:
@@ -307,18 +307,17 @@ class _BaseViewer(QWidget):
|
|||||||
def _draw_cnet_bodyplan(p: QPainter, ot, w2s_fn) -> None:
|
def _draw_cnet_bodyplan(p: QPainter, ot, w2s_fn) -> None:
|
||||||
"""Dibuja la malla de control en el Body Plan.
|
"""Dibuja la malla de control en el Body Plan.
|
||||||
|
|
||||||
Capa visual entre la grilla de referencia y las curvas del casco:
|
En el body plan TODAS las secciones se superponen en el mismo plano
|
||||||
• Aristas transversales — polilínea de control de cada sección
|
y-z, por lo que las aristas longitudinales (mismo índice de LdA a
|
||||||
(equal to the section control polyline, muted, drawn BEFORE the
|
través de todas las estaciones) producen líneas diagonales en abanico
|
||||||
actual hull-curve so the colored curve reads on top of it).
|
que carecen de sentido visual. Aquí solo se dibujan las aristas
|
||||||
• Aristas longitudinales — segmentos horizontales a la altura de cada
|
TRANSVERSALES: la polilínea de control de cada sección, idéntica a la
|
||||||
línea de agua, conectando todos los nodos de esa LdA en ambas bandas.
|
curva del casco pero dibujada en color muted ANTES que la curva bold,
|
||||||
Permiten ver cómo varía la manga de proa a popa en cada calado.
|
de forma que el ojo ve claramente «control net → curva encima».
|
||||||
"""
|
"""
|
||||||
n_sta = ot.n_stations
|
n_sta = ot.n_stations
|
||||||
n_wl = ot.n_waterlines
|
n_wl = ot.n_waterlines
|
||||||
|
|
||||||
# ── Aristas transversales (a lo largo de cada sección) ────────────
|
|
||||||
pen_t = QPen(_CNET_TRAN, 0.8, Qt.PenStyle.SolidLine)
|
pen_t = QPen(_CNET_TRAN, 0.8, Qt.PenStyle.SolidLine)
|
||||||
p.setPen(pen_t)
|
p.setPen(pen_t)
|
||||||
p.setBrush(Qt.BrushStyle.NoBrush)
|
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))
|
path.lineTo(w2s_fn(0.0, 0.0))
|
||||||
p.drawPath(path)
|
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:
|
def _draw_cnet_planview(p: QPainter, ot, w2s_fn) -> None:
|
||||||
"""Dibuja la malla de control en la Vista de Planta.
|
"""Dibuja la malla de control en la Vista de Planta.
|
||||||
|
|
||||||
• Aristas longitudinales — waterlines (conectan todas las estaciones
|
Solo aristas TRANSVERSALES: por cada estación i, una polilínea
|
||||||
en una LdA = las curvas de contorno, dibujadas muted ANTES de las
|
vertical que conecta sus nodos a lo largo de todas las LdA
|
||||||
curvas reales).
|
(x constante, y varía de 0 a manga máxima en esa estación).
|
||||||
• Aristas transversales — polilínea vertical por estación,
|
Esto muestra claramente «este nodo pertenece a esta estación» y
|
||||||
conectando los nodos de esa estación a lo largo de todas las LdA.
|
distingue los nodos longitudinales (en la waterline) de los
|
||||||
Muestra cómo cambia la manga con el calado para cada estación.
|
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_sta = ot.n_stations
|
||||||
n_wl = ot.n_waterlines
|
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)
|
pen_t = QPen(_CNET_TRAN, 0.7, Qt.PenStyle.SolidLine)
|
||||||
p.setPen(pen_t)
|
p.setPen(pen_t)
|
||||||
|
p.setBrush(Qt.BrushStyle.NoBrush)
|
||||||
for i in range(n_sta):
|
for i in range(n_sta):
|
||||||
path = QPainterPath()
|
path = QPainterPath()
|
||||||
for j in range(n_wl):
|
for j in range(n_wl):
|
||||||
|
|||||||
Reference in New Issue
Block a user