Manifold Geometry // Многообразная Геометрия

OpenCascade

Подписаться на эту рубрику по RSS

Open CASCADE Technology (OpenCascade, OCCT).

Однако, веха (изгнание CDL)

Всякий, кто начинал работу с библиотекой Open CASCADE Technology (OCCT), задавался вопросом: что такое CDL? Действительно, среди привычных файлов с расширениями cxx (тело C++) и hxx (заголовочные файлы C++) нередко можно встретить странные вкрапления в виде файлов с расширением cdl. И даже больше: с расширениями ixx, jxx, lxx и gxx. Последние хоть и имеют какое-то непонятное назначение, но, по существу, являются все теми же «старыми-добрыми» исходниками C++. Что же касается cdl-файлов, то здесь обнаруживается некоторый доморощенный синтаксис, который похож на C++ только тем, что и CDL и C++ придерживаются парадигмы ООП. Пример файла CDL приведен ниже:

class XYZ from gp inherits Storable 
        --- Purpose :
        --  This class describes a cartesian coordinate entity in 
        --  3D space {X,Y,Z}. This entity is used for algebraic
        --  calculation. This entity can be transformed
        --  with a "Trsf" or a  "GTrsf" from package "gp".
        -- It is used in vectorial computations or for holding this type
        -- of information in data structures.
uses Mat from gp
raises ConstructionError from Standard,
       OutOfRange        from Standard
is
  Create returns XYZ;
    	---C++: inline
        --- Purpose : Creates an XYZ object with zero co-ordinates (0,0,0)
  Create (X, Y, Z : Real)  returns XYZ;
        ---C++:inline
        --- Purpose : creates an XYZ with given coordinates
  SetCoord (me : in out; X, Y, Z : Real)
        ---C++: inline
        ---Purpose: For this XYZ object, assigns
        --   the values X, Y and Z to its three coordinates
     is static;
  ...
fields
  x : Real;
  y : Real;
  z : Real;
end;

Этот кусочек кода играет ту же роль, что и простейший заголовочный файл C++ — объявляет класс. В данном случае речь идет о классе с именем XYZ из пакета gp (Geometric Primitives), который представляет собой упорядоченную тройку вещественных чисел для декартовых координат. Но почему бы не использовать привычный C++? Чтобы это понять, надо разобраться, что такое CDL и для чего он был изобретен.

К истокам

CDL (Open CASCADE Component Definition Language) — это основа библиотеки OCCT. По крайне мере, так было раньше. Теперь это просто реликт, который всем мешает. Забегая вперед, отмечу, что команда разработчиков OCCT взяла курс на окончательное избавление от тех древних артефактов, что достались ей в наследство от CAx-платформы EUCLID. Но вернемся к определению. CDL — это мета-язык, т.е. «над-язык», который позволяет архитектору программного обеспечения «воспарить» над серой обыденностью конкретным языком программирования и мыслить категориями компонент и взаимосвязей между ними. Реально он чем-то напоминает CORBA IDL (Interface Definition Language), т.е. служит только для описания интерфейсов, но не самих алгоритмов. Приведем неполный список задач, которые решались при помощи CDL разработчиками OCCT:

  • Фокусирование на логике, но не на реализации. Задумка понятная, но реальный мир, как обычно, сложнее. Даже в простейшем gp_XYZ.cdl мы видим разного рода низкоуровневые заклинания, такие как

  • C++: inline

    или

    C++: alias operator +

  • Возможность использования механизма generic-классов. Этот механизм предполагает, что некоторый исходный код (помещенный в файл с расширением gxx) может быть использован для данных разного типа. По сути речь идет о собственной реализации механизма шаблонов C++, что было оправдано много лет назад, когда шаблоны не являлись частью стандарта C++. Теперь generic-классы морально устарели.

  • Возможность неявного создания «умных указателей» для всех классов, наследующих Standard_Transient. Действительно, используя CDL мы не указываем явно, что наш класс должен быть снабжен соответствующим «умным указателем», тогда как в «честном» заголовочном файле (hxx) придется написать пару дополнительных заклинаний.

  • Заметим, что механизм «умных указателей» в библиотеке OCCT реализован посредством параллельной иерархии классов, т.е. каждому пользовательскому классу, наследующему Standard_Transient, должен быть поставлен в соответствие некоторый класс «умного указателя», наследующий Handle_Standard_Transient. Процесс создания такой параллельной иерархии во многом упрощается, благодаря CDL.

    UPDATE: так было до версии OpenCascade 7.0. Теперь параллельной иерархии нет. В новой версии библиотеки умный указатель — простой и понятный шаблонный класс.

Наличие CDL, разумеется, предполагает, что есть некоторая среда, способная его интерпретировать. Такая среда называется WOK (Workshop Organization Kit). С помощью нее осуществляется преобразование cdl-файлов в заголовочные файлы C++ и организуется вся сопутствующая работа (инстанцирование generic-классов, создание «умных указателей», определение зависимостей и т.д.). Среда WOK предоставляет командный интерпретатор, в котором все операции, перечисленные выше, выполняются при помощи инструкции «umake». Например, чтобы полностью собрать пакет gp, можно дать следующую команду:

umake gp

Модернизация

Инструменты, которые существенно облегчали труд программиста и проектировщика OCCT, на сегодняшний день устарели. Практическая польза языка CDL с развитием стандарта C++ оказалась ничтожна. Более того, синтаксис современного C++ куда более выразителен, нежели синтаксис CDL, а потому язык определения интерфейсов становится лишь дополнительной преградой, а не подспорьем (не зря появились такие заклинания, как «C++ inline» и им подобные).

Стоит также отметить, что роль среды WOK не ограничивается обработкой cdl-файлов. WOK позволяет организовать одновременную работу группы программистов над разной функциональностью, вводя понятие «workbench» — своеобразной «песочницы». Однако и эта сильная сторона WOK в настоящее время кроется великим множеством систем контроля версий (Git, SVN, Perforce и т.д.).

После всего сказанного остается порадоваться, что официальный разработчик OCCT не цепляется за устаревшие технологии и модернизирует библиотеку, изгоняя из нее духов прошлого. Поводом к написанию настоящей заметки послужила отрадная новость с официального сайта: вышла промежуточная версия OCCT без CDL и WOK. Что ж, остается дождаться официального релиза и поблагодарить команду разработчиков за проделанную работу и волю к обновлениям.