野火论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始


查看: 10421|回复: 4

[分享] 最近写了一段提取模型所有平面的代码,分享一下

[复制链接]

9

主题

29

回帖

1

威望

实习生

Rank: 1

积分
48
发表于 2018-3-14 10:02 | 显示全部楼层 |阅读模式
之前项目要用到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的方程  

评分

参与人数 1威望 +2 收起 理由
野火 + 2 感谢分享

查看全部评分

33

主题

3169

回帖

75

威望

教授

Rank: 8Rank: 8

积分
3577

希望之星勋章

发表于 2018-3-14 16:58 | 显示全部楼层
感谢分享!
回复 支持 反对

使用道具 举报

10

主题

106

回帖

0

威望

助工

Rank: 2

积分
132
发表于 2018-3-15 09:10 | 显示全部楼层
这个要收藏一下,谢谢
回复 支持 反对

使用道具 举报

21

主题

310

回帖

6

威望

工程师

Rank: 3Rank: 3

积分
409
发表于 2018-3-15 09:27 | 显示全部楼层
感谢分享!!!
回复 支持 反对

使用道具 举报

0

主题

198

回帖

0

威望

工程师

Rank: 3Rank: 3

积分
204
发表于 2021-9-22 12:39 | 显示全部楼层

感谢分享!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

本站为非营利性站点,部分资源为网友搜集或发布,仅供学习和研究使用,如用于商业用途,请购买正版。站内所发布的资源,如有侵犯你的权益,请联系我们,本站将立即改正或删除。

QQ|手机版|小黑屋|野火论坛(©2007~2024) ( 苏ICP备11036728号-2 )苏公网安备 32039102000103号

GMT+8, 2024-4-26 06:02 , Processed in 0.109983 second(s), 31 queries .

快速回复 返回顶部 返回列表