Построение тела с фасками рёбер

Функция

MbResultType ChamferSolid(       MbSolid &              solid,
                                 MbeCopyMode            sameShell,
                           const MbShellChamferParams & chamferParams,
                                 c3d::SolidSPtr &       result );

выполняет построение фасок указанных рёбер исходного тела.

Входными параметрами функции являются:

  • solid — исходное тело;

  • sameShell — режим копирования исходного тела;

  • chamferParams — параметры построения.

Выходным параметром функции является построенное тело result.

Функция возвращает код результата операции из перечисления MbResultType.

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

При построении тел с фасками рёбер для инициализации объектов chamferParams с параметрами операции в классе MbShellChamferParams определён следующий конструктор:

MbShellChamferParams( const c3d::EdgesSPtrVector &  initCurves,
                      const SmoothValues &          params,
                      const MbSNameMaker &          names )
: _initCurves( initCurves )
, _nameMaker( &names.Duplicate() )
, _params( params ){}

где

  • initCurves — массив обрабатываемых рёбер тела;

  • params — объект с параметрами построения фаски;

  • names — именователь.

Параметр solid содержит исходное тело, рёбра которого подлежат обработке.

Параметр sameShell управляет передачей граней, рёбер и вершин от исходного тела solid к построенному телу result и может принимать одно из четырёх значений:

  • cm_Same = 0 (оболочка не копируется);

  • cm_KeepHistory (исходная оболочка и её копия имеют общие базовые поверхности, вершины и неизменённые операцией грани);

  • cm_KeepSurface (исходная оболочка и её копия имеют общие базовые поверхности);

  • cm_Copy (исходная оболочка и её копия не имеют общих данных).

Перечисление MbeCopyMode подробно описано в параграфе Копирование множества граней MbFaceShell.

Для построения фасок рёбер используются те же параметры SmoothValues & params, что и при построении скруглений рёбер. Класс SmoothValues описан в файле op_shell_parameter.h. Объект params содержит информацию о форме и способе сопряжения смежных граней обрабатываемых рёбер. Для построения фасок используются следующие данные параметра params*:

  • distance1 — первый катет фаски;

  • distance2 — второй катет фаски;

  • begLength — расстояние от начальной вершины до точки остановки сопряжения (отрицательное значение означает отсутствие остановки, значение должно быть равно UNDEFINED_DBL, если не требуется задавать остановку);

  • endLength — расстояние от конечной вершины до точки остановки сопряжения (отрицательное значение означает отсутствие остановки, значение должно быть равно UNDEFINED_DBL, если не требуется задавать остановку);

  • form — тип сопряжения из перечисления MbeSmoothForm;

  • smoothCorner — способ скругления чемоданных углов;

  • prolong — флаг продолжения скругления по касательным рёбрам;

  • vector1 — вектор нормали плоскости остановки сопряжения в начале;

  • vector2 — вектор нормали плоскости остановки сопряжения в конце.

* Все открытые поля будут перенесены в закрытую секцию. Для задания параметров фаски следует использовать специализированные методы инициализации:

// инициализация фаски с равными отступами
bool InitChamfer( double dist );

// инициализация фаски с разными отступами
bool InitChamfer( double dist1, double dist2 );

// инициализация фаски по катету и углу
bool InitOneSideChamfer( bool firstSide, double dist, double ang );

Дополнительные свойства операции задаются методом SetProperties(), аргументами которого являются:

  • c — коэффициент формы, изменяется от 0.05 до 0.95 (при 0 — дуга окружности);

  • pro — флаг продолжения по касательной;

  • cor — способ скругления «чемоданных» углов;

  • autoS — автоопределение сохранения кромки/поверхности;

  • keep — сохранять кромку (true) или сохранять поверхность скругления/фаски (false);

  • str — строгое скругление. Если false, скруглить хотя бы то, что возможно;

  • equ — в углах сочленения вставлять тороидальную поверхность.

Для задания остановок определены методы SetBegLength()/SetEndLength() (по умолчанию остановка не задана).

Способом сопряжения фаски управляет параметр form. Для построения фасок рёбер используются значения параметра form равные st_Chamfer, st_Slant1 и st_Slant2.

При значении form = st_Chamfer функция строит поверхность фаски с заданными катетами, которые определяются параметрами distance1 и distance2, рис. 1:

../../../../_images/M.2.12.1.png

Рис. 1

При значении form = st_Slant1 функция строит поверхность фаски с заданным катетом distance1 и прилегающим к нему углом, определяемым катетом distance2, рис. 2:

../../../../_images/M.2.12.2.png

Рис. 2

При значении form = st_Slant2 функция строит поверхность фаски с заданным углом и прилегающим к нему катетом. Параметр distance1 соответствует катету, обеспечивающему заданный угол, а distance2 определяет прилежащий катет, рис. 3:

../../../../_images/M.2.12.3.png

Рис. 3

На рис. 4 приведён пример остановки фаски на расстоянии begLength от начальной вершины и на расстоянии endLength от конечной вершины обрабатываемого ребра. Если не требуется останавливать сопряжение, то расстояния begLength и endLength должны принимать отрицательные значения.

../../../../_images/M.2.12.4.png

Рис. 4

На примере тела, приведённого на рис. 5, продемонстрируем работу флага prolong при построении фаски выделенного ребра:

../../../../_images/M.2.12.5.png

Рис. 5

Флаг prolong указывает на то, какие рёбра тела должны быть обработаны. Если prolong = false, то обработке подлежат только те рёбра, которые указаны в контейнере initCurves, рис. 6:

../../../../_images/M.2.12.6.png

Рис. 6

Если prolong = true, то обработке подлежат рёбра, указанные в контейнере initCurves, а также рёбра, гладко стыкующиеся с ними, рис. 7:

../../../../_images/M.2.12.7.png

Рис. 7

При построении фаски трёх рёбер, стыкующихся в одной вершине, параметр smoothCorner определяет способ обработки чемоданных углов. На примере тела, приведённого на рис. 8, покажем работу параметра smoothCorner при построении фасок на всех рёбрах тела.

../../../../_images/M.2.12.8.png

Рис. 8

Если smoothCorner = ec_pointed, то обработка углов, в которых стыкуются три ребра одинаковой выпуклости, отсутствует, и в построенном теле присутствует точка, в которой стыкуются три грани фаски, рис. 9:

../../../../_images/M.2.12.9.png

Рис. 9

При всех других значениях параметра smoothCorner углы, в которых стыкуются три ребра одинаковой выпуклости, обрабатываются путём построения дополнительной грани, как показано на рис. 10:

../../../../_images/M.2.12.10.png

Рис. 10

На примере тела в форме пирамиды, приведённого на рис. 11, покажем работу рассматриваемой функции при построении фаски в частных случаях. Результат построения при симметричной конфигурации рёбер и симметричной фаске приведён на рис. 12:

../../../../_images/M.2.12.11.png

Рис. 11

../../../../_images/M.2.12.12.png

Рис. 12

Следует заметить, что для построения фаски стыкующихся в одной вершине четырёх и более рёбер необходимо пересечение всех поверхностей фаски в одной точке. Пример симметричной фаски семи рёбер, стыкующихся в общей вершине, приведён на рис. 13:

../../../../_images/M.2.12.13.png

Рис. 13

Когда в функции построения фаски параметры distance1 и distance2 не равны и для обработки заданы несколько рёбер, то трудно разобраться, что чему соответствует. В такой ситуации предлагается использовать вспомогательные функции: SmoothPhantom(), SmoothSequence(), SmoothPositionData(), объявленные в файле action_phantom.h.

Функция SmoothPhantom() строит упрощённые поверхности для имитации будущих фасок.

Функция SmoothSequence() строит последовательности рёбер, к которым по желанию могут быть добавлены гладко стыкующиеся рёбра, обрабатываемые совместно.

Функция SmoothPositionData() вычисляет по три точки для обрабатываемых рёбер, которые используются для фантомных размеров катетов и углов. Обычно с помощью указанных функций рисуется некий фантом, по которому можно понять, что получится в результате операции, и даётся возможность поменять параметры при необходимости.

Перед построением фасок обрабатываемые рёбра сортируются, при необходимости или по требованию к ним добавляются гладко стыкующиеся рёбра, и из рёбер создаются последовательности гладко стыкующихся рёбер. Параметры distance1 и distance2 привязаны к первой и второй поверхностям соответственно, кривой пересечения первого ребра в последовательности гладко стыкующихся рёбер.

Поверхности можно получить методами кривой пересечения GetCurveOneSurface() и GetCurveTwoSurface().

По distance1 и distance2 первого ребра определяются параметры для остальных рёбер каждой последовательности.

При построении фаски рёбер рассматриваемая функция добавляет в журнал построенного тела строитель MbChamferSolid, который объявлен в файле cr_chamfer_solid.h.

В тестовом приложении test.exe построение тела с фасками выполняется командами меню «Создать → Тело → Обработкой рёбер → Фаска катет-катет», «Создать → Тело → Обработкой рёбер → Фаска катет-угол», «Создать → Тело → Обработкой рёбер → Фаска угол-катет».