arquivos de leitura .DXF [fechado]
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!
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:
- Você enviar a todo o arquivo que você importou com um leitor a esta rotina
- Em seguida, ele procura o bloco ENTIDADES (isto é onde al a geometria é armazenada)
- 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) - Em seguida, ele verifica um nome de camada
- Em seguida, ele verifica se os códigos das variáveis ??estão lá
-
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] } } } } }