阅读.DXF文件

有没有人知道源代码,理想情况下是C#或类似的源代码,用于读取.DXF文件(由AutoCAD等使用)? 如果不是代码,那么表格显示各种代码(元素/块/等)及其含义?

我自己写了一个读者,并且有详细说明格式的死树文档,但我试图避免将255个ACI颜色中的每一个转换为RGB转换为… …谢谢!

来自WoutWare的Cadlib已经用于几个项目并取得了良好的效果。

我有两年的时间在开发我自己的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。

问候。

幸运的是,AutoCAD在此处发布了DXF格式信息: DXF格式

您可能想尝试开放设计联盟 。 我自己看了一段时间,但他们有大量的C库来处理各种AutoCAD文件。

这是CodeProject dxf阅读器的链接; 但它似乎非常有限(并且做得不是特别好)。

这是Java中的另一个开源dxf阅读器。 但是越野车!

我已经编写了一些C#代码,用相同的代码从目前可用的所有ASCII DXF版本中读取点/行/弧
您可以添加更多对象bij,只需添加更多具有正确名称的子例程
(看看DXF内部)。

它能做什么:

  1. 您将使用阅读器导入的整个文件发送到此例程
  2. 然后它搜索ENTITIES块(这是几何存储的位置)
  3. 然后它搜索对象(点/线/弧)
    (R12至R14使用POINT / LINE / ARC)
    (R2000至R2013使用AcDbPoint / AcDbLine / AcDbArc或AcDbCircle,如果它包含角度)
  4. 然后它检查图层名称
  5. 然后它检查变量代码是否存在
  6. 然后你可以对数据做些什么

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

如果有人仍在寻找更新……
它是同一个库,只包括两个链接。

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