我正在尝试在 Java 中编写/查找一些代码,这些代码读取 dxf 文件并将“实体”部分中的几何图形存储到数组中,以便以后可以将这些信息以表格的形式导入 Oracle 11g。
先感谢您!
我最近使用了 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。
对于一般感兴趣的一些反馈,请阅读阅读 .DXF 文件
有许多 Java 库实现了 DXF 读取器/写入器,例如kabeja(开源)和de-caff(免费查看器,它所基于的库可在商业上获得)。
一句警告:DXF 比乍一看要复杂得多,因此如果您选择一种解决方案,请在您的数据上彻底测试它。
我在我的项目中使用了 Kabeja,我注意到它是一个非常好的选择,因为它是一个免费且功能强大的工具。
AutoCAD 线由两个端点(起点和终点)表示
每个点有 3 个坐标 : X
,Y
和Z
下面是一个 2D 方法(适用于X
和Y
),它以 dxf 文件作为参数,对其进行解析,然后提取其中的行。
使用 kabeja 函数将读取 autocad 行,然后我们可以构建自己的 Java Line
s
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。