Программно узнать цилиндр или скугление

Автор LorD_LeLiK, 13.02.14, 14:20:29

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

LorD_LeLiK

Нужно в программно рассортировать грани и занести их в таблицу, но функция ksFaceDefinition::IsCylinder возвращает True и в случаи если грань является отверстием (цилиндрическим выступом)  и в случаи если грань является скруглением. Как узнать как поверхность поступила на вход, цилиндр или скругление?

#1
Получаете радиус - pFaceDefinition.GetCylinderParam(H,R); и считаете длину окружности.
Получаете интерфейс математической кривой в трехмерном пространстве.
pCurve3D:=IUnknown(pEdgeDefinition.GetCurve3D) as ICurve3D;
Находите длину ребра:
tMin:=pCurve3D.GetParamMin;
tMax:=pCurve3D.GetParamMax;
Dlina:=pCurve3D.GetMetricLength(tMin,tMax);
Сравниваете длину окружности с длиной ребра.

Второй способ:
pCurve3D:=IUnknown(pEdgeDefinition.GetCurve3D) as ICurve3D;
Проверяете является кривая окружностью - pCurve3D.IsCirIcle или дугой - pCurve3D.IsArc.
+ Благодарностей: 1

ТрындецЪ

GetCylinderParam выдаёт ошибочную высоту цилиндра.
Например, вырезаю я в листовом теле толщиной 2 мм отверстие на глубину 10 мм, и мне метод GetCylinderParam выдаст высоту цилиндрической грани не 2 мм, а 10 мм. Как получать верное значение?

Upd: Грань получаю от SelectionManager, предварительно выделив мышкой.

#3
По координатам двух точек на математической поверхности ISurface, P1(Umin,Vmin) и P2(Umin,Vmax).
+ Благодарностей: 1

ТрындецЪ

Совет помог. Вот что получилось на Python:
param_Cylinder = ksFaceDefinition.GetCylinderParam (0,0)

r = param_Cylinder[2] #Радиус

ksSurface = ksFaceDefinition.GetSurface() # интерфейс математической поверхности
Umin = ksSurface.GetParamUMin()
Vmin = ksSurface.GetParamVMin()
Vmax = ksSurface.GetParamVMax()
point_1 = ksSurface.GetPoint(Umin, Vmin,0,0,0)
point_2 = ksSurface.GetPoint(Umin, Vmax,0,0,0)

h = math.sqrt((point_2[1] - point_1[1])**2 + (point_2[2] - point_1[2])**2 + (point_2[3] - point_1[3])**2) # Высота