5 - 2018

Что не так с 3D PDF и eDrawings, или Как мы заменили 3D-просмотрщик в своем приложении

Сергей Ершов, руководитель группы прикладных АРМ отдела проектирования и разработки PDM-систем, АСКОН
Сергей Ершов, руководитель группы прикладных АРМ отдела проектирования и разработки PDM-систем, АСКОН

Это рассказ о том, как мы встроили новый просмотрщик 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, пригодная для встраивания, но со временем нам стала открываться его темная сторона:

  1. Мы имеем право распространять Acrobat Reader в своем дистрибутиве. Оказалось, Acrobat Reader установлен далеко не на каждом первом компьютере. Иногда там установлен Acrobat Reader несовместимой версии, а иногда — вообще другое приложение для просмотра PDF, несовместимое с Acrobat Reader.
  2. Вектор развития Acrobat Reader непредсказуем. Каждый релиз полон сюрпризов и пополняет используемый нами арсенал средств, предназначенных для автоматического закрытия окон ненужных сообщений, сворачивания назойливых панелей и установки туманно документированных опций.
  3. Выход обновления Acrobat Reader внезапен и неотвратим. О нем мы узнаем из сообщений пользователей о том, что у них перестало работать «вторичное представление».
  4. Обратная связь с разработчиком, вероятно, возможна, но, как показывает регулярное изучение печальных форумов, бесперспективна.
  5. Иногда использование ActiveX Acrobat Reader приводит к аварийному завершению вашего приложения. В итоге мы пришли к применению режима SafeMode в Acrobat Reader. В этом режиме периодически аварийно завершается только скрытый дочерний процесс Acrobat Reader, а наше приложение продолжает работать.
  6. ActiveX Acrobat Reader доступен только в версии 32 bit — без вариантов.

И самое главное — неудовлетворительная производительность при работе с большими моделями (сборками):

  • низкая скорость экспорта из КОМПАС­3D в 3D PDF (возможно, часть ответственности лежит на КОМПАС­3D, но что есть — то есть);
  • большой размер файла 3D PDF, что увеличивает нагрузку на файловую систему и сеть и требует больше оперативной памяти (поиск оптимальных — с точки зрения соотношений точности вывода моделей к размеру файла — настроек не дал приемлемых результатов);
    • низкая скорость загрузки больших моделей 3D PDF,
    • неудовлетворительные скорость/качество рендеринга больших файлов.

Знакомство с C3D Viewer

Мы всегда с интересом следили за успехами и новинками C3D Labs (все­таки дочерняя компания АСКОН, коллеги). Появление нового просмотрщика C3D Viewer не прошло незамеченным. Получив доступ к ранним бета­версиям продукта, мы провели сравнительное исследование функциональности и производительности (рис. 1­4). Результаты исследования вдохновили нас на запуск проекта, итогом которого должно было стать встраивание компонента 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 «крутит» со скоростью 30­100++ FPS на разных моделях).

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

Рис. 1. Исследование C3D Viewer

Рис. 1. Исследование C3D Viewer

По нашим запросам команда C3D Labs разработала функционал аннотирования 3D­моделей, обеспечила локализацию на русский язык.

Ряд доработок API C3D Viewer был обусловлен спецификой применения компонента в нашем приложении. В результате в API появились новые методы и события, позволившие реализовать собственный механизм индикации прогресса загрузки модели и экстренного прерывания/отмены загрузки.

И раз уж я упомянул о дороговизне eDrawings, то справедливости ради надо сказать, что C3D Viewer тоже для нас не бесплатен, но условия его использования гораздо более демократичные.

Рис. 2. Сохранение файла, с

Рис. 2. Сохранение файла, с

Рис. 3. Размер файла, Мбайт

Рис. 3. Размер файла, Мбайт

Рис. 4. Время загрузки файла, с

Рис. 4. Время загрузки файла, с

Рис. 4. Время загрузки файла, с

Встраивание

Вначале следует дать краткое техническое описание системы, в которую нам предстояло встроить C3D Viewer, — клиентского приложения ЛОЦМАН:PLM.

Это десктопное Win32­приложение с MDI­интерфейсом, написанное на Delphi 2006.

Компоновка дочерних MDI­окон — динамическая, строится на основе описания набора взаимосвязанных «панелей», каждая из которых предоставляет некоторый аспект информации об указанном объекте.

Программный компонент C3D Viewer — это ActiveX COM Library (C++, Qt).

API простой и компактный, ключевые операции — асинхронные, выполняются в отдельном потоке, поэтому взаимодействие с компонентом основано на вызове методов и обработке событий.

Прототип модуля просмотра вторичного представления удалось собрать и встроить в ЛОЦМАН:PLM всего за пару часов, а вот прочие «мелочи» потребовали гораздо больше времени.

Мы реализовали собственные панели инструментов, контекстное меню, панель, отображающую структуру модели, и панель со списком аннотаций — в нужном нам объеме и виде, в соответствии с общей визуальной стилистикой интерфейса приложения.

Мы применяем компонент в нескольких режимах работы с вторичным представлением: встроенный просмотр, полноэкранный просмотр и режим аннотирования (рис. 5 и 6).

Рис 5. Встроенный просмотр вторичного представления

Рис 5. Встроенный просмотр вторичного представления

Рис 6. Аннотирование вторичного представления

Рис 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. Мы попробовали разные виртуальные машины, вот некоторая информация об этом:

  • Hyper­V — 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.