libopencad - разработка новой библиотеки поддержки DWG (GSoC'16)
- Дмитрий Барышников
- Гуру
- Сообщения: 2572
- Зарегистрирован: 17 ноя 2009, 19:17
- Репутация: 261
- Откуда: Москва
Re: libopencad - разработка новой библиотеки поддержки DWG (
Сейчас остался незакрытым вопрос с атрибутами - Attr и AttrDef. Есть ли такие файлы? Пока есть понимание что атрибуты навешиваются на блоки, а не entity. Может мы не правы.
Это нужно для отображения в таблице атрибутов.
Еще, если есть примеры, когда dwg "не так как надо" открывался в ГИС софте (ArcGIS, Панорама ...). Тоже бы посмотрели и сделали бы как надо (если модель GDAL позволит).
Это нужно для отображения в таблице атрибутов.
Еще, если есть примеры, когда dwg "не так как надо" открывался в ГИС софте (ArcGIS, Панорама ...). Тоже бы посмотрели и сделали бы как надо (если модель GDAL позволит).
-
- Гуру
- Сообщения: 731
- Зарегистрирован: 12 янв 2011, 22:40
- Репутация: 304
- Ваше звание: ∀
Re: libopencad - разработка новой библиотеки поддержки DWG (
Да, атрибуты навешиваются на блоки. Причём атрибут, как правило (но необязательно), - это отображаемый текст, который может иметь собственную точку привязки на чертеже (но остаётся связанным с экземпляром блока).
Постараюсь не забыть найти вечером подходящий пример в своих архивах. Я когда-то активно использовал блоки с атрибутами, кастомные типы линий, wipeout'ы и прочие хитрые возможности AutoCAD для оформления топосъёмок. Даже динамические блоки пробовал использовать (например, для условного знака трубы под дорогой), но они часто глючили и не имели понятного задокументированного представления в формате DXF, так что с ними опыт скорее негативный.
Постараюсь не забыть найти вечером подходящий пример в своих архивах. Я когда-то активно использовал блоки с атрибутами, кастомные типы линий, wipeout'ы и прочие хитрые возможности AutoCAD для оформления топосъёмок. Даже динамические блоки пробовал использовать (например, для условного знака трубы под дорогой), но они часто глючили и не имели понятного задокументированного представления в формате DXF, так что с ними опыт скорее негативный.
- Максим Дубинин
- MindingMyOwnBusiness
- Сообщения: 9128
- Зарегистрирован: 06 окт 2003, 20:20
- Репутация: 747
- Ваше звание: NextGIS
- Откуда: Москва
- Контактная информация:
Re: libopencad - разработка новой библиотеки поддержки DWG (
Донецков, шлите все подряд более-менее типовое. Сэмплы дальше разработчиков распространяться не будут.
пристегивайтесь, турбулентность прямо по курсу
-
- Новоприбывший
- Сообщения: 5
- Зарегистрирован: 11 мар 2016, 14:43
- Репутация: 9
Re: libopencad - разработка новой библиотеки поддержки DWG (
На гитхабе, в репозитории библиотеки есть страница https://github.com/sandyre/libopencad/w ... geometriesДонецков писал(а):Какие примеры файлов в dwg нужны, с какими примитивами и т.п. ? По возможности пришлю ...
Внизу есть список unsupported geometries с пояснениями, почему пока их поддержки нет в библиотеке. Есть геометрии помеченные как "how to make it in ACAD?". Примеры именно таких геометрий нам нужны.
Спасибо.
sun and dire
-
- Гуру
- Сообщения: 731
- Зарегистрирован: 12 янв 2011, 22:40
- Репутация: 304
- Ваше звание: ∀
Re: libopencad - разработка новой библиотеки поддержки DWG (
Что касается wipeout, то по свойствам он очень похож на растр с полигональной границей, но без содержимого. Не удивлюсь, если и внутреннее представление его совпадает с представлением растра, поэтому его и нет в спецификации. Это сравнительно позднее добавление в AutoCAD (по-моему, появилось в версии 2005 или 2006) и вполне могло быть реализовано в виде костыля для обратной совместимости.
Форма (SHAPE) - это тоже своеобразный костыль, но более старый. Используется в в основном для реализации пользовательских шрифтов и элементов типов линий, но может быть и вставлена прямо в чертёж подобно блоку. Формы описываются на специальном векторном языке и затем компилируются в бинарный файл, из которого могут быть загружены в чертёж. Описание языка есть в документации AutoCAD, насчёт бинарного представления не знаю.
Ещё, если мне не изменяет память, многие вещи, реализованные в сторонних расширениях для AutoCAD (а геодезисты любят их использовать), имеют графическое представление в виде так называемых proxy-объектов, чтобы корректно отображаться в AutoCAD без установленных расширений. Хорошо бы научиться работать с ними, хотя я не знаю, документированы ли где-нибудь эти самые proxy.
Форма (SHAPE) - это тоже своеобразный костыль, но более старый. Используется в в основном для реализации пользовательских шрифтов и элементов типов линий, но может быть и вставлена прямо в чертёж подобно блоку. Формы описываются на специальном векторном языке и затем компилируются в бинарный файл, из которого могут быть загружены в чертёж. Описание языка есть в документации AutoCAD, насчёт бинарного представления не знаю.
Ещё, если мне не изменяет память, многие вещи, реализованные в сторонних расширениях для AutoCAD (а геодезисты любят их использовать), имеют графическое представление в виде так называемых proxy-объектов, чтобы корректно отображаться в AutoCAD без установленных расширений. Хорошо бы научиться работать с ними, хотя я не знаю, документированы ли где-нибудь эти самые proxy.
-
- Новоприбывший
- Сообщения: 5
- Зарегистрирован: 11 мар 2016, 14:43
- Репутация: 9
Re: libopencad - разработка новой библиотеки поддержки DWG (
Большое спасибо про wipeout - попробую читать его как растр, может быть и правда сработает.Ariki писал(а):Что касается wipeout, то по свойствам он очень похож на растр с полигональной границей, но без содержимого. Не удивлюсь, если и внутреннее представление его совпадает с представлением растра, поэтому его и нет в спецификации. Это сравнительно позднее добавление в AutoCAD (по-моему, появилось в версии 2005 или 2006) и вполне могло быть реализовано в виде костыля для обратной совместимости.
Форма (SHAPE) - это тоже своеобразный костыль, но более старый. Используется в в основном для реализации пользовательских шрифтов и элементов типов линий, но может быть и вставлена прямо в чертёж подобно блоку. Формы описываются на специальном векторном языке и затем компилируются в бинарный файл, из которого могут быть загружены в чертёж. Описание языка есть в документации AutoCAD, насчёт бинарного представления не знаю.
Ещё, если мне не изменяет память, многие вещи, реализованные в сторонних расширениях для AutoCAD (а геодезисты любят их использовать), имеют графическое представление в виде так называемых proxy-объектов, чтобы корректно отображаться в AutoCAD без установленных расширений. Хорошо бы научиться работать с ними, хотя я не знаю, документированы ли где-нибудь эти самые proxy.
Proxy-entities задокументированы в ODA DWG Spec, но достаточно обширны, постараюсь успеть их прикрутить к дедлайну, но обещать не буду.
sun and dire
-
- Новоприбывший
- Сообщения: 5
- Зарегистрирован: 11 мар 2016, 14:43
- Репутация: 9
Re: libopencad - разработка новой библиотеки поддержки DWG (
Финальный отчет по 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:
Краткое описание идеи.
Цель моего проекта была в добавлении поддержки 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
-
- Гуру
- Сообщения: 1195
- Зарегистрирован: 23 апр 2011, 10:32
- Репутация: 205
- Откуда: Ульяновск
Re: libopencad - разработка новой библиотеки поддержки DWG (
А чтобы пощупать надо собирать из исходников или где-то есть готовое под винду?
- Дмитрий Барышников
- Гуру
- Сообщения: 2572
- Зарегистрирован: 17 ноя 2009, 19:17
- Репутация: 261
- Откуда: Москва
Re: libopencad - разработка новой библиотеки поддержки DWG (
Пока только из исходников. В сентябре сделаем "ночные сборки" для нашей транковой версии.
- SergeyRyzhkov
- Гуру
- Сообщения: 909
- Зарегистрирован: 02 июл 2014, 19:13
- Репутация: 203
- Ваше звание: GP-экотеррористы
- Откуда: Санкт-Петербург
- Контактная информация:
Re: libopencad - разработка новой библиотеки поддержки DWG (
Дмитрий. Пишу с телеф(могут быть описки)
Я могу выслать Вам пример автокадовских файлов,а Вы мне результаи.
Также помимо файдов пришлю доп.хотелки(для возможного нашего модуля в рамках прлекта для водоканала). Хотелки могут выразиться в небольшой контракт с вашей компанией)
[ Сообщение с мобильного устройства ]
Я могу выслать Вам пример автокадовских файлов,а Вы мне результаи.
Также помимо файдов пришлю доп.хотелки(для возможного нашего модуля в рамках прлекта для водоканала). Хотелки могут выразиться в небольшой контракт с вашей компанией)
[ Сообщение с мобильного устройства ]
- Дмитрий Барышников
- Гуру
- Сообщения: 2572
- Зарегистрирован: 17 ноя 2009, 19:17
- Репутация: 261
- Откуда: Москва
Re: libopencad - разработка новой библиотеки поддержки DWG (
Присылайте. Почта у меня не изменилась mailto:dmitry.baryshnikov@nextgis.ru
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: libopencad - разработка новой библиотеки поддержки DWG (
А баиндинги планируются для библиотеки или только для GDAL-а?
Spatial is now, more than ever, just another column- The Geometry Column.
- Дмитрий Барышников
- Гуру
- Сообщения: 2572
- Зарегистрирован: 17 ноя 2009, 19:17
- Репутация: 261
- Откуда: Москва
Re: libopencad - разработка новой библиотеки поддержки DWG (
2Denis Rykov - пока запросов такого функционала не было. Кстати можно вполне запрос нового функционала сюда кинуть: https://github.com/sandyre/libopencad/issues
Сделал сборку GDAL + CAD под Ubuntu в нашем dev ppa - https://launchpad.net/~nextgis/+archive ... /+packages
Осторожно! GDAL из ppa заменит системный.
Версия под Windows еще в процессе.
Сделал сборку GDAL + CAD под Ubuntu в нашем dev ppa - https://launchpad.net/~nextgis/+archive ... /+packages
Осторожно! GDAL из ppa заменит системный.
Версия под Windows еще в процессе.
-
- Гуру
- Сообщения: 1195
- Зарегистрирован: 23 апр 2011, 10:32
- Репутация: 205
- Откуда: Ульяновск
Re: libopencad - разработка новой библиотеки поддержки DWG (
Под винду не соберётся в принципе или просто настроенного сборщика нет?
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: libopencad - разработка новой библиотеки поддержки DWG (
Так вроде же в инсталлятрое есть.
Spatial is now, more than ever, just another column- The Geometry Column.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 29 гостей