Question

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

J'écris moi-même un lecteur et j'ai une documentation d'arbre mort détaillant le format, mais j'essaie d'éviter d'écrire, par exemple. un convertisseur de chacune des 255 couleurs ACI en RVB ... Merci!

Était-ce utile?

La solution

Cadlib de WoutWare que j'utilise pour quelques projets avec de bons résultats.

Autres conseils

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

Cordialement.

Heureusement, AutoCAD publie les informations de format DXF ici: Formats DXF

Mise à jour au cas où quelqu'un cherche toujours ...
C’est la même bibliothèque, avec juste les deux liens.

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

Vous pouvez essayer la Open Design Alliance . Cela fait quelque temps que je l'ai regardé moi-même, mais ils avaient une charge de bibliothèques C pour traiter divers fichiers AutoCAD.

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

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

J'ai écrit du code C # pour lire les points / lignes / arcs de toutes les versions DXF ASCII disponibles pour le moment avec le même code.
Vous pouvez ajouter plus d'objets en ajoutant simplement plusieurs sous-routines avec le nom correct.
(regardez à l'intérieur du DXF).

Ce que ça fait:

  1. Vous envoyez le fichier entier que vous avez importé avec un lecteur à cette routine
  2. Ensuite, il recherche le bloc ENTITIES (c’est là que toute la géométrie est stockée)
  3. Ensuite, il recherche l'objet (Point / Line / Arc)
    (R12 à R14 utilisent POINT / LINE / ARC)
    (R2000 à R2013, utilisez AcDbPoint / AcDbLine / AcDbArc ou AcDbCircle s’il contient les angles)
  4. Ensuite, il recherche un nom de couche
  5. Ensuite, il vérifie si les codes de variable sont présents
  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]
                    }
                }
            }
    
        }
    }
    
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top