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,打开特别慢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/465220.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day39- 动态规划part07

一、爬楼梯 题目一&#xff1a;57. 爬楼梯 57. 爬楼梯&#xff08;第八期模拟笔试&#xff09; 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬至多m (1 < m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 注意&#xff1a;…

2 月 7 日算法练习- 数据结构-并查集

并查集 并查集是一种图形数据结构&#xff0c;用于存储图中结点的连通关系。 每个结点有一个父亲&#xff0c;可以理解为“一只伸出去的手”&#xff0c;会指向另外一个点&#xff0c;初始时指向自己。 一个点的根节点是该点的父亲的父亲的的父亲&#xff0c;直到某个点的父亲…

sheng的学习笔记-docker部署数据库oracle,mysql

部署目录&#xff1a;sheng的学习笔记-部署-目录-CSDN博客 docker基础知识可参考 sheng的学习笔记-docker部署&#xff0c;原理图&#xff0c;命令&#xff0c;用idea设置docker docker安装数据库 mac版本 安装oracle 下载oracle镜像 打开终端&#xff0c;输入 docker s…

【java】笔记10:类与对象——本章练习

题目1&#xff1a; 代码如下&#xff1a; import java.util.Scanner; public class Input{public static void main(String[]args){Circle cnew Circle();PassObject yuannew PassObject();System.out.println("r""\t""times");yuan.printAreas…

bert-vits2本地部署报错疑难问题汇总

环境&#xff1a; bert-vits2.3 win 和wsl 问题描述&#xff1a; bert-vits2本地部署报错疑难问题汇总 解决方案&#xff1a; 问题1: Conda安装requirements里面依赖出现ERROR: No matching distribution found for opencc1.1.6 解决方法 需要在 Python 3.11 上使用 Op…

Github 2024-02-09 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-02-09统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目4Go项目2Scala项目1PLpgSQL项目1Ruby项目1HTML项目1Solidity项目1Lua项目1 开源个人理财应用 Mayb…

【Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)】

Linux环境基础开发工具的使用yum、vim、gcc、g、gdb、make/Makefile Linux软件包管理器- yumLinux下安装软件的方式认识yum查找软件包安装软件如何实现本地机器和云服务器之间的文件互传卸载软件 Linux编辑器 - vimvim的基本概念vim下各模式的切换vim命令模式各命令汇总vim底行…

JAVA学习笔记9

1.Java API 文档 1.java类的组织形式 2.字符类型(char) 1.基本介绍 ​ *字符类型可以表示单个字符&#xff0c;字符类型是char&#xff0c;char是两个字节&#xff08;可以存放汉字&#xff09;&#xff0c;多个字符我们用字符串String ​ eg:char c1 ‘a’; ​ char c2…

Linux笔记之Docker进行镜像备份与迁移

Linux笔记之Docker进行镜像备份与迁移 ——2024-02-11 code review! 文章目录 Linux笔记之Docker进行镜像备份与迁移1. 导出容器文件系统为 tar 归档文件2. 将 tar 归档文件导入为新的 Docker 镜像3. 运行新的 Docker 镜像并创建容器 1. 导出容器文件系统为 tar 归档文件 要导…

Ainx-V0.2-简单的连接封装与业务绑定

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d7;本文收录于Ainx系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系列…

【GAMES101】Lecture 20 颜色

目录 光 颜色 加色系统 CIE RGB颜色匹配实验 颜色空间 CIE XYZ颜色空间 HSV颜色空间(Hue-Saturation-Value) CIELAB空间 减色系统&#xff1a;CMYK 光 光是由不同波长的光波组成的&#xff0c;其中可见光的波长范围在400nm到700nm 用谱功率密度&#xff08;Spectral…

2024.2.5 作业

1.请编程实现哈希表的创建存储数组{12,24,234,234,23,234,23},输入key查找的值&#xff0c;实现查找功能 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> typedef int datatype; typedef struct Node {datatype data;str…