DXF Dateien
DXF Layer können eine Einzeldatei oder Auflistungen von DXF Dateien beinhalten.
Beim Zeichenzugriff werden dateibasierte Sicherheitsdeskriptoren ausgewertet. Wird dem Aufrufer gemäß der Richtlinie der Zugriff verweigert, wird kein Fehler generiert, der Zeichenvorgang für das Element wird übersprungen. In der Logstufe Detail wird ein entsprechender Eintrag erstellt. Die Liste der Sublayer wird nicht eingeschränkt.
Abfragen mittels GeoSQL sind möglich. Einschränkungen: Derzeit werden noch nicht alle CAD Geometrien in das interne Format überführt.
Die Einbindung in cardo erfolgt über den Layertyp DXF Ordner oder DXF Einzeldatei.
Der Parameter "loadErrorBehavior" wird ausgewertet. Bei "Lax" werden fehlerhafte Entity-Definitionen ignoriert (bei Strict wird der Ladevorgang mit entsprechender Fehlermeldung abgebrochen).
Zeigen Entitäten auf Layer die nicht vorhanden sind, werden diese im Modus Lax angelegt (sonst kommt eine Fehlermeldung).
Die Ebeneneigenschaft "Fehlertoleranz" wird auch beim Rendern berücksichtigt. Wenn ein referenzierter Linientyp nicht in der DXF Datei vorhanden ist, wird im Modus Lax kein Fehler ausgegeben sondern eine durchgehende Linie gezeichnet.
Argumente
Typname: DXF (Einzeldatei) oder DXFColl (mehrere Dateien)
Typ "DXF":
- fileName: Der Pfadname zu einer Dxf-Datei, absolut oder relativ
Typ "DXFColl":
- fileName: Ein oder mehrere Pfadnamen zu den Dxf-Datei. Mehrere können durch ein Stern - * - getrennt angegeben werden, schließt sich mit folder aus
... oder ...
folder: Der Pfadname eines Ordners mit den Dxf Dateien (absolut oder relativ), schließt sich mit fileName aus
recursive: Gibt an, ob der in folder angegebene Ordner rekursiv nach Dxf Dateien durchsucht werden soll oder nur direkt in diesem Verzeichnis
replace (false): Wenn die Ebene bereits vorhanden ist, werden die Dateien aus folder oder fileName der internen Auflistung hinzugefügt (replace=false) oder ersetzt (replace=true)
dxfSubLayerHandling ("DistinctOfAllDxfLayerNames"): Verhalten, wie Sublayer generiert werden, mögliche Werte sind EachFileAsSubLayer, DistinctOfAllDxfLayerNames oder NoSubLayers.
Für Beide:
- quality ("Default"): Darstellungsqualität, einer der Werte: Default, Low, AntiAlias oder HighQuality
- epsgCode (-1): wenn definiert (d.h. > 0), dann wird dieser wie angegeben übernommen, ansonsten wird eine automatische Ermittlung anhand der Ausdehnung der Elemente versucht, siehe auch hier
- renderImages (false): Wenn false, dann werden alle Entitäten vom Typ "IMAGE" nicht dargestellt (die Liste der Sublayer wird nicht eingeschränkt, das Verhalten wirkt sich nur beim Zeichenvorgang aus)
- forceBlackBackground (false): Hintergrundbild vor dem Zeichnen schwarz einfärben, Blackcolor Index auswerten
Beispiel
{
"DxfEbene": {
"type": "Dxf",
"fileName": "D:\\Temp\\dxf\\Übersichtslageplan.dxf",
"forceBlackBackground":false
}
}
Ladevorgang
Die Dxf Dateien werden beim ersten Zugriff in einer Zwischendatei gespeichert. Dabei handelt es sich um eine SQLite Datenbank mit interner Datenstruktur. Die Dateien enthalten einen Metadatensatz und die Entitäten in einem optimierten Format.
Beim Zugriff wird überprüft, ob sich die Ausgangs-DXF Datei seit Erstellung des Caches geändert hat. Beim Neuladen der Datei wird der Cache bei Bedarf neu erstellt. Die Prüfung erfolgt anhand des Änderungsdatums der Datei.
Beim erstmaligen Laden der Dxf Datei in diesen Cache wird seit Version 7.0.6.648 versucht das Text-Encoding in der die DXF-Datei gespeichert wurde zu ermitteln, um dadurch Texte (mit Umlauten) korrekt darzustellen.
Projektion / EPSG Definition
Da keine Definition einer Projektion in einer DXF Datei vorgesehen ist, kann der Epsg-Code beim Laden übergeben werden. Ist dies nicht der Fall, dann wird versucht die EPSG aus der Bounding-Box zu "schätzen".
Alternativ dazu kann eine Datei angelegt werden die gleichlautend wie die DXF Datei ist, aber mit der Dateierweiterung ".epsg". (test.dxf => test.epsg)
In dieser Datei wird in der ersten Zeile der EPSG Code erwartet (EPSG:xxxx oder nur xxxx, bzw. xxx::Code).
Einige Anbieter sehen per Konvention .prj Dateien vor. Allerdings ist die Zuordnung zwischen der dort enthaltenen ESRI WKT Präsentation zu einem EPSG Code nicht 100%tig möglich. Daher haben wir vorerst diesen Weg gewählt.
Wenn eine solche Datei vorhanden ist, dann muss der Inhalt gültig sein, sonst wird ein Fehler ausgelöst.
Der so definierte Epsg-Code wird allen anderen o.g. Varianten gegenüber bevorzugt.
Vor allem bei der Verwendung von DXFCollections kann die Verwendung sinnvoll sein (die Dateien in einer Collection dürfen verschiedene Projektionen haben).
Features
Beim Zeichenvorgang der CAD Daten sind bereits alle Darstellungsinformationen in der Datei selber enthalten. Allerdings kann ein Filter für die Layernamen mit übergeben werden.
Für den Zeichenvorgang ist derzeit ein Timeout von 1 min. fest hinterlegt (sowohl für Einzeldateien, als auch Collections).
Implementierungsdetails / Features und Einschränkungen
Für die Implementierung für den DXF Zugriff wurde eine eigene Komponente entwickelt. Grundlage der Implementierung stellen die verfügbaren Dokumentationen zum Datenformat dar. Diese sind nicht in allen Punkten erschöpfend. Die unten aufgeführte Liste stellt den aktuellen Stand dar. Anpassungen werden auch im Changelog mit aufgeführt.
Implementierungsdetails
- verschachtelte INSERTS werden unterstützt
- "Frozen" Layer werden unterstützt (d.h. nicht angezeigt)
- Entitäten werden in der korrekten Reihenfolge, entsprechend ihres Sortier-Handles (in SORTENTSTABLE) gezeichnet
- Indizierte Farben und TrueColor werden unterstützt
- Farbe und Strichdicke können von Layer oder INSERT geerbt werden
Unterstützte Entitäten ohne bekannte Einschränkungen:
- 3DFACE (maximal 4 Linien)
- ARC (Kreissegment)
- CIRCLE (Kreis)
- ELLIPSE (Ellipse)
- IMAGE (Bild)
- LINE (Linie)
- POINT (Punkt)
- SOLID (gefülltes Polygon aus 3 oder 4 Punkten)
- TRACE (gefülltes Polygon aus 4 Punkten)
Unterstützte Entitäten mit Einschränkungen:
HATCH (Polygon):
- Schraffuren (definiert durch Abstand und Winkel) werden nur bei ANSI31 unterstützt alle anderen Füllungen sind fest
- benutzerdefinierte Füllungen (komplexe Muster) für Polygone werden NICHT unterstützt
- durch Entität definierte lokale nicht Default Extrusion Direction wird NICHT unterstützt
- die Darstellung von Polygonen aus Splines kann sich vom DWG Viewer unterscheiden, da der von AutoCAD verwendete Splinealgorithmus uns unbekannt ist
- asymmetrische Skalierung (Höhenskalierung ungleich Breitenskalierung) wird für Hatches die Kreissegmente beinhalten NICHT unterstützt
- das "Ausschneiden" von Stücken aus einem Polygon mit einem Polygon-Doppelring (zwei gleiche Ringe) der den Außenring schneidet wird NICHT unterstützt. Es wird empfohlen Polygone so einfach wie möglich zu zeichnen. Polygone aus einem Ring und Polygone mit Löchern (Innenringe) die sich nicht überlagern oder schneiden sind kein Problem.
LWPOLYLINE (Polyline):
- die Strichdicke kann sich von der Darstellung in anderen DWG Viewern unterscheiden und ist auf der ganzen Linie konstant
POLYLINE (Polyline):
- unterschiedliche Strichdicke der Liniensegmente wird NICHT unterstützt (die Dicke ist dann immer 1 Pixel)
MTEXT (komplex formatierter Text):
- ein Referenzrechteck (ein Rechteck in dem innerhalb der Textzeilenumbruch automatisch erfolgt) wird NICHT unterstützt -> Alternative: Textzeilenumbrüche müssen manuell angegeben werden
- es wird kein, durch die MTEXT Entität definierter, farbiger Hintergrund unterstützt -> Alternative: Hintergrund vorher manuell zeichnen (z.Bsp. mit Entität SOLID)
- ein benutzerdefinierte Zeilenabstand wird NICHT unterstützt
- die Länge von Tabs kann sich vom DWG Viewer unterscheiden
- gespiegelter Text wird NICHT unterstützt
- durch Entität definierte lokale nicht Default Extrusion Direction wird NICHT unterstützt
MULTILEADER (Text mit Pfeil(en)):
- der Text hat die gleichen Einschränkungen wie die Entität MTEXT
- die Umrandung des Textes wird NICHT unterstützt -> Alternative: Umrandung vorher manuell zeichnen
TEXT (einfacher Text):
- unterstützt keine Control Anweisungen wie %%U339 -> Alternative: MTEXT verwenden
- Ausrichtung (Alignment) "Fit" und "Aligned" werden NICHT unterstützt
- gespiegelter Text wird NICHT unterstützt
ATTRIB (Text an INSERT):
- der Text hat die gleichen Einschränkungen wie die Entität TEXT
SPLINE (Spline):
- die Darstellung von Splines kann sich vom DWG Viewer unterscheiden, da der von AutoCAD verwendete Splinealgorithmus uns unbekannt ist
- Fit points werden NICHT verwendet
Allgemeine Einschränkungen:
Referenzieren von externen Dateien (wie SHX-Dateien) mit Ausnahme von Bildern wird nicht unterstützt
multiple Sichten (VIEWPORT) werden nicht unterstützt
Extrusion Direction wird für die meisten Entitäten unterstützt, mit einer Ausnahme: falls eine Entität über ein INSERT eingebunden wird und dieses INSERT eine nicht Default Extrusion Direction hat, so wird, falls vorhanden, eine lokale (durch die Entität definierte) Extrusion Direction ignoriert
Umlaute müssen für korrekte Darstellung als Unicode Zeichen, codiert werden.
Benutzerdefinierte Linienstile (LTYPE):
- Strich - Auslassungsmuster werden zwar unterstützt, jedoch können sich die Längen der einzelnen Segmente von der Darstellung im DWG Viewer unterscheiden
- Eingebetteter Text wird nur für gerade Liniensegmente unterstützt (keine Kreise, Arcs oder gebogene Linien mit Bulges), jedoch können sich die Abstände zwischen den einzelnen Segmenten von der Darstellung im DWG Viewer unterscheiden
- Eingebettete Shapes werden nicht unterstützt
Sichtbarkeit / Layerzuordnung
Wir verwenden als "Datensatz" jeweils das definierende Elemente. D.H. ein INSERT wird ein Datensatz, die Blöcke und damit enthaltenen Elemente werden diesem Element zugeordnet.
Die Layer der Elemente spielen dann, außer für Strichtypen etc., keine Rolle.
Visible oder Frozen für den Layer des Elements werden demzufolge nicht ausgewertet, dafür aber die Einstellungen für das von uns definierte Root-Objekt
Dies weicht von der Interpretation andere CAD Viewer ab. Eine Änderung des Verhaltens ist nicht kurzfristig möglich.
Implementierungsdetails zu Abfragen mit GeoSQL
alle Text erzeugenden Entitäten geben als Geometrie eine Linie zurück auf dem der Text steht
die Geometrien von Arcs, Ellipsen und Kreisen sind ein interpolierter Linienzug
Blöcke (Inserts) erzeugen Geometrie-Collections, wenn sie aus mehreren Entitäten bestehen
die Geometrie von Polygonen (HATCH) ist ein Multipolygon, wenn mehrere Ringe vorhanden sind
die Geometrie von eingebetteten Bildern (IMAGE) ist ein Linienzug bestehend aus den Eckpunkten des Bildes
die Geometrie eines MULTILEADER ist immer eine Geometrie-Collection
Speicherort und Namen der temporären Dateien
Der Dateiname für die cache-Datei wird aus einer Filesystem-Id gebildet hat die Extension ".cache".
Diese Filesystem-Id ist auch nach dem Verschieben oder Umbenennen der Datei identisch.
Abgelegt werden die Dateien im hinterlegten globalTempDir. (in Iwan: siehe Datei $default.config)
In GeoTools.Net.exe steht der Befehl TestFileId zur Verfügung, dieser generiert diese Namen und kann für die Ermittelung des Cache-Namens zu einer Dxf-Datei verwendet werden.
Bsp. in geotools.net.exe Shell:
TestFileId file:d:\test.dxf
DOS-Name: \\?\D:\test.dxf
NT-Name : \Device\HarddiskVolume1\test.dxf
Guid-Id : a8408672-31cc-0002-0000-550000000000
Guid-Md5: 33d05587-40f1-7318-f865-8e33e2cd5483
"Guid-Id" entspricht hier dem zu ermittelnden Namen der .cache Datei
Aktualisierung der Caches
Beim Neuladen der Ebenen wird geprüft, ob der Cache noch aktuell ist. Dabei wird das Schreibdatum der originalen Daten mit dem Zeitstempel des Cache verglichen.
Seit Version 7.0.8.20 wird bei jedem Zeichenzugriff geprüft ob die Quelldatei sich geändert hat (letztes Schreibdatum).
Wenn dies der Fall ist, wird im Hintergrund die Cache-Datei neu erstellt. Bisher erfolgte diese Prüfung nur beim Laden der Ebene.
Beachten Sie, dass ständige Änderungen an den eingebundenen Dateien das System stark belasten können.
Zuletzt geändert: 20.09.2024 07:22:06 (erstmals erstellt 12.03.2017)