Параметризация поверхностей
SetSurfaceUVDomain(ID: string; SrcUmin, SrcUmax, SrcVmin, SrcVmax, PrxUmin, PrxUmax, PrxVmin, PrxVmax: STFloat; TransposeUV: boolean) — изменить параметризацию уже созданной поверхности по её идентификатору. Новый объект не создаётся: поверхность оборачивается в прокси, который задаёт линейный пересчёт между двумя диапазонами параметров U/V.
ID— идентификатор поверхности;SrcUmin,SrcUmax/SrcVmin,SrcVmax— диапазон Src: параметрическое пространство, в котором поверхность «видна» снаружи — в нём заданы координаты контуров грани, ссылающейся на эту поверхность;PrxUmin,PrxUmax/PrxVmin,PrxVmax— диапазон Prx: пространство, в которое внешний параметр пересчитывается для вычисления самой поверхности (для NURBS — диапазон узлов, knot-span);TransposeUV— приtrueоси U и V меняются местами (например, когда порядок U/V в CAD-системе не совпадает с принятым в SGF — так бывает для тора).
Зачем это нужно. Некоторые CAD-системы хранят контур (loop) грани в одном параметрическом пространстве, а саму несущую поверхность определяют в другом. Если их не согласовать, CAM-система спроецирует контур не туда, и грань построится неверно. SetSurfaceUVDomain задаёт линейное соответствие Src↔Prx, и контур проецируется правильно.
Частный случай — продление поверхности: когда параметрический домен грани шире естественного домена поверхности. Так делает импорт из КОМПАС для NURBS-граней: реальный диапазон грани (MathSurface.ParamU/V) выходит за пределы узлового диапазона NURBS. Прокси «растягивает» поверхность на весь домен грани, и контур грани проецируется на NURBS корректно. Если же домен грани целиком лежит внутри узлового (обычная «обрезка внутри NURBS», типичный fillet) — перепараметризация не нужна, иначе она лишь исказит геометрию.
Пример: выравнивание параметризации поверхности.
// Выровнять параметризацию грани и несущей NURBS-поверхности (по образцу импорта КОМПАС).
void AlignSurfaceUVDomain(string surfaceId, CADFace face)
{
CADSurface surf = face.Surface;
// Src — UV-пространство, в котором заданы контуры грани
double srcUmin = face.ParamUMin, srcUmax = face.ParamUMax;
double srcVmin = face.ParamVMin, srcVmax = face.ParamVMax;
// Prx — естественный домен поверхности (для NURBS — диапазон узлов)
double prxUmin = surf.KnotUMin, prxUmax = surf.KnotUMax;
double prxVmin = surf.KnotVMin, prxVmax = surf.KnotVMax;
// Если домен грани целиком внутри домена поверхности — это обычная
// «обрезка внутри NURBS», перепараметризация только исказит геометрию.
const double eps = 1e-9;
bool insideU = srcUmin >= prxUmin - eps && srcUmax <= prxUmax + eps;
bool insideV = srcVmin >= prxVmin - eps && srcVmax <= prxVmax + eps;
if (insideU && insideV)
return;
// Иначе домен грани шире — прокси продлевает поверхность на весь её диапазон
// (TransposeUV = false: оси U/V не меняем).
sgr.SetSurfaceUVDomain(surfaceId,
srcUmin, srcUmax, srcVmin, srcVmax,
prxUmin, prxUmax, prxVmin, prxVmax,
false);
}