2009-06-16 28 views
12

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

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

Respuesta

4

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

+1

Hemos ido con esto: el precio era el correcto, y es una biblioteca muy bien organizada (¡y correctamente comentada!). –

+0

Hace más de 5 años que uso este producto ... Es genial –

4

Afortunadamente AutoCAD publicar la información de formato DXF aquí: DXF Formats

2

Es posible que desee probar el Open Design Alliance. Ha pasado un tiempo desde la última vez que lo revisé, pero tenían una gran cantidad de bibliotecas C para manejar varios archivos de AutoCAD.

+0

Los precios son, sin embargo, en serio empinada , especialmente si tiene la intención de escribir software que también la biblioteca y luego venderlo. –

2

Here es un enlace a un lector de CodeProject dxf; parece muy limitado (y no especialmente bien hecho) sin embargo.

0

Here es otro lector de código abierto dxf, en Java. ¡Buggy sin embargo!

5

Tengo un par de años trabajando en desarrollar mi propio DXf-Viewer in java (puede colocar 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.
Hay 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.

Atentamente.

0

He escrito algo de código C# para leer puntos/líneas/del arco de todas las versiones de DXF ASCII disponibles en este momento con el mismo código
Puede añadir más objetos Bij simplemente añadiendo más subrutinas con el nombre correcto
(mira dentro del DXF).

Lo que hace:

  1. de enviar el archivo de todo el que haya importado con un lector de esta rutina
  2. Entonces se busca bloquear las entidades (aquí es donde al la geometría se almacena)
  3. a continuación, busca el objeto (punto/línea/arco)
    (R12 hasta R14 uso PUNTO/LINE/ARC)
    (R2000 hasta R2013 utilizar AcDbPoint/AcDbLine/AcDbArc o AcDbCircle si contiene los ángulos)
  4. Luego se comprueba si hay un nombre de capa
  5. A continuación, se comprueba si los códigos de variables hay
  6. entonces usted puede 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] 
           } 
          } 
         } 
    
        } 
    }