11

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

先感谢您!

4

3 回答 3

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

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

于 2012-06-02T03:42:31.883 回答
7

对于一般感兴趣的一些反馈,请阅读阅读 .DXF 文件

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

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

于 2011-07-19T00:01:39.127 回答
2

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

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

每个点有 3 个坐标 : X,YZ

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

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

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

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

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

        }
    }
}

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

于 2016-04-22T13:29:40.407 回答