首页 creo提取模型所有平面

creo提取模型所有平面

小白鼠 2019-03-31 08:17:19 0 3733

#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的方程 

平面 ·

发表评论