.. role:: blue :class: blue Построение тела вращения ======================== .. _Constructing_a_Revolution_Body: .. версия ядра: 118041 Функция .. code-block:: cpp MbResultType RevolutionSolid( const MbSweptData & sweptData, const MbAxis3D & axis, const RevolutionValues & params, const MbSNameMaker & operNames, RPArray & contoursNames, MbSolid *& result ); выполняет построение тела вращения. Входными параметрами функции являются: - **sweptData** -- данные об образующих кривых; - **axis** -- ось вращения; - **params** -- объект, содержащий параметры вращения; - **operNames** -- именователь операции; - **contoursNames** -- именователи сегментов образующего контура. Выходным параметром функции является построенное тело (оболочка) **result**. Функция возвращает код результата операции из перечисления :ref:`MbResultType ` (см. *mb_operation_result.h*). Функция объявлена в файле *action_solid.h*. Тело вращения относится к разновидности тел движения, которые получаются путем движения образующей кривой вдоль направляющей кривой. Направляющей кривой тела вращения служит окружность или ее дуга. Тело вращения строится путем вращения одной или нескольких кривых вокруг оси **axis**. Параметр **sweptData** содержит информацию об образующих кривых. Классы :blue:`MbSweptData` и :blue:`RevolutionValues` описаны в файле *op_swept_parameter.h*. Образующие кривые могут представлять собой двумерные контуры **contours** на поверхности **surface** или контуры в пространстве **contours3D**. В частном случае поверхность **surface** может представлять собой плоскость. Ориентация контуров **contours** может быть произвольной. Контуры **contours** могут быть вложены друг в друга. Вращение кривых может выполняться в прямом направлении относительно оси **axis**, в обратном направлении относительно оси **axis** и в обоих направлениях. Вращение в прямом направлении выполняется против часовой стрелки при взгляде навстречу оси **axis**. Параметры построения в каждом направлении задают объекты :blue:`MbSweptSide`. Параметр **params** содержит два объекта класса :blue:`MbSweptSide` -- **side1** и **side2**, в которых находятся параметры вращения в прямом и обратном направлении. Способ вращения задается в поле **way** объекта класса :blue:`MbSweptSide`: - при **way** = *sw_scalarValue* вращение выполняется на угол **scalarValue** в направлении **side1** или **side2**. Угол вращения задается в радианах; - при **way** = *sw_surface* вращение выполняется до поверхности **side1**.\ *surface* или **side2**.\ *surface* при **side1**.\ *distance* равном нулю или **side2**.\ *distance* равном нулю соответственно; - при **way** = *sw_surface* и **distance** не равным нулю вращение выполняется до эквидистантной поверхности к **side1**.\ *surface* или до эквидистантной поверхности к **side2**.\ *surface* соответственно; - при **way** = *sw_shell* вращение выполняется до ближайшего объекта (тела) в направлении **side1** или **side2**. Параметры **params**.\ *thickness1* и **params**.\ *thickness2* определяют толщину стенки тонкостенного тела. Параметр **params**.\ *thickness1* задает отступ наружу от образующей кривой, а параметр **params**.\ *thickness2* задает отступ внутрь от образующей кривой. Параметр **params**.\ *shellClosed* управляет замкнутостью построенного тела. Параметр **params**.\ *checkSelfInt* сообщает о необходимости проверки результата построения на самопересечение. По умолчанию **params**.\ *checkSelfInt* = *false*, проверка не выполняется. Параметр **params**.\ *shape* управляет формой построенного тела. При **params**.\ *shape* = 1 построенное тело имеет топологию тора, при **params**.\ *shape* = 0 построенное тело имеет топологию сферы. Если образующая — незамкнутая плоская кривая и ось вращения лежит в плоскости кривой, то возможно построение тела вращения с топологией типа сферы. В этом случае образующая достраивается до оси вращения. На рис. 1 приведены данные, используемые при построении, и схема наследования параметров построения тела вращения :blue:`RevolutionValues` & **params**. .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/Revolution_Inheritance_scheme.png :width: 15cm :align: center Рис. 1 Параметры **operNames** и **contoursNames** обеспечивают именование граней, ребер и вершин построенного тела. На рис. 2 приведен двумерный контур **contour**, плоская поверхность **surface** (:blue:`MbPlane`) и ось вращения **axis**. .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.4.2.png :width: 12cm :align: center Рис. 2 На рис. 3 приведено замкнутое тело, построенное вращением по заданным параметрам контура, показанного на рис. 2. .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.4.3.png :width: 12cm :align: center Рис. 3 На рис. 4 приведено замкнутое тонкостенное тело, построенное вращением по заданным параметрам контура, показанного на рис. 2. .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.4.4.png :width: 12cm :align: center Рис. 4 На рис. 5 приведено незамкнутое тело, построенное вращением по заданным параметрам контура, показанного на рис. 2. Параметры построения тела, показанного на рис. 3, отличаются от параметров построения тела, показанного на рис. 5, только величиной **params**.\ *shellClosed*. .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.4.5.png :width: 15cm :align: center Рис. 5 На рис. 6 приведен двумерный контур **contour**, плоская поверхность **surface** (:blue:`MbPlane`) и две поверхности **surface1** и **surface2**, которые будут использоваться при построении тела вращения. Для построения необходимо, чтобы поверхности **surface1** и **surface2** полностью перекрывали путь движения контура в соответствующем направлении. При этом следует учитывать параметры **params**.\ *thickness1*, **params**.\ *thickness2*. Тело вращения обрезается заданными поверхностями (если **params**.\ *side1.distance* или **params**.\ *side2.distance* равны нулю) или эквидистантными к ним поверхностями (если **params**.\ *side1.distance* или **params**.\ *side2.distance* не равны нулю). .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.4.6.png :width: 12cm :align: center Рис. 6 На рис. 7 приведено тело, построенное вращением контура, показанного на рис. 6, с опциями «До поверхности» (**params**.\ *side1(2).way* = *sw_surface*), в качестве которых заданы **surface1** и **surface2**. .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.4.7.png :width: 12cm :align: center Рис. 7 На рис. 8 приведено тонкостенное тело, построенное вращением контура, показанного на рис. 6, с опциями «До поверхности», в качестве которых заданы **surface1** и **surface2**. Тело вращения обрезается заданными поверхностями. .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.4.8.png :width: 12cm :align: center Рис. 8 Двумерный контур может располагаться на плоской или криволинейной поверхности. Например, тело можно построить вращением контура на криволинейной поверхности, полученного от цикла одной из граней твердого тела, показанного на рис. 9. .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.4.9.png :width: 12cm :align: center Рис. 9 На рис. 10 приведено замкнутое тело, полученное вращением контура на криволинейной поверхности, приведенной на рис. 9. .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.4.10.png :width: 12cm :align: center Рис. 10 На рис. 11 приведено замкнутое тонкостенное тело, полученное вращением контура на криволинейной поверхности, приведенной на рис. 9. .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.4.11.png :width: 12cm :align: center Рис. 11 На рис. 12 приведено незамкнутое тело, полученное вращением контура на криволинейной поверхности, приведенной на рис. 9. .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.4.12.png :width: 12cm :align: center Рис. 12 Если на одной поверхности расположено множество не пересекающихся двумерных контуров, то рассматриваемая функция определяет внешние контуры и вложенные в них внутренние контуры, причем вложение может быть многократным. На рис. 13 приведено множество не пересекающихся двумерных контуров **contours** и плоская поверхность **surface** (:blue:`MbPlane`). .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.4.13.png :width: 12cm :align: center Рис. 13 На рис. 14 приведено замкнутое тело, состоящее из нескольких частей, построенное вращением множества контуров, показанного на рис. 13. .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.4.14.png :width: 12cm :align: center Рис. 14 На рис. 15 приведено замкнутое тонкостенное тело, состоящее из нескольких частей, построенное вращением множества контуров, показанного на рис. 13. .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.4.15.png :width: 12cm :align: center Рис. 15 На рис. 16 приведены два трехмерных контура. .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.4.16.png :width: 12cm :align: center Рис. 16 На рис. 17 приведено двусвязное тонкостенное замкнутое тело, полученное вращением трехмерных контуров, приведенных на рис. 16. .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.4.17.png :width: 12cm :align: center Рис. 17 На рис. 18 приведены два незамкнутых тела, полученных вращением трехмерных контуров, приведенных на рис. 16. Построение выполнено для каждого контура отдельно. .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.4.18.png :width: 12cm :align: center Рис. 18 При построении операции вращения до конструктивной плоскости с вырожденной областью определения оболочка будет построена до ближайшего пересечения с указанной плоскостью. В случае, если плоскость имеет невырожденные границы, то часть плоскости, до которой будет построено вращение, определяется по положению центра тяжести контура, ограничивающего плоскость, относительно проекции оси вращения на плоскость. Функция построения тела вращения :blue:`RevolutionSolid`\() добавляет в журнал построенного тела строитель :blue:`MbCurveRevolutionSolid`, который содержит все необходимые для построения тела данные. Строитель :blue:`MbCurveRevolutionSolid` объявлен в файле *cr_revolution_solid.h*. В тестовом приложении *test.exe* построение тела вращения выполняется командами меню «Создать->Тело->На базе кривых->Вращением поверхностной кривой» и «Создать->Тело->На базе кривых->Вращением трехмерной кривой».