97 lines
3.8 KiB
GDScript
97 lines
3.8 KiB
GDScript
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://core/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)
|