Zum Inhalt springen

CAD XML Syntax-Lesemechanik und Pflichtfelder

Aus VermCAD Hilfe Wiki
Version vom 20. Juli 2026, 13:50 Uhr von Hahn (Diskussion | Beiträge) (CAD-XML-Syntax-Dokumentation (automatischer Import))
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

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 als VC_Plotrahmen/VC_Hintergrundbild (ohne „CAD") serialisiert.
  • T2DLine, T2DStartEndPunktLine, T2DAreaBase sind 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)

  1. Factory: Wurzeltag → Erzeugerfunktion (Init_CreateCADObj_HashTable → NewObjectFromXML). Die Objekt-Erzeugung wird erst beim Fund des VermCadID-Kindes ausgelöst.
  2. Element-Dispatch (T3DBaseObject.CreateFromXML, XmlLite-SAX-Reader): Elementknoten werden über die CAD_XML_Reader_ComplexStructures_HashTable (Struktur-/GUID-Referenz-Elemente, Attribute werden mitgegeben), Text-/CDATA-Knoten über die CAD_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.
  3. 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=-1 werden 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):

  1. Rissdaten + CurrRissID (Sektion Rissdaten und Auswahlen)
  2. Bearbeitungsgebiet (BearbeitungsgebietAutomatisch, BearbeitungsgebietAutoMitFlaechen, Bearbeitungsgebiet)
  3. ObjektAuswahlen
  4. Punkte (VC_CADPunkt, VC_CADBMPunkt) — nur mit gültigen X/Y-Koordinaten
  5. Punktsymbole — nur mit vorhandenem Referenz-Punkt
  6. Linien (SimpleLine, MeteredSimpleLine, Arc, Circle, Ellipse, Klotoide, Klothoide)
  7. Flächen (VCFlaeche, LTK [Anhalt], Flaeche)
  8. AlkisDE-Flächen (nur Anhalt)
  9. Kompos (VCBerechnung, VCMessung, Bemassung, Kompo)
  10. Texte (PNR-Text-Varianten, Text) — leere Texte werden nicht gespeichert
  11. Hintergrundbilder — nur wenn Textur geladen und Bilddatei existiert
  12. Plotrahmen
  13. 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- und Endpunkt-GUID; Kreis/Ellipse: Mittelpunkt-GUID + Radius/Radien; Bogen: zusätzlich RatioDistRad + Spiegeln (werden immer geschrieben), sinnvollerweise BogenMittePoint.
  • Flächen: Rand/Exterior-GUID auf ein Kompo, dessen MemberGroup die Randlinien enthält.
  • Kompo: MemberGroup mit ≥ 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 Texte Text_Referenzobjekt.
  • Punktsymbol: Rückverweis nötig — der zugehörige Punkt braucht PointSymbolGUID/WeitereSymbole auf das Symbol; Symbole ohne Referenz-Punkt werden beim Speichern übersprungen.
  • VCBerechnung/VCMessung: strikte Element-Reihenfolge MakroIDType → MakroIDNr → MakroIDName → VC_CADVCBerCalcKind → VC_CADVCBerechnungSettings zwingend.

Regeln fürs Erzeugen einer Projekt-XML

  1. Dateirahmen nach Übersicht aufbauen (Prolog, Kommentar, VCDaten mit Namespaces, Metadaten inkl. ObjectFileVersion/ObjectFileVCVersion — nie höher als die Zielinstallation, siehe Versionierung).
  2. Je Koordinatensystem eine VCCADDaten-Sektion mit KSID-Attribut; darin zuerst Rissdaten (mindestens RissEintrag_0 mit RissName+RissID) und CurrRissID.
  3. Objekte in der Schreibreihenfolge oben ausgeben; jedes Objekt: Wurzeltag → VermCadID (eindeutige GUID!) → benötigte Basiselemente (mindestens Layer) → Klassen-Elemente.
  4. Nur Nicht-Default-Werte schreiben (fehlendes Element = Default); Formate strikt nach Werte- und Koordinatenformate.
  5. Alle GUID-Referenzen müssen auf existierende Objekte derselben Datei zeigen — fehlende harte Referenzen führen zur Zerstörung des referenzierenden Objekts beim Laden.
  6. Keine Legacy-Tags schreiben (Alias-Tabelle).

Verfügbarkeit und Besonderheiten

  • Factory-Einträge VC_AreaCADLTK/VC_AreaCADAlkisDE existieren nur in der Sachsen-Anhalt-Version (IFDEF Anhalt); die vier InGerade/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_CADBoeschung und 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 in CAD_XML_Reader_HashTable, der Struktur-Tags in CAD_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)



[Nach oben]