.. role:: blue :class: blue Построение модифицированного тела ================================= .. _Constructing_a_Modified_Body: .. версия ядра: 118058 Функция .. code-block:: cpp MbResultType ModifiedSolid( MbSolid & solid, MbeCopyMode sameShell, const MbModifiedSolidParams & params, MbModifiedSolidResults & results ); В зависимости от параметров модификации :blue:`MbModifiedSolidParams` функция выполняет одно из следующих действий: 1. Удаление из тела выбранных граней без прилегающих скруглений (*dmm_RemoveFaces*). Удаление грани вместе с прилегающими скруглениями (*dmm_RemoveFacesWithAdjacentFillets*). Удаление замкнутых цилиндрических, конических, тороидальных, сферических граней, граней вращения и выдавливания радиуса меньше заданного без прилегающих скруглений (*dmm_RemoveBelowRadius*). Удаление замкнутых цилиндрических, сферических граней, граней вращения и выдавливания радиуса меньше заданного вместе с прилегающими скруглениями (*dmm_RemoveBelowRadiusWithAdjacentFillets*). 2. Создание тела из выбранных граней с окружением (*dmm_Create*). 3. Перемещение выбранных граней с окружением относительно оставшихся граней тела (*dmm_MoveFacesByVector*) или без адаптации прилегающих скруглений (*dmm_MoveFacesByVectorNoAdaptation*). Направление и величину перемещения определяет вектор **direction**. 4. Замена выбранных граней тела эквидистантными гранями (перемещение по нормали, изменение радиуса) (*dmm_OffsetFaces*). Расстояние смещения определяется параметром **value**. 5. Изменение радиуса выбранных граней скругления на заданную величину (*dmm_FilletsRadiusChange*). Величина изменения радиуса определяется параметром **value**. .. в action_direct.h в ENG описании dmm_FilletChange заменить на dmm_FilletsRadiusChange 6. Замена выбранных граней тела деформируемыми гранями (превращение в NURBS) для редактирования (*dmm_ConvertFacesToNurbs*). 7. Удаление выбранных граней скругления тела (*dmm_PurifyFillets*). Удаление также всех гладко прилегающих скруглений (*dmm_PurifyFilletsChains*). Удаление всех скруглений тела, меньших определённого радиуса (*dmm_PurifyFilletsBelowRadius*). 8. Слияние вершин рёбер и удаление рёбер (*dmm_DeleteEdges*). 9. Замена гладко стыкующихся граней одной гранью (*dmm_UniteFaces*). 10. Поворот выбранных граней с адаптацией прилегающих скруглений (*dmm_RotateFaces*) или без (*dmm_RotateFacesNoFilletAdaptation*). Угол поворота определяется параметром **angle**, ось поворота определяется осью **axis**. 11. Замена выбранных граней тела (*dmm_ReplaceFaces*). 12. Установка радиусов выбранных граней скругления для цепочки гладко стыкующихся скруглений (*dmm_FilletsRadiusSet*) и установка радиусов выбранных граней скругления (*dmm_FilletsRadiusSetSingle*). Новый радиус определяется параметром **value**. .. В РАЗРАБОТКЕ .. 13.Установка радиуса замкнутых цилиндрических граней с адаптацией прилегающих скруглений (*dmm_CylinderRadiusSet*) или без адаптации (*dmm_CylinderRadiusSetNoAdaptation*). Новый радиус определяется параметром *value*. 14.Установка радиуса замкнутых сферических граней с адаптацией прилегающих скруглений (*dmm_SphereRadiusSet*) или без адаптации (*dmm_SphereRadiusSetNoAdaptation*). Новый радиус определяется параметром *value*. 15.Замена группы выбранных граней тела (*dmm_ReplaceGroupFaces*). Входными параметрами функции являются: - **solid** -- исходное тело; - **sameShell** -- вариант копирования исходного тела; - **params** -- параметры модификации. Выходным параметром функции является структура результатов модификации **results**, содержащая модифицированное тело и дополнительную информацию об операции. При удачной работе функция возвращает :blue:`rt_Success`, в противном случае функция возвращает код ошибки из перечисления :ref:`MbResultType ` (см. *mb_operation_result.h*). Возможные коды ошибок: :blue:`rt_Success` -- ошибок нет; :blue:`rt_Error` -- неизвестная ошибка; :blue:`rt_IncorrectData` -- некорректные данные; :blue:`rt_ParameterError` -- ошибочный параметр. Функция объявлена в файле *action_direct.h*. При создании объекта **params** с параметрами модификации используется один из следующих конструкторов (см. *op_direct_mod_parameter.h*). **Конструкторы без набора граней** .. в описании конструкторов в хидере заменить dmm_FilletChange на dmm_FilletsRadiusChange - **type** -- тип модификации. Для данного конструктора доступны: *dmm_OffsetFaces*, *dmm_FilletsRadiusChange*; - **value** -- величина сдвига для *dmm_OffsetFaces* или величина изменения радиуса для *dmm_FilletsRadiusChange*; - **names** -- именователь операции. .. code-block:: cpp MbModifiedSolidParams( MbeModifyingMode type, const MbSNameMaker & names, double value ); --------------------------------------- - **type** -- тип модификации. Для данного конструктора доступны: *dmm_RotateFaces*, *dmm_RotateFacesNoFilletAdaptation*; - **axis** -- ось вращения; - **angle** -- угол вращения; - **names** -- именователь операции. .. code-block:: cpp MbModifiedSolidParams( MbeModifyingMode type, const MbSNameMaker & names, const MbAxis3D & axis, double angle ); --------------------------------------- - **type** -- тип модификации. Для данного конструктора доступны: *dmm_MoveFacesByVector*, *dmm_MoveFacesByVectorNoAdaptation*; - **direction** -- направление перемещения; - **names** -- именователь операции. .. code-block:: cpp MbModifiedSolidParams( MbeModifyingMode type, const MbSNameMaker & names, const MbVector3D & direction ); **Конструкторы по набору граней** - **modType** -- тип модификации. Для данного конструктора доступны: *dmm_UniteFaces*, *dmm_Create*, *dmm_ConvertFacesToNurbs*, *dmm_PurifyFillets*; - **names** -- именователь операции; - **faces** -- список граней для модификации. .. code-block:: cpp MbModifiedSolidParams( MbeModifyingMode modType, const MbSNameMaker & names, const c3d::ItemIndices & faces ); --------------------------------------- - **type** -- тип модификации. Для данного конструктора доступны: *dmm_OffsetFaces*, *dmm_FilletsRadiusChange*, *dmm_RemoveBelowRadius*, *dmm_RemoveBelowRadiusWithAdjacentFillets*, *dmm_PurifyFilletsBelowRadius*; - **names** -- именователь операции; - **faces** -- список граней для модификации; - **value** -- величина сдвига для *dmm_OffsetFaces*, величина изменения радиуса для *dmm_FilletsRadiusChange*, величина максимального радиуса для *dmm_Remove* и *dmm_Purify*. .. code-block:: cpp MbModifiedSolidParams( MbeModifyingMode type, const MbSNameMaker & names, const c3d::ItemIndices & faces, double value ) : MbModifiedSolidParams( type, names, value ) { AddFaces( faces ); } --------------------------------------- - **type** -- тип модификации. Для данного конструктора доступны: *dmm_RotateFaces*, *dmm_RotateFacesNoFilletAdaptation*; - **names** -- именователь операции; - **faces** -- список граней для модификации; - **axis** -- ось вращения; - **angle** -- угол вращения. .. code-block:: cpp MbModifiedSolidParams( MbeModifyingMode type, const MbSNameMaker & names, const c3d::ItemIndices & faces, const MbAxis3D & axis, double angle ) : MbModifiedSolidParams( type, names, axis, angle ) { AddFaces( faces ); } --------------------------------------- - **type** -- тип модификации. Для данного конструктора доступны: *dmm_MoveFacesByVector*; - **names** -- именователь операции; - **faces** -- список граней для модификации; - **direction** -- направление сдвига. .. code-block:: cpp MbModifiedSolidParams( MbeModifyingMode type, const MbSNameMaker & names, const c3d::ItemIndices & faces, const MbVector3D & direction ) : MbModifiedSolidParams( type, names, direction ) { AddFaces( faces ); } --------------------------------------- - **type** -- тип модификации. Для данного конструктора доступны: *dmm_ConvertFacesToNurbs*; - **names** -- именователь операции; - **faces** -- список граней для модификации; - **surfaces** -- поверхности замены (может быть пустым массивом). .. code-block:: cpp template MbModifiedSolidParams( MbeModifyingMode type, const MbSNameMaker & names, const c3d::ItemIndices & faces, const SurfArray & surfaces ) : MbModifiedSolidParams( type, names ) { AddFaces( faces ); AddSurfaces( surfaces ); } --------------------------------------- - **type** -- тип модификации. Для данного конструктора доступны: *dmm_ReplaceFaces*; - **names** -- именователь операции; - **replacedFaces** -- список заменяемых граней; - **replacementSurfaces** -- список заменяющих поверхностей; - **surfaceParts** -- список номеров частей поверхностей, которые будут использоваться при нескольких возможных вариантах замены; - **sameSurfaces** -- использовать исходные поверхности (true) или их копии (false); - **offsets** -- список сдвигов от заменяющих поверхностей. .. code-block:: cpp template MATH_FUNC_EX MbModifiedSolidParams( MbeModifyingMode type, const MbSNameMaker & names, const c3d::ItemIndices & replacedFaces, const SurfArray & replacementSurfaces, bool sameSurfaces, const c3d::NumbersVector & surfaceParts, const c3d::DoubleVector & offsets ); --------------------------------------- - **modType** -- тип модификации. Для данного конструктора доступны: *dmm_DeleteEdges*; - **names** -- именователь операции; - **edges** -- список рёбер для модификации; - **beginOrEnd** -- флаг удаления начала или конца соответствующего ребра. .. code-block:: cpp MbModifiedSolidParams( MbeModifyingMode modType, const MbSNameMaker & names, const c3d::EdgeFacesIndices & edges, const c3d::BoolVector & beginOrEnd ) : MbModifiedSolidParams( modType, names ) { AddEdges( edges, beginOrEnd ); } .. В разработке **type** -- тип модификации. Для данного конструктора доступны: *dmm\_ReplaceGroupFaces*; **names** -- именователь операции; **solid** -- тело с заменяющими гранями; **replacedFacesInd** -- список индексов заменяемых граней. **replacementFacesInd** -- список индексов заменяющих граней из тела с заменяющими гранями. **offset** -- сдвиг заменяющих граней. .. .. code-block:: cpp MbModifiedSolidParams|( MbeModifyingMode type, const MbSNameMaker & names, const MbSolid & solid, const c3d::ItemIndices & replacedFacesInd, const c3d::ItemIndices & replacementFacesInd, double offset ); Параметр **solid** содержит исходное тело, которое подлежит обработке. Параметр **sameShell** управляет передачей данных от исходного тела **solid** к построенному телу **results** и может принимать одно из четырёх значений: - *cm_Same* = 0 (тело не копируется); - *cm_KeepHistory* (исходное тело и его копия имеют общие базовые поверхности, вершины и неизменённые операцией грани); - *cm_KeepSurface* (исходное тело и его копия имеют общие базовые поверхности); - *cm_Copy* (исходное тело и его копия не имеют общих данных). Перечисление :blue:`MbeCopyMode` подробно описано в подразделе :ref:`Копирование множества граней MbFaceShell `. Параметр **params** описывает параметры модификации, которые определяются типом модификации и дополнительными параметрами в зависимости от используемого конструктора. Тип модификации задаётся параметром **_modificationType**, который может принимать одно из значений перечисления :blue:`MbeModifyingMode` (см. *op_direct_mod_parameter.h*). При типах модификации *dmm_RemoveFaces* и *dmm_RemoveFacesWithAdjacentFillets* рассматриваемая функция удаляет грани **faces** из копии тела **solid** и, используя окружение, обрабатывает место удалённых граней, сохраняя замкнутость тела. Если грани **faces** связаны с остальными гранями скруглениями, то в режиме *dmm_RemoveFacesWithAdjacentFillets* прилегающие грани скругления автоматически добавляются к множеству удаляемых граней. При типах модификации *dmm_RemoveBelowRadius* и *dmm_RemoveBelowRadiusWithAdjacentFillets* функция удаляет замкнутые цилиндрические, конические, тороидальные, сферические грани, а также грани вращения и выдавливания радиуса меньше или равного заданному значению радиуса. В режиме *dmm_RemoveBelowRadiusWithAdjacentFillets* эти грани удаляются вместе с прилегающими скруглениями. Такая настройка позволяет автоматически убирать мелкие сквозные или глухие отверстия без явного перечисления всех соответствующих граней. На рис. 1 приведено исходное тело, а на рис. 2 — построенное тело, полученное путём удаления указанных граней исходного тела: .. figure:: /MODELER/DIRECT_MODELING_METHODS/pictures/M.6.2.1.png :width: 10cm :align: center Рис. 1 .. figure:: /MODELER/DIRECT_MODELING_METHODS/pictures/M.6.2.2.png :width: 12cm :align: center Рис. 2 Аналогичный результат можно получить, если выбрать все указанные грани и прилегающие к ним скругления и использовать тип *dmm_RemoveFaces*. При типе модификации *dmm_Create* рассматриваемая функция создаёт новое тело из копий граней **faces**. Если грани **faces** связаны с остальными гранями скруглениями, то сначала удаляются прилегающие скругления, а затем из граней **faces** создаётся новое тело. Новое тело будет замкнутым, так как в него входят как исходные грани **faces**, так и грани, построенные на базовых поверхностях, смежных с гранями **faces**. Дополнительные грани необходимы для ликвидации краевых рёбер. На рис. 3 приведено исходное тело, а на рис. 4 — вновь построенное тело, полученное из указанных граней исходного тела. Тело на рис. 3 состоит из пяти граней: трёх граней множества **faces** и двух граней на базе цилиндрической поверхности, на которую опирались два удалённых скругления: .. figure:: /MODELER/DIRECT_MODELING_METHODS/pictures/M.6.2.3.png :width: 10cm :align: center Рис. 3 .. figure:: /MODELER/DIRECT_MODELING_METHODS/pictures/M.6.2.4.png :width: 10cm :align: center Рис. 4 При типах модификации *dmm_MoveFacesByVector* и *dmm_MoveFacesByVectorNoAdaptation* рассматриваемая функция перемещает грани **faces** относительно остальных граней в копии тела **solid**. Перемещение выполняется в направлении вектора **direction** на расстояние его длины. В режиме *dmm_MoveFacesByVector* адаптируются прилегающие скругления, в режиме *dmm_MoveFacesByVectorNoAdaptation* скругления не перестраиваются. Если грани **faces** связаны с остальными гранями скруглениями, то в режиме с адаптацией сначала удаляются скругления, далее перемещаются грани **faces** и затем скругления восстанавливаются на новых местах. На рис. 5 и рис. 6 приведены тела, построенные путём перемещения указанных граней исходных тел, приведённых на рис. 1 и рис. 3, соответственно: .. figure:: /MODELER/DIRECT_MODELING_METHODS/pictures/M.6.2.5.png :width: 12cm :align: center Рис. 5 .. figure:: /MODELER/DIRECT_MODELING_METHODS/pictures/M.6.2.6.png :width: 12cm :align: center Рис. 6 При типе модификации *dmm_OffsetFaces* рассматриваемая функция заменяет грани **faces** в копии тела **solid** эквидистантными гранями. Эквидистантные грани смещены по нормали на расстояние, заданное параметром **value**. Если **value** положительно, смещение выполняется в сторону внешних нормалей, при отрицательном значении – в противоположную сторону. Если грани **faces** связаны с остальными гранями скруглениями, то сначала удаляются скругления, далее грани **faces** заменяются эквидистантными, и затем скругления восстанавливаются на новых местах. На рис. 7 и рис. 8 приведены тела, построенные путём замены указанных граней эквидистантными гранями. Исходные тела приведены на рис. 1 и рис. 3, соответственно: .. figure:: /MODELER/DIRECT_MODELING_METHODS/pictures/M.6.2.7.png :width: 12cm :align: center Рис. 7 .. figure:: /MODELER/DIRECT_MODELING_METHODS/pictures/M.6.2.8.png :width: 12cm :align: center Рис. 8 Если параметр **value** отрицателен, то эквидистантные грани смещаются на отрицательное расстояние. На рис. 9 и рис. 10 приведены тела, построенные путём замены указанных граней эквидистантными гранями с отрицательным смещением. Исходные тела приведены на рис. 5 и рис. 6, соответственно: .. figure:: /MODELER/DIRECT_MODELING_METHODS/pictures/M.6.2.9.png :width: 12cm :align: center Рис. 9 .. figure:: /MODELER/DIRECT_MODELING_METHODS/pictures/M.6.2.10.png :width: 12cm :align: center Рис. 10 При типе модификации *dmm_FilletsRadiusChange* рассматриваемая функция изменяет радиусы граней скругления **faces** в копии тела **solid**. Радиус каждой грани скругления увеличивается или уменьшается на величину, заданную параметром **value**. Положительное значение **value** приводит к увеличению радиуса скруглений, отрицательное – к уменьшению. При этом сохраняется замкнутость тела и непрерывность сопряжения с соседними гранями, насколько это возможно с учётом заданной геометрии. На рис. 11 и рис. 12 приведены тела, построенные путём изменения радиуса указанных граней скругления. Исходные тела приведены на рис. 1 и рис. 3, соответственно: .. figure:: /MODELER/DIRECT_MODELING_METHODS/pictures/M.6.2.11.png :width: 12cm :align: center Рис. 11 .. figure:: /MODELER/DIRECT_MODELING_METHODS/pictures/M.6.2.12.png :width: 12cm :align: center Рис. 12 При типе модификации *dmm_ConvertFacesToNurbs* рассматриваемая функция заменяет грани **faces** в копии тела **solid** деформируемыми гранями (NURBS-поверхностями), обеспечивая возможность дальнейшего редактирования этих граней по контрольным точкам. Если грани **faces** связаны с остальными гранями скруглениями, то сначала удаляются прилегающие скругления, далее грани **faces** заменяются деформируемыми гранями на базе соответствующих NURBS-поверхностей, после чего скругления восстанавливаются на новых местах. На рис. 13 приведено исходное тело, а на рис. 14 -- построенное тело, полученное путём замены указанной грани исходного тела деформируемой гранью, и показаны контрольные точки деформируемой грани. Деформируемая грань построена на базе NURBS-поверхности: .. figure:: /MODELER/DIRECT_MODELING_METHODS/pictures/M.6.2.13.png :width: 9cm :align: center Рис. 13 .. figure:: /MODELER/DIRECT_MODELING_METHODS/pictures/M.6.2.14.png :width: 9cm :align: center Рис. 14 На рис. 15 приведено деформируемое тело с перемещёнными контрольными точками деформируемой грани. На рис. 16 приведён результат деформирования тела: .. figure:: /MODELER/DIRECT_MODELING_METHODS/pictures/M.6.2.15.png :width: 9cm :align: center Рис. 15 .. figure:: /MODELER/DIRECT_MODELING_METHODS/pictures/M.6.2.16.png :width: 9cm :align: center Рис. 16 При типах модификации *dmm_PurifyFillets* и *dmm_PurifyFilletsChains* рассматриваемая функция удаляет грани скруглений **faces** в копии тела **solid** и, используя окружение, обрабатывает место удалённых граней, сохраняя замкнутость тела. В режиме *dmm_PurifyFilletsChains* дополнительно удаляются все скругления, гладко стыкующиеся с выбранными гранями. На рис. 17 и рис. 18 приведены тела, построенные путём удаления указанных граней скругления. Исходные тела приведены на рис. 1 и рис. 3, соответственно: .. figure:: /MODELER/DIRECT_MODELING_METHODS/pictures/M.6.2.17.png :width: 10cm :align: center Рис. 17 .. figure:: /MODELER/DIRECT_MODELING_METHODS/pictures/M.6.2.18.png :width: 10cm :align: center Рис. 18 .. dmm_PurifyFilletsBelowRadius особо не тестировался .. При типе модификации \textit{dmm\_PurifyFilletsBelowRadius} вместо явно заданного множества \textbf{faces} используются все грани скругления тела, радиус которых меньше или равен заданному максимальному радиусу. Это позволяет удалять все мелкие скругления ниже порогового размера без их перечисления. .. На рис. 18 приведено исходное тело, а на рис. 19 -- построенное тело, полученное путём удаления всех граней скругления, радиус которых не превосходит порогового значения: Функция :blue:`ModifiedSolid`\() работает при условии сохранения неизменной топологии редактируемого тела. Функция :blue:`ModifiedSolid`\() добавляет в журнал построенного тела строитель :blue:`MbFaceModifiedSolid`, который содержит все необходимые данные для выполнения операции. Строитель :blue:`MbFaceModifiedSolid` объявлен в файле *cr_modified_solid.h*. Тестовое приложение *test.exe* выполняет построение модифицированного тела командами меню «Создать → Тело → Прямым редактированием».