STL数据格式有两种一种是二进制 一种是ASCII STL另外一种是Binary STL。


目录

Binary 二进制:

ASCII STL



Binary 二进制:

二进制STL文件用固定的字节数来给出三角面片的几何信息。

【80】80个字节的文件头,用于存贮文件名
【4】 4 个字节的int描述模型的三角面片个数(小端存储)
【50*n】一个三角面片占用固定的50个字节(小端存储),依次是: 
【12】3个4字节浮点数(角面片的法矢量)
【12】3个4字节浮点数(1个顶点的坐标)
【12】3个4字节浮点数(2个顶点的坐标)
【12】3个4字节浮点数(3个顶点的坐标)个
【2】三角面片的最后2个字节用来描述三角面片的属性信息。
一个完整二进制STL文件的大小为三角形面片数乘以 50再加上84个字节。

solid name //一个三角面
facet normal ni nj nkouter loopvertex v1x v1y v1zvertex v2x v2y v2zvertex v3x v3y v3zendloop
endfacet//更多三角面···endsolid name

ASCII STL

ASCII STL,每一个facet由7行数据组成,outer loop后面三个顶点的顺序沿法线矢量逆时针排序,格式如下:

solid name // 文件名及文件路径facet normal ni nj nk          // 三角形法向量的三个分量outer loopvertex v1x v1y v1z     // 第一个顶点坐标vertex v2x v2y v2z     // 第二个顶点坐标vertex v3x v3y v3z     // 第三个顶点坐标endloop
endfacet                       // 完成一个三角形的定义endsolid name                  // 整个文件结束

读取代码

//这个函数是判断是否是二进制还是ASCII码形式 然后调动不同的函数处理
// 传入的文件的位置
bool stldata::readfile(const std::string & pfile)
{std::ifstream in(pfile.c_str(), std::ifstream::in);if (!in)return false;std::string headStr;getline(in, headStr, ' ');in.close();if (headStr.empty())return false;bool isreadsucceed = false;if (headStr[0] == 's'){isreadsucceed=ReadASCII(pfile);}else{isreadsucceed=ReadBinary(pfile);}return isreadsucceed;
}/*********************************
*读取ASCII格式的stl
*********************************/
bool stldata::ReadASCII(const std::string & pfile)
{int i = 0, j = 0, cnt = 0, pCnt = 0;char a[100];char str[100];double x = 0, y = 0, z = 0;std::ifstream in(pfile.c_str(), std::ifstream::in);if (!in)return false;pNewTri = new Triangle3D();do{i = 0;cnt = 0;in.getline(a, 100, '\n');while (a[i] != '\0'){if (!islower((int)a[i]) && !isupper((int)a[i]) && a[i] != ' ')   //为数字和小数点的时候跳出去 break;cnt++;i++;}while (a[cnt] != '\0'){str[j] = a[cnt];cnt++;j++;}str[j] = '\0';j = 0;if (sscanf(str, "%lf%lf%lf", &x, &y, &z) == 3){switch (pCnt%4){case 0: pNewTri->normal.setxyz(x,y,z); break;case 1: pNewTri->vertex[0].setxyz(x, y, z); break;case 2: pNewTri->vertex[1].setxyz(x, y, z); break;case 3: pNewTri->vertex[2].setxyz(x, y, z);pNewTri->cal_angle_theta();triList.push_back(pNewTri);pNewTri = new Triangle3D();  break;default:break;}pCnt=++pCnt%4;}} while (!in.eof());return true;
}/*********************************
*读取Binary格式的stl
*********************************/
bool stldata::ReadBinary(const std::string & pfile)
{char str[80];std::ifstream in(pfile.c_str(), std::ifstream::in | std::ifstream::binary);if (!in)return false;in.read(str, 80);   //前80个字节是作者 姓名等其他信息//number of trianglesint triangles;in.read((char*)&triangles, sizeof(int));  //stl 数量if (triangles == 0)return false;for (int i = 0; i < triangles; i++){pNewTri = new Triangle3D();float coorXYZ[12];in.read((char*)coorXYZ, 12 * sizeof(float));pNewTri->normal.setxyz(coorXYZ[0], coorXYZ[1], coorXYZ[2]);pNewTri->vertex[0].setxyz(coorXYZ[3], coorXYZ[4], coorXYZ[5]);pNewTri->vertex[1].setxyz(coorXYZ[6], coorXYZ[7], coorXYZ[8]);pNewTri->vertex[2].setxyz(coorXYZ[9], coorXYZ[10], coorXYZ[11]);pNewTri->cal_angle_theta();triList.push_back(pNewTri);in.read((char*)coorXYZ, 2);  //属性信息}in.close();return true;
}

参考文献:

https://blog.csdn.net/just0kk/article/details/53967846

https://blog.csdn.net/woniu199166/article/details/79271093

QT中读取STL并显示相关推荐

  1. QT学习之解决QT中QIcon图标不显示的问题

    QT学习之解决QT中QIcon图标不显示的问题 参考文章: (1)QT学习之解决QT中QIcon图标不显示的问题 (2)https://www.cnblogs.com/yang12318/p/1069 ...

  2. emwin从外部flash中读取bmp图片显示

    在emwin中有提供了一个从外部读取图片数据进行显示的函数,如下: 而且提供了官方例程,不过官方历程中从外部读取是从外部文件系统中进行读取的bmp图片进行显示,官方例程如下 /* ********** ...

  3. 如何在QT中读取串口数据

    总是能在别人的博客中学到太多太多,谢谢各位对知识的无私共享,谢谢大家 前言 去年我使用Qt编写串口通信程序时,将自己的学习过程写成了教程(Qt编写串口通信程序全程图文讲解),但是由于时间等原因,我只实 ...

  4. Qt中Qlabel 图片拖放显示

    Qt中Qlabel接受图片拖放 1. 先在ui框中放入label控件,并调至合适大小: 暂时就命名为:label 2. 代码中头文件应包含: #include <QUrl> #includ ...

  5. QT中png图片无法显示的问题

    最近在学霍亚飞的<Qt Creator快速入门>,在练习的时候,发现png图片老是不能运行:网上搜索了一下解决方法: 总结如下: 1.最基本的是看自己文件路径是不是对的,有时候设置的是相对 ...

  6. 用JSP从数据库中读取图片并显示在网页上

    环境:mysql+tomcat: <1>先在mysql下建立如下的table. 并insert图像.  mysql.sql文件如下: CREATE TABLE photo ( photo_ ...

  7. QT界面中实现视频帧显示的多种方法及应用

    QT界面中实现视频帧显示的多种方法及应用 (一) 引言 1.1 视频帧在QT界面中的应用场景 1.2 不同方法的性能和适用性分析 1.2.1 使用QLabel和QPixmap 1.2.2 使用QPai ...

  8. QT中使用OpenGL绘制图形

    Qt Creator中的3D绘图及动画教程(参照NeHe) 刚刚学习了Qt Creator,发现Qt提供了QtOpenGL模块,对OpenGL做了不错的封装,这使得我们可以很轻松地在Qt程序中使用Op ...

  9. Qt中使用OpenGL进行绘图

    Qt Creator中的3D绘图及动画教程(参照NeHe) 刚刚学习了Qt Creator,发现Qt提供了QtOpenGL模块,对OpenGL做了不错的封装,这使得我们可以很轻松地在Qt程序中使用Op ...

最新文章

  1. 重磅!《2021中国开源发展蓝皮书》发布
  2. .Net开发时有没有好的页面开发框架?
  3. python 模拟用户点击浏览器_Python-模拟浏览器-下载文献
  4. android bootloader阶段GPIO的控制
  5. 【转】Java中字符串中子串的查找共有四种方法(indexof())
  6. SpringMVC获取请求参数-集合类型
  7. 音视频PaaS的“未毕之旅”
  8. java开发用怎么软件开发_Java 9中的5个功能将改变您开发软件的方式(还有2个不会)...
  9. AFNetworking 3.1.0 使用中某些知识点讲解
  10. 【移植Linux 3.4.2内核第一步】之简单修改
  11. Python shutil.md
  12. 面试珍藏:最常见的200多道Java面试题(2019年最新版)
  13. Linux centos 使用yum安装MySQL
  14. 20个优秀的 CSS 网格系统(CSS Grid Systems)推荐
  15. java维护_java配置和维护
  16. React骚操作——jsx遇到template-directive
  17. 3.JUC线程高级-同步容器 ConcurrentHashMap
  18. SOP、DIP、PLCC、TQFP、PQFP、TSOP、BGA封装解释
  19. 【力扣面试】面试题 04.02. 最小高度树(就是创建二叉平衡树)
  20. python将列表元素全部小写_python实现创建新列表和新字典,并使元素及键值对全部变成小写...

热门文章

  1. Pytorch中torchvision.datasets.ImageFolder报错:Found 0 files in subfolders of:XXX,完美解决!
  2. Oracle Parallel Query
  3. Jekins的简介和使用
  4. Hive 插入数据报错FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask.
  5. 还是学生的时候 想着存些对我有用 的url
  6. 中文词性标注的简单实现
  7. [附源码]Python计算机毕业设计大学生社团管理系统
  8. linux - grep命令
  9. JSP 编译和运行过程与JSP源码简单分析
  10. JAVA学习:将字符串转成数字