Размножение тела
Функция
MbResultType DuplicationSolid( const MbSolid & solid,
const MbDuplicationSolidParams & params,
c3d::SolidSPtr & result );
выполняет построение копий исходного тела, трансформацию их по указанному закону и объединение в одно тело.
Входными параметрами функции являются:
solid - исходное тело;
params - параметры построения.
В классе MbDuplicationSolidParams для инициализации объекта params с параметрами построения используются следующие конструкторы (см. op_shell_parameter.h):
MbDuplicationSolidParams( const DPtr<DuplicationValues> & values,
IProgressIndicator * prog = nullptr )
_duplicationValues ( values )
, _selIndices ( )
, _adaptMode ( false )
, _names ( )
, _progress ( prog )
{
if ( _duplicationValues == nullptr )
{
C3D_ASSERT( _duplicationValues != nullptr );
_duplicationValues = new DuplicationMatrixValues();
}
}
MbDuplicationSolidParams( const DPtr<DuplicationValues> & 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();
}
}
Конструктор на основе класса DuplicationMeshValues для копирования по сетке:
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 )
{}
Конструкторы на основе класса DuplicationMatrixValues для копирования по матрицам:
MbDuplicationSolidParams( const MbMatrix3D & matr,
IProgressIndicator * prog = nullptr )
_duplicationValues( new DuplicationMatrixValues( matr ) )
, _selIndices()
, _adaptMode( false )
, _names()
, _progress( prog )
{}
MbDuplicationSolidParams( const SArray<MbMatrix3D> & matr,
IProgressIndicator * prog = nullptr )
_duplicationValues( new DuplicationMatrixValues( matr ) )
, _selIndices()
, _adaptMode( false )
, _names()
, _progress( prog )
{}
MbDuplicationSolidParams( const std::vector<MbMatrix3D> & matr,
IProgressIndicator * prog = nullptr )
: _duplicationValues( new DuplicationMatrixValues( matr ) )
, _selIndices()
, _adaptMode( false )
, _names()
, _progress( prog )
{}
где
_duplicationValues - параметры копирования;
_selIndices - индексы выбранных граней оболочки;
_adaptMode - режим адаптации открытых оболочек;
_names - именователь тел и граней, создаваемых операцией;
IProgressIndicator * _progress - индикатор прогресса выполнения операции.
Выходным параметром функции является построенное тело result.
Функция возвращает код результата операции из перечисления MbResultType.
Функция объявлена в файле action_solid.h.
Параметр _names обеспечивает именование граней, рёбер и вершин построенного тела.
Параметр values задаёт параметры построения. На рис. 1 приведены данные, используемые при построении, и схема наследования параметров построения от абстрактного класса DuplicationValues:
Рис. 1
Для размножения тела, копии которого располагаются по двумерной сетке, следует использовать параметры 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 определяет центр локальной системы координат (а также точку приложения оси вращения в случае полярной системы).
Для размножения тела, копии которого трансформированы по набору матриц, следует использовать параметры DuplicationMatrixValues. Множество матриц трансформации определено параметром values.matrices.
Если после построения копии и исходное тело пересекаются друг с другом, то выполняется булева операция объединения пересекшихся тел. На рис. 2 приведён результат построения размноженного по полярной сетке тела:
Рис. 2
Функция DuplicationSolid() добавляет в журнал построенного тела строитель MbDuplicationSolid, который содержит все необходимые данные для выполнения операции. Строитель MbDuplicationSolid объявлен в файле cr_duplication_solid.h.
В тестовом приложении test.exe размножение тела выполняется командами меню «Создать→Тело→На базе тела→Размножением по сетке» и «Создать→Тело→На базе тела→Размножением матрицами».