Построение трансформированного тела

Функция

MbResultType TransformedSolid(      MbSolid &          solid,
                                    MbeCopyMode        sameShell,
                              const TransformValues &  p,
                              const MbSNameMaker &     names,
                                    MbSolid *&         result )

выполняет трансформацию исходного тела по заданной матрице, рассчитанной по габаритному кубу.

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

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

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

  • p – параметры трансформации;

  • names – именователь операции.

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

При удачной работе функция возвращает rt_Success, в противном случае функция возвращает код ошибки из перечисления MbResultType (см. mb_operation_result.h).

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

При создании объекта p с параметрами трансформации используется один из следующих конструкторов (см. op_shell_parameter.h):

Конструктор по умолчанию:

TransformValues()
: matrix()
, fixedPoint()
, useFixed( false )
, isotropy( false )
{}

Конструктор по матрице:

TransformValues( const MbMatrix3D & m )
: matrix( m )
, fixedPoint()
, useFixed( false )
, isotropy( false )
{}

Конструктор по матрице и неподвижной точке преобразования:

TransformValues( const MbMatrix3D & m, const MbCartPoint3D & f, bool fix = false, bool iso = false )
: matrix( m )
, fixedPoint( f )
, useFixed( fix )
, isotropy( iso )
{}

Конструктор по неподвижной точке преобразования и масштабам по осям:

TransformValues( double sX, double sY, double sZ, const MbCartPoint3D & fP );

Конструктор копирования:

TransformValues( const TransformValues & other )
: matrix    ( other.matrix )
, fixedPoint( other.fixedPoint )
, useFixed  ( other.useFixed )
, isotropy  ( other.isotropy )
{}

Рассматриваемая функция выполняет масштабирование тела с помощью матрицы, имеющей одинаковые или разные масштабы преобразования по осям глобальной системы координат.

Параметр solid содержит исходное тело, которое подлежит обработке.

Параметр sameShell управляет копированием данных от исходного тела solid построенному телу result (см. Копирование множества граней MbFaceShell).

Параметр p содержит матрицу трансформации p.matrix и величины p.fixedPoint, p.useFixed, p.isotropy, которые используются для расчёта матрицы трансформации. Параметр трансформации TransformValues объявлен в файле op_shell_parameter.h.

Параметр names используется для именования элементов тела.

Матрица трансформации рассчитывается по габаритному кубу исходного тела solid и смещению одной из точек габаритного куба методом:

bool MbCube::CalculateMatrix(      size_t             pIndex,
                             const MbCartPoint3D &    point,
                             const MbCartPoint3D &    fixedPoint,
                                   bool               useFixed,
                                   bool               isotropy,
                                   MbMatrix3D &       matrix ) const;

где

  • pIndex – номер смещаемой точки габаритного куба;

  • point – точка пространства, с которой нужно совместить точку габаритного куба с номером pIndex;

  • fixedPoint – неподвижная точка преобразования (используется, если useFixed = true);

  • useFixed – флаг использования неподвижной точки;

  • isotropy – флаг равенства масштабов преобразования;

  • matrix – рассчитанная матрица преобразования.

На рис. 1 приведена нумерация точек габаритного куба тела solid. Вершины габаритного куба имеют номера 0–7, середины рёбер габаритного куба имеют номера 8–19, центры граней габаритного куба имеют номера 20–25.

../../../../_images/M.6.1.1.png

Рис. 1

Матрица трансформации matrix рассчитывается по деформированному кубу, полученному путём совмещения точки габаритного куба с номером pIndex с точкой пространства point.

Если useFixed = true, то неподвижной точкой преобразования будет точка fixedPoint. Если useFixed = false, то неподвижной точкой преобразования будет точка габаритного куба, противолежащая точке с номером pIndex. Противолежащими точками габаритного куба считаются точки: 0–6, 1–7, 2–4, 3–5, 8–14, 9–15, 10–12, 11–13, 16–18, 17–19, 20–21, 22–23, 24–25.

Если isotropy = true, то масштабы преобразования по всем осям будут одинаковы и пропорциональны вектору смещения точки габаритного куба с номером pIndex. Если isotropy = false, то масштабы преобразования будут пропорциональны проекциям на стороны габаритного куба вектора смещения точки габаритного куба с номером pIndex. Величины p.fixedPoint, p.useFixed, p.isotropy и p.matrix используются в качестве параметров fixedPoint, useFixed, isotropy и matrix метода CalculateMatrix().

На рис. 2 приведено исходное тело solid, точки габаритного куба и точка пространства point, с которой нужно совместить указанную точку габаритного куба, а на рис. 3 приведено трансформированное тело result, построенное рассматриваемой функцией с параметрами useFixed = false и isotropy = false.

../../../../_images/M.6.1.2.png

Рис. 2

../../../../_images/M.6.1.3.png

Рис. 3

Трансформировать тело по заданной матрице можно также методом Transform(), который перегружен у всех геометрических объектов, включая MbSolid, но при этом тело не будет содержать информацию о выполненных над ним действиях.

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

Тестовое приложение test.exe выполняет построение трансформированного тела командой меню «Создать → Тело → Прямым редактированием → Трансформированием габарита».