Экспорт файла SolidWorks для дальнейшего парсинга?
Доброго времени суток.
Каким образом можно экспортировать 3d модель/эскиз для дальнейшего парсинга на С++?
После парсинга нужно получить количество отверстий, их диаметр и расположение относительно друг друга или краев.
Пример такой 3d модели:
Artem Kirsov, Ну структура там, так или иначе - как у всех 3d моделей. Полигоны/треугольники в пространстве. Или набор точек с координатами. а потом набор индексов, описывающих грани. Или набор граней заданных координатами точек.
А вот как дырки искать - это отдельная очень сложная задача. В топологическом смысле? Вот сколько на этой картинке отверстий у объектов?
Ее, наверно. можно даже решить, если у вас отверстия все вот такие - цилиндрическе в плоской модели. Но там все равно будет куча крайних случаев и исключений.
Wataru, Поиск отверстий только в одной плоскости (как на картинке). Открыв STEP файл блокнотом понял что не всё так просто.
Есть такая строка
#357 = CIRCLE ( 'NONE', #49, 20.00000000000000355 ) ;
Вроде и радиус соответствует(20.0), но таких строк (CIRCLE) аж 8 штук.
А отверстий 2, ну допустим деталь объемная и там описано отверстия с обоих сторон детали.
Ну тогда 4, а не 8.
Короче пока не понятно.
Wataru, Разобрался где координаты центров и радиусы каждого отверстия (сделал 3 окружности разного радиуса). Не понятно только чего на каждую окружность по 4 элемента с разными ссылками на другие строки (#nnn), но одинаковыми координатами центра и радиуса. И вопрос как их отличать если все отверстия будут одного диаметра? Только сравнивая координаты?
#357 = CIRCLE ( 'NONE', #49, 20.00000000000000355 ) ;
А что написано в строке #49?
Возьмите все 4 строки CIRCLE для одного отверстия и все 4 строки, на которые они ссылаются. Наверно, там будут отдельно записаны центры окружностей.
Тогда стоит парсить все строчки CIRCLE и все строчки вида того, на что они ссылаются. Потом из них собирать тройки (координаты, радиус) и вот эти вот уникальные выдавать в ответ.
Думаю условно сделать так:
В цикле перебирать файл, при первом нахождении строки "CIRCLE " добавлять её или координаты с радиусом в отдельный массив. А дальше при переборе файла, все строки "CIRCLE " координаты которых уже есть в массиве игнорировать.
Я бы сделал так, прочитал файл и распарсил строчки AXIS2_PLACEMENT_3D, DIRECTION, CARTESIAN_POINT и CIRCLE. Можно поддерживать 4 разных мапа с ключами - номер строки, и данными оттуда. Что-то вроде map, map и map.
При парсинге не надо никаких регулярок - просто разбиваете строку на токены по пробелам, первый - ключ ("#20"), второй должен быть "=", а третий - это тип строки. если он "CIRCLE" и т.д., то берете соответствуюие 1-3 токена в данные (можно float получить через функцию stof(). Для CIRCLE у вас одна строка - ключ (5-ый токен) и float - радиус (6-ой токен). Для Axis выделяете 3 cтроки - ключа. Для Direction и Cartesian_point вы выделяете 3 float.
Потом проходитесь по всем CIRCLE, берете AXIS c нужным ключем, оттуда берете 3 строки c ключами для Cartesian Point и двух осей. Хотя оси, наверно, можно и игнорировать вообще. Потом в map-е для точки берете точку с нужным ключем. И вот у вас отверстие описывается радиусом, тройкой координат центра и двумя тройками координат осей. Оси, возможно, можно игнорировать. Все эти данные складывайте в новый класс. которые кладите в свой set. Оно автоматически дубликаты считать не будет. в конце его size() - это количество отверстий. И можно их все координаты вывести.