From 85cbdbf8e0f5fc06cd29eae91ddc85174a7d8364 Mon Sep 17 00:00:00 2001 From: Julian Appel Date: Fri, 30 Oct 2026 21:10:23 +0100 Subject: [PATCH] Specify Revit assignment dialog and per-project socket limit Co-Authored-By: Claude Opus 5.5 --- .../revit-excel-integration-requirements.md | 202 +++++++++++++++--- docs/spec/revit-excel-phase-14-plan.md | 55 ++++- 2 files changed, 232 insertions(+), 25 deletions(-) diff --git a/docs/spec/revit-excel-integration-requirements.md b/docs/spec/revit-excel-integration-requirements.md index effceb6..1849729 100644 --- a/docs/spec/revit-excel-integration-requirements.md +++ b/docs/spec/revit-excel-integration-requirements.md @@ -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: diff --git a/docs/spec/revit-excel-phase-14-plan.md b/docs/spec/revit-excel-phase-14-plan.md index 5039852..7d7feb8 100644 --- a/docs/spec/revit-excel-phase-14-plan.md +++ b/docs/spec/revit-excel-phase-14-plan.md @@ -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