CAD XML Syntax-VermCadID und GUID-Referenzen: Unterschied zwischen den Versionen
Hahn (Diskussion | Beiträge) CAD-XML-Syntax-Dokumentation (automatischer Import) |
Claude (Diskussion | Beiträge) Rechtschreibung: Links auf umbenannte Seiten umgestellt |
||
| Zeile 62: | Zeile 62: | ||
=== AlkisID (Hinweis) === | === AlkisID (Hinweis) === | ||
Die ALKIS-Objekt-ID (<code>AlkisID</code>, 16-stellige GML-ID wie <code>DETHL53P0000GTXJ</code>) steht NICHT im VermCadID-Block, sondern als erstes [[CAD XML Syntax-Basiselemente|Basiselement]] direkt nach <code></VermCadID></code>. Der Legacy-Tag <code>ALKIS_GMLID</code> wird beim Lesen gleichbehandelt (siehe [[CAD XML Syntax-Versionierung und | Die ALKIS-Objekt-ID (<code>AlkisID</code>, 16-stellige GML-ID wie <code>DETHL53P0000GTXJ</code>) steht NICHT im VermCadID-Block, sondern als erstes [[CAD XML Syntax-Basiselemente|Basiselement]] direkt nach <code></VermCadID></code>. Der Legacy-Tag <code>ALKIS_GMLID</code> wird beim Lesen gleichbehandelt (siehe [[CAD XML Syntax-Versionierung und Kompatibilität|Versionierung und Kompatibilität]]). | ||
== Referenzen == | == Referenzen == | ||
Aktuelle Version vom 22. September 2026, 10:57 Uhr
Jedes CAD-Objekt in der Projekt-XML beginnt mit dem Identitätsblock VermCadID (GUID, Objektart, ggf. Punktnummer). Über die GUID referenzieren sich die Objekte gegenseitig (Linie → Start-/Endpunkt, Kompo → Member usw.). Diese Seite beschreibt den kompletten Block, die drei Referenz-Schreibweisen und das Fehlerverhalten bei doppelten oder fehlenden GUIDs. Ohne VermCadID-Block entsteht beim Laden KEIN Objekt.
Strukturregel
<VermCadID>
<GUID>guid</GUID> (faktisch Pflicht — sonst neue Zufalls-GUID,
alle Referenzen auf das Objekt brechen)
[<ObjektArt>enum:TObjektArt</ObjektArt>] (nur wenn ≠ oaDontCare;
MUSS VOR CADObjektArt stehen!)
[<CADObjektArt>enum:TCADObjArt</CADObjektArt>] (nur bei CAD-artiger ObjektArt, ≠ cadDontCare)
[<VCPktID_NV>text</VCPktID_NV>] (nur Punkte mit VC-Punktnummer:
Nummerierungsbezirk)
[<VCPktID_A>text</VCPktID_A>] (nur Versionen mit A-Nummern, IFDEF A_NR)
[<VCPktID_NR>text</VCPktID_NR>] (Punktnummer)
[<VCPktID_KSID>ganzzahl</VCPktID_KSID>] (wird von CAD-Punkten nicht mehr geschrieben;
fehlt sie, gilt die KSID des Projekts)
[<VCPktID_WasMisNV>bool</VCPktID_WasMisNV>] (nur Lesen, Legacy)
[<Erzeugt>datum</Erzeugt>] (nur Lesen, Legacy)
[<LetzteAenderung>datum</LetzteAenderung>] (nur Lesen, Legacy)
[<NutzerID>ganzzahl</NutzerID>] (nur Lesen, Legacy)
</VermCadID>
- Der Block ist immer das ERSTE Kindelement eines Objekts.
- Reihenfolge-Regel:
ObjektArtmuss vorCADObjektArtstehen —CADObjektArtwird nur ausgewertet, wenn die ObjektArt zuvor als CAD-artig gelesen wurde. - Beim Lesen wird exakt der Knoten
VermCadIDerwartet; jedes Kind wird nur einmal ausgewertet. Fehlerhafte Einzel-Elemente erzeugen Meldung + Log, aber keinen Abbruch. - Datumsformate und GUID-Format: siehe Werte- und Koordinatenformate.
Elemente
| Element | Typ/Format | Pflicht | Default | Bedeutung |
|---|---|---|---|---|
GUID |
guid ({XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}, Großbuchstaben) |
faktisch ja | Zufalls-GUID | eindeutige Objekt-ID; Ziel aller Referenzen |
ObjektArt |
enum:TObjektArt | ja (für CAD-Objekte) | oaDontCare |
Herkunft/Art des Objekts (Werteliste unten) |
CADObjektArt |
enum:TCADObjArt | ja (für CAD-Objekte) | cadDontCare |
CAD-Objektklasse-Kategorie (Werteliste unten); steuert Render- und Verwaltungslogik |
VCPktID_NV |
Text | nein | Nummerierungsbezirk der VC-Punktnummer (in lokalen Systemen auch Nicht-Zahlen, z. B. xx)
| |
VCPktID_A |
Text | nein | Punktart-Zeichen — nur in Bundesland-Versionen mit A-Nummern (IFDEF A_NR)
| |
VCPktID_NR |
Text | nein | Punktnummer; eine gültige VC-Punktnummer verlangt NV ≠ UND NR ≠ | |
VCPktID_KSID |
ganzzahl | nein | KSID des Projekts | Koordinatensystem-Nr. der Punktnummer; von CAD-Punkten nicht mehr geschrieben (ALKIS-Objekte schreiben sie noch) |
VCPktID_WasMisNV |
bool | nein | False | Legacy: NV war der Fehl-NV; True ersetzt beim Lesen den NV durch den MisNV |
Erzeugt / LetzteAenderung |
Datum yyyy-MM-dd hh:nn:ss (auch mit T-Trenner lesbar) |
nein | aktuelles Datum | Legacy, wird nicht mehr geschrieben |
NutzerID |
ganzzahl | nein | Login-User | Legacy, wird nicht mehr geschrieben |
Enum TObjektArt (alle Werte)
oaVC (VC-generiert), oaVCBer (aus Berechnung), oaVCDeleted, oaAlkisFFA, oaAlkis (ALKIS-Objekt, nur in VC_AlkisDaten), oaAlkisCADRepr (CAD-Repräsentation eines ALKIS-Objekts), oaCAD (manuell gezeichnet), oaDontCare (Default/Init).
In CAD-Objekten kommen praktisch vor: oaCAD, oaVC, oaVCBer, oaVCDeleted, oaAlkisCADRepr. Die Basiselemente werden nur bei diesen CAD-artigen ObjektArten geschrieben.
Enum TCADObjArt (alle Werte, Reihenfolge = Renderreihenfolge)
cadDontCare, cadPlotFrame, cadBackgroundPicture, cadFlaeche, cadKompo, cadBoeschung, cadLinie, cadText, cadPunktsymbol, cadPunkt.
AlkisID (Hinweis)
Die ALKIS-Objekt-ID (AlkisID, 16-stellige GML-ID wie DETHL53P0000GTXJ) steht NICHT im VermCadID-Block, sondern als erstes Basiselement direkt nach </VermCadID>. Der Legacy-Tag ALKIS_GMLID wird beim Lesen gleichbehandelt (siehe Versionierung und Kompatibilität).
Referenzen
Objekte referenzieren einander ausschließlich über GUIDs. Drei Schreibweisen:
| Form | Syntax | Verwendung |
|---|---|---|
| GUID-Attribut-Element (Standard) | <Startpunkt GUID="{…}"/> |
alle Objekt-zu-Objekt-Referenzen: Startpunkt/Endpunkt/Mittelpunkt, PointSymbolGUID, Member, Exterior/Interior, Text_Referenzobjekt, SchraffurHauptkanteGUID …; Attributname ist immer GUID
|
| Member mit Zusatz-Attributen | <Member GUID="{…}" RefGUID="{…}" Counter="n"/> |
nur in MemberGroup von VC_CADVCBerechnungList: RefGUID verzahnt Mess-Objekt und Zielobjekt, Counter nummeriert — siehe Objekt VC_CADVCBerechnung/VCMessung
|
| GUID als Elementtext | <SymbolID>{…}</SymbolID> |
Verweise auf Nicht-CAD-Objekte bzw. Sonderfälle: SymbolID (Symbolmanager), BoeschungOKStart_GUID u. a. Böschungskanten-Punkte, Plotrahmen_Text_Eintrag_ID, GUID-Liste in ObjektAuswahlGUIDs (zeilenweise)
|
Ablauf beim Lesen: GUID-Referenzen werden zunächst nur gemerkt (z. B. FSPGUID/FEPGUID). Nach dem Einlesen ALLER Objekte löst UpdateReferencesOrClean sie über den GUID-Suchbaum des Managers auf — in einer Wiederholungsschleife mit ToDo-Liste und abschließendem „LastTry". Ein Erzeuger sollte referenzierte Objekte trotzdem VOR den Referenzierern schreiben (Schreibreihenfolge siehe Lesemechanik und Pflichtfelder).
Fehlerverhalten
- Duplikat-GUID (GUID bereits im Suchbaum): das gesamte Objekt wird übersprungen.
- Fehlende harte Referenz (z. B. Startpunkt-GUID existiert nicht): das referenzierende Objekt wird nach dem LastTry als fehlerhaft markiert, aus dem GUID-Suchbaum entfernt und zerstört — mit Logeintrag „…konnte nicht eingelesen werden" und Detail „n von m Unter-Objekten nicht gefunden". Kinder eines fehlerhaften Eltern-Objekts können einzeln überleben.
- Weiche Referenzen (Symbol-GUID des Punktsymbols,
WeitereSymbole, Text-Ausrichtungslinie): fehlende Ziele werden nur geloggt/ignoriert, das Objekt bleibt bestehen (beim Punktsymbol Selbstheilung überSymbolName). - Sonderwert: für „Referenz explizit ENTFERNT" existiert die spezielle NOTHING-GUID (
PROPERTY_GUID_VALUE_NOTHING), belegt beiText_AusrichtungRefLinieGUID— siehe Objekt VC_CADText.
Minimalform
<VermCadID>
<GUID>{AEFE2E5B-…}</GUID>
<ObjektArt>oaCAD</ObjektArt>
<CADObjektArt>cadPunkt</CADObjektArt>
</VermCadID>
Beispiele
Beispiel (Sachsen, echt — Punkt mit VC-Punktnummer in lokalem System)
<VermCadID>
<GUID>{F3EBC8C1-…}</GUID>
<ObjektArt>oaVC</ObjektArt>
<CADObjektArt>cadPunkt</CADObjektArt>
<VCPktID_NV>xx</VCPktID_NV>
<VCPktID_NR>2000</VCPktID_NR>
</VermCadID>
Beispiel (BW, echt — ALKIS-Objekt in VC_AlkisDaten mit KSID)
<VermCadID>
<GUID>{FE697113-…}</GUID>
<ObjektArt>oaAlkis</ObjektArt>
<VCPktID_NV>9220</VCPktID_NV>
<VCPktID_NR>1066/259</VCPktID_NR>
<VCPktID_KSID>0</VCPktID_KSID>
</VermCadID>
Beispiel (echt — GUID-Referenzen einer Linie)
<Startpunkt GUID="{5E840B97-…}" />
<Endpunkt GUID="{4B8E94CA-…}" />
Verfügbarkeit und Besonderheiten
- Struktur in allen Bundesland-Versionen identisch; nur
VCPktID_Aist auf A-Nummern-Versionen (IFDEFA_NR) beschränkt. Erzeugt/LetzteAenderung/NutzerIDundVCPktID_WasMisNVstehen nur noch in alten Dateien (write-Schalter auf False).- CAD-Punkte schreiben ihre Punktnummer als DIREKTE Kinder von
VermCadID(VCPktID_NV, ggf.VCPktID_A,VCPktID_NR) — ohneVCPktID-Zwischenknoten und ohneVCPktID_KSID; die fehlende KSID wird beim Lesen aus dem Projekt ergänzt. - GUID-Lesen läuft über
OurStringToGUID(…, gctCADObjectID); ungültige GUID-Strings erzeugen Meldung + Log. - Beim Punkt gilt:
VerwendungsStatuswird nur geschrieben, wenn eine VCPktID vorhanden ist — Details auf Objekt VC_CADPunkt.
Quellen im Code
- VERMCAD\VCObjBase.pas:328-389 —
TObjBase.DataToXMLLite: Schreiben des VermCadID-Blocks - VERMCAD\VCObjBase.pas:537-664 —
InternalInitIDsFromXML: Lesen, Reihenfolge ObjektArt→CADObjektArt, KSID-Fallback (657-658) - VERMCAD\VCObjBase.pas:508-527 —
InitIDsAsFromXML(XmlLite-Pfad überTVCIDData) - VERMCAD\GlobalTypes.pas:848-871 —
TObjektArt,TCADObjArt - VERMCAD\VcPktID.pas:838-894 —
TVCPktID.DataToXMLLite(ohne Zwischenknoten/KSID) - CAD\GLGeometrics.pas:83845-83952 —
NewObjectFromXML: Objekt-Erzeugung erst beiVermCadID-Fund, Duplikat-GUID → Skip (83905-83906) - CAD\GLGeometrics.pas:86090-86325 —
UpdateReferencesOrClean: Referenz-Auflösung, LastTry, Zerstörung (86274-86282) - CAD\GLGeometrics.pas:6527-6576 —
GetXMLLinkErrorFromGUIDs: Fehlermeldung fehlender Kind-GUIDs