extends SceneTree ## Render-Probe U3 (Karte t_a4bf9b8c): Gruppen im Szenen-Baum. ## Legt 4 Objekte an, gruppiert 2 davon über den BAUM-WEG (tree_mod.group_selected), ## benennt die Gruppe „Lager“, hängt Objekt 3 per Drag-Kern in die Gruppe und ## rendert die echte Main-UI: links muss die Gruppe mit Namen + 3 Mitgliedern im ## Baum stehen und in 3D markiert sein. ## Start (BRAUCHT Rendering — NICHT --headless): ## xvfb-run godot --path . --rendering-driver opengl3 -s res://tests/probe_u3_groups_render.gd var out_dir := "/opt/data/profiles/scopedvr-dev/cache/scratch" func _initialize() -> void: if OS.get_cmdline_user_args().size() > 0: out_dir = OS.get_cmdline_user_args()[0] # Feste Fenstergröße (sonst fallen die Docks im xvfb-Default zusammen). root.size = Vector2i(1440, 900) root.mode = Window.MODE_WINDOWED await process_frame await process_frame var scene: PackedScene = load("res://scenes/main.tscn") var main = scene.instantiate() root.add_child(main) await process_frame await process_frame await process_frame # Vier Objekte nah an der Kartenmitte (sichtbar aus der Startansicht). (main.doc["objects"] as Array).append({ "id": "barrel_001", "pos": [0.0, 0.0, 0.0], "scale": 3.0, "rot_y_deg": 0.0}) (main.doc["objects"] as Array).append({ "id": "box_001", "pos": [9.0, 0.0, 5.0], "scale": 20.0, "rot_y_deg": 25.0}) (main.doc["objects"] as Array).append({ "id": "barrel_001", "pos": [-9.0, 0.0, -5.0], "scale": 3.0, "rot_y_deg": 0.0}) (main.doc["objects"] as Array).append({ "id": "box_001", "pos": [-6.0, 0.0, 9.0], "scale": 8.0, "rot_y_deg": 0.0}) main.call("_after_structure_change") await process_frame await process_frame # U3-Pfade benutzen — nicht GroupOps direkt: # 1) Mehrfachauswahl im Baum-Weg → group_selected() (nutzt interaction). var tree_mod = main.get("tree_mod") main.interaction.call("select_many", [0, 1]) tree_mod.call("group_selected") await process_frame # 2) Gruppe umbenennen (Kern-Funktion, wie der Dialog es ruft). tree_mod.call("rename_group", 0, "Lager") # 3) Objekt 2 per Drag-Kern in die Gruppe ziehen. tree_mod.call("_apply_membership_drop", [2], 0) # 4) Gruppe auswählen (Klick auf den Gruppen-Knoten simulieren). var g_node: TreeItem = _find_group_node(tree_mod, "Lager") if g_node != null: g_node.select(0) (tree_mod.get("content_tree") as Tree).item_selected.emit() main.call("_focus_selection") await process_frame await process_frame await process_frame # Hinweis-Dialoge (z. B. „Modelle fehlen“ im Klon ohne GLB-Quellen) schließen — # REKURSIV über den ganzen Fensterbaum und direkt vor dem Screenshot nochmal # (das Banner erscheint lazy nach dem View-Rebuild, nicht beim Setup). _windows_zu(root) await process_frame await RenderingServer.frame_post_draw var img := root.get_texture().get_image() var out_path := out_dir + "/u3_gruppen_im_baum_beweis.png" img.save_png(out_path) var members: Array = GroupOps.members_of(main.doc, 0) print("PROBE_PNG: ", out_path) print("PROBE_FERTIG: Gruppe=", GroupState.display_name(main.doc, 0), " Mitglieder=", members, " Baumzeile=", str(g_node.get_text(0)) if g_node != null else "FEHLT", " Auswahl=", main.interaction.get("selected_indices")) quit(0) func _find_group_node(tree_mod, name_prefix: String) -> TreeItem: var tree: Tree = tree_mod.get("content_tree") var root_item: TreeItem = tree.get_root() for child in root_item.get_children(): if str(child.get_text(0)).begins_with("Gruppen ("): for g in child.get_children(): if str(g.get_text(0)).begins_with(name_prefix): return g return null ## Alle Fenster/Dialoge im Unterbaum zu-klappen (Beweis-Bild frei räumen). func _windows_zu(node: Node) -> void: if node is Window: (node as Window).hide() return # Fenster-Inhalte brauchen nicht weiter durchlaufen zu werden for child in node.get_children(): _windows_zu(child)