我正在尝试用Java编写/查找一些代码来读取dxf文件并将几何体从“实体”部分存储到数组中,这样我以后可以根据表格将这些信息导入Oracle 11g。
提前谢谢!
答案 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个坐标:X
,Y
和Z
下面是一个2D方法(同时处理X
和Y
),它将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。