Объединение множества тел
Функция
MbResultType UnionSolid( RPArray<MbSolid> & solids,
MbeCopyMode sameShells,
bool checkIntersect,
const MbSNameMaker & names,
bool isArray,
MbSolid *& result,
RPArray<MbSolid> * notGluedSolids = NULL );
выполняет объединение тел заданного множества в одно тело.
Входными параметрами функции являются:
solids — множество тел;
sameShells — вариант копирования тел множества;
checkIntersect — флаг проверки пересечения тел множества (false — не проверять);
names — именователь операции;
isArray — флаг регулярности множества тел.
Выходными параметрами функции являются построенное тело result и множество тел notGluedSolids, которые оказались не используемыми в операции (указатель может быть равен нулю).
Функция возвращает код результата операции из перечисления MbResultType.
Функция объявлена в файле action_solid.h.
Рассматриваемая функция работает так же, как функция UnionResult() при значениях параметров последнего solid = 0, sameShell = cm_Same, oType = bo_Union, mergeFlags.mergeFaces = true. Функция выполняет объединение множества тел solids в одно тело result, при этом тела могут не пересекаться друг с другом.
Параметр sameShells управляет передачей граней, ребер и вершин от тел solids построенному телу result и может принимать одно из четырёх значений:
cm_Same = 0 (оболочка не копируется);
cm_KeepHistory (исходная оболочка и её копия имеют общие базовые поверхности, вершины и неизменённые операцией грани);
cm_KeepSurface (исходная оболочка и её копия имеют общие базовые поверхности);
cm_Copy (исходная оболочка и её копия не имеют общих данных).
Перечисление MbeCopyMode детально описано в параграфе Копирование множества граней MbFaceShell.
Параметр checkIntersect даёт команду на проверку пересечения тел множества solids между собой. Если параметр checkIntersect == true, то при построении результата выполняется булева операция объединения всех пересекающихся тел множества solids. В противном случае объединение тел заданного множества выполняется простым перекладыванием граней всех тел в построенное тело. Вне зависимости от значения параметра checkIntersect все не пересекающиеся тела множества solids передают свои грани общему промежуточному телу.
Параметр isArray работает только при checkIntersect == true и сообщает о регулярности множества тел solids. Если isArray == true, то тела множества расположены в узлах прямоугольной или круговой сетки и позиции тел заданы в именах граней.
Параметр names обеспечивает именование граней, ребер и вершин построенного тела.
Параметр notGluedSolids содержит тела, которые оказались не используемыми в операции из-за невозможности их объединения.
На рис. 1 приведены исходные тела solids:
Рис. 1
На рис. 2 приведён результат result объединения тел solids. В данном случае параметр checkIntersect необходимо положить равным true, так как тела solids пересекаются друг с другом.
Рис. 2
Функции
MbResultType UnionSolid( const RPArray<MbSolid> & solids,
const MbSNameMaker & names,
MbSolid *& result ),
MbResultType UnionSolid( const c3d::SolidsVector & solids,
const MbSNameMaker & names,
MbSolid *& result ),
MbResultType UnionSolid( const c3d::SolidsSPtrVector & solids,
const MbSNameMaker & names,
MbSolid *& result )
являются упрощёнными вариантами рассматриваемой ранее одноимённой функции, объединяя тела заданного множества простым перекладыванием граней всех тел в одно новое тело. Таким образом, построенное тело и исходные тела имеют одни и те же грани.
Функции UnionSolid() добавляют в журнал построенного тела строитель MbUnionSolid, который содержит все необходимые данные для выполнения операции. Строитель MbUnionSolid объявлен в файле cr_union_solid.h.
В тестовом приложении test.exe булева операция тела с множеством тел выполняется командой меню «Создать → Тело → На базе тела → Набор тел».