Построение тела с фасками рёбер
Функция
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:
Рис. 1
При значении form = st_Slant1 функция строит поверхность фаски с заданным катетом distance1 и прилегающим к нему углом, определяемым катетом distance2, рис. 2:
Рис. 2
При значении form = st_Slant2 функция строит поверхность фаски с заданным углом и прилегающим к нему катетом. Параметр distance1 соответствует катету, обеспечивающему заданный угол, а distance2 определяет прилежащий катет, рис. 3:
Рис. 3
На рис. 4 приведён пример остановки фаски на расстоянии begLength от начальной вершины и на расстоянии endLength от конечной вершины обрабатываемого ребра. Если не требуется останавливать сопряжение, то расстояния begLength и endLength должны принимать отрицательные значения.
Рис. 4
На примере тела, приведённого на рис. 5, продемонстрируем работу флага prolong при построении фаски выделенного ребра:
Рис. 5
Флаг prolong указывает на то, какие рёбра тела должны быть обработаны. Если prolong = false, то обработке подлежат только те рёбра, которые указаны в контейнере initCurves, рис. 6:
Рис. 6
Если prolong = true, то обработке подлежат рёбра, указанные в контейнере initCurves, а также рёбра, гладко стыкующиеся с ними, рис. 7:
Рис. 7
При построении фаски трёх рёбер, стыкующихся в одной вершине, параметр smoothCorner определяет способ обработки чемоданных углов. На примере тела, приведённого на рис. 8, покажем работу параметра smoothCorner при построении фасок на всех рёбрах тела.
Рис. 8
Если smoothCorner = ec_pointed, то обработка углов, в которых стыкуются три ребра одинаковой выпуклости, отсутствует, и в построенном теле присутствует точка, в которой стыкуются три грани фаски, рис. 9:
Рис. 9
При всех других значениях параметра smoothCorner углы, в которых стыкуются три ребра одинаковой выпуклости, обрабатываются путём построения дополнительной грани, как показано на рис. 10:
Рис. 10
На примере тела в форме пирамиды, приведённого на рис. 11, покажем работу рассматриваемой функции при построении фаски в частных случаях. Результат построения при симметричной конфигурации рёбер и симметричной фаске приведён на рис. 12:
Рис. 11
Рис. 12
Следует заметить, что для построения фаски стыкующихся в одной вершине четырёх и более рёбер необходимо пересечение всех поверхностей фаски в одной точке. Пример симметричной фаски семи рёбер, стыкующихся в общей вершине, приведён на рис. 13:
Рис. 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 построение тела с фасками выполняется командами меню «Создать → Тело → Обработкой рёбер → Фаска катет-катет», «Создать → Тело → Обработкой рёбер → Фаска катет-угол», «Создать → Тело → Обработкой рёбер → Фаска угол-катет».