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

    Это рассказ о том, как мы встроили новый просмотрщик C3D Viewer в систему управления жизненным циклом изделия ЛОЦМАН:PLM, почему мы это сделали, и что у нас получилось.

    image

    .1 Что такое «вторичное представление»


    Любое достойное упоминания PLM-решение включает в себя механизмы/подсистему PDM (управление данными об изделии).

    В базе данных PDM-системы хранятся документы и файлы, созданные в различных САПР: 3D-модели, чертежи, спецификации и расчеты.

    Для того, чтобы содержание этих документов было доступно тем пользователям, у которых на рабочем месте не установлены соответствующие приложения САПР (а они бывают о-о-очень дорогими), PDM-система формирует «вторичное представление документа» — копию документа в каком-то «нейтральном» общедоступном формате.

    После того, как «вторичное представление» загружено в систему, на его основе можно построить предварительный просмотр содержимого документа непосредственно в интерфейсе клиента PDM-системы; использовать как носитель при обмене информацией с внешними пользователями, в процессах согласования и при обмене замечаниями с помощью заметок и аннотаций.

    .2 Вторичное представление в ЛОЦМАН:PLM


    В разное время в качестве «вторичного представления» 3D-моделей в ЛОЦМАН:PLM поочередно выступали VRML, eDrawings, 3D PDF.

    Про VRML я говорить не буду – ошибки молодости… с кем не бывает.

    eDrawings был неплох, но за разработку адаптера к нему и услуги поддержки приходилось платить весьма нескромные деньги. К тому же начиная с 2014 года eDrawings стал доступен только в версии x64. Мы при всем желании не могли больше встраивать его в наш 32bit клиент ЛОЦМАН: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 доступен только в версии 32bit без вариантов.

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

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

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


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

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

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

    .4 Встраивание


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

    Это десктопное Win32 приложение с MDI интерфейсом, написанное на Delphi 2006.
    Компоновка дочерних MDI окон — динамическая, строится на основе описания набора взаимосвязанных «панелей», каждая из которых представляет некоторый аспект информации об указанном объекте.
    Программный компонент C3D Viewer – это ActiveX COM Library (C++, Qt).

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

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

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

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





    Какие были сложности:


    Импорт описания библиотеки типов


    Одной из первых проблем оказалось то, что 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 работает.

    В итоге активная фаза разработки и отладки нового просмотрщика заняла около двух месяцев. Еще две-три недели мы затратили на устранение ошибок.

    .5 Что впереди


    В следующих версиях C3D Viewer мы надеемся увидеть функции динамического сечения, измерения моделей, новые возможности работы с PMI, конфигурациями моделей в связке с КОМПАС-3D и ЛОЦМАН:PLM.

    P.S.


    Для знакомства с C3D Viewer есть бесплатная версия (скачать здесь). Она не включает API и некоторые другие функции. Версию для встраивания можно запросить на тестирование у разработчиков C3D Labs.

    Сергей Ершов, руководитель группы прикладных АРМ, АСКОН.
    АСКОН 127,11
    Крупнейший российский разработчик инженерного ПО
    Поделиться публикацией
    Комментарии 4
      0
      Скажите, а это только в новых версиях Лоцман:PLM или затронут данные обновления и Лоцман:PLM 2014
        0
        C3D Viewer доступен только начиная с версии ЛОЦМАН:PLM 2018.

          0

          А почему не используете КОМПАС-3D Viewer?

            +1
            цитируем ответ автора: «В КОМПАС-3D Viewer нет аннотирования, он открывает только файлы КОМПАС, для просмотра сборки нужно найти в БД и выгрузить все файлы сборки».

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое