.. role:: blue :class: blue Булева операция над телами ========================== .. _Boolean_Operation_on_Bodies: .. версия ядра: 118053 Функция .. code-block:: cpp MbResultType BooleanResult( const c3d::SolidSPtr & solid1, MbeCopyMode sameShell1, const c3d::SolidSPtr & solid2, MbeCopyMode sameShell2, const MbBooleanOperationParams & params, c3d::SolidSPtr & result ); выполняет построение нового тела путем булевой операции над двумя заданными телами с возможностью управления слиянием граней и рёбер. Входными параметрами функции являются: - **solid1** - первое тело для булевой операции; - **sameShell1** - вариант копирования первого тела; - **solid2** - второе тело для булевой операции; - **sameShell2** - вариант копирования второго тела; - **params** - параметры выполнения булевой операции. Выходным параметром функции является объект **result**, содержащий построенное тело. Функция возвращает код результата операции из перечисления :blue:`MbResultType` (см. *mb_operation_result.h*). Функция объявлена в файле *action_solid.h*. Функция выполняет операции объединения, пересечения и вычитания точек двух тел **solid1** и **solid2**. Параметры **sameShell1** и **sameShell2** управляют передачей граней, ребер и вершин от исходных тел **solid1** и **solid2** построенному телу **result** и могут принимать одно из четырех значений: - *cm_Same* = 0 (оболочка не копируется); - *cm_KeepHistory* (исходная оболочка и её копия имеют общие базовые поверхности, вершины и неизменённые операцией грани); - *cm_KeepSurface* (исходная оболочка и её копия имеют общие базовые поверхности); - *cm_Copy* (исходная оболочка и её копия не имеют общих данных). Детальное описание перечисления :blue:`MbeCopyMode` описано в параграфе :ref:`Копирование множества граней MbFaceShell `. Класс :blue:`MbBooleanOperationParams` содержит параметры выполнения булевой операции. При создании объекта класса :blue:`MbBooleanOperationParams` используется один из следующих конструкторов: .. code-block:: cpp MbBooleanOperationParams( OperationType oType, const MbBooleanFlags & flags, const MbSNameMaker & operNames, ProgressIndicator * progress = nullptr ); MbBooleanOperationParams( OperationType oType, bool closed, const MbSNameMaker & operNames, IProgressIndicator * progress = nullptr ); где - **oType** -- тип булевой операции; - **flags** -- управляющие флаги булевой операции; - **operNames** -- именователь; - **closed** -- показатель замкнутости оболочек операндов; - **progress** -- индикатор прогресса выполнения операции. Вариант объекта :blue:`MbBooleanOperationParams` с параметром **closed** работает только для незамкнутых тел и сообщает о необходимости выполнить проверку результата на замкнутость. Параметр **oType** определяет тип булевой операции и может принимать три значения: *bo_Union*, *bo_Intersect*, *bo_Difference*: - при **oType** = *bo_Union* рассматриваемая функция выполняет объединение тел **solid1** и **solid2**; - при **oType** = *bo_Intersect* рассматриваемая функция выполняет пересечение тел **solid1** и **solid2**; - при **oType** = *bo_Difference* рассматриваемая функция выполняет вычитание из тела **solid1** тела **solid2**. Параметр **operNames** используется для именования результирующих объектов булевой операции. Параметр **flags** содержит управляющие флаги булевой операции. В объекте имеются следующие флаги, которые могут быть установлены в конструкторе при создании объекта, а также с помощью отдельных функций установки: :blue:`bool` **mergeFaces** -- сливать подобные грани; :blue:`bool` **mergeEdges** -- сливать подобные ребра; :blue:`bool` **closed** -- замкнутость оболочек операндов; :blue:`bool` **enclosureCheck** -- проверять оболочки на вложенность; :blue:`bool` **allowNonIntersecting** -- выдавать конечную оболочку, если нет пересечений; :blue:`bool` **cutting** -- флаг резки оболочки при построении разрезов и сечений; :blue:`bool` **repairShellEdges** -- флаг починки ребер исходных оболочек. На рис. 1 приведены исходные тела **solid1** и **solid2**: .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.1.1.png :width: 12cm :align: center Рис. 1 На рис. 2 приведен результат булевой операции объединения тел **solid1** и **solid2**, показанных на рис. 1: .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.1.2.png :width: 12cm :align: center Рис. 2 На рис. 3 приведен результат булевой операции пересечения тел **solid1** и **solid2**, показанных на рис. 1: .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.1.3.png :width: 12cm :align: center Рис. 3 На рис. 4 приведен результат булевой операции вычитания тела **solid2** из тела **solid1**, показанных на рис. 1: .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.1.4.png :width: 12cm :align: center Рис. 4 На рис. 5 приведен результат булевой операции вычитания тела **solid1** из тела **solid2**, показанных на рис. 1: .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.1.5.png :width: 12cm :align: center Рис. 5 Для демонстрации работы функции с переданным объектом :blue:`MbBooleanFlags` с различными значениями флага *mergeFaces* рассмотрим булевы операции над исходными телами **solid1** и **solid2**, приведенными на рис. 6: .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.1.6.png :width: 12cm :align: center Рис. 6 На рис. 7 приведен результат **result** объединения тел **solid1** и **solid2** при работе рассматриваемой функции с флагом *mergeFaces* = *true*: .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.1.7.png :width: 12cm :align: center Рис. 7 На рис. 8 приведен результат **result** объединения тел **solid1** и **solid2** при работе рассматриваемой функции с флагом *mergeFaces* = *false*. Совпадающие грани на рис. 8 не объединены: .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.1.8.png :width: 12cm :align: center Рис. 8 На рис. 9 приведен результат **result** вычитания тела **solid2** из тела **solid1** при работе рассматриваемой функции с параметром *mergeFaces* = *true* (сливать подобные грани): .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.1.9.png :width: 12cm :align: center Рис. 9 На рис. 10 приведен результат **result** вычитания тела **solid2** из тела **solid1** при работе рассматриваемой функции с параметром *mergeFaces* = *false*. Совпадающие грани на рис. 10 не объединены. .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.1.10.png :width: 12cm :align: center Рис. 10 Функция :blue:`BooleanResult`\() добавляет в журнал построенного тела строитель :blue:`MbBooleanSolid`, который содержит все необходимые данные для выполнения операции. Строитель :blue:`MbBooleanSolid` объявлен в файле *cr_boolean_solid.h*. В тестовом приложении *test.exe* булевы операции над телами выполняются командами меню «Создать→Тело→Приклеиванием к телу→Тела», «Создать→Тело→Вырезанием из тела→Тела», «Создать→Тело→Пересечением с телом→Тела».