Резка тела на части

Функция

MbResultType SolidCutting( const c3d::SolidSPtr &        solid,
                                 MbeCopyMode             sameShell,
                           const MbShellCuttingParams &  cuttingParams,
                                 c3d::SolidsSPtrVector & results );

отрезает часть тела плоским контуром, поверхностью или оболочкой.

Входными параметрами функции являются:

  • solid – исходное тело;

  • sameShell – режим копирования исходного тела;

  • cuttingParams – параметры операции.

Выходным параметром функции являются построенные тела results.

Функция возвращает код результата операции из перечисления MbResultType (см. mb_operation_result.h).

Функция объявлена в файле action_solid.h.

Для инициализации объектов cuttingParams с параметрами операции в классе MbShellCuttingParams определен следующий конструктор по умолчанию:

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 – именователь операции.

Резка тела плоским контуром

Функция строит незамкнутую оболочку путем выдавливания в направлении dir двумерного контура contour, расположенного в плоскости XY локальной системы координат place, и выполняет булеву операцию пересечения исходного тела solid с незамкнутой оболочкой. При равенстве нулю вектора dir выдавливание контура выполняется вдоль вектора place.axisZ.

Для выполнения операции секущий контур должен полностью пересекать проекцию исходного тела на плоскость XY локальной системы координат place в направлении вектора выдавливания. Длина выдавливания контура рассчитывается так, чтобы незамкнутая оболочка полностью пересекала исходное тело.

Для инициализации объектов cuttingParams функции с параметрами операции в классе MbShellCuttingParams определены следующие конструкторы по контуру:

Конструктор с выбором сохраняемой части:

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 );
}

Конструктор без выбора сохраняемой части (по умолчанию сохраняются все части):

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.

../../../../_images/M.2.8.1.png

Рис. 1

На рис. 2 приведено построенное тело result при part = +1 и cutAsClosed = true. На рис. 3 приведено построенное тело result при part = -1 и cutAsClosed = true:

../../../../_images/M.2.8.2.png

Рис. 2

../../../../_images/M.2.8.3.png

Рис. 3

На рис. 4 приведено построенное тело result при part = +1 и cutAsClosed = false:

../../../../_images/M.2.8.4.png

Рис. 4

При part = 0 рассматриваемая функция построит тело result, в которое войдут все части исходного тела solid, полученные после резки.

Для разделения тела result на части следует воспользоваться методами DetachParts() или CreateParts(), описанным в параграфе Разделить тело на несвязанные части.

При использовании конструктора по контуру:

MbShellCuttingParams( const MbPlacement3D &      place,
                      const MbContour &          contour,
                            bool                 sameContour,
                      const MbVector3D &         dir,
                      const MbMergingFlags &     mergingFlags,
                            bool                 cutAsClosed,
                      const MbSNameMaker &       snMaker,
                            IProgressIndicator * prog = nullptr );

функция SolidCutting() режет тело поверхностью, полученной выдавливанием плоского контура, и из всех частей строит отдельные тела. На рис. 5 приведено построенное данным способом тело result при cutAsClosed = true:

../../../../_images/M.2.8.5.png

Рис. 5

Функция SolidCutting() добавляет в журнал построенного тела строитель MbCuttingSolid, который содержит все необходимые данные для выполнения операции. Строитель MbCuttingSolid объявлен в файле cr_cutting_solid.h.

В тестовом приложении test.exe резка тела плоским контуром выполняется командами меню «Создать→Тело→На базе тела→Разрезанное двумерной кривой» и «Создать→Оболочку→На основе оболочки→Разрезанную кривой».

Резка тела поверхностью

Функция строит незамкнутую оболочку с одной гранью на базе режущей поверхности surface и выполняет булеву операцию пересечения исходного тела solid с незамкнутой оболочкой. Для выполнения операции режущая поверхность должна полностью пересекать исходное тело.

Для инициализации объектов cuttingParams функции с параметрами операции в классе MbShellCuttingParams определены следующие конструкторы по поверхности:

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 );
}
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.

../../../../_images/M.2.7.1.png

Рис. 6

На рис. 7 приведено построенное тело result при part = +1 и cutAsClosed = true. На рис. 8 приведено построенное тело result при part = -1 и cutAsClosed = true.

../../../../_images/M.2.7.2.png

Рис. 7

../../../../_images/M.2.7.3.png

Рис. 8

На рис. 9 приведено построенное тело result при part = +1 и cutAsClosed = false:

../../../../_images/M.2.7.4.png

Рис. 9

При part = 0 функция построит тело result, в которое войдут все части исходного тела solid, полученные после резки.

Для разделения тела result на части следует воспользоваться функциями DetachParts() или CreateParts(), описанными в параграфе Разделить тело на несвязанные части.

При использовании конструктора по поверхности

MbShellCuttingParams( const MbSurface &          surface,
                            bool                 sameSurface,
                      const MbMergingFlags &     mergingFlags,
                            bool                 cutAsClosed,
                      const MbSNameMaker &       snMaker,
                            IProgressIndicator * prog = nullptr )

функция режет тело пересекающей его поверхностью и из всех частей строит отдельные тела. На рис. 10 приведено построенное данным методом тело result при cutAsClosed = true:

../../../../_images/M.2.7.5.png

Рис. 10

В тестовом приложении test.exe резка тела поверхностью выполняется командами меню «Создать→Тело→На базе тела→Разрезанное поверхностью» и «Создать→Оболочку→На основе оболочки→Разрезанную поверхностью».

Резка тела оболочкой

Функция выполняет резку исходного тела solid пересекающей его оболочкой cutSolid. Для выполнения операции режущая оболочка cutSolid должна полностью пересекать исходное тело solid.

Для инициализации объектов cuttingParams функции с параметрами операции в классе MbShellCuttingParams определен следующий конструктор по оболочке:

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.

../../../../_images/Cutting_by_shell_1.png

Рис. 11

На рис. 12 приведено построенное тело result при part = +1 и cutAsClosed = true. На рис. 13 приведено построенное тело result при part = -1 и cutAsClosed = true:

../../../../_images/Cutting_by_shell_2.png

Рис. 12

../../../../_images/Cutting_by_shell_3.png

Рис. 13

При part = 0 рассматриваемая функция построит тело result, в которое войдут все части исходного тела solid, полученные после резки (рис. 14):

../../../../_images/Cutting_by_shell_4.png

Рис. 14

В тестовом приложении test.exe резка тела оболочкой выполняется командами меню «Создать→Тело→На базе тела→Разрезанное оболочкой» и «Создать→Оболочку→На основе оболочки→Разрезанную оболочкой».