2009-06-16 13 views
12

Kennt jemand Quellcode, idealerweise in C# oder ähnlich, zum Lesen von .DXF-Dateien (wie von AutoCAD usw. verwendet)? Wenn nicht Code, dann Tabellen mit den verschiedenen Codes (Elemente/Blöcke/etc) und deren Bedeutung?.DXF-Dateien lesen

Ich schreibe einen Reader selbst, und habe tote Baumdokumentation, die das Format detailliert, aber versuche zu vermeiden, z. ein Konverter von jeder der 255 ACI Farben zu RGB ... Danke!

Antwort

4

Cadlib von WoutWare habe ich für ein paar Projekte mit guten Ergebnissen verwendet.

+1

Wir sind damit gegangen - der Preis war richtig, und es ist eine schön zusammen (und richtig kommentiert!) Bibliothek. –

+0

Verwenden Sie dieses Produkt jetzt seit über 5 Jahren .. Es ist großartig –

2

Sie möchten die Open Design Alliance versuchen. Es ist eine Weile her, seit ich es selbst gesehen habe, aber sie hatten eine Menge C-Bibliotheken für den Umgang mit verschiedenen AutoCAD-Dateien.

+0

Die Preise sind jedoch tun können, ernsthaft steil vor allem, wenn Sie beabsichtigen, Software zu schreiben, die auch die Bibliothek und dann verkaufen. –

2

Here ist eine Verknüpfung zu einem CodeProject-Dxf-Leser; Es scheint jedoch sehr begrenzt (und nicht besonders gut gemacht).

0

Here ist ein weiterer Open-Source-Dxf-Reader, in Java. Buggy jedoch!

5

Ich arbeite seit ein paar Jahren an der Entwicklung meiner eigenen DXf-Viewer in java (Sie könnten Ihre eigene DXF-Datei oder eine URL auf den Viewer legen) für 2D-Zeichnungen.
Die veröffentlichten Informationen von AutoCAD sind eine gute Basis, erklären aber nicht, wie es funktioniert.
Werden Sie Mitglied der Open Design Alliance, erhalten Sie die Möglichkeit, mehrere CAD-Formate in DXF zu konvertieren. Es kann eine gute Idee sein, wenn Sie ein kommerzielles Produkt entwickeln.
Es gibt ein deutsches Buch() über DXF, das dieses Format wirklich erklärt. Es ist teuer, könnte aber Tage der Suche sparen.
Die Farben im DXF-Format sind indiziert, Sie müssen einen Konverter von ACI nach RGB haben. Seien Sie vorsichtig mit den Werten 0 und 1, die eine besondere Bedeutung haben.

Grüße.

0

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 mehrere Objekte mehr Subroutinen mit dem richtigen Namen nur Bij hinzufügen
Zugabe (schauen Sie in die DXF).

Was es tut:

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

    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] 
           } 
          } 
         } 
    
        } 
    }