AnyCAD(MFC版)三种格式(IGES,STEP,STL)三维零件的读取

Wesley13
• 阅读 782

AnyCAD(MFC版)三种格式(IGES,STEP,STL)三维零件的读取

**注:**显示请参考利用AnyCAD在MFC中对话框中增加三维显示

##零件读取代码 | 类型 | 相关类 | | - | - | | IGES | TopoDataExchangeIges | | STEP | TopoDataExchangeStep | | STL | TopoDataExchangeStl |

###IGES读取与测试

void CAnyCADTest1Dlg::OnBnClickedImportIges()
{
    // TODO: 在此添加控件通知处理程序代码
    CFileDialog igesDlg(TRUE);
    igesDlg.m_ofn.lpstrTitle = _T("读取IGES文件");
    igesDlg.m_ofn.lpstrFilter = _T("IGES(*.iges\0*.iges;*.igs\0All Files\0*.*\0\0)"); 
    if (!igesDlg.DoModal())
    {
        AfxMessageBox(_T("模型导入失败!")); 
        return;
    }
   
#ifdef UNICODE
    USES_CONVERSION;
    string path = T2A(igesDlg.GetPathName());
#else
    string path = igesDlg.GetPathName().GetBuffer(0);
#endif

    TopoDataExchangeIges iges;                //复合类型(Topo_COMPOUND),24个顶点,6个面,24条边
    m_igesShape = iges.Read(path);

//    auto node = m_Window3D.ShowGeometry(m_igesShape, ElementId(2));     //该句为显示读入模型的语句

    ///////////////////////////后面为一些测试//////////////////////////
    EnumTopoShapeType type = m_igesShape.GetShapeType();                //类型

    //对iges的face进行提取
    m_subGroup = GlobalInstance::topoExplor.ExplorFaces(m_igesShape);

    TopoShapeGroup edgeGroup = GlobalInstance::topoExplor.ExplorEdges(m_igesShape);
    EdgeClassifier edgeClassfier;
    edgeClassfier.Initialize(m_igesShape);
    TopoShapeGroup freeEdgeGroup = edgeClassfier.GetFreeEdges();
    int size = edgeGroup.Size();                                        //24
    int size1 = freeEdgeGroup.Size();                                    //23
    int size2 = edgeClassfier.GetSharedEdges().Size();                    //0
    int size3 = edgeClassfier.GetStandaloneEdges().Size();                //0
    for (int i(0); i < size; ++i)
    {
        m_Window3D.ShowGeometry(edgeGroup.GetTopoShape(i), ElementId(i+1));
    }

    m_Window3D.GetView().RequestDraw(1);
}

###STEP读取与测试

void CAnyCADTest1Dlg::OnBnClickedImportStep()
{
    // TODO: 在此添加控件通知处理程序代码
    CFileDialog stepDlg(TRUE);
    stepDlg.m_ofn.lpstrTitle = _T("读取STEP文件");
    stepDlg.m_ofn.lpstrFilter = _T("STEP(*.step\0*.step\0All Files\0*.*\0\0)");
    if (!stepDlg.DoModal())
    {
        AfxMessageBox(_T("模型导入失败!"));
        return;
    }

#ifdef UNICODE
    USES_CONVERSION;
    string path = T2A(stepDlg.GetPathName());
#else
    string path = stepDlg.GetPathName().GetBuffer(0);
#endif

    TopoDataExchangeStep step;        //实体(Topo_SOLID ),8个顶点,6个面,12条边
    m_stepShape = step.Read(path);

//    auto node = m_Window3D.ShowGeometry(m_stpShape, ElementId(2));      //该句为显示读入模型的语句

///////////////////////////后面为一些测试//////////////////////////
    EnumTopoShapeType type = m_stepShape.GetShapeType();        //类型

    //对step的face进行提取
    m_subGroup = GlobalInstance::topoExplor.ExplorFaces(m_stepShape);

    TopoShapeGroup edgeGroup = GlobalInstance::topoExplor.ExplorEdges(m_stepShape);
    EdgeClassifier edgeClassfier;
    edgeClassfier.Initialize(m_stepShape);
    TopoShapeGroup sharedEdgeGroup = edgeClassfier.GetSharedEdges();
    int size = edgeGroup.Size();                                //12
    int size1 = edgeClassfier.GetFreeEdges().Size();            //0
    int size2 = sharedEdgeGroup.Size();                            //11
    int size3 = edgeClassfier.GetStandaloneEdges().Size();        //0
    for (int i(0); i < size2; ++i)
    {
        m_Window3D.ShowGeometry(sharedEdgeGroup.GetTopoShape(i), ElementId(i + 1));
    }
    
    m_Window3D.GetView().RequestDraw(1);
}

###STL读取与测试

void CAnyCADTest1Dlg::OnBnClickedImportStl()
{
    // TODO: 在此添加控件通知处理程序代码
    CFileDialog stlDlg(TRUE);
    stlDlg.m_ofn.lpstrTitle = _T("读取STL文件");
    stlDlg.m_ofn.lpstrFilter = _T("STL(*.stl\0*.stl\0All Files\0*.*\0\0)");
    if (!stlDlg.DoModal())
    {
        AfxMessageBox(_T("模型导入失败!"));
        return;
    }

#ifdef UNICODE
    USES_CONVERSION;
    string path = T2A(stlDlg.GetPathName());
#else
    string path = stlDlg.GetPathName().GetBuffer(0);
#endif

    TopoDataExchangeStl stl;        //三角面片(Topo_SHELL),8个顶点,12个面(三角面),18条边
    m_stlShape = stl.Read(path);

    //    auto node = m_Window3D.ShowGeometry(m_stpShape, ElementId(2));     //该句为显示读入模型的语句
    
    ///////////////////////////后面为一些测试//////////////////////////
    EnumTopoShapeType type = m_stlShape.GetShapeType();         //类型

    //对stl的face进行提取
    m_subGroup = GlobalInstance::topoExplor.ExplorFaces(m_stlShape);

    TopoShapeGroup edgeGroup = GlobalInstance::topoExplor.ExplorEdges(m_stlShape);
    EdgeClassifier edgeClassfier;
    edgeClassfier.Initialize(m_stlShape);
    TopoShapeGroup freeEdgeGroup = edgeClassfier.GetFreeEdges();
    int size = edgeGroup.Size();                            //18
    int size1 = freeEdgeGroup.Size();                        //0
    int size2 = edgeClassfier.GetSharedEdges().Size();        //17
    int size3 = edgeClassfier.GetStandaloneEdges().Size();    //0
    for (int i(0); i < size; ++i)
    {
        m_Window3D.ShowGeometry(edgeGroup.GetTopoShape(i), ElementId(i + 1));
    }

    m_Window3D.GetView().RequestDraw(1);
}

###测试分析   以上程序读取的均为长方体快,为同一长方体块的三种文件。   以上程序中在读取完三种零件后对读取零件的一些属性进行了测试,主要包含以下属性:     (1) type:读取得到的零件的类型;     (2) 边数:包括两种 ——            a)通过GlobalInstance::topoExplor.ExplorEdges获取的物体所有边界,个数为size;            b)通过edgeClassfier.GetFreeEdges获取的物体边界,其中又包括三种边界free edge,shared edge,standalone edge,对应的个数为size1,size2,size3。      测试代码结果如下表所示(表格中后两列是后期补充的实验,测试模型顶点个数及面个数):

零件名称

size

size1

size2

size3

type

顶点个数

面个数

IGES

24

23

0

0

Topo_COMPOUND

24

6

STEP

12

0

11

0

Topo_SOLID

8

6

STL

18

0

17

0

Topo_SHELL

8

12

  从表中可以看出,     (1) 通过edgeClassfier.GetFreeEdges获取的边界个数(size1+size2+size3)总比通过GlobalInstance::topoExplor.ExplorEdges获取的边界个数(size)少1,通过绘制结果可以看出少的是GlobalInstance::topoExplor.ExplorEdges获取的最后一个边界。     (2) IGES获取的零件类型为复合类型,边界个数与顶点个数均为24,相当于每个面单独统计一次边界和顶点,导致测得的长方体边界数为实际的两倍,顶点个数为实际的三倍;     (3) STEP获取的零件类型为实体类型,边界个数与顶点个数均与实际长方体边界个数和顶点个数相同;     (4) STL获取的零件类型为面片类型,且为三角面片。而长方体表面为四边形,因此存储为STL模型时自动对长方体表面进行划分,每个面添加了一条边界从而将四边形转化为三角形面片,因此得到的面个数为12,边界个数为18。通过图像也可以看出(如下图)。

AnyCAD(MFC版)三种格式(IGES,STEP,STL)三维零件的读取

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Django之Django模板
1、问:html页面从数据库中读出DateTimeField字段时,显示的时间格式和数据库中存放的格式不一致,比如数据库字段内容为2012082616:00:00,但是页面显示的却是Aug.26,2012,4p.m.答:为了页面和数据库中显示一致,需要在页面格式化时间,需要添加<td{{dayrecord.p\_time|date:
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这