.. role:: blue :class: blue Размножение тела ================ .. _Multiplication_of_Body: .. версия ядра: 118058 Функция .. code-block:: cpp MbResultType DuplicationSolid( const MbSolid & solid, const MbDuplicationSolidParams & params, c3d::SolidSPtr & result ); выполняет построение копий исходного тела, трансформацию их по указанному закону и объединение в одно тело. Входными параметрами функции являются: - **solid** - исходное тело; - **params** - параметры построения. В классе :blue:`MbDuplicationSolidParams` для инициализации объекта **params** с параметрами построения используются следующие конструкторы (см. *op_shell_parameter.h*): .. code-block:: cpp MbDuplicationSolidParams( const DPtr & values, IProgressIndicator * prog = nullptr ) _duplicationValues ( values ) , _selIndices ( ) , _adaptMode ( false ) , _names ( ) , _progress ( prog ) { if ( _duplicationValues == nullptr ) { C3D_ASSERT( _duplicationValues != nullptr ); _duplicationValues = new DuplicationMatrixValues(); } } .. code-block:: cpp MbDuplicationSolidParams( const DPtr & values, const MbSNameMaker & names, IProgressIndicator * prog = nullptr ) _duplicationValues ( values ) , _selIndices ( ) , _adaptMode ( false ) , _names ( ) , _progress ( prog ) { if ( _duplicationValues == nullptr ) { C3D_ASSERT( _duplicationValues != nullptr ); _duplicationValues = new DuplicationMatrixValues(); } } Конструктор на основе класса :blue:`DuplicationMeshValues` для копирования по сетке: .. code-block:: cpp MbDuplicationSolidParams( bool isPolar, const MbVector3D & dir1, const double step1, const uint num1, const MbVector3D & dir2, const double step2, const uint num2, const MbCartPoint3D * center, bool isAlongAxis, IProgressIndicator * prog = nullptr ) _duplicationValues( new DuplicationMeshValues( isPolar, dir1, step1, num1, dir2, step2, num2, center, isAlongAxis ) ) , _selIndices() , _adaptMode( false ) , _names() , _progress( prog ) {} Конструкторы на основе класса :blue:`DuplicationMatrixValues` для копирования по матрицам: .. code-block:: cpp MbDuplicationSolidParams( const MbMatrix3D & matr, IProgressIndicator * prog = nullptr ) _duplicationValues( new DuplicationMatrixValues( matr ) ) , _selIndices() , _adaptMode( false ) , _names() , _progress( prog ) {} .. code-block:: cpp MbDuplicationSolidParams( const SArray & matr, IProgressIndicator * prog = nullptr ) _duplicationValues( new DuplicationMatrixValues( matr ) ) , _selIndices() , _adaptMode( false ) , _names() , _progress( prog ) {} .. code-block:: cpp MbDuplicationSolidParams( const std::vector & matr, IProgressIndicator * prog = nullptr ) : _duplicationValues( new DuplicationMatrixValues( matr ) ) , _selIndices() , _adaptMode( false ) , _names() , _progress( prog ) {} где - **_duplicationValues** - параметры копирования; - **_selIndices** - индексы выбранных граней оболочки; - **_adaptMode** - режим адаптации открытых оболочек; - **_names** - именователь тел и граней, создаваемых операцией; - **IProgressIndicator \* _progress** - индикатор прогресса выполнения операции. Выходным параметром функции является построенное тело **result**. Функция возвращает код результата операции из перечисления :ref:`MbResultType `. Функция объявлена в файле *action_solid.h*. Параметр **_names** обеспечивает именование граней, рёбер и вершин построенного тела. Параметр **values** задаёт параметры построения. На рис. 1 приведены данные, используемые при построении, и схема наследования параметров построения от абстрактного класса :blue:`DuplicationValues`: .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.25.1.png :width: 15cm :align: center Рис. 1 Для размножения тела, копии которого располагаются по двумерной сетке, следует использовать параметры :blue:`DuplicationMeshValues`. Поддерживаются два типа размножения: по двум направлениям и по полярной сетке. Параметр **values**.\ *isPolar* определяет тип сетки. **axis1** и **axis2** - векторы в глобальной системе координат, задающие направления сетки (линейной или полярной). Если **values**.\ *isPolar* = *false*, то исходное тело и построенные копии располагаются в узлах двумерной сетки с осями **values**.\ *axis1* и **values**.\ *axis2*. Началом отсчёта служит исходное тело. Вдоль оси **values**.\ *axis1* располагаются **values**.\ *num1* копий тела с шагом **values**.\ *step1*, вдоль оси **values**.\ *axis2* располагаются **values**.\ *num2* копий тела с шагом **values**.\ *step2*, включая исходное тело. Если **values**.\ *isPolar* = *true*, построенные копии располагаются в узлах полярной сетки. Началом отсчёта служит исходное тело. Радиальное направление сетки определяется вектором **values**.\ *axis1*, а ось вращения определяется векторным произведением **values**.\ *axis1* и **values**.\ *axis2*. Вдоль радиальных направлений располагаются **values**.\ *num1* копий тела с шагом **values**.\ *step1*, на каждой окружности располагаются **values**.\ *num2* копий тела с угловым шагом **values**.\ *step2*. Если **values**.\ *isAlongAxis* = *true*, то тела располагаются вдоль радиальной оси. Если **values**.\ *isAlongAxis* = *false*, то тела располагаются параллельно исходному телу. Параметр **values**.\ *center* определяет центр локальной системы координат (а также точку приложения оси вращения в случае полярной системы). Для размножения тела, копии которого трансформированы по набору матриц, следует использовать параметры :blue:`DuplicationMatrixValues`. Множество матриц трансформации определено параметром **values**.\ *matrices*. Если после построения копии и исходное тело пересекаются друг с другом, то выполняется булева операция объединения пересекшихся тел. На рис. 2 приведён результат построения размноженного по полярной сетке тела: .. figure:: /MODELER/OPERATIONS_ON_BODIES/pictures/M.2.25.2.png :width: 9cm :align: center Рис. 2 Функция :blue:`DuplicationSolid`\() добавляет в журнал построенного тела строитель :blue:`MbDuplicationSolid`, который содержит все необходимые данные для выполнения операции. Строитель :blue:`MbDuplicationSolid` объявлен в файле *cr_duplication_solid.h*. В тестовом приложении *test.exe* размножение тела выполняется командами меню «Создать→Тело→На базе тела→Размножением по сетке» и «Создать→Тело→На базе тела→Размножением матрицами».