【问题标题】:Reading a Dxf file with Java使用 Java 读取 Dxf 文件
【发布时间】:2011-10-08 02:49:21
【问题描述】:

我正在尝试在 Java 中编写/查找一些代码,这些代码读取 dxf 文件并将“实体”部分中的几何图形存储到数组中,以便以后可以将这些信息以表格的形式导入 Oracle 11g。

提前谢谢你!

【问题讨论】:

    标签: java dxf


    【解决方案1】:

    对于一些普遍感兴趣的反馈,请阅读Reading .DXF files

    有许多 Java 库实现了 DXF 读取器/写入器,例如 kabeja(开源)和 de-caff(免费查看器,它所基于的库可在商业上获得)。

    警告:DXF 比乍一看要复杂得多,因此如果您选择解决方案,请在 您的 数据上彻底测试它。

    【讨论】:

      【解决方案2】:

      我最近使用过kabeja 并没有遇到任何问题,尽管我做了一些非常简单的任务。如果您只想将这些几何图形放入一个数组中,它将完成这项工作(在其他情况下我无法确定)。 如果您已经知道 DXF 格式,那么您将毫无问题地开始使用。它可以像下面这样简单(例如提取一些圆形实体):

      Parser parser = ParserBuilder.createDefaultParser();
      parser.parse("path/file.dxf", DXFParser.DEFAULT_ENCODING);
      DXFDocument doc = parser.getDocument();
      DXFlayer layer = doc.getDXFLayer("layer_name");
      List<DXFCircle> arcs = layer.getDXFEntities(DXFConstants.ENTITY_TYPE_CIRCLE);
      

      文档有点不完整,但它有不错的 javadocs 和干净的 api。

      【讨论】:

      • 你能解释一下如何改变使用 kabeja 生成的图像的大小。
      • 对不起...我没有使用过该功能。我只提取了 dxf 实体并将它们渲染到 jpanel。
      【解决方案3】:

      我在我的项目中使用了Kabeja,我注意到这是一个非常好的选择,因为它是一个免费且功能强大的工具。

      AutoCAD 线由两个端点(起点和终点)表示

      每个点有 3 个坐标:XYZ

      下面是一个 2D 方法(适用于 XY),它以 dxf 文件作为参数,对其进行解析,然后提取其中的行。

      将使用kabeja函数读取autocad行,然后我们可以构建自己的JavaLines

      public class ReadAutocadFile {
      
          public static ArrayList<Line> getAutocadFile(String filePath) throws ParseException {
              ArrayList<Line> lines = new ArrayList<>();
              Parser parser = ParserBuilder.createDefaultParser();
              parser.parse(filePath, DXFParser.DEFAULT_ENCODING);
              DXFDocument doc = parser.getDocument();
              List<DXFLine> lst = doc.getDXFLayer("layername ... whatever").getDXFEntities(DXFConstants.ENTITY_TYPE_LINE);
              for (int index = 0; index < lst.size(); index++) {
                  Bounds bounds = lst.get(index).getBounds();
                  Line line = new Line(
                          new Point(new Double(bounds.getMinimumX()).intValue(),
                          new Double(bounds.getMinimumY()).intValue()),
                          new Point(new Double(bounds.getMaximumX()).intValue(),
                          new Double(bounds.getMaximumY()).intValue())
                          );
                  lines.add(line);
              }
              return lines;
          }
      }
      

      每个Line 在Java 中大约是两个Point

      public class Line {
      
          private Point p1;
          private Point p2;
      
          public Line (Point p1, Point p2){
              this.p1 = p1;
              this.p2 = p2;
          }
      
          public Point getP1() {
              return p1;
          }
      
          public void setP1(Point p1) {
              this.p1 = p1;
          }
      
          public Point getP2() {
              return p2;
          }
      
          public void setP2(Point p2) {
              this.p2 = p2;
          }
      }
      

      演示:

      public class ReadAutocadFileTest {
      
          public static void main(String[] args) {
              try {
                  File file = new File("testFile.dxf");
                  ArrayList<Line> lines  = ReadAutocadFile.getAutocadFile(file.getAbsolutePath());
                  for(int index = 0 ; index < lines.size() ; index++){
                      System.out.println("Line " + (index +1));
                      System.out.print("(" + lines.get(index).getP1().getX() + "," + lines.get(index).getP1().getY()+ ")");
                      System.out.print(" to (" + lines.get(index).getP2().getX() + "," + lines.get(index).getP2().getY()+ ")\n");
                  }
              } catch (Exception e) {
      
              }
          }
      }
      

      Lines 的 ArrayList 包含 autocad 文件的所有行,我们可以在 JPanel 上绘制这个数组列表,这样我们就可以完全从 autocad 迁移到 Java。

      【讨论】:

      • @Samane :我不明白,你的意思是在 AutoCAD 文件中添加一个点?
      • @Samane :线由两个点(起点和终点)表示,要在 AutoCAD 中绘制一条线,您只需按 L 按钮使用绘制线命令,然后绘制行。
      • 不,我的意思是我想在 java 中使用 kabeja 库向 AutoCAD 文件类似的代码添加点。
      • @Samane : Kabeja 是一个用于解析 dxf 文件的 Java 库,因此我们只能从中提取线条和形状,您不能使用 java 在 dxf 文件中绘制线条。
      • 哦,还有别的办法吗?
      猜你喜欢
      • 1970-01-01
      • 2010-11-03
      • 2016-11-10
      • 1970-01-01
      • 2013-02-07
      • 1970-01-01
      • 1970-01-01
      • 2016-08-22
      • 2021-09-16
      相关资源
      最近更新 更多