.. role:: blue :class: blue Объединение множества тел ========================= .. _Merging_a_Set_of_Bodies: .. версия ядра: 118058 Функция .. code-block:: cpp MbResultType UnionSolid( RPArray & solids, MbeCopyMode sameShells, bool checkIntersect, const MbSNameMaker & names, bool isArray, MbSolid *& result, RPArray * notGluedSolids = NULL ); выполняет объединение тел заданного множества в одно тело. Входными параметрами функции являются: - **solids** — множество тел; - **sameShells** — вариант копирования тел множества; - **checkIntersect** — флаг проверки пересечения тел множества (false — не проверять); - **names** — именователь операции; - **isArray** — флаг регулярности множества тел. Выходными параметрами функции являются построенное тело **result** и множество тел **notGluedSolids**, которые оказались не используемыми в операции (указатель может быть равен нулю). Функция возвращает код результата операции из перечисления :blue:`MbResultType`. Функция объявлена в файле *action_solid.h*. Рассматриваемая функция работает так же, как функция :blue:`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* (исходная оболочка и её копия не имеют общих данных). Перечисление :blue:`MbeCopyMode` детально описано в параграфе :ref:`Копирование множества граней MbFaceShell `. Параметр **checkIntersect** даёт команду на проверку пересечения тел множества **solids** между собой. Если параметр **checkIntersect** == *true*, то при построении результата выполняется булева операция объединения всех пересекающихся тел множества **solids**. В противном случае объединение тел заданного множества выполняется простым перекладыванием граней всех тел в построенное тело. Вне зависимости от значения параметра **checkIntersect** все не пересекающиеся тела множества **solids** передают свои грани общему промежуточному телу. Параметр **isArray** работает только при **checkIntersect** == *true* и сообщает о регулярности множества тел **solids**. Если **isArray** == *true*, то тела множества расположены в узлах прямоугольной или круговой сетки и позиции тел заданы в именах граней. Параметр **names** обеспечивает именование граней, ребер и вершин построенного тела. Параметр **notGluedSolids** содержит тела, которые оказались не используемыми в операции из-за невозможности их объединения. На рис. 1 приведены исходные тела **solids**: .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.18.1.png :width: 12cm :align: center Рис. 1 На рис. 2 приведён результат **result** объединения тел **solids**. В данном случае параметр **checkIntersect** необходимо положить равным *true*, так как тела **solids** пересекаются друг с другом. .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.18.2.png :width: 12cm :align: center Рис. 2 Функции .. code-block:: cpp MbResultType UnionSolid( const RPArray & solids, const MbSNameMaker & names, MbSolid *& result ), .. code-block:: cpp MbResultType UnionSolid( const c3d::SolidsVector & solids, const MbSNameMaker & names, MbSolid *& result ), .. code-block:: cpp MbResultType UnionSolid( const c3d::SolidsSPtrVector & solids, const MbSNameMaker & names, MbSolid *& result ) являются упрощёнными вариантами рассматриваемой ранее одноимённой функции, объединяя тела заданного множества простым перекладыванием граней всех тел в одно новое тело. Таким образом, построенное тело и исходные тела имеют одни и те же грани. Функции :blue:`UnionSolid`\() добавляют в журнал построенного тела строитель :blue:`MbUnionSolid`, который содержит все необходимые данные для выполнения операции. Строитель :blue:`MbUnionSolid` объявлен в файле *cr_union_solid.h*. В тестовом приложении *test.exe* булева операция тела с множеством тел выполняется командой меню «Создать → Тело → На базе тела → Набор тел».