使用Java读取Dxf文件

时间:2011-07-18 23:43:16

标签: java dxf

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

提前谢谢!

3 个答案:

答案 0 :(得分:10)

我最近使用过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);

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

答案 1 :(得分:7)

对于一般兴趣的反馈,请阅读Reading .DXF files

有许多Java库实现了像kabeja(开放源代码)和de-caff这样的DXF读取器/写入器(一个免费的查看器,它所基于的库是商业上可用的)。

警告:DXF比第一眼看上去更复杂,所以如果您选择一个解决方案,请在您的数据上彻底测试。

答案 2 :(得分:2)

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

autocad线由两个末端(起点和终点)

表示

每个点都有3个坐标:XYZ

下面是一个2D方法(同时处理XY),它将dxf文件作为参数,解析它然后提取其中的行。

autocad行将使用kabeja函数重新编译,然后我们可以构建自己的Java Line

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) {

        }
    }
}

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