Это рассказ о том, как мы встроили новый просмотрщик C3D Viewer в систему управления жизненным циклом изделия ЛОЦМАН:PLM, почему мы это сделали и что у нас получилось.
Что такое «вторичное представление»
Любое достойное упоминание PLMрешение включает механизмы/подсистему PDM (управление данными об изделии).
В базе данных PDMсистемы хранятся документы и файлы, созданные в различных САПР: 3Dмодели, чертежи, спецификации и расчеты.
Для того чтобы содержание этих документов было доступно тем пользователям, у которых на рабочем месте не установлены соответствующие приложения САПР (а они бывают ооочень дорогими), PDMсистема формирует «вторичное представление документа» — копию документа в какомто «нейтральном» общедоступном формате.
После того как «вторичное представление» загружено в систему, на его основе можно построить предварительный просмотр содержимого документа непосредственно в интерфейсе клиента PDMсистемы; использовать как носитель при обмене информацией с внешними пользователями, в процессах согласования и при обмене замечаниями с помощью заметок и аннотаций.
Вторичное представление в ЛОЦМАН:PLM
В разное время в качестве «вторичного представления» 3Dмоделей в ЛОЦМАН:PLM поочередно выступали VRML, eDrawings, 3D PDF.
О VRML я говорить не буду — ошибки молодости… с кем не бывает.
eDrawings был неплох, но за разработку адаптера к нему и услуги поддержки приходилось платить немалые деньги. К тому же начиная с 2014 года eDrawings стал доступен только в версии x64. Мы при всем желании не могли больше встраивать его в наш 32битный клиент ЛОЦМАН:PLM как ActiveX.
3D PDF поначалу казался подарком — бесплатный, уже установлен на каждом первом компьютере, стандарт de facto в нашем «рукаве галактики», плюс готовая библиотека ActiveX, пригодная для встраивания, но со временем нам стала открываться его темная сторона:
- Мы имеем право распространять Acrobat Reader в своем дистрибутиве. Оказалось, Acrobat Reader установлен далеко не на каждом первом компьютере. Иногда там установлен Acrobat Reader несовместимой версии, а иногда — вообще другое приложение для просмотра PDF, несовместимое с Acrobat Reader.
- Вектор развития Acrobat Reader непредсказуем. Каждый релиз полон сюрпризов и пополняет используемый нами арсенал средств, предназначенных для автоматического закрытия окон ненужных сообщений, сворачивания назойливых панелей и установки туманно документированных опций.
- Выход обновления Acrobat Reader внезапен и неотвратим. О нем мы узнаем из сообщений пользователей о том, что у них перестало работать «вторичное представление».
- Обратная связь с разработчиком, вероятно, возможна, но, как показывает регулярное изучение печальных форумов, бесперспективна.
- Иногда использование ActiveX Acrobat Reader приводит к аварийному завершению вашего приложения. В итоге мы пришли к применению режима SafeMode в Acrobat Reader. В этом режиме периодически аварийно завершается только скрытый дочерний процесс Acrobat Reader, а наше приложение продолжает работать.
- ActiveX Acrobat Reader доступен только в версии 32 bit — без вариантов.
И самое главное — неудовлетворительная производительность при работе с большими моделями (сборками):
- низкая скорость экспорта из КОМПАС3D в 3D PDF (возможно, часть ответственности лежит на КОМПАС3D, но что есть — то есть);
- большой размер файла 3D PDF, что увеличивает нагрузку на файловую систему и сеть и требует больше оперативной памяти (поиск оптимальных — с точки зрения соотношений точности вывода моделей к размеру файла — настроек не дал приемлемых результатов);
- низкая скорость загрузки больших моделей 3D PDF,
- неудовлетворительные скорость/качество рендеринга больших файлов.
Знакомство с C3D Viewer
Мы всегда с интересом следили за успехами и новинками C3D Labs (всетаки дочерняя компания АСКОН, коллеги). Появление нового просмотрщика C3D Viewer не прошло незамеченным. Получив доступ к ранним бетаверсиям продукта, мы провели сравнительное исследование функциональности и производительности (рис. 14). Результаты исследования вдохновили нас на запуск проекта, итогом которого должно было стать встраивание компонента C3D Viewer в качестве средства просмотра и аннотирования вторичного представления 3Dмоделей в ЛОЦМАН:PLM:
- ускорение сохранения в формат C3D по сравнению с PDF — от 6 до 18 раз (корреляции с размером моделей и количеством компонентов не выявлено);
- размер файлов C3D меньше файлов PDF — от 2 до 39 раз;
- скорость загрузки файлов C3D выше скорости загрузки PDF — от 6 до 264 раз (корреляции с размером моделей и количеством компонентов не выявлено);
- качество и плавность отображения при вращении у C3D Viewer значительно превосходит качество Adobe Reader (по непонятным причинам замерить FPS в Adobe Reader не всегда получалось; в случаях, когда попытки замера были удачными, FPS не превышал значения «5». C3D Viewer «крутит» со скоростью 30100++ FPS на разных моделях).
Интерес к проекту был взаимным, что наилучшим образом сказалось на качестве взаимодействия с разработчиками и скорости решения различных проблем.
Рис. 1. Исследование C3D Viewer
По нашим запросам команда C3D Labs разработала функционал аннотирования 3Dмоделей, обеспечила локализацию на русский язык.
Ряд доработок API C3D Viewer был обусловлен спецификой применения компонента в нашем приложении. В результате в API появились новые методы и события, позволившие реализовать собственный механизм индикации прогресса загрузки модели и экстренного прерывания/отмены загрузки.
И раз уж я упомянул о дороговизне eDrawings, то справедливости ради надо сказать, что C3D Viewer тоже для нас не бесплатен, но условия его использования гораздо более демократичные.
Рис. 2. Сохранение файла, с
Рис. 3. Размер файла, Мбайт
Рис. 4. Время загрузки файла, с
Встраивание
Вначале следует дать краткое техническое описание системы, в которую нам предстояло встроить C3D Viewer, — клиентского приложения ЛОЦМАН:PLM.
Это десктопное Win32приложение с MDIинтерфейсом, написанное на Delphi 2006.
Компоновка дочерних MDIокон — динамическая, строится на основе описания набора взаимосвязанных «панелей», каждая из которых предоставляет некоторый аспект информации об указанном объекте.
Программный компонент C3D Viewer — это ActiveX COM Library (C++, Qt).
API простой и компактный, ключевые операции — асинхронные, выполняются в отдельном потоке, поэтому взаимодействие с компонентом основано на вызове методов и обработке событий.
Прототип модуля просмотра вторичного представления удалось собрать и встроить в ЛОЦМАН:PLM всего за пару часов, а вот прочие «мелочи» потребовали гораздо больше времени.
Мы реализовали собственные панели инструментов, контекстное меню, панель, отображающую структуру модели, и панель со списком аннотаций — в нужном нам объеме и виде, в соответствии с общей визуальной стилистикой интерфейса приложения.
Мы применяем компонент в нескольких режимах работы с вторичным представлением: встроенный просмотр, полноэкранный просмотр и режим аннотирования (рис. 5 и 6).
Рис 5. Встроенный просмотр вторичного представления
Рис 6. Аннотирование вторичного представления
Сложности в процессе встраивания
Импорт описания библиотеки типов
Одной из первых проблем оказалось то, что Delphi 2006 некорректно импортирует описание библиотеки типов из ActiveX C3D Viewer, которая написана на C++ c Qt.
Выкрутились, применив утилиту импорта библиотеки типов Delphi 2010, которая, впрочем, также давала не 100процентно правильный результат — пришлось всетаки исправить десяток строк «вручную».
Трудности «усыновления»
В нашем приложении пользователю доступен WYSIWYGредактор компоновки, который позволяет добавлять и перемещать «панели» с информацией. На одной из таких панелей располагается и ActiveX C3D Viewer.
Оказалось, что при перемещении панели с ActiveX C3D Viewer в другой «контейнер» происходит его частичное «разрушение». (Выяснили, что причина — в специфической реализации механизма смены родительского окна VCL Delphi. Если коротко, то в итоге происходит вызов winapiфункции DestroyWindow ActiveX C3D Viewer, после чего тот начинает считать себя «убитым», а Delphi тем временем продолжает считать его «живым».)
Эту проблему мы обошли, поместив ActiveX в специальный контейнер, который умеет определять, что происходит смена родительского окна, и в этот момент корректно освобождает ActiveX и создает его заново.
Проблемы с памятью
У нас 32битное приложение, и «Out of memory» никто не отменял. Возможность появления огромных сборок в условиях ограниченного 2гигабайтного объема оперативной памяти неизбежно привела к тому, что проблема стала острее.
Особую остроту придавало то, что если память заканчивалась в процессе загрузки модели в C3D Viewer, то это приводило к неожиданному аварийному завершению всего приложения.
Причину определить удалось не сразу. Пришлось разработать собственный PostMortem Debugger на основе sampling profiler, который восстанавливал стек c помощью отладочной информации JDBG.
Поняв причину, мы начали с того, что увеличили лимит доступной оперативной памяти до 3,5 Гбайт, добавив флаг IMAGE_FILE_LARGE_ADDRESS_AWARE в заголовок EXE, несколько сократили потребление памяти в своем приложении, но результат не радовал.
Дело в том, что если у вас 32битное MDIприложение (с многооконным интерфейсом), то пользователь, в принципе, может открыть не ограниченное здравым смыслом количество окон. И он это обязательно сделает. Имеет право.
Чтобы снизить вероятность появления проблем, связанных с нехваткой памяти, мы встроили в приложение механизм контроля и оптимизации использования памяти. По достижении определенного лимита неактивные в данный момент MDIокна погружаются в «спящий режим», тем самым высвобождая ресурсы.
Проблемы с виртуальными машинами
C3D Viewer требует для отображения OGLверсии не менее 2.1. Мы попробовали разные виртуальные машины, вот некоторая информация об этом:
- HyperV — C3D Viewer не работает;
- Virtual Box 4.1.44 + Window 7 — C3D Viewer работает;
- VMWare Player v14 (Accelerate 3D Graphics + OGL v3 в настройках) — C3D Viewer работает.
В итоге активная фаза разработки и отладки нового просмотрщика заняла около двух месяцев. Еще дветри недели мы затратили на устранение ошибок.
Что впереди
В следующих версиях C3D Viewer мы надеемся увидеть функции динамического сечения, измерения моделей, новые возможности работы с PMI, конфигурациями моделей в связке с КОМПАС3D и ЛОЦМАН:PLM.
***
Для знакомства с C3D Viewer есть бесплатная версия, которая доступна на сайте c3dlabs.com. Она не включает API и некоторые другие функции. Версию для встраивания можно запросить на тестирование у разработчиков C3D Labs.