# Ticket: Blueprint-Editor: gesamte Blaupause in 90°-Schritten drehen

- Typ: ticket
- Datum: 2026-09-26 20:55 UTC
- Session: devtest4
- Version: -
- Reproduzierbarkeit: -

## Zusammenfassung
Der Blueprint-Editor soll die gesamte geöffnete Blaupause über das bestehende RotateBuilding-Binding (Standard: R) in 90°-Schritten drehen können. Die Rotation wird als echte Editor-Mutation gespeichert und ist nicht auf die Clipboard-/Paste-Vorschau beschränkt.

## Schritte
Akzeptanzkriterien / Steps:
1. Blaupause im Blueprint-Editor öffnen.
2. RotateBuilding-Taste (Standard R) drücken.
3. Erwartung: Die gesamte Blaupause wird um 90° im Uhrzeigersinn gedreht, unabhängig von der aktuellen Entitätenauswahl.
4. Erwartung: Positionen und Footprints aller Entitäten werden konsistent transformiert; Mehrkachel-Maschinen behalten ihre Größe/Position korrekt, Maschinen-Quad/Direction, Conveyor-Varianten und Wire-Varianten werden mitrotiert.
5. Erwartung: Vorschau, Grid, Hover-/Selection-Overlays und Bounding-Box/Zoom zeigen unmittelbar die gedrehte Blaupause.
6. Erwartung: Jede Rotation erzeugt genau einen Undo-Schritt; Undo/Redo stellt den vorherigen Zustand wieder her.
7. Erwartung: Nach Save und erneutem Laden bleibt die gedrehte Blaupause persistent. Vier Rotationen ergeben wieder den Ausgangszustand.
8. Optional: Ein sichtbarer Hinweis im Statusbereich nennt den aktuellen 90°-Schritt bzw. die verwendete RotateBuilding-Taste.

## Erwartet
Die gesamte Entitätenliste der geöffneten Blaupause wird per bestehendem RotateBuilding-Key in 90°-Schritten im Uhrzeigersinn gedreht und als normale, speicherbare Editor-Änderung behandelt. Mehrkachel-Maschinen, Maschinenorientierung/-richtung, Conveyor-Formen und Wire-Formen werden geometrisch und semantisch korrekt mittransformiert. Rendering, Hit-Testing, Overlays, Bounding-Box und Preview bleiben konsistent. Undo/Redo und Save/Reopen erhalten bzw. speichern den Zustand.

## Tatsächlich
Der Editor bietet Rotation nur für die Clipboard-Vorschau im Paste-Modus. Für die bereits platzierte, gesamte Blaupause existiert keine Aktion. BlueprintManager besitzt zwar die Transformationslogik, sie wird dort aber nicht als Editor-Mutation verwendet.

## Technische Analyse
Betroffene Systeme:
- Source/GuiElements/BlueprintEditor/DrawBlueprintEditorView.lua: State und KeyPressed(). Die bestehende RotateBuilding-Behandlung bei Zeilen 758-763 betrifft ausschließlich FILE_Clipboard.rotation im FILE_PasteMode. Für den Normalmodus fehlt ein Committed-Blueprint-Rotationspfad; dort UndoRedo.Push(), clearSelection()/pruneHiddenSelection(), freezeViewIfBoundsChanged() und FILE_HasUnsavedChanges=true analog zu den bestehenden Mutationen aufrufen.
- Source/Objects/BlueprintManager.lua: getTransformedEntities() (aktuell lokal, ca. 728-878) enthält die vollständige 90°-Transformationslogik für Positionen, Maschinen-Quads/-Richtung/-Größe, Conveyor-Namen und Wire-Namen; TransformEntities() (1112-1125) ist öffentlich, erzeugt aber nur transformierte Kopien aus einem übergebenen Array und verändert den Editor-Blueprint nicht. Ansatz: eine Editor-API (z.B. RotateEditorBlueprint/RotateBlueprint) ergänzen, die den Snapshot vor der Mutation erzeugt, getTransformedEntities() bzw. diese Logik für die gesamte Entity-Liste verwendet und die transformierten Kopien in blueprint["Entities"] zurückschreibt. Origin und die bestehende Semantik des 90°-CW-Ursprungs beibehalten bzw. konsistent ableiten; keine separate Rotation nur im Preview.
- Source/GuiElements/BlueprintEditor/BlueprintEditorUndoRedo.lua: UndoRedo.Push() vor der Rotation; Undo/Redo arbeitet bereits per DeepCopy-Snapshot der Entities.
- Source/GuiElements/BlueprintEditor/BlueprintEditorGeometry.lua, BlueprintEditorOverlay.lua und BlueprintEditorStamp.lua: Sie lesen Positionen/Größen aus dem aktuellen Blueprint. Durch atomaren Austausch der Entity-Liste werden Preview, Bounding-Box, Hit-Testing und Overlays automatisch auf den neuen Daten arbeiten; RecomputeWireNames() und ggf. Fit-/View-Anpassung nach der Mutation aufrufen.
- Source/Objects/BlueprintManager.lua: bestehende RotateMachine- und ConveyorRotationAT-Aufrufe in getTransformedEntities() wiederverwenden; die bestehende RotateBuilding-Action aus Source/Libraries/Input/KeyMap.lua nutzen (Default R).
- Nach der Rotation sollten Dirty-State, Undo/Redo und Save/Standalone-Sync analog zu RemoveSelectedEntity()/Paste behandelt werden. Regressionen für asymmetrische/mehrkachelige Maschinen, Conveyor-/Wire-Namen und 4x-Rotation berücksichtigen.
