Чтение файла Dxf с помощью Java - PullRequest
10 голосов
/ 19 июля 2011

Я пытаюсь написать / найти некоторый код на Java, который читает файлы dxf и сохраняет геометрию из раздела «Entities» в массивы, чтобы впоследствии я мог импортировать эту информацию в Oracle 11g в виде таблиц.

Заранее спасибо!

Ответы [ 3 ]

10 голосов
/ 02 июня 2012

Я недавно использовал 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.

7 голосов
/ 19 июля 2011

Для получения отзывов, представляющих общий интерес, прочитайте Чтение файлов .DXF

Существует ряд библиотек Java, которые реализуют средство чтения / записи DXF, например kabeja (с открытым исходным кодом) и de-caff (бесплатный просмотрщик, библиотеки, на которых он основан, доступны на коммерческой основе).

Предупреждение: DXF намного сложнее, чем кажется на первый взгляд, поэтомуесли вы выбрали решение, тщательно протестируйте его на ваших данных.

2 голосов
/ 22 апреля 2016

Я использовал Kabeja в своем проекте, и я заметил, что это очень хороший выбор, потому что это бесплатный и мощный инструмент.

Линия автокад представлена ​​двумя конечностями (начальная и конечная точки)

Каждая точка имеет 3 координаты: X, Y и Z

Ниже представлен 2D-метод (работающий как с X, так и с Y), который принимает файл dxf в качестве параметра, анализирует его и затем извлекает строки внутри него.

Строки autocad будут прочитаны с использованием функций kabeja, после чего мы сможем построить наш собственный 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;
    }
}

Где каждый Line равен двум Точкам с в Java

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

        }
    }
}

ArrayList из Line s содержит все строки файла autocad, мы можем, например, нарисовать этот массив на JPanel, поэтому мы полностью переходим с autocad на Java.

...