Pregunta

¿Alguien conoce el código fuente, idealmente en C # o similar, para leer archivos .DXF (como los utiliza AutoCAD, etc.)? Si no es el código, ¿las tablas que muestran los diversos códigos (elementos / bloques / etc) y sus significados?

Yo mismo estoy escribiendo un lector y tengo documentación de árbol muerto que detalla el formato, pero estoy tratando de evitar escribir, por ejemplo. un convertidor de cada uno de los 255 colores ACI a RGB ... ¡Gracias!

¿Fue útil?

Solución

Cadlib de WoutWare he estado usando para un par de proyectos con buenos resultados.

Otros consejos

He trabajado un par de años para desarrollar mi propio DXf-Viewer en java (puede dejar su propio archivo DXF o una URL en el visor) para dibujos en 2D.
La información publicada de AutoCAD es una buena base pero no explica cómo funciona.
Convertirse en miembro de Open Design Alliance, le dará la posibilidad de convertir varios formatos CAD a DXF. Puede ser una buena idea si está desarrollando un producto comercial.
Existe un libro alemán ( http://www.crlf.de/Verlag /DXF-intern/DXF-intern.html ) sobre DXF que realmente explica este formato. Es caro, pero podría ahorrar días de búsqueda.
Los colores en el formato DXF están indexados, debe tener un convertidor de ACI a RGB. Tenga cuidado con los valores 0 y 1 que tienen un significado especial.

Saludos.

Afortunadamente, AutoCAD publica la información del formato DXF aquí: Formatos DXF

Actualización en caso de que alguien todavía esté buscando ...
Es la misma biblioteca, que incluye ambos enlaces.

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

Es posible que desee probar la Open Design Alliance . Hace tiempo que lo miraba, pero tenían una carga de bibliotecas de C para tratar con varios archivos de AutoCAD.

Aquí hay un enlace a un lector CodeProject dxf; Sin embargo, parece muy limitado (y no muy bien hecho).

Aquí hay otro lector de código abierto de dxf, en Java. Buggy sin embargo!

He escrito algunos códigos C # para leer puntos / líneas / arcos de todas las versiones ASCII DXF disponibles en este momento con el mismo código
Puede agregar más objetos, simplemente agregando más subrutinas con el nombre correcto
(mira dentro del DXF).

Lo que hace:

  1. Envías el archivo completo que has importado con un lector a esta rutina
  2. Luego busca el bloque ENTITIES (aquí es donde se almacena la geometría)
  3. Luego busca el objeto (Punto / Línea / Arco)
    (R12 hasta R14 usa PUNTO / LINEA / ARC)
    (R2000 hasta R2013 usa AcDbPoint / AcDbLine / AcDbArc o AcDbCircle si contiene los ángulos)
  4. Luego comprueba el nombre de una capa
  5. Luego verifica si los códigos de las variables están ahí
  6. Entonces puedes hacer algo con los datos

        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]
                    }
                }
            }
    
        }
    }
    
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top