Построение модифицированного тела
Функция
MbResultType ModifiedSolid( MbSolid & solid,
MbeCopyMode sameShell,
const MbModifiedSolidParams & params,
MbModifiedSolidResults & results );
В зависимости от параметров модификации MbModifiedSolidParams функция выполняет одно из следующих действий:
Удаление из тела выбранных граней без прилегающих скруглений (dmm_RemoveFaces).
Удаление грани вместе с прилегающими скруглениями (dmm_RemoveFacesWithAdjacentFillets).
Удаление замкнутых цилиндрических, конических, тороидальных, сферических граней, граней вращения и выдавливания радиуса меньше заданного без прилегающих скруглений (dmm_RemoveBelowRadius).
Удаление замкнутых цилиндрических, сферических граней, граней вращения и выдавливания радиуса меньше заданного вместе с прилегающими скруглениями (dmm_RemoveBelowRadiusWithAdjacentFillets).
Создание тела из выбранных граней с окружением (dmm_Create).
Перемещение выбранных граней с окружением относительно оставшихся граней тела (dmm_MoveFacesByVector) или без адаптации прилегающих скруглений (dmm_MoveFacesByVectorNoAdaptation). Направление и величину перемещения определяет вектор direction.
Замена выбранных граней тела эквидистантными гранями (перемещение по нормали, изменение радиуса) (dmm_OffsetFaces). Расстояние смещения определяется параметром value.
Изменение радиуса выбранных граней скругления на заданную величину (dmm_FilletsRadiusChange). Величина изменения радиуса определяется параметром value.
Замена выбранных граней тела деформируемыми гранями (превращение в NURBS) для редактирования (dmm_ConvertFacesToNurbs).
Удаление выбранных граней скругления тела (dmm_PurifyFillets).
Удаление также всех гладко прилегающих скруглений (dmm_PurifyFilletsChains).
Удаление всех скруглений тела, меньших определённого радиуса (dmm_PurifyFilletsBelowRadius).
Слияние вершин рёбер и удаление рёбер (dmm_DeleteEdges).
Замена гладко стыкующихся граней одной гранью (dmm_UniteFaces).
Поворот выбранных граней с адаптацией прилегающих скруглений (dmm_RotateFaces) или без (dmm_RotateFacesNoFilletAdaptation). Угол поворота определяется параметром angle, ось поворота определяется осью axis.
Замена выбранных граней тела (dmm_ReplaceFaces).
Установка радиусов выбранных граней скругления для цепочки гладко стыкующихся скруглений (dmm_FilletsRadiusSet) и установка радиусов выбранных граней скругления (dmm_FilletsRadiusSetSingle). Новый радиус определяется параметром value.
Входными параметрами функции являются:
solid – исходное тело;
sameShell – вариант копирования исходного тела;
params – параметры модификации.
Выходным параметром функции является структура результатов модификации results, содержащая модифицированное тело и дополнительную информацию об операции.
При удачной работе функция возвращает rt_Success, в противном случае функция возвращает код ошибки из перечисления MbResultType (см. mb_operation_result.h).
Возможные коды ошибок:
rt_Success – ошибок нет;
rt_Error – неизвестная ошибка;
rt_IncorrectData – некорректные данные;
rt_ParameterError – ошибочный параметр.
Функция объявлена в файле action_direct.h.
При создании объекта params с параметрами модификации используется один из следующих конструкторов (см. op_direct_mod_parameter.h).
Конструкторы без набора граней
type – тип модификации. Для данного конструктора доступны: dmm_OffsetFaces, dmm_FilletsRadiusChange;
value – величина сдвига для dmm_OffsetFaces или величина изменения радиуса для dmm_FilletsRadiusChange;
names – именователь операции.
MbModifiedSolidParams( MbeModifyingMode type,
const MbSNameMaker & names,
double value );
type – тип модификации. Для данного конструктора доступны: dmm_RotateFaces, dmm_RotateFacesNoFilletAdaptation;
axis – ось вращения;
angle – угол вращения;
names – именователь операции.
MbModifiedSolidParams( MbeModifyingMode type,
const MbSNameMaker & names,
const MbAxis3D & axis,
double angle );
type – тип модификации. Для данного конструктора доступны: dmm_MoveFacesByVector, dmm_MoveFacesByVectorNoAdaptation;
direction – направление перемещения;
names – именователь операции.
MbModifiedSolidParams( MbeModifyingMode type,
const MbSNameMaker & names,
const MbVector3D & direction );
Конструкторы по набору граней
modType – тип модификации. Для данного конструктора доступны: dmm_UniteFaces, dmm_Create, dmm_ConvertFacesToNurbs, dmm_PurifyFillets;
names – именователь операции;
faces – список граней для модификации.
MbModifiedSolidParams( MbeModifyingMode modType,
const MbSNameMaker & names,
const c3d::ItemIndices & faces );
type – тип модификации. Для данного конструктора доступны: dmm_OffsetFaces, dmm_FilletsRadiusChange, dmm_RemoveBelowRadius, dmm_RemoveBelowRadiusWithAdjacentFillets, dmm_PurifyFilletsBelowRadius;
names – именователь операции;
faces – список граней для модификации;
value – величина сдвига для dmm_OffsetFaces, величина изменения радиуса для dmm_FilletsRadiusChange, величина максимального радиуса для dmm_Remove и dmm_Purify.
MbModifiedSolidParams( MbeModifyingMode type,
const MbSNameMaker & names,
const c3d::ItemIndices & faces,
double value )
: MbModifiedSolidParams( type, names, value )
{
AddFaces( faces );
}
type – тип модификации. Для данного конструктора доступны: dmm_RotateFaces, dmm_RotateFacesNoFilletAdaptation;
names – именователь операции;
faces – список граней для модификации;
axis – ось вращения;
angle – угол вращения.
MbModifiedSolidParams( MbeModifyingMode type,
const MbSNameMaker & names,
const c3d::ItemIndices & faces,
const MbAxis3D & axis,
double angle )
: MbModifiedSolidParams( type, names, axis, angle )
{
AddFaces( faces );
}
type – тип модификации. Для данного конструктора доступны: dmm_MoveFacesByVector;
names – именователь операции;
faces – список граней для модификации;
direction – направление сдвига.
MbModifiedSolidParams( MbeModifyingMode type,
const MbSNameMaker & names,
const c3d::ItemIndices & faces,
const MbVector3D & direction )
: MbModifiedSolidParams( type, names, direction )
{
AddFaces( faces );
}
type – тип модификации. Для данного конструктора доступны: dmm_ConvertFacesToNurbs;
names – именователь операции;
faces – список граней для модификации;
surfaces – поверхности замены (может быть пустым массивом).
template<class SurfArray>
MbModifiedSolidParams( MbeModifyingMode type,
const MbSNameMaker & names,
const c3d::ItemIndices & faces,
const SurfArray & surfaces )
: MbModifiedSolidParams( type, names )
{
AddFaces( faces );
AddSurfaces( surfaces );
}
type – тип модификации. Для данного конструктора доступны: dmm_ReplaceFaces;
names – именователь операции;
replacedFaces – список заменяемых граней;
replacementSurfaces – список заменяющих поверхностей;
surfaceParts – список номеров частей поверхностей, которые будут использоваться при нескольких возможных вариантах замены;
sameSurfaces – использовать исходные поверхности (true) или их копии (false);
offsets – список сдвигов от заменяющих поверхностей.
template<class SurfArray> MATH_FUNC_EX
MbModifiedSolidParams( MbeModifyingMode type,
const MbSNameMaker & names,
const c3d::ItemIndices & replacedFaces,
const SurfArray & replacementSurfaces,
bool sameSurfaces,
const c3d::NumbersVector & surfaceParts,
const c3d::DoubleVector & offsets );
modType – тип модификации. Для данного конструктора доступны: dmm_DeleteEdges;
names – именователь операции;
edges – список рёбер для модификации;
beginOrEnd – флаг удаления начала или конца соответствующего ребра.
MbModifiedSolidParams( MbeModifyingMode modType,
const MbSNameMaker & names,
const c3d::EdgeFacesIndices & edges,
const c3d::BoolVector & beginOrEnd )
: MbModifiedSolidParams( modType, names )
{
AddEdges( edges, beginOrEnd );
}
Параметр solid содержит исходное тело, которое подлежит обработке.
Параметр sameShell управляет передачей данных от исходного тела solid к построенному телу results и может принимать одно из четырёх значений:
cm_Same = 0 (тело не копируется);
cm_KeepHistory (исходное тело и его копия имеют общие базовые поверхности, вершины и неизменённые операцией грани);
cm_KeepSurface (исходное тело и его копия имеют общие базовые поверхности);
cm_Copy (исходное тело и его копия не имеют общих данных).
Перечисление MbeCopyMode подробно описано в подразделе Копирование множества граней MbFaceShell.
Параметр params описывает параметры модификации, которые определяются типом модификации и дополнительными параметрами в зависимости от используемого конструктора.
Тип модификации задаётся параметром _modificationType, который может принимать одно из значений перечисления MbeModifyingMode (см. op_direct_mod_parameter.h).
При типах модификации dmm_RemoveFaces и dmm_RemoveFacesWithAdjacentFillets рассматриваемая функция удаляет грани faces из копии тела solid и, используя окружение, обрабатывает место удалённых граней, сохраняя замкнутость тела. Если грани faces связаны с остальными гранями скруглениями, то в режиме dmm_RemoveFacesWithAdjacentFillets прилегающие грани скругления автоматически добавляются к множеству удаляемых граней.
При типах модификации dmm_RemoveBelowRadius и dmm_RemoveBelowRadiusWithAdjacentFillets функция удаляет замкнутые цилиндрические, конические, тороидальные, сферические грани, а также грани вращения и выдавливания радиуса меньше или равного заданному значению радиуса. В режиме dmm_RemoveBelowRadiusWithAdjacentFillets эти грани удаляются вместе с прилегающими скруглениями. Такая настройка позволяет автоматически убирать мелкие сквозные или глухие отверстия без явного перечисления всех соответствующих граней.
На рис. 1 приведено исходное тело, а на рис. 2 — построенное тело, полученное путём удаления указанных граней исходного тела:
Рис. 1
Рис. 2
Аналогичный результат можно получить, если выбрать все указанные грани и прилегающие к ним скругления и использовать тип dmm_RemoveFaces.
При типе модификации dmm_Create рассматриваемая функция создаёт новое тело из копий граней faces. Если грани faces связаны с остальными гранями скруглениями, то сначала удаляются прилегающие скругления, а затем из граней faces создаётся новое тело. Новое тело будет замкнутым, так как в него входят как исходные грани faces, так и грани, построенные на базовых поверхностях, смежных с гранями faces. Дополнительные грани необходимы для ликвидации краевых рёбер.
На рис. 3 приведено исходное тело, а на рис. 4 — вновь построенное тело, полученное из указанных граней исходного тела. Тело на рис. 3 состоит из пяти граней: трёх граней множества faces и двух граней на базе цилиндрической поверхности, на которую опирались два удалённых скругления:
Рис. 3
Рис. 4
При типах модификации dmm_MoveFacesByVector и dmm_MoveFacesByVectorNoAdaptation рассматриваемая функция перемещает грани faces относительно остальных граней в копии тела solid. Перемещение выполняется в направлении вектора direction на расстояние его длины. В режиме dmm_MoveFacesByVector адаптируются прилегающие скругления, в режиме dmm_MoveFacesByVectorNoAdaptation скругления не перестраиваются.
Если грани faces связаны с остальными гранями скруглениями, то в режиме с адаптацией сначала удаляются скругления, далее перемещаются грани faces и затем скругления восстанавливаются на новых местах.
На рис. 5 и рис. 6 приведены тела, построенные путём перемещения указанных граней исходных тел, приведённых на рис. 1 и рис. 3, соответственно:
Рис. 5
Рис. 6
При типе модификации dmm_OffsetFaces рассматриваемая функция заменяет грани faces в копии тела solid эквидистантными гранями. Эквидистантные грани смещены по нормали на расстояние, заданное параметром value. Если value положительно, смещение выполняется в сторону внешних нормалей, при отрицательном значении – в противоположную сторону.
Если грани faces связаны с остальными гранями скруглениями, то сначала удаляются скругления, далее грани faces заменяются эквидистантными, и затем скругления восстанавливаются на новых местах.
На рис. 7 и рис. 8 приведены тела, построенные путём замены указанных граней эквидистантными гранями. Исходные тела приведены на рис. 1 и рис. 3, соответственно:
Рис. 7
Рис. 8
Если параметр value отрицателен, то эквидистантные грани смещаются на отрицательное расстояние. На рис. 9 и рис. 10 приведены тела, построенные путём замены указанных граней эквидистантными гранями с отрицательным смещением. Исходные тела приведены на рис. 5 и рис. 6, соответственно:
Рис. 9
Рис. 10
При типе модификации dmm_FilletsRadiusChange рассматриваемая функция изменяет радиусы граней скругления faces в копии тела solid. Радиус каждой грани скругления увеличивается или уменьшается на величину, заданную параметром value.
Положительное значение value приводит к увеличению радиуса скруглений, отрицательное – к уменьшению. При этом сохраняется замкнутость тела и непрерывность сопряжения с соседними гранями, насколько это возможно с учётом заданной геометрии.
На рис. 11 и рис. 12 приведены тела, построенные путём изменения радиуса указанных граней скругления. Исходные тела приведены на рис. 1 и рис. 3, соответственно:
Рис. 11
Рис. 12
При типе модификации dmm_ConvertFacesToNurbs рассматриваемая функция заменяет грани faces в копии тела solid деформируемыми гранями (NURBS-поверхностями), обеспечивая возможность дальнейшего редактирования этих граней по контрольным точкам.
Если грани faces связаны с остальными гранями скруглениями, то сначала удаляются прилегающие скругления, далее грани faces заменяются деформируемыми гранями на базе соответствующих NURBS-поверхностей, после чего скругления восстанавливаются на новых местах.
На рис. 13 приведено исходное тело, а на рис. 14 – построенное тело, полученное путём замены указанной грани исходного тела деформируемой гранью, и показаны контрольные точки деформируемой грани. Деформируемая грань построена на базе NURBS-поверхности:
Рис. 13
Рис. 14
На рис. 15 приведено деформируемое тело с перемещёнными контрольными точками деформируемой грани. На рис. 16 приведён результат деформирования тела:
Рис. 15
Рис. 16
При типах модификации dmm_PurifyFillets и dmm_PurifyFilletsChains рассматриваемая функция удаляет грани скруглений faces в копии тела solid и, используя окружение, обрабатывает место удалённых граней, сохраняя замкнутость тела. В режиме dmm_PurifyFilletsChains дополнительно удаляются все скругления, гладко стыкующиеся с выбранными гранями.
На рис. 17 и рис. 18 приведены тела, построенные путём удаления указанных граней скругления. Исходные тела приведены на рис. 1 и рис. 3, соответственно:
Рис. 17
Рис. 18
Функция ModifiedSolid() работает при условии сохранения неизменной топологии редактируемого тела.
Функция ModifiedSolid() добавляет в журнал построенного тела строитель MbFaceModifiedSolid, который содержит все необходимые данные для выполнения операции. Строитель MbFaceModifiedSolid объявлен в файле cr_modified_solid.h.
Тестовое приложение test.exe выполняет построение модифицированного тела командами меню «Создать → Тело → Прямым редактированием».