.. role:: blue :class: blue Построение элементарного тела ============================= .. _Constructing_an_Elementary_Body: Функция .. code-block:: cpp MbResultType ElementarySolid( const MbElementarySolidParams & params, MbElementarySolidResults & results ); выполняет построение элементарного тела по заданным точкам и типу создаваемого тела (см. таблицу 1), а также по элементарной поверхности (сфера, тор, конус, цилиндр). Входным параметром является объект **params** класса :blue:`MbElementarySolidParams` (см. определение в *op_shell_parameter.h*), который содержит исходные данные для операции создания тела. Выходным параметром функции является объект **results** класса :blue:`MbElementarySolidResults`, наследника класса :blue:`MbOperationResults` (см. определение в *op_shell_parameter.h*), содержащий построенное тело и обобщенные результаты выполнения функции. Функция возвращает код результата операции из перечисления :blue:`MbResultType`. Функция объявлена в файле *action_solid.h*. Построение элементарного тела по контрольным точкам --------------------------------------------------- При построении тел по контрольным точкам для инициализации объекта **params** с параметрами операции в классе :blue:`MbElementarySolidParams` определен следующий конструктор (см. *op_shell_parameter.h*): .. code-block:: cpp MbElementarySolidParams( const ElementaryShellType & solidType, const c3d::SpacePointsVector & points, const MbSNameMaker & operNames ); с параметрами: * **solidType** — тип создаваемого тела; * **points** — множество точек; * **operNames** — именователь операции. Для разных типов создаваемого тела требуется разное количество контрольных точек. В таблице 1 приведено количество контрольных точек, необходимое для создания тела типа **solidType**: .. _Elementary_Solid_Control_Points_Table_: Таблица 1 - Количество контрольных точек для различных типов элементарных тел +--------------------+--------------------------+----------------------------------------------+ | **solidType** | **Тип тела** | **Количество контрольных точек** | +====================+==========================+==============================================+ | et_Sphere | шар | 3 точки | +--------------------+--------------------------+----------------------------------------------+ | et_Torus | тор | 3 точки | +--------------------+--------------------------+----------------------------------------------+ | et_Cylinder | цилиндр | 3 точки | +--------------------+--------------------------+----------------------------------------------+ | et_Cone | конус | 3 точки | +--------------------+--------------------------+----------------------------------------------+ | et_Cone | усеченный конус | 4 точки | +--------------------+--------------------------+----------------------------------------------+ | et_Block | блок | 4 точки | +--------------------+--------------------------+----------------------------------------------+ | et_Wedge | клин | 4 точки | +--------------------+--------------------------+----------------------------------------------+ | et_Prism | призма | количество вершин основания + 1 точка | +--------------------+--------------------------+----------------------------------------------+ | et_Pyramid | пирамида | количество вершин основания + 1 точка | +--------------------+--------------------------+----------------------------------------------+ | et_Plate | плита | 4 точки | +--------------------+--------------------------+----------------------------------------------+ | et_Icosahedron | икосаэдр | 3 точки | +--------------------+--------------------------+----------------------------------------------+ | et_Polyhedron | многогранник | 3 точки | +--------------------+--------------------------+----------------------------------------------+ | et_Tetrapipe | тетра-труба | 3 точки | +--------------------+--------------------------+----------------------------------------------+ | et_Octapipe | окта-труба | 3 точки | +--------------------+--------------------------+----------------------------------------------+ При построении сферы точка **points**\[0\] определяет центр сферы, точка **points**\[1\] определяет направление оси **axisZ** локальной системы координат сферы, точка **points**\[2\] вместе с предыдущими точками определяет плоскость расположения осей **axisX** и **axisZ** локальной системы координат сферы. Расстояние между точками **points**\[0\] и **points**\[2\] определяет радиус сферы (см. рис. 1): .. figure:: ../../pictures/M.1.1.1.png :width: 12cm :align: center Рис. 1 .. это специальный контейнер для нормальной генерации подписей рисунков в пдф При построении тора точка **points**\[0\] определяет центр тора, точка **points**\[1\] определяет направление оси **axisX** локальной системы координат тора, точка **points**\[2\] вместе с предыдущими точками определяет плоскость, в которой располагаются оси **axisX** и **axisZ** локальной системы координат тора. Расстояние между точками **points**\[0\] и **points**\[1\] определяет больший радиус тора, расстояние между точками **points**\[1\] и **points**\[2\] определяет меньший радиус тора (рис. 2): .. figure:: ../../pictures/M.1.1.2.png :width: 12cm :align: center Рис. 2 При построении цилиндра точка множества **points**\[0\] определяет центр нижнего основания цилиндра, точка **points**\[1\] определяет центр верхнего основания цилиндра и направление оси **axisZ** локальной системы координат цилиндра, точка **points**\[2\] вместе с предыдущими точками определяет плоскость расположения осей **axisX** и **axisZ** локальной системы координат цилиндра. Расстояние между точками **points**\[0\] и **points**\[1\] определяет высоту цилиндра, расстояние от оси **axisZ** до точки **points**\[2\] определяет радиус цилиндра (рис. 3): .. figure:: ../../pictures/M.1.1.3.png :width: 9cm :align: center Рис. 3 При построении конуса точка множества **points**\[0\] определяет вершину конуса, точка **points**\[1\] определяет центр основания конуса и направление оси **axisZ** локальной системы координат конуса, точка **points**\[2\] вместе с предыдущими точками определяет плоскость расположения осей **axisX** и **axisZ** локальной системы координат конуса. Расстояние между точками **points**\[0\] и **points**\[1\] определяет высоту конуса, угол конуса определяется из условия, что точка **points**\[2\] лежит на боковой поверхности конуса (рис. 4): .. figure:: ../../pictures/M.1.1.4.png :width: 12cm :align: center Рис. 4 При построении усеченного конуса точка множества **points**\[0\] определяет вершину конуса, точка **points**\[1\] определяет центр большего основания конуса и направление оси **axisZ** локальной системы координат конуса, точка **points**\[2\] определяет центр меньшего основания конуса, точка **points**\[3\] вместе с предыдущими точками определяет плоскость расположения осей **axisX** и **axisZ** локальной системы координат конуса. Расстояние между точками **points**\[1\] и **points**\[2\] определяет высоту усеченного конуса, угол конуса определяется из условия, что точка **points**\[3\] лежит на боковой поверхности конуса (рис. 5): .. figure:: ../../pictures/truncated_cone.png :width: 10cm :align: center Рис. 5 При построении прямоугольного блока точки множества **points**\[0\] и **points**\[1\] определяют ребро и две вершины блока, точка **points**\[2\] вместе с предыдущими точками определяет плоскость нижнего основания блока. Через точку **points**\[2\] проходит ребро блока, параллельное ребру **points**\[0\]– **points**\[1\]. Точка **points**\[3\] определяет плоскость верхнего основания блока (рис. 6): .. figure:: ../../pictures/M.1.1.5.png :width: 12cm :align: center Рис. 6 При построении прямоугольного клина точки множества **points**\[0\] и **points**\[1\] определяют ребро и две вершины клина, точка **points**\[2\] вместе с предыдущими точками определяет плоскость нижнего основания клина и его вершину. Через точку **points**\[2\] проходит ребро клина, параллельное ребру **points**\[0\]– **points**\[1\]. Точка **points**\[3\] определяет плоскость верхнего основания клина (рис. 7): .. figure:: ../../pictures/M.1.1.6.png :width: 12cm :align: center Рис. 7 При построении плиты с цилиндрическими торцами точки множества **points**\[0\] и **points**\[1\] определяют ребро и две вершины плиты, точка **points**\[2\] вместе с предыдущими точками определяет плоскость нижнего основания пластины. Через точку **points**\[2\] проходит ребро плиты, параллельное ребру **points**\[0\]– **points**\[1\]. Точка **points**\[3\] определяет плоскость верхнего основания пластины (рис. 8): .. figure:: ../../pictures/M.1.1.7.png :width: 12cm :align: center Рис. 8 При построении прямой призмы точки **points**\[0\], **points**\[1\], …, **points**\[n-1\] определяют многоугольник основания. Высоту призмы определяет расстояние от плоскости нижнего основания до последней точки **points**\[n\]. На рис. 9 приведена прямая призма с пятиугольным основанием: .. figure:: ../../pictures/M.1.1.8.png :width: 12cm :align: center Рис. 9 При построении пирамиды с многоугольником в основании точки **points**\[0\], **points**\[1\], …, **points**\[n-1\] определяют многоугольник основания, последняя точка **points**\[n\] определяет вершину пирамиды. На рис. 10 приведена пирамида с пятиугольным основанием: .. figure:: ../../pictures/M.1.1.9.png :width: 12cm :align: center Рис. 10 Многоугольник основания призмы или пирамиды может быть произвольным. При построении икосаэдра точки **points**\[0\], **points**\[1\], **points**\[2\] определяют вершины и плоскости всех граней фигуры (рис. 11): .. figure:: ../../pictures/Icosahedron.png :width: 12cm :align: center Рис. 11 Построение элементарного тела по заданной поверхности ------------------------------------------------------ Для создания тел по элементарной поверхности необходимо использовать функцию :ref:`ElementarySolid() ` с использованием следующего конструктора для инициализации объекта **params** с параметрами операции (см. *op_shell_parameter.h*): .. code-block:: cpp MbElementarySolidParams( const SPtr & surface, const MbSNameMaker & operNames ); с параметрами: * **surface** — элементарная поверхность (сфера, тор, цилиндр, конус); * **operNames** — именователь операции. Элементарной поверхностью может быть сфера :blue:`MbSphere`, поверхность тора :blue:`MbTorus`, цилиндрическая поверхность :blue:`MbCylinder`, коническая поверхность :blue:`MbCone`. На рис. 12 приведена сферическая поверхность и построенное по ней тело: .. figure:: ../../pictures/M.1.2.1.png :width: 15cm :align: center Рис. 12 На рис. 13 приведена поверхность тора и построенное по ней тело: .. figure:: ../../pictures/M.1.2.2.png :width: 13cm :align: center Рис. 13 На рис. 14 приведена цилиндрическая поверхность и построенное по ней тело: .. figure:: ../../pictures/M.1.2.3.png :width: 15cm :align: center Рис. 14 На рис. 15 приведена коническая поверхность и построенное по ней тело: .. figure:: ../../pictures/M.1.2.4.png :width: 15cm :align: center Рис. 15 Если перечисленные поверхности являются циклически замкнутыми, то построенные по ним тела будут иметь соответствующую форму. Если поверхность не является ни одной из перечисленных элементарных поверхностей, функция возвращает код ошибки *rt_Error*. Функция :blue:`ElementarySolid()` добавляет в журнал построенного тела builder :blue:`MbElementarySolid` (объявлен в файле *cr_elementary_solid.h*). В тестовом приложении *test.exe* построение элементарного тела выполняется командами меню «Создать→Тело→По точкам» и «Создать→Тело→На базе поверхности→По элементарной поверхности».