2009-06-16 30 views
12

Qualcuno conosce il codice sorgente, idealmente in C# o simile, per la lettura di file .DXF (utilizzati da AutoCAD, ecc.)? Se non il codice, allora le tabelle che mostrano i vari codici (elementi/blocchi/ecc.) E il loro significato?Lettura di file .DXF

Scrivo da solo un lettore e ho una documentazione dell'albero morto che specifica il formato, ma sto cercando di evitare di scrivere ad es. un convertitore da ciascuno dei 255 colori ACI a RGB ... Grazie!

risposta

4

Cadlib da WoutWare ho utilizzato per un paio di progetti con buoni risultati.

+1

Siamo andati con questo - il prezzo era giusto, ed è una libreria ben assemblata (e adeguatamente commentata!). –

+0

State usando questo prodotto da oltre 5 anni. È fantastico –

4

Fortunatamente AutoCAD pubblicare le informazioni formato DXF qui: DXF Formats

2

Si consiglia di provare il Open Design Alliance. È passato un po 'di tempo da quando l'ho guardato io stesso, ma avevano un sacco di librerie C per gestire vari file di AutoCAD.

+0

I prezzi sono, tuttavia, seriamente ripida , soprattutto se si intende effettivamente scrivere software che anche la libreria e poi venderlo. –

2

Here è un collegamento a un lettore di dxf CodeProject; sembra molto limitato (e non particolarmente ben fatto) però.

0

Here è un altro lettore dxf open source, in Java. Buggy comunque!

5

Ho un paio di anni di lavoro per sviluppare il mio DXf-Viewer in java (è possibile rilasciare il proprio file DXF o un URL sul visualizzatore) per i disegni 2D.
Le informazioni pubblicate da AutoCAD sono una buona base, ma non spiegano come funziona.
Diventare membro di Open Design Alliance, ti darà la possibilità di convertire diversi formati CAD in DXF. Potrebbe essere una buona idea se stai sviluppando un prodotto commerciale.
C'è un libro tedesco (http://www.crlf.de/Verlag/DXF-intern/DXF-intern.html) su DXF che spiega veramente questo formato. È costoso, ma potrebbe salvare giorni di ricerca.
I colori nel formato DXF sono indicizzati, è necessario disporre di un convertitore da ACI a RGB. Fai attenzione ai valori 0 e 1 che hanno un significato speciale.

Saluti.

0

Ho scritto un po 'di codice C# per leggere punti/linee/arco di da tutte le versioni ASCII DXF disponibili al momento con lo stesso codice
È possibile aggiungere più oggetti bij solo l'aggiunta di più subroutine con il nome corretto
(guarda dentro il DXF).

Cosa fa:

  1. si invia il tutto il file che hai importato con un lettore a questa routine
  2. Poi cerca per le entità blocco (questo è dove al la geometria viene memorizzato)
  3. Poi cerca l'oggetto (punto/linea/Arc)
    (R12 fino a R14 uso PUNTO/lINEA/ARC)
    (R2000 fino R2013 utilizzare AcDbPoint/AcDbLine/AcDbArc o AcDbCircle se contiene gli angoli)
  4. Poi si verifica la presenza di un nome di livello
  5. Poi controlla se i codici delle variabili sono lì
  6. allora si può fare qualcosa con i dati

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