Pergunta

Alguém sabe de código fonte, de preferência em C # ou similar, para leitura de arquivos .DXF (como o usado pelo AutoCAD etc)? Se não o código, então tabelas mostrando os vários códigos (elementos / blocos / etc) e seus significados?

Eu estou escrevendo um leitor de mim mesmo, e ter a documentação árvore morta detalhando o formato, mas estou tentando evitar escrever por exemplo um conversor de cada uma das 255 cores ACI para RGB ... Obrigado!

Foi útil?

Solução

Cadlib de WoutWare tenho vindo a utilizar por um par de projetos com bons resultados.

Outras dicas

Eu tenho trabalhar um par de anos para o desenvolvimento de minha própria DXF-Viewer em java (você pode soltar o seu próprio arquivo DXF ou um URL sobre o espectador) para desenhos 2D.
as informações publicadas a partir de AutoCAD é uma base boa, mas não explica como ele funciona.
Tornar-se membro da o Open design Alliance, vai dar-lhe a possibilidade de converter vários formatos de CAD para DXF. Pode ser uma boa idéia se você estiver desenvolvendo um produto comercial.
Há um livro alemão ( http://www.crlf.de/Verlag /DXF-intern/DXF-intern.html ) sobre DXF que realmente explicar este formato. É caro, mas poderia poupar dias de pesquisa.
As cores no formato DXF são indexados, você deve ter um conversor de ACI para RGB. Tenha cuidado com os valores 0 e 1 que têm um significado especial.

Cumprimentos.

Felizmente AutoCAD publicar as informações de formato DXF aqui: DXF formatos

Atualização no caso de alguém ainda está procurando ...
É a mesma biblioteca, apenas incluindo ambos os links.

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

Você pode querer tentar o Open Design Alliance . É um tempo desde que eu olhei para ele mesmo, mas eles tinham uma carga de bibliotecas C para lidar com vários arquivos do AutoCAD.

Aqui é um link para um CodeProject dxf leitor; parece muito limitada (e não particularmente bem feito) embora.

Aqui é outra fonte aberta dxf leitor, em Java. Buggy no entanto!

Eu escrevi algum código C # para ler pontos / linhas / Arc de todo DXF ASCII versões disponíveis no momento com o mesmo código
Você pode adicionar mais objetos Bij apenas adicionando mais sub-rotinas com o nome
correta (Olhar para dentro do DXF).

O que faz:

  1. Você enviar a todo o arquivo que você importou com um leitor a esta rotina
  2. Em seguida, ele procura o bloco ENTIDADES (isto é onde al a geometria é armazenada)
  3. Em seguida, ele procura o objeto (Point / Line / Arc)
    (R12 até R14 uso POINT / LINE / ARC)
    (R2000 até uso R2013 AcDbPoint / AcDbLine / AcDbArc ou AcDbCircle se ele contém os ângulos)
  4. Em seguida, ele verifica um nome de camada
  5. Em seguida, ele verifica se os códigos das variáveis ??estão lá
  6. Depois, você pode fazer alguma coisa com os dados

        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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top