.. role:: blue :class: blue Продление каркаса ================= .. _Wireframe_Extension: .. версия ядра: 118050 Функция .. code-block:: cpp MbResultType ExtendWireFrame( c3d::WireFrameSPtr & wireframe, MbeCopyMode sameEdges, const MbCurveExtensionParameters3D & params, c3d::WireFrameSPtr & result ); продлевает заданный каркас и тем самым обобщает операцию продления кривой. Параметрами функции являются: - **wireframe** - исходный (продлеваемый) каркас (рекомендуется передавать нормализованный каркас); - **sameEdges** - режим копирования входного каркаса; - **params** - параметры продления; - **result** - результирующий каркас. Функция объявлена в файле *action_wireframe.h*. Класс :blue:`MbCurveExtensionParameters3D` наследует свойства класса :blue:`MbCurveExtensionParameters`. Объект **params** задаёт следующую группу параметров продления каркаса (кривой): - параметры продления в начале - объект класса :blue:`MbCurveExtensionEnds` или одного из его наследников (:blue:`MbCurveExtensionLinear`, :blue:`MbCurveExtensionCircular`, :blue:`MbCurveExtensionNatural`); - параметры продления в конце - объект класса :blue:`MbCurveExtensionEnds` или его наследников, задаётся независимо от параметров начала; - флаг разрешения замкнутости продлённой кривой (**allowClosure**), определяющий, допускается ли замыкание кривой в процессе продления. В процессе продления (если длина продления будет достаточно большой) кривая может замкнуться. Это не всегда желательно, так как иногда между концами должен оставаться зазор. Для этого необходимо установить **allowClosure** = *false*. Величина зазора определяется внутренними алгоритмами и недоступна для изменения пользователем. В случае, когда продлённая кривая достигла своей предельной длины (кривая замкнулась или образовался максимально допустимый зазор между концами), выдаётся одно из следующих предупреждений: *rt_CurveClosedAtStart*, *rt_CurveClosedAtEnd* или *rt_CurveClosedBothSides* (см. таблицу). - флаг продления вдоль поверхности (**alongSurface**), определяющий, должна ли поверхностная кривая (:ref:`MbSurfaceCurve `) оставаться на своей поверхности. Роль этого флага наглядно показана на рисунке 1, на котором приведена поверхность вращения и произвольная поверхностная кривая на ней (голубым цветом) с двумя вариантами продления «по дуге»: - если продлевать кривую как пространственную (**alongSurface** = *false*), то удлинённый участок (фиолетовый) будет представлять собой дугу окружности, но при этом может покинуть поверхность; - при продлении вдоль поверхности (**alongSurface** = *true*) кривая всегда остаётся на поверхности, но форма продлевающего сегмента (оранжевый) зависит от геометрии поверхности. Для неповерхностных кривых при **alongSurface** = *true* возвращается код ошибки *rt_IncorrectData*. .. figure:: /MODELER/CURVE_CONSTRUCTION_METHODS/pictures/5_14_1.png :width: 15cm :align: center Рис. 1 - именователь операции (объект класса :blue:`MbSNameMaker`), который используется для именования созданного каркаса. В большинстве случаев при продлении вдоль поверхности запрещён выбег продлённой кривой за границы поверхности. Если это произошло, операция возвращает ошибку *rt_BeyondLimitsExtension* (см. таблицу). Выбег за границы допускается для :blue:`MbElementarySurface` и периодических поверхностей для границ, соответствующих периодическому направлению. Класс :blue:`MbCurveExtensionEnds` описывает параметры продления отдельного конца каркаса. В документации используются следующие понятия: - **длина продления** — метрическая длина, на которую каркас продлевается от выбранного конца; - **способ продления** — значение перечисления :blue:`MbeCurveExtensionWays`, определяющее метод продления (по касательной, по дуге или естественным продолжением исходного каркаса). В геометрическом ядре реализованы три различных способа продления: 1. Продление «**по касательной**» или «**линейным**» способом (:blue:`MbeCurveExtensionWays::cew_Linear`) осуществляется восстановлением касательной в заданной точке кривой и откладыванием вдоль неё отрезка заданной длины. При таком способе продления обеспечивается гладкость не хуже G\ :sup:`1` в месте стыка с продлевающим сегментом. Параметры, отвечающие за данный способ продления, задаются через объекты класса :blue:`MbCurveExtensionLinear`. 2. Продление «**по дуге**» или «**круговым**» способом (:blue:`MbeCurveExtensionWays::cew_Circular`) выполняется построением соприкасающейся окружности на продлеваемом конце и взятием её дуги заданной длины. При таком способе продления обеспечивается гладкость не хуже G\ :sup:`2`. Параметры, отвечающие за данный способ продления, задаются через объекты класса :blue:`MbCurveExtensionCircular`. 3. Продление естественным продолжением оригинальной кривой (формы, которую она имела непосредственно перед операцией продления) (:blue:`MbeCurveExtensionWays::cew_CommonNatural`). На выходе будет та же кривая, только имеющая большую длину. Но иногда продление осуществляется путём создания контура с пристыковкой к исходной кривой такого NURBS-сегмента, который обеспечивает гладкость не хуже G\ :sup:`3` в месте стыка. Параметры, отвечающие за данный способ продления, задаются через объекты класса :blue:`MbCurveExtensionNatural`. Классы :blue:`MbCurveExtensionLinear`, :blue:`MbCurveExtensionCircular` и :blue:`MbCurveExtensionNatural` наследуются от :blue:`MbCurveExtensionEnds` и позволяют задать параметры, специфичные только для конкретного способа продления. Различие между перечисленными способами продления проиллюстрировано на рис. 2: .. figure:: /MODELER/CURVE_CONSTRUCTION_METHODS/pictures/5_14_2.png :width: 15cm :align: center Рис. 2 Не существует никаких ограничений на комбинации опций продления отдельных концов. Продление каждого конца осуществляется независимо от другого. Например, на рис. 3 изображена дуга эллипса, продлённая в начале на 30 единиц «по касательной» и в конце «по дуге» на 60 единиц. .. figure:: /MODELER/CURVE_CONSTRUCTION_METHODS/pictures/5_14_3.png :width: 15cm :align: center Рис. 3 Рассматриваемая функция :blue:`ExtendWireFrame`\() возвращает код результата операции в соответствии с таблицей: Коды результата операции .. raw:: html
Тип результата операции Наименование результата операции Описание
– rt_Success Алгоритм успешно завершился и получен корректный результат.
Критические ошибки rt_CurveError Неподдерживаемая кривая. Например MbPlaneCurve, из которой нельзя извлечь 2D-кривую или систему координат.
rt_Error Не удалось получить корректный результат.
rt_InternalError Сбой во внутренних алгоритмах продления.
rt_MustBeOpen Исходная кривая замкнута.
rt_ParameterError Некорректное значение одного из параметров продления.
rt_TooLargeExtension Слишком большая длина продления. Пороговое значение длины определяется геометрией исходной кривой.
rt_IncorrectData Несовместимые входные параметры. При этом значение каждого параметра в отдельности корректно. Например, установлен параметр alongSurface = true для неповерхностной кривой.
rt_BeyondLimitsExtension Невозможно продлить кривую за границы или за полюс поверхности.
rt_ContourError Разрыв в точке продления.
rt_NoCurvesForBuild Нулевые кривые в результате.
Некритические ошибки rt_CurveClosedAtStart Кривая продлевается в начале и при этом замыкается.
rt_CurveClosedAtEnd Кривая продлевается в конце и при этом замыкается.
rt_CurveClosedBothSides Возвращается в каждом из следующих случаев:
  1. Одновременное появление статусов rt_CurveClosedAtStart и rt_CurveClosedAtEnd.
  2. Статусы rt_CurveClosedAtStart, rt_CurveClosedAtEnd отсутствуют, но суммарная (по двум направлениям) длина продления такова, что результирующая кривая замыкается.
.. для пдф .. .. figure:: ../../pictures/table_for_pdf.png :width: 15cm :align: center При критических ошибках указатель на результирующий каркас всегда нулевой; при некритических — каркас создаётся, но его геометрия может не удовлетворять требованиям. Ниже приведена примерная последовательность действий для вызова алгоритма продления каркаса. 1. Подключить необходимые заголовочные файлы: .. code-block:: cpp #include #include 2. В качестве примера продлим каркас «по дуге» на 100 единиц в конце: .. code-block:: cpp double extendLength = 100.0; // Длина продления 3. Инициализируем параметры продления каждого отдельного конца: объекты класса :blue:`MbCurveExtensionEnds`. Если продление конкретного конца не требуется, необходимо параметры этого конца инициализировать конструктором по умолчанию. .. code-block:: cpp // В начале не продлеваем. Поэтому используем конструктор по умолчанию. MbCurveExtensionEnds paramStart; // В конце продлеваем по дуге MbCurveExtensionCircular paramEnd( extendLength ); 4. Далее инициализируем другие параметры продления и включаем в них созданные в п. 3 объекты с опциями продления концов. .. code-block:: cpp bool allowClosure = false; // Флаг разрешения замкнутости bool alongSurface = false; // Флаг продления вдоль поверхности MbSNameMaker name; // Именователь операции MbCurveExtensionParameters3D opParameters( paramStart, paramEnd, allowClosure, alongSurface, name ); 5. Вызвать API-функцию, осуществляющую продление: .. code-block:: cpp SPtr scrWireFrame; // Заранее подготовленный ненулевой каркас SPtr result( nullptr ); // Результат продления MbResultType res = ::ExtendWireFrame( scrWireFrame, cm_Copy, opParameters, result ); Результирующий каркас будет содержать строитель :blue:`MbExtendCurveCreator` (наследник от :blue:`MbCreator`). В тестовом приложении test.exe продление каркаса выполняется командой меню «Создать→Проволочный каркас→На базе проволочного каркаса→Продление каркаса».