Аналитические поверхности
Поверхности создаются под уникальным ID. У аналитических примитивов (плоскость, цилиндр, конус, сфера, тор) расположение задаётся одинаково тройкой: Location — положение (vT), Axis — ось Z (vZ), RefAxis — ось X (vX); ось Y вычисляется как векторное произведение Axis × RefAxis. Помимо аналитических примитивов в эту группу входят NURBS-поверхность и полигональная сетка (Mesh).
Часть аналитических поверхностей математически бесконечны — плоскость безгранична, а цилиндр и конус не ограничены по оси. Поэтому при создании их обязательно нужно ограничивать: у плоскости область задаётся прямоугольником xMin…xMax × yMin…yMax, у цилиндра и конуса — границами по оси Hmin…Hmax (и при необходимости угловым сектором Amin…Amax). Если CAD-система не предоставляет явных границ, разумно ограничить поверхность габаритами всей модели. (Сфера и тор замкнуты и в дополнительном ограничении не нуждаются.)
Примитивы аналитических поверхностей:
- Плоскость —
CreatePlaneP. - Цилиндр —
CreateCylinderP. - Конус —
CreateConeP. - Сфера —
CreateSphereP. - Тор —
CreateTorusP. - NURBS-поверхность —
StartNurbsSurface…CloseNurbsSurface. - Полигональная сетка —
StartMesh…CloseMesh.
Пример сохранения аналитической поверхности
SaveSurface — диспетчер: получает поверхность CAD-системы и, в зависимости от её типа, вызывает соответствующий обработчик (SavePlane, SaveCylinder, …). Каждый обработчик пишет геометрию в SGF подходящим вызовом из Поверхности и возвращает флаг успеха. Ниже показаны сам диспетчер и один из обработчиков (SavePlane); остальные устроены аналогично.
// Сохраняет поверхность любого типа; возвращает признак успеха (Id уже задан в CADSurface)
bool SaveSurface(CADSurface surf)
{
switch (surf.Type)
{
case "Plane": return SavePlane(surf.Id, surf.Param);
case "Cylinder": return SaveCylinder(surf.Id, surf.Param); // обработчики остальных
case "Cone": return SaveCone(surf.Id, surf.Param); // типов устроены так же
case "Sphere": return SaveSphere(surf.Id, surf.Param);
case "Torus": return SaveTorus(surf.Id, surf.Param);
case "Nurbs": return SaveNurbsSurface(surf.Id, surf.Param);
case "Mesh": return SaveMesh(surf.Id, surf.Param);
// … прочие типы поверхностей (см. «Поверхности»)
default: return false; // тип не поддерживается
}
}
// Один из обработчиков — сохранение плоскости
bool SavePlane(string id, CADPlaneParam param)
{
// точки-направления CAD приводим к TST3DPoint (Xmin/Ymin/Xmax/Ymax — числа)
return sgr.CreatePlaneP(id, ToPoint(param.Location), ToPoint(param.Axis), ToPoint(param.RefAxis),
param.Xmin, param.Ymin, param.Xmax, param.Ymax);
}