libopencad - разработка новой библиотеки поддержки DWG (GSoC'16)

Вопросы по программному обеспечению NextGIS: Web, Mobile, QGIS, Manager и многочисленным модулям
Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: libopencad - разработка новой библиотеки поддержки DWG (

Сообщение Дмитрий Барышников » 14 июл 2016, 10:06

Сейчас остался незакрытым вопрос с атрибутами - Attr и AttrDef. Есть ли такие файлы? Пока есть понимание что атрибуты навешиваются на блоки, а не entity. Может мы не правы.
Это нужно для отображения в таблице атрибутов.

Еще, если есть примеры, когда dwg "не так как надо" открывался в ГИС софте (ArcGIS, Панорама ...). Тоже бы посмотрели и сделали бы как надо (если модель GDAL позволит).

Ariki
Гуру
Сообщения: 731
Зарегистрирован: 12 янв 2011, 22:40
Репутация: 304
Ваше звание:

Re: libopencad - разработка новой библиотеки поддержки DWG (

Сообщение Ariki » 14 июл 2016, 11:41

Да, атрибуты навешиваются на блоки. Причём атрибут, как правило (но необязательно), - это отображаемый текст, который может иметь собственную точку привязки на чертеже (но остаётся связанным с экземпляром блока).

Постараюсь не забыть найти вечером подходящий пример в своих архивах. Я когда-то активно использовал блоки с атрибутами, кастомные типы линий, wipeout'ы и прочие хитрые возможности AutoCAD для оформления топосъёмок. Даже динамические блоки пробовал использовать (например, для условного знака трубы под дорогой), но они часто глючили и не имели понятного задокументированного представления в формате DXF, так что с ними опыт скорее негативный.

Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9128
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 747
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: libopencad - разработка новой библиотеки поддержки DWG (

Сообщение Максим Дубинин » 14 июл 2016, 15:52

Донецков, шлите все подряд более-менее типовое. Сэмплы дальше разработчиков распространяться не будут.
пристегивайтесь, турбулентность прямо по курсу

sandyre
Новоприбывший
Сообщения: 5
Зарегистрирован: 11 мар 2016, 14:43
Репутация: 9

Re: libopencad - разработка новой библиотеки поддержки DWG (

Сообщение sandyre » 14 июл 2016, 16:40

Донецков писал(а):Какие примеры файлов в dwg нужны, с какими примитивами и т.п. ? По возможности пришлю ...
На гитхабе, в репозитории библиотеки есть страница https://github.com/sandyre/libopencad/w ... geometries

Внизу есть список unsupported geometries с пояснениями, почему пока их поддержки нет в библиотеке. Есть геометрии помеченные как "how to make it in ACAD?". Примеры именно таких геометрий нам нужны.

Спасибо.
sun and dire

Ariki
Гуру
Сообщения: 731
Зарегистрирован: 12 янв 2011, 22:40
Репутация: 304
Ваше звание:

Re: libopencad - разработка новой библиотеки поддержки DWG (

Сообщение Ariki » 14 июл 2016, 17:19

Что касается wipeout, то по свойствам он очень похож на растр с полигональной границей, но без содержимого. Не удивлюсь, если и внутреннее представление его совпадает с представлением растра, поэтому его и нет в спецификации. Это сравнительно позднее добавление в AutoCAD (по-моему, появилось в версии 2005 или 2006) и вполне могло быть реализовано в виде костыля для обратной совместимости.

Форма (SHAPE) - это тоже своеобразный костыль, но более старый. Используется в в основном для реализации пользовательских шрифтов и элементов типов линий, но может быть и вставлена прямо в чертёж подобно блоку. Формы описываются на специальном векторном языке и затем компилируются в бинарный файл, из которого могут быть загружены в чертёж. Описание языка есть в документации AutoCAD, насчёт бинарного представления не знаю.

Ещё, если мне не изменяет память, многие вещи, реализованные в сторонних расширениях для AutoCAD (а геодезисты любят их использовать), имеют графическое представление в виде так называемых proxy-объектов, чтобы корректно отображаться в AutoCAD без установленных расширений. Хорошо бы научиться работать с ними, хотя я не знаю, документированы ли где-нибудь эти самые proxy.

sandyre
Новоприбывший
Сообщения: 5
Зарегистрирован: 11 мар 2016, 14:43
Репутация: 9

Re: libopencad - разработка новой библиотеки поддержки DWG (

Сообщение sandyre » 14 июл 2016, 18:34

Ariki писал(а):Что касается wipeout, то по свойствам он очень похож на растр с полигональной границей, но без содержимого. Не удивлюсь, если и внутреннее представление его совпадает с представлением растра, поэтому его и нет в спецификации. Это сравнительно позднее добавление в AutoCAD (по-моему, появилось в версии 2005 или 2006) и вполне могло быть реализовано в виде костыля для обратной совместимости.

Форма (SHAPE) - это тоже своеобразный костыль, но более старый. Используется в в основном для реализации пользовательских шрифтов и элементов типов линий, но может быть и вставлена прямо в чертёж подобно блоку. Формы описываются на специальном векторном языке и затем компилируются в бинарный файл, из которого могут быть загружены в чертёж. Описание языка есть в документации AutoCAD, насчёт бинарного представления не знаю.

Ещё, если мне не изменяет память, многие вещи, реализованные в сторонних расширениях для AutoCAD (а геодезисты любят их использовать), имеют графическое представление в виде так называемых proxy-объектов, чтобы корректно отображаться в AutoCAD без установленных расширений. Хорошо бы научиться работать с ними, хотя я не знаю, документированы ли где-нибудь эти самые proxy.
Большое спасибо про wipeout - попробую читать его как растр, может быть и правда сработает.
Proxy-entities задокументированы в ODA DWG Spec, но достаточно обширны, постараюсь успеть их прикрутить к дедлайну, но обещать не буду.
sun and dire

sandyre
Новоприбывший
Сообщения: 5
Зарегистрирован: 11 мар 2016, 14:43
Репутация: 9

Re: libopencad - разработка новой библиотеки поддержки DWG (

Сообщение sandyre » 15 авг 2016, 10:14

Финальный отчет по GSoC (перевод).

Краткое описание идеи.
Цель моего проекта была в добавлении поддержки DWG в GDAL.

Состояние проекта (GDAL) до моей работы.
Поддержка DWG была, однако она не была встроенной по умолчанию, а зависела от проприетарной third-party библиотеки Teigha, которую нужно было приобретать и подключать самостоятельно.

Какие возможности привнес мой проект в ПО (GDAL).

Libopencad (GDAL CAD Driver engine)

Обзор
Libopencad это библиотека написанная на C++11, которая позволяет читать и писать CAD (DWG/DXF/DXFB) файлы. Она была спроектирована для того, чтобы иметь общий API для работы с любыми CAD файлами. В ней присутствует базовый абстрактный класс CADFile. Создавая классы-наследники от CADFile становится возможным написание ‘драйвера’ для любого CAD формата, все что для этого нужно - это переопределить интерфейсные функции вида ‘CADFile::GetGeometry(index)’ для чтения конкретного формата и версии. Сейчас реализован драйвер для DWG2000 (R15), однако только для чтения.
В комплект поставки библиотеки идет утилита 'cadinfo', которая выводит на экран все, что библиотека может извлечь из файла - переменные ACAD, представленные слои и их атрибуты, а так же геометрии.
Внутренняя структура
Библиотека представляет объекты CAD двумя различными способами - базовый класс CADObject и классы наследующие его (CAD...Object) являются точными аналогами того, как CAD формат хранит эти объекты (те же типы данных, и другие тонкости); класс CADGeometry и другие классы наследующие его (например, CADLine, CADArc и тд) сделаны для API доступа к CAD...Object классам. Другими словами, библиотека оперирует CAD...Object, и при запросе вызывающей программы преобразует их к CADGeometry (и не только, существуют классы вида CADDictionary, которые предоставляют доступ к Named Object Dictionary).
Библиотека поддерживает 3 вида чтения (OpenOptions) - READ_ALL (все, что может быть "изъято" из CAD файла будет вычитано), READ_FAST (пропускается некоторая "бесполезная" информация - не идет подсчет CRC, LineTypes пропускаются), READ_FASTEST (только геометрия будет вычитана, все остальное пропущено).
При парсинге файла, библиотека не сохраняет никакую информацию, которая ей не нужна. Сначала, она вычитывает мета-информацию (переменные окружения, различные ObjectMap и Classes-секции), и строит карту файла (file map). Она сохраняет только некоторую информацию о слоях (их атрибуты, вида имя слоя, "заморожен", "невидим" и тд), и переменные ACAD. Затем, когда вызывающее приложение использует CADLayer.GetGeometry(index), она на самом деле вычитывает запрашиваемую геометрию, используя заготовленную file map. Конечно, иногда это будет медленнее чем кешировать все, что она вычитывает - однако это дает гибкость в использовании библиотеки - вы сами решаете, что нужно кешировать, а что нет.
Библиотека так же имеет специальные классы которые инкапсулируют функции чтения/записи, так что становится возможным переопределить их под ваши нужды - по умолчанию они используют std::fstream, однако возможно заставить библиотеку работать и с сетью, создав класс-наследник CADFileIO и передав его в функцию OpenCADFile(CADFileIO, OpenOptions).

Библиотека поддерживает чтение следующих геометрий (для остальных не реализован маппинг CAD...Object -> CADGeometry):
Point, Circle, Ellipse, Arc, Text, Solid, Spline, Line, Polyline 2D, Polyline 3D, LWPolyline, Ray, Raster (Images), MText, MLine, XLine, Polyface Mesh, 3DFace.


GDAL CAD Driver

Обзор
GDAL CAD Driver использует libopencad как источник данных. Не все, что умеет libopencad, уже отмапплено в OGR-представление. Текущие "фичи":
OpenOptions представляет из себя 2 опции:
- MODE - READ_ALL/READ_FAST/READ_FASTEST (означает то же самое, что и библиотечный OpenOptions, параметр просто пробрасывается в библиотеку).
- ADD_UNSUPPORTED_GEOMETRIES_DATA (YES/NO) - нестабильная фича, если какие либо объекты не могут быть отмапплены в OGR-представление (или они просто не реализованы), они будут представлены как CADUnknown объекты и отмапплены в OGRFeature которое не имеет геометрического представления (поведение, например, QGIS при работе с объектами без геометрического представления неизвестно) однако с базовой информацией - тип геометрии, и некоторые другие параметры.
CAD переменные отмапплены в metadata.
В отличии от DXF driver, CAD driver поддерживает послойность векторных данных (а не все объекты попадают на один слой entities).
Растровые subdatasets так же поддержаны.
Системы координат извлекаются напрямую из CAD файла (если они представлены в соответствии с ESRI Docs for DWG files), или, если изъять их не удалось, из %FILENAME%.prj файла в той же директории.
Атрибуты CADGeometry полностью отмапплены в OGRLayerDefn. Таким образом, все атрибуты блоков будут видны в OGRLayerDefn.

Все полезные ссылки.
Libopencad repository (installation is described in REAME.MD)
Libopencad + GDAL fork
Blog with all reports and notices
PR with my work into GDAL-trunk.
GDAL Wiki driver page

Скриншоты работы.
Поддержка растра и вектора одним и тем же драйвером (слева - ArcGIS, справа - QGIS):
Изображение

Небольшое сравнение оригинала (ACAD) и QGIS с новым DWG driver:
Изображение

Маппинг атрибутов блока в OGRLayerDefn:
Изображение
sun and dire

freeExec
Гуру
Сообщения: 1195
Зарегистрирован: 23 апр 2011, 10:32
Репутация: 205
Откуда: Ульяновск

Re: libopencad - разработка новой библиотеки поддержки DWG (

Сообщение freeExec » 17 авг 2016, 16:03

А чтобы пощупать надо собирать из исходников или где-то есть готовое под винду?

Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: libopencad - разработка новой библиотеки поддержки DWG (

Сообщение Дмитрий Барышников » 17 авг 2016, 16:11

Пока только из исходников. В сентябре сделаем "ночные сборки" для нашей транковой версии.

Аватара пользователя
SergeyRyzhkov
Гуру
Сообщения: 909
Зарегистрирован: 02 июл 2014, 19:13
Репутация: 203
Ваше звание: GP-экотеррористы
Откуда: Санкт-Петербург
Контактная информация:

Re: libopencad - разработка новой библиотеки поддержки DWG (

Сообщение SergeyRyzhkov » 18 авг 2016, 13:01

Дмитрий. Пишу с телеф(могут быть описки)
Я могу выслать Вам пример автокадовских файлов,а Вы мне результаи.
Также помимо файдов пришлю доп.хотелки(для возможного нашего модуля в рамках прлекта для водоканала). Хотелки могут выразиться в небольшой контракт с вашей компанией)

[ Сообщение с мобильного устройства ]

Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: libopencad - разработка новой библиотеки поддержки DWG (

Сообщение Дмитрий Барышников » 18 авг 2016, 14:40

Присылайте. Почта у меня не изменилась mailto:dmitry.baryshnikov@nextgis.ru

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: libopencad - разработка новой библиотеки поддержки DWG (

Сообщение Denis Rykov » 27 авг 2016, 09:32

А баиндинги планируются для библиотеки или только для GDAL-а?
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: libopencad - разработка новой библиотеки поддержки DWG (

Сообщение Дмитрий Барышников » 07 сен 2016, 01:11

2Denis Rykov - пока запросов такого функционала не было. Кстати можно вполне запрос нового функционала сюда кинуть: https://github.com/sandyre/libopencad/issues

Сделал сборку GDAL + CAD под Ubuntu в нашем dev ppa - https://launchpad.net/~nextgis/+archive ... /+packages
Осторожно! GDAL из ppa заменит системный.

Версия под Windows еще в процессе.

freeExec
Гуру
Сообщения: 1195
Зарегистрирован: 23 апр 2011, 10:32
Репутация: 205
Откуда: Ульяновск

Re: libopencad - разработка новой библиотеки поддержки DWG (

Сообщение freeExec » 30 июн 2017, 10:29

Под винду не соберётся в принципе или просто настроенного сборщика нет?

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: libopencad - разработка новой библиотеки поддержки DWG (

Сообщение Denis Rykov » 30 июн 2017, 10:47

Так вроде же в инсталлятрое есть.
Spatial is now, more than ever, just another column- The Geometry Column.

Ответить

Вернуться в «NextGIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя