| … | … | @@ -95,6 +95,28 @@ func set_graph_data(nodes: Array, edges: Array, clusters: Array, cluster_labels: |
| 95 | 95 | _layout_step() |
| 96 | 96 | _spread_overlapping() |
| 97 | 97 | _rescale_to_fit() |
| 98 | |
| 99 | # Debug: log position bounds so we can diagnose invisible graphs |
| 100 | if not _positions.is_empty(): |
| 101 | var min_p := Vector2(INF, INF) |
| 102 | var max_p := Vector2(-INF, -INF) |
| 103 | var nan_count: int = 0 |
| 104 | for p: Vector2 in _positions.values(): |
| 105 | if is_nan(p.x) or is_nan(p.y) or is_inf(p.x) or is_inf(p.y): |
| 106 | nan_count += 1 |
| 107 | continue |
| 108 | min_p.x = minf(min_p.x, p.x) |
| 109 | min_p.y = minf(min_p.y, p.y) |
| 110 | max_p.x = maxf(max_p.x, p.x) |
| 111 | max_p.y = maxf(max_p.y, p.y) |
| 112 | print("[graph_canvas] layout done: %d positions, canvas=%s, bounds=(%s → %s), nan=%d" % [_positions.size(), str(size), str(min_p), str(max_p), nan_count]) |
| 113 | # Safety: if positions are out of canvas bounds or contain NaN, redo with current size |
| 114 | if nan_count > 0 or max_p.x < 0 or max_p.y < 0 or min_p.x > size.x or min_p.y > size.y: |
| 115 | print("[graph_canvas] positions out of bounds — forcing re-layout with canvas size %s" % str(size)) |
| 116 | _positions.clear() |
| 117 | _grid_layout() |
| 118 | _spread_overlapping() |
| 119 | _rescale_to_fit() |
| 98 | 120 | queue_redraw() |
| 99 | 121 | |
| 100 | 122 | |
| … | … | @@ -319,6 +341,11 @@ func _draw() -> void: |
| 319 | 341 | draw_string(_font, center - Vector2(60, 0), "No graph data", HORIZONTAL_ALIGNMENT_LEFT, -1, 14, Color(0.5, 0.5, 0.5)) |
| 320 | 342 | return |
| 321 | 343 | |
| 344 | if _positions.is_empty(): |
| 345 | var center: Vector2 = size / 2.0 |
| 346 | draw_string(_font, center - Vector2(80, 0), "%d nodes, no positions" % _nodes.size(), HORIZONTAL_ALIGNMENT_LEFT, -1, 14, Color(0.8, 0.3, 0.3)) |
| 347 | return |
| 348 | |
| 322 | 349 | # Draw edges — daemon uses {from, to, mi} |
| 323 | 350 | # Adaptive rendering: reduce alpha and filter low-MI edges when dense |
| 324 | 351 | var edge_count: int = _edges.size() |