.. role:: blue :class: blue Резка тела на части =================== .. _Cutting_a_Body: .. версия ядра: 118056 Функция .. code-block:: cpp MbResultType SolidCutting( const c3d::SolidSPtr & solid, MbeCopyMode sameShell, const MbShellCuttingParams & cuttingParams, c3d::SolidsSPtrVector & results ); отрезает часть тела плоским контуром, поверхностью или оболочкой. Входными параметрами функции являются: - **solid** -- исходное тело; - **sameShell** -- режим копирования исходного тела; - **cuttingParams** -- параметры операции. Выходным параметром функции являются построенные тела **results**. Функция возвращает код результата операции из перечисления :blue:`MbResultType` (см. *mb_operation_result.h*). Функция объявлена в файле *action_solid.h*. Для инициализации объектов **cuttingParams** с параметрами операции в классе :blue:`MbShellCuttingParams` определен следующий конструктор по умолчанию: .. code-block:: cpp MbShellCuttingParams( int part, const MbMergingFlags & mergingFlags, bool cutAsClosed, const MbSNameMaker & snMaker, IProgressIndicator * prog = nullptr ) : cutterData ( ) , booleanFlags( ) , nameMaker ( &snMaker.Duplicate() ) , retainedPart( ts_neutral ) , prolongState( ) , progress ( prog ) { booleanFlags.InitCutting( cutAsClosed ); booleanFlags.SetMerging( mergingFlags ); SetRetainedPart( part ); } - **part** -- сохраняемая часть исходной оболочки (+1, 0, -1), 0 -- оставить обе части; - **mergingFlags** -- флаги слияния элементов оболочки; - **cutAsClosed** -- флаг построения замкнутой оболочки; - **snMaker** -- именователь операции. Резка тела плоским контуром --------------------------- .. _Cutting_a_Body_by_a_Flat_Contour: Функция строит незамкнутую оболочку путем выдавливания в направлении **dir** двумерного контура **contour**, расположенного в плоскости XY локальной системы координат **place**, и выполняет булеву операцию пересечения исходного тела **solid** с незамкнутой оболочкой. При равенстве нулю вектора **dir** выдавливание контура выполняется вдоль вектора **place.axisZ**. Для выполнения операции секущий контур должен полностью пересекать проекцию исходного тела на плоскость XY локальной системы координат **place** в направлении вектора выдавливания. Длина выдавливания контура рассчитывается так, чтобы незамкнутая оболочка полностью пересекала исходное тело. Для инициализации объектов **cuttingParams** функции с параметрами операции в классе :blue:`MbShellCuttingParams` определены следующие конструкторы по контуру: Конструктор с выбором сохраняемой части: .. code-block:: cpp MbShellCuttingParams( const MbPlacement3D & place, const MbContour & contour, bool sameContour, const MbVector3D & dir, int part, const MbMergingFlags & mergingFlags, bool cutAsClosed, const MbSNameMaker & snMaker, IProgressIndicator * prog = nullptr ) : cutterData ( place, dir, contour, sameContour ) , booleanFlags( ) , nameMaker ( &snMaker.Duplicate() ) , retainedPart( ts_neutral ) , prolongState( ) , progress ( prog ) { booleanFlags.InitCutting( cutAsClosed ); booleanFlags.SetMerging( mergingFlags ); SetRetainedPart( part ); } Конструктор без выбора сохраняемой части (по умолчанию сохраняются все части): .. code-block:: cpp MbShellCuttingParams( const MbPlacement3D & place, const MbContour & contour, bool sameContour, const MbVector3D & dir, const MbMergingFlags & mergingFlags, bool cutAsClosed, const MbSNameMaker & snMaker, IProgressIndicator * prog = nullptr ) : cutterData ( place, dir, contour, sameContour ) , booleanFlags( ) , nameMaker ( &snMaker.Duplicate() ) , retainedPart( ts_neutral ) , prolongState( ) , progress ( prog ) { booleanFlags.InitCutting( cutAsClosed ); booleanFlags.SetMerging( mergingFlags ); } где - **place** -- локальная система координат, в плоскости XY которой расположен двумерный контур; - **contour** -- двумерный контур выдавливания расположен в плоскости XY локальной системы координат **place**; - **sameContour** -- флаг использования исходного контура (true) или его копии (false); - **dir** -- направление выдавливания контура; - **part** -- сохраняемая часть исходного тела (+1, 0, -1), 0 -- оставить обе части; - **mergingFlags** -- флаги слияния элементов оболочки; - **cutAsClosed** -- флаг построения замкнутой оболочки; - **snMaker** -- именователь операции. Параметр **part** определяет оставляемую часть исходного тела **solid**: - при *part* = +1 сохраняется часть тела, расположенная справа от контура, если смотреть вдоль контура навстречу оси **place.axisZ**; - при *part* = -1 сохраняется часть тела, расположенная слева от контура, если смотреть вдоль контура навстречу оси **place.axisZ**; - при *part* = 0 сохраняются обе части тела. Параметр **mergingFlags** управляет слиянием подобных граней и ребер результирующей оболочки. Параметр **cutAsClosed** говорит о том, каким считать исходное тело **solid**: замкнутым или незамкнутым. При **cutAsClosed** = *true* операция выполняется над множеством точек, расположенным внутри и на поверхности тела. При **cutAsClosed** = *false* операция выполняется над множеством точек, расположенным на поверхности тела. Параметр **snMaker** обеспечивает именование граней, ребер и вершин построенного тела. На рис. 1 показаны исходное тело **solid**, режущий контур **contour** и плоскость XY локальной системы координат **place**. .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.8.1.png :width: 9cm :align: center Рис. 1 На рис. 2 приведено построенное тело **result** при *part* = +1 и *cutAsClosed* = *true*. На рис. 3 приведено построенное тело **result** при *part* = -1 и *cutAsClosed* = *true*: .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.8.2.png :width: 8cm :align: center Рис. 2 .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.8.3.png :width: 8cm :align: center Рис. 3 На рис. 4 приведено построенное тело **result** при *part* = +1 и *cutAsClosed* = *false*: .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.8.4.png :width: 9cm :align: center Рис. 4 При *part* = 0 рассматриваемая функция построит тело **result**, в которое войдут все части исходного тела **solid**, полученные после резки. Для разделения тела **result** на части следует воспользоваться методами :blue:`DetachParts`\() или :blue:`CreateParts`\(), описанным в параграфе :ref:`Разделить тело на несвязанные части `. При использовании конструктора по контуру: .. code-block:: cpp MbShellCuttingParams( const MbPlacement3D & place, const MbContour & contour, bool sameContour, const MbVector3D & dir, const MbMergingFlags & mergingFlags, bool cutAsClosed, const MbSNameMaker & snMaker, IProgressIndicator * prog = nullptr ); функция :blue:`SolidCutting`\() режет тело поверхностью, полученной выдавливанием плоского контура, и из всех частей строит отдельные тела. На рис. 5 приведено построенное данным способом тело **result** при *cutAsClosed* = *true*: .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.8.5.png :width: 9cm :align: center Рис. 5 Функция :blue:`SolidCutting`\() добавляет в журнал построенного тела строитель :blue:`MbCuttingSolid`, который содержит все необходимые данные для выполнения операции. Строитель :blue:`MbCuttingSolid` объявлен в файле *cr_cutting_solid.h*. В тестовом приложении *test.exe* резка тела плоским контуром выполняется командами меню «Создать→Тело→На базе тела→Разрезанное двумерной кривой» и «Создать→Оболочку→На основе оболочки→Разрезанную кривой». Резка тела поверхностью ----------------------- .. _Cutting_a_Body_by_a_Surface: Функция строит незамкнутую оболочку с одной гранью на базе режущей поверхности **surface** и выполняет булеву операцию пересечения исходного тела **solid** с незамкнутой оболочкой. Для выполнения операции режущая поверхность должна полностью пересекать исходное тело. Для инициализации объектов **cuttingParams** функции с параметрами операции в классе :blue:`MbShellCuttingParams` определены следующие конструкторы по поверхности: .. code-block:: cpp MbShellCuttingParams( const MbSurface & surface, bool sameSurface, int part, const MbMergingFlags & mergingFlags, bool cutAsClosed, const MbSNameMaker & snMaker, IProgressIndicator * prog = nullptr ) : cutterData ( surface, sameSurface ) , booleanFlags( ) , nameMaker ( &snMaker.Duplicate() ) , retainedPart( ts_neutral ) , prolongState( ) , progress ( prog ) { booleanFlags.InitCutting( cutAsClosed ); booleanFlags.SetMerging( mergingFlags ); SetRetainedPart( part ); } .. code-block:: cpp MbShellCuttingParams( const MbSurface & surface, bool sameSurface, const MbMergingFlags & mergingFlags, bool cutAsClosed, const MbSNameMaker & snMaker, IProgressIndicator * prog = nullptr ) : cutterData ( surface, sameSurface ) , booleanFlags( ) , nameMaker ( &snMaker.Duplicate() ) , retainedPart( ts_neutral ) , prolongState( ) , progress ( prog ) { booleanFlags.InitCutting( cutAsClosed ); booleanFlags.SetMerging( mergingFlags ); } - **surface** -- режущая поверхность; - **sameSurface** -- флаг использования исходной поверхности (true) или её копии (false); - **part** -- сохраняемая часть исходного тела (+1, 0, -1), 0 -- оставить обе части; - **mergingFlags** -- флаги слияния элементов оболочки; - **cutAsClosed** -- флаг построения замкнутой оболочки; - **snMaker** -- именователь операции. Параметр **part** определяет сохраняемую часть исходного тела **solid**: - при **part** = +1 сохраняется часть тела, расположенная над поверхностью (с той стороны, в которую направлена нормаль поверхности); - при **part** = --1 сохраняется часть тела, расположенная под поверхностью; - при **part** = 0 сохраняются обе части тела. Параметр **cutAsClosed** говорит о том, каким считать исходное тело **solid**: замкнутым или незамкнутым: - при **cutAsClosed** = *true* операция выполняется над множеством точек, расположенным внутри и на поверхности тела; - при **cutAsClosed** = *false* операция выполняется над множеством точек, расположенным на поверхности тела. Параметр **snMaker** обеспечивает именование граней, ребер и вершин построенного тела. На рис. 6 показаны исходное тело **solid** и режущая поверхность **surface**. .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.7.1.png :width: 9cm :align: center Рис. 6 На рис. 7 приведено построенное тело **result** при *part* = +1 и *cutAsClosed* = true. На рис. 8 приведено построенное тело **result** при *part* = -1 и *cutAsClosed* = true. .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.7.2.png :width: 7cm :align: center Рис. 7 .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.7.3.png :width: 7cm :align: center Рис. 8 На рис. 9 приведено построенное тело **result** при *part* = +1 и *cutAsClosed* = false: .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.7.4.png :width: 9cm :align: center Рис. 9 При **part** = 0 функция построит тело **result**, в которое войдут все части исходного тела **solid**, полученные после резки. Для разделения тела **result** на части следует воспользоваться функциями :blue:`DetachParts`\() или :blue:`CreateParts`\(), описанными в параграфе :ref:`Разделить тело на несвязанные части `. При использовании конструктора по поверхности .. code-block:: cpp MbShellCuttingParams( const MbSurface & surface, bool sameSurface, const MbMergingFlags & mergingFlags, bool cutAsClosed, const MbSNameMaker & snMaker, IProgressIndicator * prog = nullptr ) функция режет тело пересекающей его поверхностью и из всех частей строит отдельные тела. На рис. 10 приведено построенное данным методом тело **result** при *cutAsClosed* = *true*: .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.7.5.png :width: 9cm :align: center Рис. 10 В тестовом приложении *test.exe* резка тела поверхностью выполняется командами меню «Создать→Тело→На базе тела→Разрезанное поверхностью» и «Создать→Оболочку→На основе оболочки→Разрезанную поверхностью». Резка тела оболочкой -------------------- Функция выполняет резку исходного тела **solid** пересекающей его оболочкой **cutSolid**. Для выполнения операции режущая оболочка **cutSolid** должна полностью пересекать исходное тело **solid**. Для инициализации объектов **cuttingParams** функции с параметрами операции в классе :blue:`MbShellCuttingParams` определен следующий конструктор по оболочке: .. code-block:: cpp MbShellCuttingParams( const MbSolid & solid, bool sameSolid, int part, const MbMergingFlags & mergingFlags, bool cutAsClosed, const MbSNameMaker & snMaker, IProgressIndicator * prog = nullptr ) : cutterData ( solid, sameSolid, true ) , booleanFlags( ) , nameMaker ( &snMaker.Duplicate() ) , retainedPart( ts_neutral ) , prolongState( ) , progress ( prog ) { booleanFlags.InitCutting( cutAsClosed ); booleanFlags.SetMerging( mergingFlags ); SetRetainedPart( part ); } - **solid** -- режущая оболочка; - **sameSolid** -- флаг использования исходного тела (*true*) или его копии (*false*); - **part** -- сохраняемая часть исходного тела (+1, 0, -1), 0 -- оставить обе части; - **mergingFlags** -- флаги слияния элементов оболочки; - **cutAsClosed** -- флаг построения замкнутой оболочки; - **snMaker** -- именователь операции. Параметр **part** определяет сохраняемую часть исходного тела **solid**: - при **part** = +1 сохраняется часть тела, расположенная снаружи оболочки; - при **part** = --1 сохраняется часть тела, расположенная внутри оболочки; - при **part** = 0 сохраняются обе части тела. Параметр **cutAsClosed** говорит о том, каким считать исходное тело **solid**: замкнутым или незамкнутым: - при **cutAsClosed** = *true* операция выполняется над множеством точек, расположенным внутри и на поверхности тела; - при **cutAsClosed** = *false* операция выполняется над множеством точек, расположенным на поверхности тела. Параметр **snMaker** обеспечивает именование граней, ребер и вершин построенного тела. На рис. 11 показаны исходное тело **solid** и режущая оболочка **cutSolid**. .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/Cutting_by_shell_1.png :width: 9cm :align: center Рис. 11 На рис. 12 приведено построенное тело **result** при *part* = +1 и *cutAsClosed* = *true*. На рис. 13 приведено построенное тело **result** при *part* = -1 и *cutAsClosed* = *true*: .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/Cutting_by_shell_2.png :width: 8cm :align: center Рис. 12 .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/Cutting_by_shell_3.png :width: 8cm :align: center Рис. 13 При **part** = 0 рассматриваемая функция построит тело **result**, в которое войдут все части исходного тела **solid**, полученные после резки (рис. 14): .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/Cutting_by_shell_4.png :width: 9cm :align: center Рис. 14 В тестовом приложении *test.exe* резка тела оболочкой выполняется командами меню «Создать→Тело→На базе тела→Разрезанное оболочкой» и «Создать→Оболочку→На основе оболочки→Разрезанную оболочкой».