creo提取模型所有平面
#include "stdafx.h" #include <ProSolid.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的方程
转载请注明出处: 芝麻开花
本文的链接地址: http://www.vmould.cn/?post=149
发表评论 取消回复