Булева операция над телами

Функция

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, содержащий построенное тело.

Функция возвращает код результата операции из перечисления MbResultType (см. mb_operation_result.h).

Функция объявлена в файле action_solid.h.

Функция выполняет операции объединения, пересечения и вычитания точек двух тел solid1 и solid2.

Параметры sameShell1 и sameShell2 управляют передачей граней, ребер и вершин от исходных тел solid1 и solid2 построенному телу result и могут принимать одно из четырех значений:

  • cm_Same = 0 (оболочка не копируется);

  • cm_KeepHistory (исходная оболочка и её копия имеют общие базовые поверхности, вершины и неизменённые операцией грани);

  • cm_KeepSurface (исходная оболочка и её копия имеют общие базовые поверхности);

  • cm_Copy (исходная оболочка и её копия не имеют общих данных).

Детальное описание перечисления MbeCopyMode описано в параграфе Копирование множества граней MbFaceShell.

Класс MbBooleanOperationParams содержит параметры выполнения булевой операции. При создании объекта класса MbBooleanOperationParams используется один из следующих конструкторов:

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 – индикатор прогресса выполнения операции.

Вариант объекта 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 содержит управляющие флаги булевой операции.

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

bool mergeFaces – сливать подобные грани;

bool mergeEdges – сливать подобные ребра;

bool closed – замкнутость оболочек операндов;

bool enclosureCheck – проверять оболочки на вложенность;

bool allowNonIntersecting – выдавать конечную оболочку, если нет пересечений;

bool cutting – флаг резки оболочки при построении разрезов и сечений;

bool repairShellEdges – флаг починки ребер исходных оболочек.

На рис. 1 приведены исходные тела solid1 и solid2:

../../../../_images/M.2.1.1.png

Рис. 1

На рис. 2 приведен результат булевой операции объединения тел solid1 и solid2, показанных на рис. 1:

../../../../_images/M.2.1.2.png

Рис. 2

На рис. 3 приведен результат булевой операции пересечения тел solid1 и solid2, показанных на рис. 1:

../../../../_images/M.2.1.3.png

Рис. 3

На рис. 4 приведен результат булевой операции вычитания тела solid2 из тела solid1, показанных на рис. 1:

../../../../_images/M.2.1.4.png

Рис. 4

На рис. 5 приведен результат булевой операции вычитания тела solid1 из тела solid2, показанных на рис. 1:

../../../../_images/M.2.1.5.png

Рис. 5

Для демонстрации работы функции с переданным объектом MbBooleanFlags с различными значениями флага mergeFaces рассмотрим булевы операции над исходными телами solid1 и solid2, приведенными на рис. 6:

../../../../_images/M.2.1.6.png

Рис. 6

На рис. 7 приведен результат result объединения тел solid1 и solid2 при работе рассматриваемой функции с флагом mergeFaces = true:

../../../../_images/M.2.1.7.png

Рис. 7

На рис. 8 приведен результат result объединения тел solid1 и solid2 при работе рассматриваемой функции с флагом mergeFaces = false. Совпадающие грани на рис. 8 не объединены:

../../../../_images/M.2.1.8.png

Рис. 8

На рис. 9 приведен результат result вычитания тела solid2 из тела solid1 при работе рассматриваемой функции с параметром mergeFaces = true (сливать подобные грани):

../../../../_images/M.2.1.9.png

Рис. 9

На рис. 10 приведен результат result вычитания тела solid2 из тела solid1 при работе рассматриваемой функции с параметром mergeFaces = false. Совпадающие грани на рис. 10 не объединены.

../../../../_images/M.2.1.10.png

Рис. 10

Функция BooleanResult() добавляет в журнал построенного тела строитель MbBooleanSolid, который содержит все необходимые данные для выполнения операции. Строитель MbBooleanSolid объявлен в файле cr_boolean_solid.h.

В тестовом приложении test.exe булевы операции над телами выполняются командами меню «Создать→Тело→Приклеиванием к телу→Тела», «Создать→Тело→Вырезанием из тела→Тела», «Создать→Тело→Пересечением с телом→Тела».