Specify Revit assignment dialog and per-project socket limit

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Julian Appel 2026-10-30 21:10:23 +01:00
parent 38019fe087
commit 85cbdbf8e0
2 changed files with 232 additions and 25 deletions

View file

@ -124,7 +124,7 @@ Zielvertrag:
```ts
interface ExternalModelConfiguration {
schemaVersion: 1;
schemaVersion: 2;
layout: {
headerRow: number;
firstDataRow: number;
@ -153,6 +153,19 @@ interface ExternalModelConfiguration {
}
```
Schema-Version 2 ergänzt nur das Geräteart-Merkmal `isSocket`
(Abschnitt 6). Konfigurationen der Version 1 – auch Kopien in Importbatches,
History-Commands und Snapshots – werden beim Lesen hochgestuft.
Der Steckdosen-Höchstwert je Stromkreis ist **keine** Revit-Einstellung,
sondern eine allgemeine Projekteinstellung der Leistungsbilanz:
`Project.maxSocketsPerCircuit` (positive ganze Zahl oder `null` = keine
Grenze), auftraggeberabhängig und in den Projekteinstellungen gepflegt. Er
wird über `project.update-settings` (Schema-Version 4) geändert; Versionen
1–3 bleiben ausführbar und lassen den Wert unverändert. Snapshot-Schema 11
und der Projekttransfer enthalten ihn; ältere Stände werden mit `null`
hochgestuft.
Standardzuordnung:
| Schlüssel | Bedeutung | Standardspalte |
@ -192,6 +205,13 @@ Leistung je Einheit in W, GZF, cosPhi und Kostengruppe. Jede exakte
`Familie und Typ`-Regel verweist auf genau eine Geräteart und verwendet die
Mengenregel `1` oder `socketCount`.
Jede Geräteart trägt zusätzlich das Merkmal `isSocket` („Steckdose“). Nur
Objekte solcher Gerätearten zählen für den Steckdosen-Höchstwert je
Stromkreis (Abschnitt 11), unabhängig von ihrer Kategorie. Beim Hochstufen
einer Konfiguration der Version 1 und beim Anlegen im Wizard wird `isSocket`
mit `true` vorbelegt, wenn eine Familienregel dieser Geräteart die
Mengenregel `socketCount` verwendet; der Planer kann das Merkmal ändern.
Mehrere Revit-Familien dürfen auf dieselbe Geräteart zeigen. Jedes Revit-
Objekt bleibt trotzdem einzeln über seine Worksharing-ID nachverfolgbar.
Unbekannte Familien müssen im Importwizard zugeordnet oder über eine neue
@ -306,33 +326,167 @@ aktuellen Row-Werte als Planungswerte und entsprechende Overrides.
## 11. Editor-Zuordnung und Löschen
Umsetzungsstand R7: Der Stromkreislisteneditor lädt die kompakte Projektliste
gemeinsam mit dem Baum, gruppiert unzugeordnete Objekte des aktuellen
Verteilers im Client und bietet Gruppen sowie einzelne Worksharing-IDs als
Drag-Quelle an. Drop auf Row, Circuit und freien Gruppenbereich verwendet die
drei persistenten Zuordnungscommands. Row-Badges zeigen die Linkzahl; Lösen
kopiert die aktuellen Row-Planungswerte als Overrides. Row-, Circuit- und
Gruppenlöschungen speichern die vollständigen Linkübergänge im Forward- und
Inverse-Command. Raum- und Verteilerlöschungen prüfen externe Referenzen
explizit.
Stand 30.10.2026: Dieser Abschnitt ersetzt den R7-Editorbereich (rechter
Drawer mit Gruppen-Drag direkt ins Grid). Der Drawer konnte gleichartige
Objekte eines Raums nur gesamt oder einzeln zuordnen und kannte keinen
Steckdosen-Höchstwert. Die drei R7-Zuordnungscommands bleiben für gespeicherte
History-Einträge ausführbar; die Editor-UI verwendet sie nicht mehr.
Umsetzung: Pakete R11–R14 im [Phasenplan](revit-excel-phase-14-plan.md).
Der rechte, überlagernde Editorbereich zeigt unzugeordnete konfliktfreie
Objekte des aktuellen Verteilers. Gruppierungsschlüssel sind interner Raum,
Auswahlkenner, Geräteart, Kategorie, identische Planungswerte und kompatibler
ProjectDevice-Link. Die Anzeige nennt Summe der wirksamen Mengen und Zahl der
externen Objekte. Gruppen sind aufklappbar; Einzel- und Mehrfachauswahl sowie
Filter bleiben möglich.
### 11.1 Grundsatz
Drag-and-drop:
- Ein Revit-Objekt (eine Familieninstanz, z. B. eine Doppelsteckdose mit
wirksamer Menge 2) ist unteilbar. Es ist mit höchstens einer Row verknüpft
und gehört damit immer zu genau einem Stromkreis.
- Aufgeteilt wird ausschließlich auf Objektebene: Die 8 Doppelsteckdosen eines
Raums (16 wirksame Steckdosen) können auf mehrere Stromkreise verteilt
werden, eine einzelne Doppelsteckdose nie.
- Zugeordnet wird über den Zuordnungsdialog. Drag-and-drop findet innerhalb
des Dialogs statt, nicht direkt aus einer Seitenleiste ins Grid.
- auf vorhandene Row: genau diese Row;
- auf Circuit: neue Row mit `manualQuantity = 0`;
- auf freien Bereich: neuer Circuit, Schutz und Row in einem Command.
### 11.2 Zuordnungsdialog „Revit-Objekte zuordnen“
Neue IDs und BMK werden einmal geplant; Redo rechnet sie nicht neu. Neue Rows
übernehmen den bestätigten Gruppenzustand und die Summe der effektiven Mengen.
An Rows zeigt ein Hinweis die Zahl verknüpfter Revit-Objekte; einzelne Objekte
können ausdrücklich gelöst werden.
Öffnen:
- Werkzeugleiste des Editors: „Revit-Objekte zuordnen (N)“, N = Zahl der
zuordenbaren Objekte des Verteilers;
- Kontextmenü eines Stromkreises oder einer Row: derselbe Dialog mit
vorausgewähltem und sichtbar markiertem Ziel.
Gezeigt werden vorhandene (`present`), unzugeordnete Objekte, deren
effektiver Verteiler der aktuelle Verteiler ist. Objekte ohne Verteiler
erscheinen nur als Hinweis „N Objekte ohne Verteiler – auf der Revit-Seite
zuordnen“.
Der Dialog ist großflächig und zweigeteilt.
Links, Objektbereich:
- Baum Raum → Gruppe → Objekt. Raumknoten zeigen Nummer, Name und die Summe
der wirksamen Steckdosen. Gruppen verwenden die Schlüssel interner Raum,
Auswahlkenner, Geräteart, Kategorie, identische Planungswerte und
ProjectDevice-Link und zeigen Objektzahl und Mengensumme.
- Jede Objektzeile zeigt `Familie und Typ`, die wirksame Menge (z. B. „2ד)
und die Worksharing-ID (gekürzt, vollständig im Tooltip).
- Checkboxen auf allen Ebenen (Raum und Gruppe dreiwertig). Klick wählt aus,
Strg+Klick schaltet um, Umschalt+Klick wählt einen Bereich.
- Suche über Raum, Familie, Auswahlkenner und Worksharing-ID; Filter
Geräteart und „nur Steckdosen“.
- Fußzeile: „6 Objekte · 12 Steckdosen · 2 Räume“ und die Aktionen
„Zuweisen an …“ und „Automatisch aufteilen …“.
Rechts, Zielbereich:
- Stromkreise des Verteilers nach Stromkreisgruppen, je Zeile BMK, Name und
Belegung „6 / 8 Steckdosen“ (ohne Höchstwert nur die Zahl).
- Aufklappbar bis auf die Rows einschließlich geplanter neuer Rows.
- Je Gruppe ein Ablagefeld „Neuer Stromkreis“.
- Geplante, noch nicht übernommene Zuordnungen sind farblich markiert und
lassen sich einzeln zurücknehmen oder per Drag zurück in den Objektbereich
legen.
### 11.3 Drag-and-drop und Tastatur
- Die aktuelle Auswahl (oder das gezogene Objekt, wenn es nicht ausgewählt
ist) wird auf ein Ziel im Zielbereich gezogen:
- auf eine Row: genau diese Row;
- auf einen Stromkreis: Row-Bildung nach 11.4;
- auf „Neuer Stromkreis“: neuer Stromkreis in dieser Gruppe, Row-Bildung
nach 11.4.
- Während des Ziehens sind gültige Ziele hervorgehoben. Ungültige Ziele
(andere Kategorie) sind ausgegraut und nennen den Grund im Tooltip. Ziele,
deren Höchstwert überschritten würde, bleiben gültig, zeigen aber die
künftige Belegung in Warnfarbe, z. B. „10 / 8“.
- Tastaturalternative: „Zuweisen an …“ öffnet eine Zielauswahl mit allen
Stromkreisen und „Neuer Stromkreis in Gruppe …“.
- Ein Drop schreibt nichts. Er erweitert den lokalen Zuordnungsplan des
Dialogs (11.7).
### 11.4 Row-Bildung im Zielstromkreis
Die einem Stromkreis zugewiesenen Objekte werden nach den Gruppenschlüsseln
aus 11.2 zusammengefasst; jede Teilgruppe ergibt einen Row-Vorschlag. Objekte
aus mehreren Räumen ergeben damit mehrere Rows im selben Stromkreis.
- Existiert im Stromkreis eine Row mit gleichem Raum, gleicher Kategorie,
gleichem Auswahlkenner und kompatiblem ProjectDevice-Link, wird sie als Ziel
vorgeschlagen. Der Planer kann je Vorschlag auf „neue Row“ umstellen.
- Neue Rows erhalten `manualQuantity = 0`, den Gruppenzustand als
Planungswerte und die Summe der wirksamen Mengen als Anzahl.
- Abweichende Planungswerte gegenüber einer bestehenden Row sind Konflikte
(11.7).
### 11.5 Steckdosen-Höchstwert
- Grundlage ist die Projekteinstellung `maxSocketsPerCircuit`
(Abschnitt 5). Im Dialog wird er angezeigt; geändert wird er in den
Projekteinstellungen.
- Belegung eines Stromkreises = Summe der wirksamen Mengen aller verknüpften
und geplanten Objekte, deren Geräteart `isSocket` trägt, über alle Rows des
Stromkreises. Manuelle Mengenanteile zählen nicht mit.
- Der Höchstwert ist eine Warnung, keine Sperre. Eine manuelle Zuweisung über
den Höchstwert ist erlaubt, muss aber vor der Übernahme ausdrücklich
bestätigt werden.
- Die automatische Aufteilung überschreitet den Höchstwert nie. Einzige
Ausnahme ist ein Einzelobjekt, das allein größer ist; es erhält einen
eigenen Stromkreis und wird als Überschreitung markiert.
### 11.6 Automatisch aufteilen
„Automatisch aufteilen …“ verteilt die ausgewählten Steckdosen-Objekte auf
neue Stromkreise einer gewählten, kategoriegleichen Stromkreisgruppe.
Nicht-Steckdosen in der Auswahl bleiben unberührt und werden genannt. Der
Höchstwert ist mit dem Projektwert vorbelegt und für diesen Lauf änderbar;
ohne Projektwert muss er eingegeben werden.
Raumweises Verfahren:
1. Räume nach Raumnummer (natürliche Sortierung), Objekte ohne Raum zuletzt;
innerhalb eines Raums nach Worksharing-ID.
2. Passt ein Raum vollständig in die Restkapazität des aktuellen neuen
Stromkreises, kommt er dorthin.
3. Sonst beginnt ein neuer Stromkreis, sofern der Raum vollständig in einen
leeren Stromkreis passt.
4. Sonst wird der Raum objektweise auf so viele neue Stromkreise verteilt wie
nötig, ohne ein Objekt zu teilen.
Das Ergebnis ist ein Plan, keine Übernahme. Er erscheint im Zielbereich und
kann per Drag-and-drop nachbearbeitet werden. Vorhandene Stromkreise werden
nicht automatisch aufgefüllt.
### 11.7 Zuordnungsplan und Übernahme
- Der Dialog sammelt alle Zuweisungen lokal. Nichts wird geschrieben, bevor
„Übernehmen“ bestätigt ist. Schließen mit offenem Plan fragt nach.
- Vor der Übernahme listet eine Prüfansicht jeden Planungswert-Konflikt
(Row, Feld, Row-Wert, Objektwert) und jede Höchstwert-Überschreitung. Beide
verlangen eine ausdrückliche Bestätigung. Ohne Konflikte und
Überschreitungen genügt „Übernehmen“.
- Die Übernahme ist ein atomarer Command
`external-object.apply-assignment-plan` mit `expectedRevision` und genau
einem Undo-Schritt. Er enthält:
- die vollständigen Snapshots neuer Stromkreise (stabile UUID,
Gruppe, BMK, abgeleitete Spannung, erforderlicher Standardschutz);
- die vollständigen Snapshots neuer Rows;
- die erwarteten Vorher-Zustände aller betroffenen Rows und Objekte;
- alle Link-Übergänge, die ausdrücklich bestätigten Konflikte und die
Mengenänderungen bestehender Rows.
- BMKs neuer Stromkreise werden beim Planen einmal vergeben: höchste
Nummer der Gruppe + 1, + 2, … ohne Lückenfüllung. Redo rechnet sie nicht neu.
- Die Inverse entfernt nur unverändert gebliebene erzeugte Stromkreise und
Rows und stellt Links und Mengen exakt wieder her.
- Bei 409 lädt der Dialog neu, prüft den Plan erneut und entfernt nicht mehr
gültige Zuweisungen mit Hinweis; gültige bleiben erhalten.
### 11.8 Verknüpfte Objekte an der Row
- An Rows zeigt das Badge „Revit N“ die Zahl verknüpfter Objekte. Ein Klick
öffnet eine Liste mit Worksharing-ID, Familie, Raum und wirksamer Menge.
- In der Liste lassen sich einzelne Objekte oder alle ausdrücklich lösen.
Gelöste Objekte erhalten die aktuellen Row-Werte als Planungswerte und
Overrides.
- „Anzahl“ bleibt gesperrt; „Anz. manuell“ und „Anz. Revit“ gelten wie
bisher.
Wird eine Row, ein Circuit oder eine Gruppe mit verknüpften Revit-Objekten
gelöscht, zeigt die UI vor Bestätigung:

View file

@ -19,6 +19,10 @@ Der alte CSV-Plan 14.0–14.6 ist abgelöst und wird nicht fortgeschrieben.
| R8 | abgeschlossen | Rückgabe-Excel für alle, abweichende oder ausgewählte Objekte und append-only Exportnachweis sind umgesetzt. |
| R9 | abgeschlossen | Vollständiger Folgeimport nach exakter Worksharing-ID mit Quellentscheidungen, fehlenden Objekten, bestätigtem Löschen und persistentem Undo/Redo. |
| R10 | abgeschlossen | Ende-zu-Ende-Kette, 5.000-Objekte-Lasttest, gebatchte Zustandspersistenz und Abschlussdokumentation. |
| R11 | geplant | Projekteinstellung `maxSocketsPerCircuit` und Geräteart-Merkmal `isSocket` samt Hochstufung und Einstellungs-UI. |
| R12 | geplant | Reines Planungsmodul für Row-Bildung, Belegung, Konflikte und raumweise Aufteilung. |
| R13 | geplant | Atomarer Command `external-object.apply-assignment-plan` mit Route und exakter Inverse. |
| R14 | geplant | Zuordnungsdialog mit Drag-and-drop und Plan, Row-Objektliste mit Einzel-Lösen, Entfernen des R7-Drawers. |
## R0 – Audit
@ -223,7 +227,56 @@ ist für alle vollständigen External-Model-Zustandspfade behoben. Messwerte und
Abnahme stehen in [R10-Abnahme](revit-excel-r10-validation.md). Phase 14 ist
damit abgeschlossen.
## Pflichtprüfungen je Paket R1–R10
## R11–R14 – Zuordnungsdialog und Steckdosen-Höchstwert
Fachgrundlage: Abschnitte 5, 6 und 11 der
[Anforderungen](revit-excel-integration-requirements.md), Stand 30.10.2026.
Anlass: Der R7-Drawer kann gleichartige Objekte eines Raums nur gesamt oder
einzeln zuordnen. Steckdosen müssen objektweise und unter einem
auftraggeberabhängigen Höchstwert auf mehrere Stromkreise verteilt werden.
### R11 – Einstellungen
- Projekteinstellung `maxSocketsPerCircuit`: Migration `0018` (nullable
Spalte), `project.update-settings` Schema-Version 4 (1–3 bleiben ausführbar
und lassen den Wert unverändert), Snapshot-Schema 11 (1–10 mit `null`
hochgestuft), Projekttransfer, PUT-Route und Projekteinstellungsdialog;
- `ExternalModelConfiguration` Schema-Version 2 mit `deviceTypes[].isSocket`;
Version 1 wird beim Lesen aus den `socketCount`-Regeln hochgestuft
(gespeicherte Konfiguration, Importbatch-Kopien, History-Commands,
Snapshots, Transfer);
- Revit-Einstellungen: Merkmal „Steckdose“ je Geräteart; Wizards belegen es
vor.
### R12 – Planungsmodul
- reines, importfreies Modul für Client und Server;
- Row-Bildung im Zielstromkreis, Belegung je Stromkreis, Konfliktliste,
Kategorieprüfung und raumweise Aufteilung nach Anforderung 11.6;
- fokussierte Unit-Tests, u. a.: 8 Doppelsteckdosen bei Grenze 8 ergeben
zwei Stromkreise mit je 4 Objekten; Räume werden nur bei Bedarf geteilt;
ein Einzelobjekt über der Grenze erhält einen eigenen Stromkreis.
### R13 – Command
- `external-object.apply-assignment-plan` über die gemeinsame
Project-Command-Transaktionsgrenze und
`external-object-assignment.persistence.ts`;
- serverseitige Neuprüfung mit dem R12-Modul; Konflikte und Überschreitungen
nur mit ausdrücklich gelisteter Bestätigung;
- strikte zod-Eingabe, Routentests (nicht angemeldet, fremdes Objekt,
ungültige Eingabe), SQLite-Commit/Rollback, Undo/Redo nach Neustart.
### R14 – Editor-UI
- Zuordnungsdialog nach Anforderung 11.2–11.7 mit lokalem Plan, Drag-and-drop,
Tastaturalternative, Prüfansicht und 409-Neuprüfung;
- Kontextmenü-Einstieg mit vorausgewähltem Ziel;
- Row-Badge öffnet die Objektliste mit Einzel- und Gesamt-Lösen;
- R7-Drawer und Grid-Drop für Revit-Objekte entfernen; AGENTS.md und
Architekturdokumentation nachziehen.
## Pflichtprüfungen je Paket R1–R14
```text
fokussierte Tests