代码之家  ›  专栏  ›  技术社区  ›  Joel in Gö

正在读取.dxf文件[已关闭]

  •  16
  • Joel in Gö  · 技术社区  · 17 年前

    是否有人知道用于读取.dxf文件(如autocad等所用)的源代码(最好是C或类似代码)?如果不是代码,那么显示各种代码(元素/块等)及其含义的表?

    我自己正在写一个阅读器,并有详细的格式的死树文档,但我试图避免写例如从255个aci颜色到rgb的转换器…谢谢!

    8 回复  |  直到 8 年前
        1
  •  6
  •   Wout    15 年前

    Cadlib 从Woutware我已经用了几个项目,效果很好。

        2
  •  5
  •   elou    16 年前

    我有几年的工作在发展我自己的 DXf-Viewer in java (您可以将自己的DXF文件或URL放到查看器上)用于二维图形。
    从AutoCAD发布的信息是一个很好的基础,但不能解释它是如何工作的。
    成为开放式设计联盟的成员,将为您提供将几种CAD格式转换为DXF的可能性。如果您正在开发商业产品,这可能是一个好主意。
    有一本德语书( http://www.crlf.de/Verlag/DXF-intern/DXF-intern.html )关于dxf,它真正解释了这种格式。它很贵,但可以节省几天的搜索时间。
    dxf格式的颜色是索引的,您必须有一个从aci到rgb的转换器。注意具有特殊含义的值0和1。

    当做。

        3
  •  4
  •   Lazarus    17 年前

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

        4
  •  2
  •   robertc    17 年前

    你可能想试试 Open Design Alliance . 我已经有一段时间没亲自看过了,但是他们有很多C库用来处理各种AutoCAD文件。

        5
  •  2
  •   Joel in Gö    17 年前

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

        6
  •  0
  •   Joel in Gö    17 年前

    Here 是另一个开源的DXF阅读器,在Java中。但是马车!

        7
  •  0
  •   Sander    8 年前

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

    它做什么:

    1. 您将用读卡器导入的整个文件发送到此例程
    2. 然后搜索实体块(这是存储所有几何图形的位置)
    3. 然后搜索对象(点/线/弧)
      (R12到R14使用点/线/弧)
      (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]
                      }
                  }
              }
      
          }
      }
      
        8
  •  0
  •   Ian    8 年前

    更新以防有人仍在查找…
    它是同一个库,只包含两个链接。

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