|
之前项目要用到proe二次开发技术提取模型平面的算法,自己是新手,就跑到论坛里边来找,结果没找着 跑到隔壁实验室问出来了一个思路,然后查文档和网上的资料,终于磨磨蹭蹭弄出来了 先上效果图
平面提取代码效果图
代码如下
#include "stdafx.h"
#include <roSolid.h>
#include <vector>
using std::vector;
struct plane {
double a;
double b;
double c;
double d;
};
vector<struct plane> allPlanes; // 存储从模型中提取出来的所有平面
struct SolidSurface
{
ProSurface* pSrf;
};
ProError VisitSolidSurface(ProSurface pSrf, ProError pStatus, ProAppData pData)
{
SolidSurface* sSldSrf = (SolidSurface*)pData;
ProArrayObjectAdd((ProArray*)&sSldSrf->pSrf // 曲面向量
, -1 // 从尾部插入
, 1 // 插入一个平面
, &pSrf); // 平面的来源
return PRO_TK_NO_ERROR;
}
// 实体表面获取
ProError GetSolidSurface()
{
ProError status;
ProMdldata mdldata;
ProMdl pSldMdl;
status = ProMdlCurrentGet(&pSldMdl);
if (status != PRO_TK_NO_ERROR)
{
AfxMessageBox(_T("打开模型失败!"));
return PRO_TK_NO_ERROR;
}
ProSurface** pSrfArray = NULL;
ProSrftype pSrfType = PRO_SRF_PLANE;
ProError err;
err = ProArrayAlloc(0, sizeof(ProSurface), 1, (ProArray*)pSrfArray);
SolidSurface sSldSrf;
err = ProArrayAlloc(0, sizeof(ProSurface), 1, (ProArray*)&sSldSrf.pSrf);
err = ProSolidSurfaceVisit((ProSolid)pSldMdl // 实体句柄
, VisitSolidSurface // 访问函数 如果它不返回 PRO_TK_NO_ERROR, 那么访问停止
, NULL // 筛选函数 如果为空,表示访问所有的曲面
, &sSldSrf); // 传递给访问函数和筛选函数的变量,用于存储访问中入队的实体表面
if (err != PRO_TK_NO_ERROR)
return err;
int nSrfNum = 0;
// 遍历实体表面
err = ProArraySizeGet(sSldSrf.pSrf, &nSrfNum);
for (int i = 0; i < nSrfNum; i++)
{
ProSurface pSrf = sSldSrf.pSrf;
if (pSrfType != PRO_SRF_NONE)
{
ProGeomitem pSrfGeom;
err = ProSurfaceToGeomitem((ProSolid)pSldMdl, pSrf, &pSrfGeom);
if (err != PRO_TK_NO_ERROR)
continue;
ProGeomitemdata* pSrfGeomData;
err = ProGeomitemdataGet(&pSrfGeom, &pSrfGeomData);
if (err != PRO_TK_NO_ERROR)
continue;
ProSrftype pSrfType2 = pSrfGeomData->data.p_surface_data->type;
//ProGeomitemdataFree(&pSrfGeomData);
if (pSrfType2 != pSrfType)
continue;
else {
CStringW cstrInfo; // 存储当前平面的法向量和原点信息
cstrInfo = L"面的类型: 平面\n";
// 写出平面法向量的三个分量
double a = pSrfGeomData->data.p_surface_data->srf_shape.plane.e3[0];
double b = pSrfGeomData->data.p_surface_data->srf_shape.plane.e3[1];
double c = pSrfGeomData->data.p_surface_data->srf_shape.plane.e3[2];
CStringW cstrPlaneNormalVector;
cstrPlaneNormalVector.Format(L"平面的法向量: (%.2f, %.2f, %.2f)\n", a, b, c);
// 写出平面的平移分量
double x0 = pSrfGeomData->data.p_surface_data->srf_shape.plane.origin[0];
double y0 = pSrfGeomData->data.p_surface_data->srf_shape.plane.origin[1];
double z0 = pSrfGeomData->data.p_surface_data->srf_shape.plane.origin[2];
CStringW cstrPlaneOrigin;
cstrPlaneOrigin.Format(L"平面的原点%.2f,%.2f,%.2f)", x0, y0, z0);
// 写出平面的截距
double d = -a*x0 - b*y0 - c*z0;
// 则平面的方程为:ax+by+cz+d=0;
cstrInfo += cstrPlaneNormalVector + cstrPlaneOrigin;
MessageBoxW(NULL, cstrInfo, L"icaxdev: Sample004", MB_OK);
struct plane p;
p.a = a;
p.b = b;
p.c = c;
p.d = d;
allPlanes.push_back(p);
}
}
err = ProArrayObjectAdd((ProArray*)pSrfArray, -1, 1, &pSrf);
}
err = ProArrayFree((ProArray*)&sSldSrf.pSrf);
return PRO_TK_NO_ERROR;
}
将ProSrftype pSrfType = PRO_SRF_PLANE 修改为其他类型则可以提取其他类型surface的方程
|
评分
-
查看全部评分
|