C# 读取 .DXF 文件
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1000785/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Reading .DXF files
提问by Joel in G?
Does anyone know of source code, ideally in C# or similar, for reading .DXF files (as used by AutoCAD etc)? If not code, then tables showing the various codes (elements / blocks / etc) and their meanings?
有谁知道源代码,最好是 C# 或类似的,用于读取 .DXF 文件(如 AutoCAD 等使用的)?如果不是代码,那么表格显示各种代码(元素/块/等)及其含义?
I am writing a reader myself, and have dead tree documentation detailing the format, but am trying to avoid writing e.g. a converter from each of the 255 ACI colours to RGB... Thanks!
我自己正在写一个读者,并且有详细说明格式的死树文档,但我试图避免编写从 255 种 ACI 颜色中的每一种到 RGB 的转换器......谢谢!
采纳答案by sBENdk
回答by Lazarus
Fortunately AutoCAD publish the DXF format information here: DXF Formats
幸运的是 AutoCAD 在此处发布了 DXF 格式信息:DXF 格式
回答by robertc
You may want to try the Open Design Alliance. It's a while since I looked at it myself, but they had a load of C libraries for dealing with various AutoCAD files.
您可能想尝试开放设计联盟。自从我自己看它已经有一段时间了,但是他们有大量的 C 库来处理各种 AutoCAD 文件。
回答by Joel in G?
回答by Joel in G?
回答by elou
I have work a couple of years at developing my own DXf-Viewer in java(you could drop your own DXF file or an URL on the viewer) for 2D drawings.
The published information from AutoCAD is a good base but doesn't explain how it works.
Becoming member of the Open Design Alliance, will give you the possibility to convert several CAD formats to DXF. It may be a good idea if you are developing a commercial product.
There is a german book (http://www.crlf.de/Verlag/DXF-intern/DXF-intern.html) about DXF which really explain this format. It's expensive, but could save days of search.
The colors in the DXF Format are indexed, you must have a converter from ACI to RGB. Be careful with values 0 and 1 which having a special meaning.
我已经在 Java中开发了我自己的DXf-Viewer(您可以在查看器上放置自己的 DXF 文件或 URL)方面工作了几年,用于 2D 绘图。
AutoCAD 发布的信息是一个很好的基础,但没有解释它是如何工作的。
成为开放设计联盟的成员,您就可以将多种 CAD 格式转换为 DXF。如果您正在开发商业产品,这可能是个好主意。
有一本关于 DXF的德语书 ( http://www.crlf.de/Verlag/DXF-intern/DXF-intern.html) 真正解释了这种格式。它很昂贵,但可以节省数天的搜索时间。
DXF 格式中的颜色被索引,你必须有一个从 ACI 到 RGB 的转换器。请注意具有特殊含义的值 0 和 1。
Regards.
问候。
回答by Sander
I've written some C# code to read points/lines/arc's from all ASCII DXF versions available at the moment with the same code
You can add more objects bij just adding more subroutines with the correct name
(look inside the DXF).
我已经编写了一些 C# 代码来使用相同的代码从目前可用的所有 ASCII DXF 版本中读取点/线/弧。
您可以添加更多对象 bij 只需添加更多具有正确名称的子例程
(查看 DXF 内部)。
What it does:
它能做什么:
- You send the the whole file you've imported with a reader to this routine
- Then it searches for the ENTITIES block (this is where al the geometry is stored)
- Then it searches for the object(Point/Line/Arc)
(R12 till R14 use POINT / LINE/ ARC)
(R2000 till R2013 use AcDbPoint / AcDbLine / AcDbArc or AcDbCircle if it contains the angles) - Then it checks for a layer name
- Then it checks if the variable codes are there
Then you can do something with the data
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] } } } } }
- 您将使用阅读器导入的整个文件发送到此例程
- 然后它搜索 ENTITIES 块(这是存储所有几何图形的地方)
- 然后它搜索对象(点/线/弧)
(R12 到 R14 使用 POINT/LINE/ARC)
(R2000 到 R2013 使用 AcDbPoint/AcDbLine/AcDbArc 或 AcDbCircle,如果它包含角度) - 然后它检查图层名称
- 然后它检查变量代码是否存在
然后你可以对数据做一些事情
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] } } } } }
回答by Ian
Update in case someone is still looking...
It's the same library, just including both links.
更新以防有人仍在寻找...
它是同一个库,只包含两个链接。
https://github.com/haplokuon/netDxf
https://www.nuget.org/packages/netDXF/
https://github.com/haplokuon/netDxf
https://www.nuget.org/packages/netDXF/