Построение тела выдавливания
Функция
MbSweptData ExtrusionSolid( const MbSweptData & sweptData,
const MbVector3D & direction,
const MbSolid * solid1,
const MbSolid * solid2,
bool checkIntersection,
const ExtrusionValues & params,
const MbSNameMaker & operNames,
PArray<MbSNameMaker> & contoursNames,
MbSolid *& result );
выполняет построение тела выдавливания.
Входными параметрами функции являются:
sweptData – параметр, содержащий данные об образующей кривой;
direction – направление выдавливания;
solid1 – используется при выборе опции MbSweptWay::sw_shell, для выдавливания до ближайших граней заданного тела в прямом направлении;
solid2 – используется при выборе опции MbSweptWay::sw_shell, для выдавливания до ближайших граней заданного тела в обратном направлении;
checkIntersection – флаг для объединения тел solid1 и solid2 с проверкой пересечения;
params – объект класса ExtrusionValues, который содержит информацию о том, как задается величина выдавливания в каждую из сторон (на расстояние, до поверхности, до тела);
operNames – именователь операции;
contoursNames – именователи сегментов образующего контура.
Выходным параметром функции является построенное тело result.
Функция возвращает код результата операции из перечисления MbResultType (см. mb_operation_result.h).
Функция объявлена в файле action_solid.h.
Тело выдавливания относится к разновидности тел движения, которые получают путем движения образующей кривой вдоль направляющей кривой. Направляющей кривой тела выдавливания служит отрезок прямой. Тело выдавливания строится путем движения одной или нескольких кривых вдоль отрезка, направление которого задает вектор direction.
Параметр sweptData содержит информацию об образующих кривых. Классы MbSweptData, ExtrusionValues описаны в файле op_swept_parameter.h.
Образующая кривая операции выдавливания, вращения или кинематической операции может включать в себя набор двумерных контуров, набор трехмерных контуров, проволочный каркас, тело.
Двумерные контуры на поверхности могут пересекаться. Замкнутые пересекающиеся контуры объединяются с помощью булевой операции над регионами (рис. 1):
Рис. 1
В случае построения незамкнутой оболочки, если в число пересекающихся контуров входит разомкнутый контур, то будет построена оболочка с пересечением частей и функция вернет ошибку.
В случае построения замкнутой оболочки, пересечения оболочек, полученных по разомкнутым контурам, обрабатываются булевой операцией над оболочками.
Для набора двумерных контуров на поверхности существуют следующие ограничения:
может быть один или несколько контуров;
если контуров несколько, они должны быть либо все замкнуты, либо все разомкнуты;
если контуры замкнуты, они могут быть вложенными друг в друга, уровень вложенности не ограничивается.
Для двумерных контуров на неплоской поверхности есть дополнительное ограничение: все контуры должны быть замкнуты.
Построение операции по двумерным контурам на неплоской поверхности рассчитано на указание пользователем грани тела в качестве образующей. В этом случае данные для образующей можно получить с помощью метода грани MbFace::GetSurfaceCurvesData(). Этот метод возвращает копию базовой поверхности грани и набор двумерных контуров, созданных по циклам ребер.
Ограничение для трехмерных контуров – создание замкнутого тела путем выдавливания трехмерного контура возможно только для варианта с тонкой стенкой.
При указании тела и поверхности одновременно предполагается, что выполняется кинематическая операция над телом вдоль кривой на этой поверхности, причем движение согласовано с нормалью.
Построение тела может выполняться в прямом направлении относительно вектора direction, в обратном направлении относительно вектора direction и в обоих направлениях. Параметры построения в каждом направлении задают объекты MbSweptSide.
Параметр params содержит информацию о способе выдавливания в прямом направлении MbSweptSide side1 и информацию о способе выдавливания в обратном направлении MbSweptSide side2. Выдавливание в каждую сторону может выполнятся тремя способами:
При way = sw_scalarValue выдавливание выполняется на длину scalarValue в направлении side1 или side2.
При way = sw_shell выдавливание выполняется до ближайшего объекта solid1 или solid2.
При way = sw_surface выдавливание выполняется до поверхности side1.surface или side2.surface, если side1.distance равно нулю или side2.distance равно нулю, соответственно.
При way = sw_surface и distance не равным нулю выдавливание выполняется до эквидистантной поверхности к side1.surface или до эквидистантной поверхности к side2.surface, соответственно.
Если side1.rake не равно нулю или side2.rake не равно нулю, то выдавливание выполняется с уклоном side1.rake или side2.rake в соответствующую сторону.
Параметр params.thickness1 задает отступ наружу от образующей кривой, а параметр params.thickness2 задает отступ внутрь от образующей кривой.
Параметр params.shellClosed управляет замкнутостью построенного тела.
Параметр params.checkSelfInt сообщает о необходимости проверки результата построения на самопересечение. По умолчанию params.checkSelfInt = false, проверка не выполняется.
Управляющие флаги mergeFlags управляют слиянием подобных граней или ребер (mergeFaces = true – сливать подобные грани; mergeEdges = true – сливать подобные ребра).
На рис. 2 приведены данные, используемые при построении, и схема наследования параметров построения тела выдавливания ExtrusionValues & params.
Рис. 2
Параметр operNames обеспечивает именование граней, ребер и вершин построенного тела.
На рис. 3 приведен двумерный контур contour и плоская поверхность surface (MbPlane):
Рис. 3
На рис. 4 приведено замкнутое тело, построенное выдавливанием по заданным параметрам контура, показанного на рис. 3. Каждому сегменту контура соответствует грань тела, имя которой взято от соответствующего элемента генератора имен contoursNames[0].
Рис. 4
На рис. 5 приведено замкнутое тонкостенное тело, построенное выдавливанием по заданным параметрам контура, показанного на рис. 3:
Рис. 5
На рис. 6 приведено незамкнутое тело, построенное выдавливанием по заданным параметрам контура, показанного на рис. 3. Параметры построения тела, показанного на рис. 4, отличаются от параметров построения тела, показанного на рис. 6, только величиной params.shellClosed:
Рис. 6
На рис. 7 приведен двумерный контур contour, плоская поверхность surface (MbPlane) и два тела solid1 и solid2, которые будут использоваться при построении тела выдавливания. Для построения необходимо, чтобы тела solid1 и solid2 полностью перекрывали путь движения контура в соответствующем направлении. При этом следует учитывать параметры params.side1.rake, params.side2.rake, params.thickness1, params.thickness2:
Рис. 7
Такое построение выполняется выдавливанием контура на длину, превосходящую максимальное расстояние до заданного тела, с последующим вычитанием заданного тела из построенного тела.
На рис. 8 приведено тело, построенное выдавливанием контура, показанного на рис. 7, с опциями «До ближайших объектов», в качестве которых заданы тела solid1 и solid2:
Рис. 8
На рис. 9 приведено тонкостенное тело с уклоном граней, построенное выдавливанием контура, показанного на рис. 7, с опциями «До ближайших объектов», в качестве которых заданы тела solid1 и solid2:
Рис. 9
На рис. 10 приведен двумерный контур contour, плоская поверхность surface (MbPlane) и две поверхности surface1 и surface2, которые будут использоваться при построении тела выдавливания. Для построения необходимо, чтобы поверхности surface1 и surface2 полностью перекрывали путь движения контура в соответствующем направлении. При этом следует учитывать параметры params.side1.rake, params.side2.rake, params.thickness1, params.thickness2. Тело выдавливания обрезается заданными поверхностями или эквидистантными к ним поверхностями, если params.side1.distance или params.side2.distance не равны нулю.
Рис. 10
На рис. 11 приведено тело, построенное выдавливанием контура, показанного на рис. 10, с опциями «До поверхности», в качестве которых заданы surface1 и surface2.
Рис. 11
На рис. 12 приведено тонкостенное тело с уклоном граней, построенное выдавливанием контура, показанного на рис. 10, с опциями «До поверхности», в качестве которых заданы surface1 и surface2:
Рис. 12
Двумерный контур может располагаться на плоской или криволинейной поверхности. Например, тело можно построить выдавливанием контура на криволинейной поверхности, полученного от цикла одной из граней твердого тела, показанного на рис. 13:
Рис. 13
На рис. 14 приведено тело, полученное выдавливанием контура на криволинейной поверхности, приведенной на рис. 13:
Рис. 14
На рис. 15 приведено тонкостенное тело, полученное выдавливанием контура на криволинейной поверхности, приведенной на рис. 13:
Рис. 15
На рис. 16 приведено незамкнутое тело, полученное выдавливанием контура на криволинейной поверхности, приведенной на рис. 13:
Рис. 16
Если на одной поверхности расположено множество не пересекающихся двумерных контуров, то рассматриваемая функция определяет внешние контуры и вложенные в них внутренние контуры, причем вложение может быть многократным. На рис. 17 приведено множество не пересекающихся двумерных контуров contours и плоская поверхность surface (MbPlane).
Рис. 17
На рис. 18 приведено замкнутое тело, состоящее из нескольких частей, построенное выдавливанием множества контуров, показанного на рис. 17:
Рис. 18
На рис. 19 приведено замкнутое тело, состоящее из нескольких частей, построенное выдавливанием с уклоном множества контуров, показанного на рис. 17:
Рис. 19
На рис. 20 приведено замкнутое тонкостенное тело, состоящее из нескольких частей, построенное выдавливанием множества контуров, показанного на рис. 17:
Рис. 20
На рис. 21 приведены два трехмерных контура:
Рис. 21
На рис. 22 приведено двусвязное тонкостенное замкнутое тело, полученное выдавливанием трехмерных контуров, приведенных на рис. 21.
Рис. 22
На рис. 23 приведены два незамкнутых тела, полученных выдавливанием трехмерных контуров, приведенных на рис. 21. Построение выполнено для каждого контура отдельно:
Рис. 23
Функция построения тела выдавливания ExtrusionSolid() добавляет в журнал построенного тела строитель MbCurveExtrusionSolid, который содержит все необходимые для построения тела данные. Строитель MbCurveExtrusionSolid объявлен в файле cr_extrusion_solid.h.
В тестовом приложении test.exe построение тела выдавливания выполняется командами меню «Создать->Тело->На базе кривых->Выдавливанием поверхностной кривой» и «Создать->Тело->На базе кривых->Выдавливанием трехмерной кривой».