当前位置: 首页 > news >正文

Open CASCADE学习|保存为STL文件

STL (Stereolithography) 文件是一种广泛用于3D打印和计算机辅助设计 (CAD) 领域的文件格式。它描述了一个三维模型的表面而不包含颜色、材质或其他非几何信息。STL文件通常用于3D打印过程中,因为它们仅包含构建物体所需的位置信息。

由于STL文件只包含表面信息,因此在导出过程中可能会丢失一些细节,特别是当模型具有非常小的特征或内部几何结构时。因此,在导出之前,最好确保你的模型是“水密的”(即没有内部孔或洞),并且所有的细节都在可接受的打印分辨率内。

为了将一个3D模型保存为STL文件,你通常需要使用一个3D建模软件或CAD软件,如SolidWorks、Fusion 360、Blender、Tinkercad等。

下面基于OCCT实现将3D模型保存为STL文件​:​

void SaveFile(const QString filename)
{std::fstream fs;fs.open(filename.toStdString(), std::ios::out);bool flag = fs.is_open();
​fs << "solid OCC STL\n";TopoDS_Shape aBottle = MakeBottle(50, 70, 30);IMeshTools_Parameters aMeshParams;  //离散化的参数BRepMesh_IncrementalMesh::SetParallelDefault(true);for (TopExp_Explorer Ex(aBottle, TopAbs_FACE); Ex.More(); Ex.Next()){TopoDS_Face aFace = TopoDS::Face(Ex.Current());//划分网格BRepMesh_IncrementalMesh aMesher(aFace, aMeshParams);const Standard_Integer aStatus = aMesher.GetStatusFlags();//读取网格TopLoc_Location  loc = aFace.Location();const  Poly_ListOfTriangulation triangulars = BRep_Tool::Triangulations(aFace, loc); //容器int num = triangulars.Size();
​Poly_ListOfTriangulation::iterator iter = triangulars.begin();for (iter; iter != triangulars.end(); iter++) {Handle(Poly_Triangulation) poy = *iter;Standard_Integer nodNum = poy->NbTriangles();bool f = poy->HasNormals();for (int i = 1; i <= nodNum; i++) {Poly_Triangle tri = poy->Triangle(i);
​Standard_Integer n1, n2, n3;tri.Get(n1, n2, n3); //得到三角形三个顶点编号
​//计算三角形面片的法线double x1 = poy->Node(n1).X();double y1 = poy->Node(n1).Y();double z1 = poy->Node(n1).Z();
​double x2 = poy->Node(n2).X();double y2 = poy->Node(n2).Y();double z2 = poy->Node(n2).Z();
​double x3 = poy->Node(n3).X();double y3 = poy->Node(n3).Y();double z3 = poy->Node(n3).Z();
​double detX1 = x2 - x1;double detY1 = y2 - y1;double detZ1 = z2 - z1;
​double detX2 = x3 - x2;double detY2 = y3 - y2;double detZ2 = z3 - z2;
​double X = detY1 * detZ2 - detZ1 * detY2;double Y = detZ1 * detX2 - detX1 * detZ2;double Z = detX1 * detY2 - detY1 * detX2;
​double module = std::pow(X * X + Y * Y + Z * Z, 0.5);X /= module;Y /= module;Z /= module;
​//gp_Dir normal = poy->Normal(i);
​fs << " facet normal  " << X << " " << Y << " " << Z << "\n";fs << "  outer loop" << "\n";fs << "   vertex  " << poy->Node(n1).X() << " " << poy->Node(n1).Y() << " " << poy->Node(n1).Z() << "\n";//std::cout<< "   vertex  " << poy->Node(n1).X() << " " << poy->Node(n1).Y() << " " << poy->Node(n1).Z() << "\n";fs << "   vertex  " << poy->Node(n2).X() << " " << poy->Node(n2).Y() << " " << poy->Node(n2).Z() << "\n";fs << "   vertex  " << poy->Node(n3).X() << " " << poy->Node(n3).Y() << " " << poy->Node(n3).Z() << "\n";fs << "  endloop" << "\n";fs << " endfacet" << "\n";}}}fs << "endsolid OCC STL\n";fs.close();
}
​

文件有点大,接近30M,打开特别慢

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • thinkphp6入门(18)-- 中间件中除了handle函数,还可以有其它函数吗
  • re:从0开始的CSS学习之路 5. 颜色单位
  • 【教程】Linux使用git自动备份和使用支持文件恢复的rm命令
  • 93 log4j-slf4j-impl 搭配上 log4j-to-slf4j 导致的 StackOverflow
  • Rust语言入门小结(第1篇)
  • SQL,HQL刷题,尚硅谷
  • 【MySQL】字符串函数的学习
  • 使用代理IP有风险吗?如何安全使用代理IP?
  • STM32 硬件随机数发生器(RNG)
  • GNU C和标准C
  • Redis(十三)缓存双写一致性策略
  • 在Ubuntu22.04上部署ComfyUI
  • 【51单片机】外部中断和定时器中断
  • 【数据结构】链表OJ面试题5(题库+解析)
  • Java异常处理 throw和throws
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • Django 博客开发教程 8 - 博客文章详情页
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • es6--symbol
  • JAVA 学习IO流
  • Java多线程(4):使用线程池执行定时任务
  • LeetCode29.两数相除 JavaScript
  • Netty源码解析1-Buffer
  • 树莓派 - 使用须知
  • 小程序开发中的那些坑
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • #define,static,const,三种常量的区别
  • $.ajax中的eval及dataType
  • (003)SlickEdit Unity的补全
  • (MATLAB)第五章-矩阵运算
  • (简单) HDU 2612 Find a way,BFS。
  • (十七)Flink 容错机制
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)树状数组
  • (转载)虚函数剖析
  • .config、Kconfig、***_defconfig之间的关系和工作原理
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .net/c# memcached 获取所有缓存键(keys)
  • .net中生成excel后调整宽度
  • @ResponseBody
  • @Service注解让spring找到你的Service bean
  • @Transactional事务注解内含乾坤?
  • @WebService和@WebMethod注解的用法
  • []串口通信 零星笔记
  • [20171102]视图v$session中process字段含义
  • [BZOJ] 2006: [NOI2010]超级钢琴
  • [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • [CF494C]Helping People
  • [GN] Vue3快速上手1