Frage

Kennt jemand Quellcode, idealerweise in C # oder ähnlichem, .DXF Dateien zum Lesen (wie AutoCAD, etc.)? Wenn dies nicht der Code, dann Tabellen zeigen die verschiedenen Codes (Elemente / Blöcke / etc) und ihre Bedeutung?

Ich schreibe ein Leser selbst, und haben toten Baum Dokumentation das Format Detaillierung, aber ich versuche, zum Beispiel das Schreiben zu vermeiden ein Wandler von jedem der 255 ACI Farben RGB ... Danke!

War es hilfreich?

Lösung

CadLib von WoutWare habe ich mit guten Ergebnissen für ein paar Projekte im Einsatz.

Andere Tipps

Ich arbeite habe ein paar Jahre in meinem eigenen dxf-Viewers in Java für 2D-Zeichnungen (Sie können Ihre eigene DXF-Datei oder eine URL auf den Betrachter fallen).
die veröffentlichten Informationen von AutoCAD eine gute Basis, aber nicht erklären, wie es funktioniert.
-Mitglied werden die Open Design Alliance, gibt Ihnen die Möglichkeit, verschiedene CAD-Formate DXF zu konvertieren. Es kann eine gute Idee sein, wenn Sie ein kommerzielles Produkt entwickeln.
Es ist ein Deutsch Buch ( http://www.crlf.de/Verlag /DXF-intern/DXF-intern.html ) über DXF, die wirklich in dieses Format erklären. Es ist teuer, aber konnte Tagen Suche speichern.
Die Farben im DXF-Format indiziert sind, können Sie einen Konverter von ACI zu RGB haben muss. Seien Sie vorsichtig mit den Werten 0 und 1, die eine besondere Bedeutung haben.

Viele Grüße.

Zum Glück AutoCAD veröffentlicht die DXF-Format Informationen hier: DXF-Formate

Update, falls jemand noch sucht ...
Es ist die gleiche Bibliothek, nur mit den beiden Links.

https://github.com/haplokuon/netDxf
https://www.nuget.org/packages/netDXF/

Sie können das Open Design Alliance versuchen. Es ist eine Weile her, seit ich es mir sah, aber sie hatten eine Last von C-Bibliotheken für verschiedene AutoCAD-Dateien handeln.

Hier ist ein Link zu einem Codeproject dxf Leser; Es scheint sehr begrenzt (und nicht besonders gut gemacht) aber.

Hier ist ein weiterer Open-Source-dxf Leser, in Java. Buggy aber!

Ich habe einige C # -Code geschrieben Punkte / Linien / Bogen des von allen ASCII DXF-Versionen zur Zeit mit dem gleichen Code
zur Verfügung zu lesen Sie können weitere Objekte hinzufügen bij nur mehr Subroutinen mit dem richtigen Namen
Hinzufügen (Blick ins Innere der DXF).

Was es tut:

  1. Sie senden die die gesamte Datei, die Sie mit einem Lesegerät zu dieser Routine importiert haben
  2. Dann sucht er nach der Entities-Block (dies ist, wo al die Geometrie wird gespeichert)
  3. Dann sucht es für das Objekt (Punkt / Linie / Bogen)
    (R12 bis R14 Verwendung POINT / LINE / ARC)
    (R2000 bis R2013 verwenden AcDbPoint / AcDbLine / AcDbArc oder AcDbCircle, wenn es um die Winkel enthält)
  4. Dann überprüft er für einen Layer-Namen
  5. Dann prüft sie, ob die Variablencodes sind
  6. Dann können Sie etwas mit den Daten tun

        private void ReadDxfFile (string DxfFile)
    {
        string Layer = "";
    
        string[] D = DxfFile.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
    
        int iEntities = 0; for(int i = 0; i < D.Length; i++) { if (D[i] == "ENTITIES") {iEntities = i; break; } }
        for (int i = iEntities; i < D.Length; i++)
        {
            if (D[i] == "POINT" || D[i] == "AcDbPoint")
            {
                int iEntity = i; if (D[i].StartsWith("AcDb")) { for (iEntity = i; D[iEntity] != "AcDbEntity"; iEntity--) ; }
                Layer = ""; for (int iLayer = iEntity; iLayer < i + 10 && Layer == ""; iLayer++) { if (D[iLayer] == "  8") { Layer = D[iLayer + 1]; }; }
                for (int iWaarden = i; iWaarden < i + 8; iWaarden++)
                {
                    if (D[iWaarden] == " 10" && D[iWaarden + 2] == " 20")
                    {
                        //Here you can store the following data in a list for later use
                        //LayerName = Layer
                        //X = D[iWaarden + 1]
                        //Y = D[iWaarden + 3]
                        //Z = D[iWaarden + 5]
                    }
                }
            }
    
            if (D[i] == "LINE" || D[i] == "AcDbLine")
            {
                int iEntity = i; if (D[i].StartsWith("AcDb")) { for (iEntity = i; D[iEntity] != "AcDbEntity"; iEntity--) ; }
                Layer = ""; for (int iLayer = iEntity; iLayer < i + 10 && Layer == ""; iLayer++) { if (D[iLayer] == "  8") { Layer = D[iLayer + 1]; }; }
                for (int iWaarden = i; iWaarden < i + 10; iWaarden++)
                {
                    if (D[iWaarden] == " 10" && D[iWaarden + 2] == " 20")
                    {
                        //Here you can store the following data in a list for later use
                        //LayerName = Layer
                        //Xbegin = D[iWaarden + 1]
                        //Ybegin = D[iWaarden + 3]
                        //Zbegin = D[iWaarden + 5]
                        //Xend = D[iWaarden + 7]
                        //Yend = D[iWaarden + 9]
                        //Zend = D[iWaarden + 11]
                    }
                }
            }
    
            if (D[i] == "ARC" || D[i] == "AcDbArc" || D[i] == "AcDbCircle")
            {
                int iEntity = i; if (D[i].StartsWith("AcDb")) { for (iEntity = i; D[iEntity] != "AcDbEntity"; iEntity--) ; }
                Layer = ""; for (int iLayer = iEntity; iLayer < i + 10 && Layer == ""; iLayer++) { if (D[iLayer] == "  8") { Layer = D[iLayer + 1]; }; }
                for (int iWaarden = i; iWaarden < i + 10; iWaarden++)
                {
                    if (D[iWaarden] == " 10" && D[iWaarden + 2] == " 20" && D[iWaarden + 10] == " 51")
                    {
                        //Here you can store the following data in a list for later use
                        //LayerName = Layer
                        //Xmid = D[iWaarden + 1]
                        //Ymid = D[iWaarden + 3]
                        //Zmid = D[iWaarden + 5]
                        //Radius = D[iWaarden + 7]
                        //StartAngle = D[iWaarden + 9]
                        //StartAngle = D[iWaarden + 11]
                    }
                    if (D[iWaarden] == " 10" && D[iWaarden + 2] == " 20" && D[iWaarden + 12] == " 51")
                    {
                        //Here you can store the following data in a list for later use
                        //LayerName = Layer
                        //Xmid = D[iWaarden + 1]
                        //Ymid = D[iWaarden + 3]
                        //Zmid = D[iWaarden + 5]
                        //Radius = D[iWaarden + 7]
                        //StartAngle = D[iWaarden + 11]
                        //StartAngle = D[iWaarden + 13]
                    }
                }
            }
    
        }
    }
    
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top