CAD XML Syntax-Lesemechanik und Pflichtfelder
Diese Seite beschreibt, wie VermCad die CAD-Objekte der Projekt-XML einliest (Factory, Element-Dispatch, Referenzen-Update), in welcher Reihenfolge die Objektgruppen geschrieben werden und welche Minimalanforderungen ein Objekt erfüllen muss, damit es korrekt geladen wird. Sie ist damit die zentrale Regelseite für das ERZEUGEN und REPARIEREN von Projekt-XMLs.
Strukturregel
<VCCADDaten KSID="…">
… Rissdaten, CurrRissID, ObjektAuswahlen, Bearbeitungsgebiet … (siehe Sektion VCCADDaten)
{ <objekt-wurzeltag> (muss in der Factory-Tabelle stehen,
<VermCadID> … </VermCadID> sonst wird das Element ignoriert)
[Basiselemente]
… klassenspezifische Elemente …
</objekt-wurzeltag> }*
</VCCADDaten>
Factory: Objekt-Wurzeltag → Delphi-Klasse
Beim Lesen wird jedes Kind-Element von VCCADDaten über die Hash-Tabelle CreateCADObj_HashTable auf eine Erzeugerfunktion abgebildet. Nur die folgenden 29 Tags erzeugen Objekte; alle anderen Tags werden still ignoriert.
| XML-Tag | Delphi-Klasse | Detailseite | Bundesland |
|---|---|---|---|
VC_CADPunkt |
T3DPoint | Objekt VC_CADPunkt | alle |
VC_CADBMPunkt |
T3DBMPoint (Bogenmittenpunkt) | Objekt VC_CADBMPunkt | alle |
VC_CADPunktsymbol |
T3DPointSymbol | Objekt VC_CADPunktsymbol | alle |
VC_CADSimpleLine |
T2DSimpleLine | Objekt VC_CADSimpleLine | alle |
VC_CADMeteredSimpleLine |
T2DMeteredSimpleLine | Objekt VC_CADMeteredSimpleLine | alle |
VC_CADArcLine |
T2DArcLine | Objekt VC_CADArcLine | alle |
VC_CADCircleLine |
T2DCircleLine | Objekt VC_CADCircleLine/EllipseLine | alle |
VC_CADEllipseLine |
T2DEllipseLine | Objekt VC_CADCircleLine/EllipseLine | alle |
VC_CADKlotoideLine |
T2DKlotoideLine | Objekt VC_CADKlotoide | alle |
VC_CAD_Klothoide |
T2DKlothoide | Objekt VC_CADKlotoide | alle |
VC_CADFlaeche |
T2DArea | Objekt VC_CADFlaeche/VCFlaeche | alle |
VC_CADVCFlaeche |
T2DVCArea | Objekt VC_CADFlaeche/VCFlaeche | alle |
VC_Plotrahmen |
T2DPlotFrame | Objekt VC_Plotrahmen | alle |
VC_AreaCADLTK |
T2DAreaLTK | Objekt VC_AreaCADLTK/AlkisDE | nur Sachsen-Anhalt (Anhalt) |
VC_AreaCADAlkisDE |
T2DAreaAlkisDE | Objekt VC_AreaCADLTK/AlkisDE | nur Sachsen-Anhalt (Anhalt) |
VC_CADVCBerechnung |
T3DVCBerechnung | Objekt VC_CADVCBerechnung/VCMessung | alle |
VC_CADVCMessung |
T3DVCMessung | Objekt VC_CADVCBerechnung/VCMessung | alle |
VC_CADBemassung |
T3DBemassung | Objekt VC_CADBemassung | alle |
VC_CADKompo |
T3DKompo | Objekt VC_CADKompo | alle |
VC_CADText |
T2DText | Objekt VC_CADText | alle |
VC_CADVCPNRText |
T2DVCPNRText | Objekt VC_CADVCPNRText und Varianten | alle |
VC_CADVCPNRParVMAKuerzelText |
T2DVCPNRParameterVMAKuerzelText | Objekt VC_CADVCPNRText und Varianten | alle |
VC_CADVCPNRParVMAKuerzelOriginalText |
T2DVCPNRParameterVMAKuerzelText (mit IsOriginal-Flag) |
Objekt VC_CADVCPNRText und Varianten | alle |
VC_CADVCPNRParInGeradeText |
T2DVCPNRParameterInGeradeText | Objekt VC_CADVCPNRText und Varianten | nur BW |
VC_CADVCPNRParInGeradeOriginalText |
T2DVCPNRParameterInGeradeText (mit IsOriginal-Flag) |
Objekt VC_CADVCPNRText und Varianten | nur BW |
VC_CADVCPNRParAufKreisbogenText |
T2DVCPNRParameterAufKreisbogenText | Objekt VC_CADVCPNRText und Varianten | nur BW |
VC_CADVCPNRParAufKreisbogenOriginalText |
T2DVCPNRParameterAufKreisbogenText (mit IsOriginal-Flag) |
Objekt VC_CADVCPNRText und Varianten | nur BW |
VC_CADBoeschung |
T2DBoeschung | Objekt VC_CADBoeschung | alle |
VC_Hintergrundbild |
T2DBackgroundPicture | Objekt VC_Hintergrundbild | alle |
Hinweise:
- Nicht alle Objekte heißen
VC_CAD*: Plotrahmen und Hintergrundbild werden alsVC_Plotrahmen/VC_Hintergrundbild(ohne „CAD") serialisiert. T2DLine,T2DStartEndPunktLine,T2DAreaBasesind abstrakte Zwischenklassen ohne eigenes Wurzeltag.- Die PNRText-„Original"-Varianten sind KEINE eigenen Klassen: Die Factory erzeugt dieselbe Klasse wie die Normal-Variante und setzt zusätzlich das Flag
IsOriginal := True(GLGeometrics.pas:83807/83819/83830). Die Unterscheidung steckt allein im Wurzeltag.
Lesemechanik (drei Stufen)
- Factory: Wurzeltag → Erzeugerfunktion (
Init_CreateCADObj_HashTable→NewObjectFromXML). Die Objekt-Erzeugung wird erst beim Fund desVermCadID-Kindes ausgelöst. - Element-Dispatch (
T3DBaseObject.CreateFromXML, XmlLite-SAX-Reader): Elementknoten werden über dieCAD_XML_Reader_ComplexStructures_HashTable(Struktur-/GUID-Referenz-Elemente, Attribute werden mitgegeben), Text-/CDATA-Knoten über dieCAD_XML_Reader_HashTable(einfache Werte) auf Reader-IDs (TCAD_XML_Reader_ID) abgebildet. Das Ende eines Objekts wird über die Element-TIEFE erkannt (Tiefenzähler), nicht über End-Tag-Namen. - PostProcessing: nach dem Einlesen des Objekts (
InternalCreateFromXMLPostProcessing, z. B. Qualitäts-Reparatur beim Punkt, Symbol-Selbstheilung); die GUID→Objekt-Auflösung erfolgt erst nach dem Laden ALLER Objekte über den GUID-Suchbaum (VermCadID und GUID-Referenzen).
Fehlertoleranz:
- Unbekannte Tags werden stillschweigend übersprungen (nur im VCDEBUG-Build geloggt) — zusätzliche/fremde Elemente machen eine Datei nicht ungültig.
- Defekte Einzelwerte: Exception wird gefangen und geloggt, die restlichen Elemente des Objekts werden weitergelesen. Ein defektes Objekt bricht das Projektladen nicht ab.
- Objekte mit
Deleted=-1werden nach dem Laden entfernt.
Schreibreihenfolge der Objektgruppen
Innerhalb jeder VCCADDaten-Sektion schreibt VermCad in dieser festen Reihenfolge (referenzierte Objekte stehen dadurch VOR ihren Referenzierern — ein Erzeuger sollte sie einhalten, der Leser ist dank nachgelagerter Referenz-Auflösung aber tolerant):
- Rissdaten +
CurrRissID(Sektion Rissdaten und Auswahlen) - Bearbeitungsgebiet (
BearbeitungsgebietAutomatisch,BearbeitungsgebietAutoMitFlaechen,Bearbeitungsgebiet) ObjektAuswahlen- Punkte (
VC_CADPunkt,VC_CADBMPunkt) — nur mit gültigen X/Y-Koordinaten - Punktsymbole — nur mit vorhandenem Referenz-Punkt
- Linien (SimpleLine, MeteredSimpleLine, Arc, Circle, Ellipse, Klotoide, Klothoide)
- Flächen (VCFlaeche, LTK [Anhalt], Flaeche)
- AlkisDE-Flächen (nur Anhalt)
- Kompos (VCBerechnung, VCMessung, Bemassung, Kompo)
- Texte (PNR-Text-Varianten, Text) — leere Texte werden nicht gespeichert
- Hintergrundbilder — nur wenn Textur geladen und Bilddatei existiert
- Plotrahmen
- Spezialobjekte (Böschung)
Speicherfilter: keine temporären Objekte; VC-generierte Objekte (oaVC/oaVCDeleted) nur, wenn Default-Eigenschaften geändert wurden oder ein verbundenes Objekt gespeichert werden muss.
Minimalanforderungen je Objekt (Pflichtfelder)
| Regel | Bedeutung |
|---|---|
| Registrierter Wurzeltag | sonst wird das gesamte Element ignoriert (Tabelle oben) |
VermCadID-Block |
zwingend — ohne ihn entsteht KEIN Objekt; GUID faktisch Pflicht, Duplikat-GUID → Objekt übersprungen; ObjektArt VOR CADObjektArt (Details)
|
Layer |
wird immer geschrieben; beim Lesen über den LayerManager aufgelöst (Basiselemente) |
Klassen-Minimum (Details auf den Objektseiten):
- Punkt:
Position/gml:pos— Punkte mit Fehlwert-Koordinaten werden beim nächsten Speichern verworfen. - Linien (Start/End-Typen):
Startpunkt- undEndpunkt-GUID; Kreis/Ellipse:Mittelpunkt-GUID + Radius/Radien; Bogen: zusätzlichRatioDistRad+Spiegeln(werden immer geschrieben), sinnvollerweiseBogenMittePoint. - Flächen:
Rand/Exterior-GUID auf ein Kompo, dessenMemberGroupdie Randlinien enthält. - Kompo:
MemberGroupmit ≥ 1 (sinnvoll ≥ 2)Member-GUIDs; ein leerer Kompo wird nicht gespeichert. - Bemaßung:
BasePoint1+BasePoint2— sonst wird das Objekt beim Referenzen-Update verworfen. - Texte: Textinhalt im Kind-Element
VC_CADText(leere Texte werden verworfen); für positionsgebundene TexteText_Referenzobjekt. - Punktsymbol: Rückverweis nötig — der zugehörige Punkt braucht
PointSymbolGUID/WeitereSymboleauf das Symbol; Symbole ohne Referenz-Punkt werden beim Speichern übersprungen. - VCBerechnung/VCMessung: strikte Element-Reihenfolge
MakroIDType→MakroIDNr→MakroIDName→VC_CADVCBerCalcKind→VC_CADVCBerechnungSettingszwingend.
Regeln fürs Erzeugen einer Projekt-XML
- Dateirahmen nach Übersicht aufbauen (Prolog, Kommentar,
VCDatenmit Namespaces, Metadaten inkl.ObjectFileVersion/ObjectFileVCVersion— nie höher als die Zielinstallation, siehe Versionierung). - Je Koordinatensystem eine
VCCADDaten-Sektion mitKSID-Attribut; darin zuerstRissdaten(mindestensRissEintrag_0mitRissName+RissID) undCurrRissID. - Objekte in der Schreibreihenfolge oben ausgeben; jedes Objekt: Wurzeltag →
VermCadID(eindeutige GUID!) → benötigte Basiselemente (mindestensLayer) → Klassen-Elemente. - Nur Nicht-Default-Werte schreiben (fehlendes Element = Default); Formate strikt nach Werte- und Koordinatenformate.
- Alle GUID-Referenzen müssen auf existierende Objekte derselben Datei zeigen — fehlende harte Referenzen führen zur Zerstörung des referenzierenden Objekts beim Laden.
- Keine Legacy-Tags schreiben (Alias-Tabelle).
Verfügbarkeit und Besonderheiten
- Factory-Einträge
VC_AreaCADLTK/VC_AreaCADAlkisDEexistieren nur in der Sachsen-Anhalt-Version (IFDEFAnhalt); die vierInGerade/AufKreisbogen-PNR-Varianten nur in BW. Eine Datei mit solchen Tags wird in anderen Bundesland-Versionen trotzdem geladen — die unbekannten Tags werden dann still ignoriert (Datenverlust beim erneuten Speichern!). - In den drei Referenz-Beispielprojekten (BW/Sachsen/THR) kommen
VC_CADBemassung,VC_CADBoeschungund die beiden Anhalt-Flächentypen nicht vor — die Tags sind gleichwohl in der Factory registriert. - Die Reader-IDs sind der Enum
TCAD_XML_Reader_ID; Registrierung der einfachen Tags inCAD_XML_Reader_HashTable, der Struktur-Tags inCAD_XML_Reader_ComplexStructures_HashTable.
Quellen im Code
- CAD\GLGeometrics.pas:96996-97034 —
Init_CreateCADObj_HashTable: Factory-Tabelle (29 Tags) - CAD\GLGeometrics.pas:83845-83952 —
TCADObjectManager.NewObjectFromXML: VermCadID-Pflicht, Duplikat-GUID-Skip - CAD\GLGeometrics.pas:6189-6261 —
T3DBaseObject.CreateFromXML: Element-Dispatch, unbekannte Tags (6242-6246) - CAD\GLGeometrics.pas:96747-96992 — Reader-Hash-Tabellen (einfach + komplex)
- CAD\GLTypes.pas:1782-2017 —
TCAD_XML_Reader_ID - CAD\GLGeometrics.pas:79499-80190 —
SaveXMLLite: Schreibreihenfolge, Speicherfilter (79516/79524), Punkt-/Symbol-/Text-Filter (79669, 79712, 79982) - CAD\GLGeometrics.pas:86090-86325 —
UpdateReferencesOrClean: Referenz-Auflösung, Zerstörung fehlerhafter Objekte,ClearAll(True)für Deleted (86312) - CAD\GLGeometrics.pas:5969-5975 —
IsCADObjectName(= Factory-ContainsKey)