在Pro/TOOLKIT中,类型ProSurface表示面。ProSurface和ProGeomitem之间可以相互转换:
- ProSurface -> ProGeomitem:ProSurfaceToGeomitem
- ProGeomitem -> ProSurface:ProGeomitemToSurface
ProSurfaceTypeGet用于获取面的类型,面的类型有以下几种:
- PRO_SRF_PLANE:平面。
- PRO_SRF_CYL:圆柱面。
- PRO_SRF_CONE:圆锥面
- PRO_SRF_TORUS:圆环面
- ...等等
函数ProGeomitemdataGet用于获取面的数据,注意在用完之后要调用ProGeomitemdataFree来释放数据。
ProGeomitemdata下的ProSurfacedata用于存储面的数据,而其下 ProSurfaceshapedata srf_shape 则用于表达不同类型面的具体数据。
typedef struct geom_item_data_struct
{
ProType obj_type;
union
{
ProCurvedata *p_curve_data;
ProSurfacedata *p_surface_data;
ProCsysdata *p_csys_data;
} data;
} ProGeomitemdata;
typedef struct ptc_surf
{
......
ProSurfaceshapedata srf_shape;
......
} ProSurfacedata;
typedef union ptc_srfshape
{
ProPlanedata plane; // 平面
ProCylinderdata cylinder; // 圆柱面
ProConedata cone; // 圆锥面
ProTorusdata torus; // 圆环面
ProSrfrevdata srfrev;
......
} ProSurfaceshapedata;
示例代码:
// 获取面的数据
int TestGetSurfaceData(uiCmdCmdId command,
uiCmdValue *p_value,
void *p_push_command_data)
{
ProError err;
// 选择面
ProSelection *sels;
int nSel = 0;
err = ProSelect("surface,datum", 1, NULL, NULL, NULL, NULL, &sels, &nSel);
if (PRO_TK_NO_ERROR != err || 1 != nSel)
{
return -1;
}
// 获取选择的面
ProGeomitem geomSurface;
err = ProSelectionModelitemGet(sels[0], &geomSurface);
ProSurface surface;
err = ProGeomitemToSurface(&geomSurface, &surface);
ProSrftype srfType;
err = ProSurfaceTypeGet(surface, &srfType);
// 获取面的数据
ProGeomitemdata* geomdata;
err = ProGeomitemdataGet(&geomSurface, &geomdata);
// 根据面的类型获取具体的数据
CStringW cstrInfo;
switch (srfType)
{
case PRO_SRF_PLANE:
{
cstrInfo = L"面的类型: 平面\n";
CStringW cstrPlaneNormalVector;
cstrPlaneNormalVector.Format(L"平面的法向量: (%.2f, %.2f, %.2f)",
geomdata->data.p_surface_data->srf_shape.plane.e3[0],
geomdata->data.p_surface_data->srf_shape.plane.e3[1],
geomdata->data.p_surface_data->srf_shape.plane.e3[2]);
cstrInfo += cstrPlaneNormalVector;
}
break;
case PRO_SRF_CYL:
{
cstrInfo = L"面的类型: 圆柱面\n";
CStringW cstrRadius;
cstrRadius.Format(L"圆柱面的半径为: %.2f", geomdata->data.p_surface_data->srf_shape.cylinder.radius);
cstrInfo += cstrRadius;
}
break;
default:
cstrInfo = L"面的数据:亲,试试自己完成!";
break;
}
MessageBoxW(NULL, cstrInfo, L"icaxdev: Sample004", MB_OK);
// 释放数据
err = ProGeomitemdataFree(&geomdata);
return 0;
}