.. role:: blue :class: blue Построение тела выдавливания ============================ .. _Constructing_an_Extrusion_Body: .. версия ядра: 118041 Функция .. code-block:: cpp MbSweptData ExtrusionSolid( const MbSweptData & sweptData, const MbVector3D & direction, const MbSolid * solid1, const MbSolid * solid2, bool checkIntersection, const ExtrusionValues & params, const MbSNameMaker & operNames, PArray & contoursNames, MbSolid *& result ); выполняет построение тела выдавливания. Входными параметрами функции являются: - **sweptData** -- параметр, содержащий данные об образующей кривой; - **direction** -- направление выдавливания; - **solid1** -- используется при выборе опции :blue:`MbSweptWay::sw_shell`, для выдавливания до ближайших граней заданного тела в прямом направлении; - **solid2** -- используется при выборе опции :blue:`MbSweptWay::sw_shell`, для выдавливания до ближайших граней заданного тела в обратном направлении; - **checkIntersection** -- флаг для объединения тел **solid1** и **solid2** с проверкой пересечения; - **params** -- объект класса :blue:`ExtrusionValues`, который содержит информацию о том, как задается величина выдавливания в каждую из сторон (на расстояние, до поверхности, до тела); - **operNames** -- именователь операции; - **contoursNames** -- именователи сегментов образующего контура. Выходным параметром функции является построенное тело **result**. Функция возвращает код результата операции из перечисления :ref:`MbResultType ` (см. *mb_operation_result.h*). Функция объявлена в файле *action_solid.h*. Тело выдавливания относится к разновидности тел движения, которые получают путем движения образующей кривой вдоль направляющей кривой. Направляющей кривой тела выдавливания служит отрезок прямой. Тело выдавливания строится путем движения одной или нескольких кривых вдоль отрезка, направление которого задает вектор **direction**. Параметр **sweptData** содержит информацию об образующих кривых. Классы :blue:`MbSweptData`, :blue:`ExtrusionValues` описаны в файле *op_swept_parameter.h*. Образующая кривая операции выдавливания, вращения или кинематической операции может включать в себя набор двумерных контуров, набор трехмерных контуров, проволочный каркас, тело. Двумерные контуры на поверхности могут пересекаться. Замкнутые пересекающиеся контуры объединяются с помощью булевой операции над регионами (рис. 1): .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/Constructing_an_Extrusion_Body_1.png :width: 18cm :align: center Рис. 1 В случае построения незамкнутой оболочки, если в число пересекающихся контуров входит разомкнутый контур, то будет построена оболочка с пересечением частей и функция вернет ошибку. В случае построения замкнутой оболочки, пересечения оболочек, полученных по разомкнутым контурам, обрабатываются булевой операцией над оболочками. Для набора двумерных контуров на поверхности существуют следующие ограничения: - может быть один или несколько контуров; - если контуров несколько, они должны быть либо все замкнуты, либо все разомкнуты; - если контуры замкнуты, они могут быть вложенными друг в друга, уровень вложенности не ограничивается. Для двумерных контуров на неплоской поверхности есть дополнительное ограничение: все контуры должны быть замкнуты. Построение операции по двумерным контурам на неплоской поверхности рассчитано на указание пользователем грани тела в качестве образующей. В этом случае данные для образующей можно получить с помощью метода грани :blue:`MbFace::GetSurfaceCurvesData`\(). Этот метод возвращает копию базовой поверхности грани и набор двумерных контуров, созданных по циклам ребер. Ограничение для трехмерных контуров -- создание замкнутого тела путем выдавливания трехмерного контура возможно только для варианта с тонкой стенкой. При указании тела и поверхности одновременно предполагается, что выполняется кинематическая операция над телом вдоль кривой на этой поверхности, причем движение согласовано с нормалью. Построение тела может выполняться в прямом направлении относительно вектора **direction**, в обратном направлении относительно вектора **direction** и в обоих направлениях. Параметры построения в каждом направлении задают объекты :blue:`MbSweptSide`. Параметр **params** содержит информацию о способе выдавливания в прямом направлении :blue:`MbSweptSide` **side1** и информацию о способе выдавливания в обратном направлении :blue:`MbSweptSide` **side2**. Выдавливание в каждую сторону может выполнятся тремя способами: 1. При **way** = *sw_scalarValue* выдавливание выполняется на длину *scalarValue* в направлении **side1** или **side2**. 2. При **way** = *sw_shell* выдавливание выполняется до ближайшего объекта **solid1** или **solid2**. 3. При **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 приведены данные, используемые при построении, и схема наследования параметров построения тела выдавливания :blue:`ExtrusionValues` & **params**. .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/inheritance_scheme.png :width: 18cm :align: center Рис. 2 Параметр **operNames** обеспечивает именование граней, ребер и вершин построенного тела. На рис. 3 приведен двумерный контур **contour** и плоская поверхность **surface** (:blue:`MbPlane`): .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.3.2.png :width: 18cm :align: center Рис. 3 На рис. 4 приведено замкнутое тело, построенное выдавливанием по заданным параметрам контура, показанного на рис. 3. Каждому сегменту контура соответствует грань тела, имя которой взято от соответствующего элемента генератора имен **contoursNames**\[0\]. .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.3.3.png :width: 18cm :align: center Рис. 4 На рис. 5 приведено замкнутое тонкостенное тело, построенное выдавливанием по заданным параметрам контура, показанного на рис. 3: .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.3.4.png :width: 18cm :align: center Рис. 5 На рис. 6 приведено незамкнутое тело, построенное выдавливанием по заданным параметрам контура, показанного на рис. 3. Параметры построения тела, показанного на рис. 4, отличаются от параметров построения тела, показанного на рис. 6, только величиной **params**.\ *shellClosed*: .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.3.5.png :width: 18cm :align: center Рис. 6 На рис. 7 приведен двумерный контур **contour**, плоская поверхность **surface** (:blue:`MbPlane`) и два тела **solid1** и **solid2**, которые будут использоваться при построении тела выдавливания. Для построения необходимо, чтобы тела **solid1** и **solid2** полностью перекрывали путь движения контура в соответствующем направлении. При этом следует учитывать параметры **params**.\ *side1.rake*, **params**.\ *side2.rake*, **params**.\ *thickness1*, **params**.\ *thickness2*: .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.3.6.png :width: 15cm :align: center Рис. 7 Такое построение выполняется выдавливанием контура на длину, превосходящую максимальное расстояние до заданного тела, с последующим вычитанием заданного тела из построенного тела. На рис. 8 приведено тело, построенное выдавливанием контура, показанного на рис. 7, с опциями «До ближайших объектов», в качестве которых заданы тела **solid1** и **solid2**: .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.3.7.png :width: 15cm :align: center Рис. 8 На рис. 9 приведено тонкостенное тело с уклоном граней, построенное выдавливанием контура, показанного на рис. 7, с опциями «До ближайших объектов», в качестве которых заданы тела **solid1** и **solid2**: .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.3.8.png :width: 15cm :align: center Рис. 9 На рис. 10 приведен двумерный контур **contour**, плоская поверхность **surface** (:ref:`MbPlane `) и две поверхности **surface1** и **surface2**, которые будут использоваться при построении тела выдавливания. Для построения необходимо, чтобы поверхности **surface1** и **surface2** полностью перекрывали путь движения контура в соответствующем направлении. При этом следует учитывать параметры **params**.\ *side1.rake*, **params**.\ *side2.rake*, **params**.\ *thickness1*, **params**.\ *thickness2*. Тело выдавливания обрезается заданными поверхностями или эквидистантными к ним поверхностями, если **params**.\ *side1.distance* или **params**.\ *side2.distance* не равны нулю. .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.3.9.png :width: 15cm :align: center Рис. 10 На рис. 11 приведено тело, построенное выдавливанием контура, показанного на рис. 10, с опциями «До поверхности», в качестве которых заданы **surface1** и **surface2**. .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.3.10.png :width: 15cm :align: center Рис. 11 На рис. 12 приведено тонкостенное тело с уклоном граней, построенное выдавливанием контура, показанного на рис. 10, с опциями «До поверхности», в качестве которых заданы **surface1** и **surface2**: .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.3.11.png :width: 15cm :align: center Рис. 12 Двумерный контур может располагаться на плоской или криволинейной поверхности. Например, тело можно построить выдавливанием контура на криволинейной поверхности, полученного от цикла одной из граней твердого тела, показанного на рис. 13: .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.3.12.png :width: 15cm :align: center Рис. 13 На рис. 14 приведено тело, полученное выдавливанием контура на криволинейной поверхности, приведенной на рис. 13: .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.3.13.png :width: 15cm :align: center Рис. 14 На рис. 15 приведено тонкостенное тело, полученное выдавливанием контура на криволинейной поверхности, приведенной на рис. 13: .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.3.14.png :width: 15cm :align: center Рис. 15 На рис. 16 приведено незамкнутое тело, полученное выдавливанием контура на криволинейной поверхности, приведенной на рис. 13: .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.3.15.png :width: 15cm :align: center Рис. 16 Если на одной поверхности расположено множество не пересекающихся двумерных контуров, то рассматриваемая функция определяет внешние контуры и вложенные в них внутренние контуры, причем вложение может быть многократным. На рис. 17 приведено множество не пересекающихся двумерных контуров **contours** и плоская поверхность **surface** (:blue:`MbPlane`). .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.3.16.png :width: 15cm :align: center Рис. 17 На рис. 18 приведено замкнутое тело, состоящее из нескольких частей, построенное выдавливанием множества контуров, показанного на рис. 17: .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.3.17.png :width: 15cm :align: center Рис. 18 На рис. 19 приведено замкнутое тело, состоящее из нескольких частей, построенное выдавливанием с уклоном множества контуров, показанного на рис. 17: .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.3.18.png :width: 15cm :align: center Рис. 19 На рис. 20 приведено замкнутое тонкостенное тело, состоящее из нескольких частей, построенное выдавливанием множества контуров, показанного на рис. 17: .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.3.19.png :width: 15cm :align: center Рис. 20 На рис. 21 приведены два трехмерных контура: .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.3.20.png :width: 15cm :align: center Рис. 21 На рис. 22 приведено двусвязное тонкостенное замкнутое тело, полученное выдавливанием трехмерных контуров, приведенных на рис. 21. .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.3.21.png :width: 15cm :align: center Рис. 22 На рис. 23 приведены два незамкнутых тела, полученных выдавливанием трехмерных контуров, приведенных на рис. 21. Построение выполнено для каждого контура отдельно: .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.3.22.png :width: 15cm :align: center Рис. 23 Функция построения тела выдавливания :blue:`ExtrusionSolid`\() добавляет в журнал построенного тела строитель :blue:`MbCurveExtrusionSolid`, который содержит все необходимые для построения тела данные. Строитель :blue:`MbCurveExtrusionSolid` объявлен в файле *cr_extrusion_solid.h*. В тестовом приложении *test.exe* построение тела выдавливания выполняется командами меню «Создать->Тело->На базе кривых->Выдавливанием поверхностной кривой» и «Создать->Тело->На базе кривых->Выдавливанием трехмерной кривой».