.. role:: blue :class: blue Построение трансформированного тела =================================== .. _Constructing_a_Transformed_Body: .. версия ядра: 118058 Функция .. code-block:: cpp MbResultType TransformedSolid( MbSolid & solid, MbeCopyMode sameShell, const TransformValues & p, const MbSNameMaker & names, MbSolid *& result ) выполняет трансформацию исходного тела по заданной матрице, рассчитанной по габаритному кубу. Входными параметрами функции являются: - **solid** – исходное тело; - **sameShell** – вариант копирования исходного тела; - **p** – параметры трансформации; - **names** – именователь операции. Выходным параметром функции является модифицированное тело **result**. При удачной работе функция возвращает :blue:`rt_Success`, в противном случае функция возвращает код ошибки из перечисления :ref:`MbResultType ` (см. *mb_operation_result.h*). Функция объявлена в файле *action_direct.h*. При создании объекта **p** с параметрами трансформации используется один из следующих конструкторов (см. *op_shell_parameter.h*): Конструктор по умолчанию: .. code-block:: cpp TransformValues() : matrix() , fixedPoint() , useFixed( false ) , isotropy( false ) {} Конструктор по матрице: .. code-block:: cpp TransformValues( const MbMatrix3D & m ) : matrix( m ) , fixedPoint() , useFixed( false ) , isotropy( false ) {} Конструктор по матрице и неподвижной точке преобразования: .. code-block:: cpp TransformValues( const MbMatrix3D & m, const MbCartPoint3D & f, bool fix = false, bool iso = false ) : matrix( m ) , fixedPoint( f ) , useFixed( fix ) , isotropy( iso ) {} Конструктор по неподвижной точке преобразования и масштабам по осям: .. code-block:: cpp TransformValues( double sX, double sY, double sZ, const MbCartPoint3D & fP ); Конструктор копирования: .. code-block:: cpp TransformValues( const TransformValues & other ) : matrix ( other.matrix ) , fixedPoint( other.fixedPoint ) , useFixed ( other.useFixed ) , isotropy ( other.isotropy ) {} Рассматриваемая функция выполняет масштабирование тела с помощью матрицы, имеющей одинаковые или разные масштабы преобразования по осям глобальной системы координат. Параметр **solid** содержит исходное тело, которое подлежит обработке. Параметр **sameShell** управляет копированием данных от исходного тела **solid** построенному телу **result** (см. :ref:`Копирование множества граней MbFaceShell `). Параметр **p** содержит матрицу трансформации **p**.\ *matrix* и величины **p**.\ *fixedPoint*, **p**.\ *useFixed*, **p**.\ *isotropy*, которые используются для расчёта матрицы трансформации. Параметр трансформации :blue:`TransformValues` объявлен в файле *op_shell_parameter.h*. Параметр **names** используется для именования элементов тела. Матрица трансформации рассчитывается по габаритному кубу исходного тела **solid** и смещению одной из точек габаритного куба методом: .. code-block:: cpp 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. .. figure:: /MODELER/DIRECT_MODELING_METHODS/pictures/M.6.1.1.png :width: 12cm :align: center Рис. 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** метода :blue:`CalculateMatrix`\(). На рис. 2 приведено исходное тело **solid**, точки габаритного куба и точка пространства **point**, с которой нужно совместить указанную точку габаритного куба, а на рис. 3 приведено трансформированное тело **result**, построенное рассматриваемой функцией с параметрами **useFixed** = *false* и **isotropy** = *false*. .. figure:: /MODELER/DIRECT_MODELING_METHODS/pictures/M.6.1.2.png :width: 12cm :align: center Рис. 2 .. figure:: /MODELER/DIRECT_MODELING_METHODS/pictures/M.6.1.3.png :width: 12cm :align: center Рис. 3 Трансформировать тело по заданной матрице можно также методом :blue:`Transform`\(), который перегружен у всех геометрических объектов, включая :blue:`MbSolid`, но при этом тело не будет содержать информацию о выполненных над ним действиях. Функция :blue:`TransformedSolid`\() добавляет в журнал построенного тела строитель :blue:`MbTransformedSolid`, который содержит все необходимые данные для выполнения операции. Строитель :blue:`MbTransformedSolid` объявлен в файле *cr_transformed_solid.h*. Тестовое приложение *test.exe* выполняет построение трансформированного тела командой меню «Создать → Тело → Прямым редактированием → Трансформированием габарита».