Продление каркаса

Функция

MbResultType ExtendWireFrame(       c3d::WireFrameSPtr &           wireframe,
                                    MbeCopyMode                    sameEdges,
                              const MbCurveExtensionParameters3D & params,
                                    c3d::WireFrameSPtr &           result );

продлевает заданный каркас и тем самым обобщает операцию продления кривой.

Параметрами функции являются:

  • wireframe - исходный (продлеваемый) каркас (рекомендуется передавать нормализованный каркас);

  • sameEdges - режим копирования входного каркаса;

  • params - параметры продления;

  • result - результирующий каркас.

Функция объявлена в файле action_wireframe.h.

Класс MbCurveExtensionParameters3D наследует свойства класса MbCurveExtensionParameters. Объект params задаёт следующую группу параметров продления каркаса (кривой):

  • параметры продления в начале - объект класса MbCurveExtensionEnds или одного из его наследников (MbCurveExtensionLinear, MbCurveExtensionCircular, MbCurveExtensionNatural);

  • параметры продления в конце - объект класса MbCurveExtensionEnds или его наследников, задаётся независимо от параметров начала;

  • флаг разрешения замкнутости продлённой кривой (allowClosure), определяющий, допускается ли замыкание кривой в процессе продления. В процессе продления (если длина продления будет достаточно большой) кривая может замкнуться. Это не всегда желательно, так как иногда между концами должен оставаться зазор. Для этого необходимо установить allowClosure = false. Величина зазора определяется внутренними алгоритмами и недоступна для изменения пользователем. В случае, когда продлённая кривая достигла своей предельной длины (кривая замкнулась или образовался максимально допустимый зазор между концами), выдаётся одно из следующих предупреждений: rt_CurveClosedAtStart, rt_CurveClosedAtEnd или rt_CurveClosedBothSides (см. таблицу).

  • флаг продления вдоль поверхности (alongSurface), определяющий, должна ли поверхностная кривая (MbSurfaceCurve) оставаться на своей поверхности. Роль этого флага наглядно показана на рисунке 1, на котором приведена поверхность вращения и произвольная поверхностная кривая на ней (голубым цветом) с двумя вариантами продления «по дуге»:

    • если продлевать кривую как пространственную (alongSurface = false), то удлинённый участок (фиолетовый) будет представлять собой дугу окружности, но при этом может покинуть поверхность;

    • при продлении вдоль поверхности (alongSurface = true) кривая всегда остаётся на поверхности, но форма продлевающего сегмента (оранжевый) зависит от геометрии поверхности. Для неповерхностных кривых при alongSurface = true возвращается код ошибки rt_IncorrectData.

../../../../_images/5_14_1.png

Рис. 1

  • именователь операции (объект класса MbSNameMaker), который используется для именования созданного каркаса.

В большинстве случаев при продлении вдоль поверхности запрещён выбег продлённой кривой за границы поверхности. Если это произошло, операция возвращает ошибку rt_BeyondLimitsExtension (см. таблицу). Выбег за границы допускается для MbElementarySurface и периодических поверхностей для границ, соответствующих периодическому направлению.

Класс MbCurveExtensionEnds описывает параметры продления отдельного конца каркаса. В документации используются следующие понятия:

  • длина продления — метрическая длина, на которую каркас продлевается от выбранного конца;

  • способ продления — значение перечисления MbeCurveExtensionWays, определяющее метод продления (по касательной, по дуге или естественным продолжением исходного каркаса).

В геометрическом ядре реализованы три различных способа продления:

  1. Продление «по касательной» или «линейным» способом (MbeCurveExtensionWays::cew_Linear) осуществляется восстановлением касательной в заданной точке кривой и откладыванием вдоль неё отрезка заданной длины. При таком способе продления обеспечивается гладкость не хуже G1 в месте стыка с продлевающим сегментом. Параметры, отвечающие за данный способ продления, задаются через объекты класса MbCurveExtensionLinear.

  2. Продление «по дуге» или «круговым» способом (MbeCurveExtensionWays::cew_Circular) выполняется построением соприкасающейся окружности на продлеваемом конце и взятием её дуги заданной длины. При таком способе продления обеспечивается гладкость не хуже G2. Параметры, отвечающие за данный способ продления, задаются через объекты класса MbCurveExtensionCircular.

  3. Продление естественным продолжением оригинальной кривой (формы, которую она имела непосредственно перед операцией продления) (MbeCurveExtensionWays::cew_CommonNatural). На выходе будет та же кривая, только имеющая большую длину. Но иногда продление осуществляется путём создания контура с пристыковкой к исходной кривой такого NURBS-сегмента, который обеспечивает гладкость не хуже G3 в месте стыка. Параметры, отвечающие за данный способ продления, задаются через объекты класса MbCurveExtensionNatural.

Классы MbCurveExtensionLinear, MbCurveExtensionCircular и MbCurveExtensionNatural наследуются от MbCurveExtensionEnds и позволяют задать параметры, специфичные только для конкретного способа продления. Различие между перечисленными способами продления проиллюстрировано на рис. 2:

../../../../_images/5_14_2.png

Рис. 2

Не существует никаких ограничений на комбинации опций продления отдельных концов. Продление каждого конца осуществляется независимо от другого. Например, на рис. 3 изображена дуга эллипса, продлённая в начале на 30 единиц «по касательной» и в конце «по дуге» на 60 единиц.

../../../../_images/5_14_3.png

Рис. 3

Рассматриваемая функция ExtendWireFrame() возвращает код результата операции в соответствии с таблицей:

Коды результата операции

Тип результата операции Наименование результата операции Описание
– 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 отсутствуют, но суммарная (по двум направлениям) длина продления такова, что результирующая кривая замыкается.

При критических ошибках указатель на результирующий каркас всегда нулевой; при некритических — каркас создаётся, но его геометрия может не удовлетворять требованиям.

Ниже приведена примерная последовательность действий для вызова алгоритма продления каркаса.

  1. Подключить необходимые заголовочные файлы:

    #include <op_wireframe_parameter.h>
    #include <action_wireframe.h>
    
  2. В качестве примера продлим каркас «по дуге» на 100 единиц в конце:

    double extendLength = 100.0;   // Длина продления
    
  3. Инициализируем параметры продления каждого отдельного конца: объекты класса MbCurveExtensionEnds. Если продление конкретного конца не требуется, необходимо параметры этого конца инициализировать конструктором по умолчанию.

    // В начале не продлеваем. Поэтому используем конструктор по умолчанию.
    MbCurveExtensionEnds     paramStart;
    
    // В конце продлеваем по дуге
    MbCurveExtensionCircular paramEnd( extendLength );
    
  4. Далее инициализируем другие параметры продления и включаем в них созданные в п. 3 объекты с опциями продления концов.

    bool allowClosure = false;  // Флаг разрешения замкнутости
    bool alongSurface = false;  // Флаг продления вдоль поверхности
    MbSNameMaker  name;                  // Именователь операции
    MbCurveExtensionParameters3D opParameters( paramStart,
                                               paramEnd,
                                               allowClosure,
                                               alongSurface,
                                               name );
    
  5. Вызвать API-функцию, осуществляющую продление:

    SPtr<MbWireFrame> scrWireFrame;      // Заранее подготовленный ненулевой каркас
    
    SPtr<MbWireFrame> result( nullptr ); // Результат продления
    MbResultType  res = ::ExtendWireFrame( scrWireFrame,
                                           cm_Copy,
                                           opParameters,
                                           result );
    

Результирующий каркас будет содержать строитель MbExtendCurveCreator (наследник от MbCreator).

В тестовом приложении test.exe продление каркаса выполняется командой меню «Создать→Проволочный каркас→На базе проволочного каркаса→Продление каркаса».