Булева операция над телами
Функция
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:
Рис. 1
На рис. 2 приведен результат булевой операции объединения тел solid1 и solid2, показанных на рис. 1:
Рис. 2
На рис. 3 приведен результат булевой операции пересечения тел solid1 и solid2, показанных на рис. 1:
Рис. 3
На рис. 4 приведен результат булевой операции вычитания тела solid2 из тела solid1, показанных на рис. 1:
Рис. 4
На рис. 5 приведен результат булевой операции вычитания тела solid1 из тела solid2, показанных на рис. 1:
Рис. 5
Для демонстрации работы функции с переданным объектом MbBooleanFlags с различными значениями флага mergeFaces рассмотрим булевы операции над исходными телами solid1 и solid2, приведенными на рис. 6:
Рис. 6
На рис. 7 приведен результат result объединения тел solid1 и solid2 при работе рассматриваемой функции с флагом mergeFaces = true:
Рис. 7
На рис. 8 приведен результат result объединения тел solid1 и solid2 при работе рассматриваемой функции с флагом mergeFaces = false. Совпадающие грани на рис. 8 не объединены:
Рис. 8
На рис. 9 приведен результат result вычитания тела solid2 из тела solid1 при работе рассматриваемой функции с параметром mergeFaces = true (сливать подобные грани):
Рис. 9
На рис. 10 приведен результат result вычитания тела solid2 из тела solid1 при работе рассматриваемой функции с параметром mergeFaces = false. Совпадающие грани на рис. 10 не объединены.
Рис. 10
Функция BooleanResult() добавляет в журнал построенного тела строитель MbBooleanSolid, который содержит все необходимые данные для выполнения операции. Строитель MbBooleanSolid объявлен в файле cr_boolean_solid.h.
В тестовом приложении test.exe булевы операции над телами выполняются командами меню «Создать→Тело→Приклеиванием к телу→Тела», «Создать→Тело→Вырезанием из тела→Тела», «Создать→Тело→Пересечением с телом→Тела».