.. role:: blue :class: blue Построение заплатки =================== .. _Constructing_a_Patch: .. версия ядра: 118041 .. code-block:: cpp MbResultType PatchShell( const MbPatchShellParams & params, c3d::SolidSPtr & result ); Функция выполняет построение заплатки по множеству кривых. Функция принимает в качестве входного параметра объект **params** класса :blue:`MbPatchShellParams`, содержащий параметры, необходимые для операции (см. определение в *op_shell_parameter.h*): - **initCurves** -- набор кривых; - **patchValues** -- объект, содержащий параметры построения; - **names** -- именователь. Класс :blue:`MbPatchShellParams` содержит 3 конструктора по набору кривых, параметрам и именователю: .. code-block:: cpp MbPatchShellParams( const std::vector> & initCurves, const PatchValues & patchValues, const MbSNameMaker & names ); MbPatchShellParams( const RPArray & initCurves, const PatchValues & patchValues, const MbSNameMaker & names ); MbPatchShellParams( const RPArray & initCurves, const PatchValues & patchValues, const MbSNameMaker & names ); Выходным параметром функции является построенное тело **result**. Функция возвращает код результата операции из перечисления :blue:`MbResultType` (см. *mb_operation_result.h*). Функция объявлена в файле *action_shell.h*. Функция выполняет построение тела, состоящего из грани, края которой проходят по заданным кривым. Для построения корректного тела кривые множества **initCurves** должны стыковаться друг с другом и образовывать замкнутый контур. Если кривые **initCurves** лежат в одной плоскости, то заплатка будет представлять собой часть плоскости, лежащую внутри контура, образованного кривыми. Если все кривые **initCurves** лежат на одной и той же криволинейной поверхности, то заплатка будет представлять собой часть общей поверхности, ограниченную заданными кривыми. Если множество **initCurves** состоит из одной кривой, то эта кривая будет разбита на две части, а поверхность заплатки будет линейчатой поверхностью, имеющей два полюса. Аналогично строится заплатка, если множество **initCurves** содержит две кривые -- поверхность заплатки будет линейчатой поверхностью, имеющей два полюса. Если количество кривых **initCurves** равно трем, то поверхность заплатки будет поверхностью :blue:`MbCornerSurface`, построенной по трем кривым и имеющей полюс. Если количество кривых **initCurves** равно четырем, то поверхность заплатки будет поверхностью :blue:`MbCoverSurface`, построенной по четырем кривым. В других случаях возможен отказ от построения. Объект **patchValues** cодержит информацию о типе заплатки и флаге проверки самопересечений. Для инициализации объекта в структуре :blue:`PatchValues` по умолчанию задан следующий конструктор: .. code-block:: cpp PatchValues() : type ( ts_none ) , checkSelfInt ( false ) , mergeEdges ( true ) , tolerantData ( false ) , internalMatingType ( pmt_None ) { } где - **type** -- тип заплатки; - **checkSelfInt** -- флаг проверки самопересечений; - **mergeEdges** -- флаг слияния подобных ребер (*true* -- сливать подобные ребра); - **tolerantData** -- флаг построения неточной заплатки по неточным входным данным; - **internalMatingType** -- тип сопряжения между частями заплатки. Используется при **type** = *ts_byCurves*. Для объекта **patchValues** определены следующие типы заплатки (см. перечисление :blue:`SurfaceType`): - *ts_tang* -- по касательной; - *ts_norm* -- по нормали; - *ts_none* -- не определено; - *ts_plane* -- плоская заплатка; - *ts_byCurves* -- построение задается сопряжениями по каждой кривой. Типы *ts_tang*, *ts_norm* задаются при построении заплатки по касательной или по нормали соответственно. Если задан тип заплатки *ts_plane*, будет построена заплатка с плоскими гранями. Тип *ts_byCurves* задается, если требуется построить заплатку с сопряжением по некоторым границам. В этом случае для нужной границы :blue:`MbPatchCurve` нужно задать сопряжение методом :blue:`SetMating`\(). На рис. 1 приведено восемь кривых, лежащих на краю внутреннего выреза грани. На рис. 2 приведена заплатка, построенная по кривым, приведенным на рис. 1: .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.12.1.png :width: 11cm :align: center Рис. 1 .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.12.2.png :width: 11cm :align: center Рис. 2 На рис. 3 приведено шесть кривых, лежащих на краях разных граней, полученных путем резки граней общей поверхностью: .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.12.3.png :width: 12cm :align: center Рис. 3 Если после резки в краевых ребрах сохранилась информация о режущей поверхности, то при построении заплатки может быть использована режущая поверхность. На рис. 4 приведен пример построения заплатки в виде некоторой части режущей поверхности, которая образовала краевые ребра, приведенные на рис. 3: .. figure:: /MODELER/METHODS_OF_SOLID_BUILDING/pictures/M.1.12.4.png :width: 12cm :align: center Рис. 4 Как правило, кривые для множества **initCurves** берутся от краевых ребер. После построения заплатку часто сшивают с другими телами, примыкающими к ее краям. Функция :blue:`PatchShell`\() добавляет в журнал построенного тела строитель :blue:`MbPatchCreator`. Строитель :blue:`MbPatchCreator` объявлен в файле *cr_patch_creator.h*. В тестовом приложении *test.exe* построение заплатки можно реализовать командой меню «Создать→Оболочку→Заплатку».