Domanda

Qualcuno conosce il codice sorgente, idealmente in C # o simile, per leggere i file .DXF (usati da AutoCAD ecc.)? Se non il codice, le tabelle che mostrano i vari codici (elementi / blocchi / ecc.) E i loro significati?

Sto scrivendo un lettore da solo e ho la documentazione di un albero morto che dettaglia il formato, ma sto cercando di evitare di scrivere ad es. un convertitore da ciascuno dei 255 colori ACI a RGB ... Grazie!

È stato utile?

Soluzione

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

Altri suggerimenti

Ho un paio di anni di lavoro per sviluppare il mio DXf-Viewer in java (potresti trascinare il tuo 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 davvero questo formato. È costoso, ma potrebbe risparmiare 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.

Fortunatamente AutoCAD pubblica le informazioni sul formato DXF qui: Formati DXF

Aggiorna nel caso in cui qualcuno stia ancora cercando ...
È la stessa libreria, includendo solo entrambi i collegamenti.

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

Potresti provare Open Design Alliance . È da un po 'che non lo guardo da solo, ma avevano un sacco di librerie C per gestire vari file di AutoCAD.

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

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

Ho scritto del codice C # per leggere punti / linee / archi da tutte le versioni ASCII DXF disponibili al momento con lo stesso codice
Puoi aggiungere più oggetti semplicemente aggiungendo più subroutine con il nome corretto
(guarda all'interno del DXF).

Cosa fa:

  1. In questa routine invii l'intero file che hai importato con un lettore
  2. Quindi cerca il blocco ENTITIES (qui è dove viene memorizzata la geometria)
  3. Quindi cerca l'oggetto (Punto / Linea / Arco)
    (Da R12 a R14 usare POINT / LINE / ARC)
    (R2000 fino a R2013 usa AcDbPoint / AcDbLine / AcDbArc o AcDbCircle se contiene gli angoli)
  4. Quindi controlla il nome di un livello
  5. Quindi controlla se ci sono i codici variabili
  6. Quindi puoi 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]
                    }
                }
            }
    
        }
    }
    
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top