2009-06-16 9 views
12

Quelqu'un connaît le code source, idéalement en C# ou similaire, pour la lecture des fichiers DXF (tel qu'il est utilisé par AutoCAD, etc.)? Si ce n'est pas du code, alors des tableaux montrant les différents codes (éléments/blocs/etc) et leurs significations?lecture .DXF

Je vous écris moi-même lecteur, et accompagnés des documents d'arbre mort détaillant le format, mais essaie d'éviter d'écrire par exemple un convertisseur de chacune des 255 couleurs ACI vers RVB ... Merci!

Répondre

4

Cadlib de WoutWare ce que j'utilise pour un couple de projets avec de bons résultats.

+1

Nous sommes allés avec ceci - le prix était juste, et c'est une bibliothèque bien mise en place (et correctement commentée!). –

+0

Utilisation de ce produit depuis plus de 5 ans maintenant .. C'est super –

2

Vous pouvez essayer le Open Design Alliance. Cela fait un moment que je l'ai regardé moi-même, mais ils avaient un tas de bibliothèques C pour traiter les différents fichiers AutoCAD.

+0

Les prix sont cependant sérieusement raide , surtout si vous avez l'intention d'écrire réellement un logiciel qui aussi la bibliothèque et ensuite le vendre. –

2

Here est un lien vers un lecteur dxf CodeProject; il semble très limité (et pas particulièrement bien fait) cependant.

0

Here est un autre lecteur de dxf open source, en Java. Buggy cependant!

5

J'ai travaillé quelques années à développer mon propre DXf-Viewer in java (vous pouvez déposer votre propre fichier DXF ou une URL sur la visionneuse) pour les dessins 2D.
Les informations publiées par AutoCAD constituent une bonne base mais n'expliquent pas comment cela fonctionne.
membre Devenir de l'Open Design Alliance, vous donnera la possibilité de convertir plusieurs formats de CAO DXF. Ce peut être une bonne idée si vous développez un produit commercial.
Il y a un livre allemand (http://www.crlf.de/Verlag/DXF-intern/DXF-intern.html) à propos de DXF qui expliquent vraiment ce format. C'est cher, mais pourrait sauver des jours de recherche.
Les couleurs dans le format DXF sont indexées, vous devez disposer d'un convertisseur de ACI RVB. Attention aux valeurs 0 et 1 qui ont une signification particulière.

Cordialement.

0

J'ai écrit un code C# à partir de toutes les versions DXF ASCII lecture de points/lignes/d'arc disponible pour le moment avec le même code
Vous pouvez ajouter des objets Bij ajoutant simplement plus sous-routines avec le nom correct
(regarde à l'intérieur du DXF).

Ce qu'il fait:

  1. Vous envoyez le tout le fichier que vous avez importé avec un lecteur à cette routine
  2. Ensuite, il recherche les ENTITÉS bloc (c'est là al la géométrie est stockée)
  3. Ensuite, il recherche l'objet (point/ligne/Arc)
    (R12 jusqu'à R14 utilisation pOINT/lIGNE/ARC)
    (R2000 à R2013 utiliser AcDbPoint/AcDbLine/AcDbArc ou AcDbCircle si elle contient les angles)
  4. Ensuite, il vérifie un nom de couche
  5. Ensuite, il vérifie si les codes variables sont là
  6. Ensuite, vous pouvez faire quelque chose avec les données

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