Булева операция с кинематическим телом ======================================= .. _Boolean_Operation_on_Swept_Body: .. role:: blue :class: blue .. версия ядра: 118058 Функция .. code-block:: cpp MbResultType EvolutionResult( const c3d::SolidSPtr & srcSolid, const MbeCopyMode copyMode, OperationType oType, const MbEvolutionShellParams & evShellParams, c3d::SolidSPtr & result ); выполняет построение кинематического тела и булеву операцию заданного тела с построенным телом. Входными параметрами функции являются: - **srcSolid** – заданное тело для булевой операции; - **copyMode** – режим копирования заданного тела; - **oType** – тип булевой операции: bo_Union – объединение тел, bo_Intersect – пересечение тел, bo_Difference – вычитание тел; - **evShellParams** – исходные данные для создания кинематического тела. Выходным параметром функции является построенное тело **result**. Функция возвращает код результата операции из перечисления :blue:`MbResultType` (см. *mb_operation_result.h*). Функция объявлена в файле *action_solid.h*. При создании объекта **evShellParams** с исходными данными для построения используется один из следующих конструкторов (см. *op_shell_parameter.h*): .. code-block:: cpp MbEvolutionShellParams( const MbSweptData & sweptData, const MbCurve3D & spineCurve, const EvolutionValues & evolParams, const MbSNameMaker & operName, const RPArray & contoursNames, const MbSNameMaker & spineName, IProgressIndicator * prog = nullptr ); .. code-block:: cpp MbEvolutionShellParams( const MbSweptData & sweptData, const MbWireFrame & spineFrame, const EvolutionValues & evolParams, const MbSNameMaker & operName, const RPArray & contoursNames, const MbSNameMaker & spineName, IProgressIndicator * prog = nullptr ); .. code-block:: cpp MbEvolutionShellParams( const MbSweptData & sweptData, const MbSpine & spine, const EvolutionValues & evolParams, const MbSNameMaker & operName, const RPArray & contoursNames, const MbSNameMaker & spineName, IProgressIndicator * prog = nullptr ); .. code-block:: cpp MbEvolutionShellParams( const MbSweptData & sweptData, const MbSpine & spine, const EvolutionValues & evolParams, const MbSNameMaker & operName, const RPArray & contoursNames, const MbSNameMaker & spineName, const VariableSectionValues & varSectVals, IProgressIndicator * prog = nullptr ); где - **sweptData** – данные об образующей; - **spineCurve** – направляющая кривая; - **spineFrame** – направляющая кривая в виде проволочного каркаса; - **spine** – направляющая кривая c дополнительной информацией; - **evolParams** – параметры операции; - **operName** – именователь операции; - **contoursNames** – именователь контуров образующей; - **spineName** – именователь направляющей; - **varSectVals** – данные, необходимые для построения элемента по траектории с изменяемым сечением; - **prog** – индикатор прогресса выполнения операции. Функция представляет собой последовательное объединение двух функций: функции :blue:`EvolutionShell`\(), выполняющей построение тела путем движения образующих кривых **sweptData** вдоль направляющей кривой **spine** (**spineCurve**, **spineFrame**), и функции :blue:`BooleanResult`\(), выполняющего булеву операцию **oType** тела **srcSolid** с построенным на предыдущем шаге кинематическим телом. Функция :blue:`EvolutionShell`\() описана в параграфе :ref:`Построение кинематического тела `, функция :blue:`BooleanResult`\() описана в параграфе :ref:`Булева операция над телами `. Параметр **copyMode** управляет передачей граней, ребер и вершин от исходного тела **srcSolid** построенному телу **result** и может принимать одно из четырех значений: - *cm_Same* = 0 (оболочка не копируется); - *cm_KeepHistory* (исходная оболочка и её копия имеют общие базовые поверхности, вершины и неизменённые операцией грани); - *cm_KeepSurface* (исходная оболочка и её копия имеют общие базовые поверхности); - *cm_Copy* (исходная оболочка и её копия не имеют общих данных). Перечисление :blue:`MbeCopyMode` подробно описано в параграфе :ref:`Копирование множества граней MbFaceShell `. Параметр **oType** определяет тип булевой операции и может принимать три значения: *bo_Union*, *bo_Intersect*, *bo_Difference*. При **oType** = *bo_Union* функция выполняет объединение тела **srcSolid** и кинематического тела. При **oType** = *bo_Intersect* функция выполняет пересечение тел **srcSolid** и кинематического тела. При **oType** = *bo_Difference* функция выполняет вычитание из тела **srcSolid** кинематического тела. Параметры **operName** и **contoursNames** обеспечивают именование граней, ребер и вершин построенного тела. Функция :blue:`EvolutionResult`\() при построении тела путем движения кривых имеет те же возможности, что и функция :blue:`EvolutionShell`\(): направляющие кривые могут располагаться на плоскости, криволинейной поверхности или в пространстве, тело может полностью заполнять замкнутые кривые или иметь тонкую стенку. Остановимся на некоторых возможностях рассматриваемой функции, связанных с булевыми операциями. На рис. 1 показаны тело **srcSolid**, образующая кривая **sweptData** и направляющая кривая **spine**: .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.5.1.png :width: 12cm :align: center Рис. 1 На рис. 2 приведен результат булевой операции объединения тела **srcSolid** и тела, полученного движением образующей кривой **sweptData** вдоль направляющей кривой **spine**, показанных на рис. 1: .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.5.2.png :width: 12cm :align: center Рис. 2 На рис. 3 приведен результат булевой операции вычитания из тела **srcSolid** тела, полученного движением образующей кривой **sweptData** вдоль направляющей кривой **spine**, показанных на рис. 1: .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.5.3.png :width: 12cm :align: center Рис. 3 На рис. 4 приведен результат булевой операции пересечения тела **srcSolid** и тела, полученного движением образующей кривой **sweptData** вдоль направляющей кривой **spine**, показанных на рис. 1: .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.5.4.png :width: 15cm :align: center Рис. 4 В тестовом приложении *test.exe* булева операция с построенным кинематическим телом выполняется командами меню «Создать→Тело→Приклеиванием к телу→Движения кривой», «Создать→Тело→Вырезанием из тела→Движения кривой» и «Создать→Тело→Пересечением с телом→Движения кривой».