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.rhkb.cn/news/255277.html

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

相关文章

MacOS 查AirPods 电量技巧:可实现低电量提醒、自动弹窗

要怎么透过macOS 来查询AirPods 电量呢&#xff1f;当AirPods 和Mac 配对后&#xff0c;有的朋友想通过Mac来查询AirPods有多少电量&#xff0c;这个里有几个技巧&#xff0c;下面我们来介绍一下。 透过Mac 查AirPods 电量技巧 技巧1. 利用状态列上音量功能查询 如要使用此功能…

C++自定义函数详解

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 铁汁们新年好呀&#xff0c;今天我们来了解自定义函数。 文章目录 1.数学中的函数 2.什么是自定义函数 3.自定义函数如何使用&#xff1f; 4.值传递和引用传递&#xff08;形参和实参区分&#xff09; …

Acwing---837. 连通块中点的数量

连通块中点的数量 1.题目2.基本思想3.代码实现 1.题目 给定一个包含 n n n个点&#xff08;编号为 1 ∼ n 1∼n 1∼n&#xff09;的无向图&#xff0c;初始时图中没有边。 现在要进行 m m m 个操作&#xff0c;操作共有三种&#xff1a; C a b&#xff0c;在点 a 和点 b …

计算机网络基本知识(二)

文章目录 概要分层为什么分层怎么分层&#xff1f;1.实体2.协议3.服务 分层基本原则正式认识分层详细例子解释 总结 概要 分层知识&#xff1a;概念理解 分层 为什么分层 大致以上五点 为了解决上面的问题&#xff08;复杂&#xff09; 大问题划分为小问题 怎么分层&#…

【后端高频面试题--Mybatis篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;后端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 后端高频面试题--Mybatis篇 什么是Mybatis&#xff1f;Mybatis的优缺点&#xff1f;Mybatis的特点…

提升MySQL访问性能

1. 读写分离 设置多个从数据库&#xff0c;从数据库可能在多个机器中。写操作在主数据库进行主数据库提供数据的主要依据 缓解了MySQL的读压力。 主从复制原理图如下 如果对于读操作有一致性要求&#xff0c;那么读操作去主数据库即可。 2. 连接池 因为一个请求必须要…

C语言-----自定义类型-----结构体枚举联合

结构体和数组一样&#xff0c;都是一群数据的集合&#xff0c;不同的是数组当中的数据是相同的类型&#xff0c;但是结构体中的数据类型可以不相同&#xff0c;结构体里的成员叫做成员变量 结构体类型是C语言里面的一种自定义类型&#xff0c;我们前面已经了解到过int,char,fl…

SpringSecurity(19)——OAuth2客户端信息存储

ClientDetailsService public interface ClientDetails extends Serializable {String getClientId();//客户端idSet<String> getResourceIds();//此客户端可以访问的资源。如果为空&#xff0c;则调用者可以忽略boolean isSecretRequired();//验证此客户端是否需要secr…

LeetCode---383周赛

题目列表 3028. 边界上的蚂蚁 3029. 将单词恢复初始状态所需的最短时间 I 3030. 找出网格的区域平均强度 3031. 将单词恢复初始状态所需的最短时间 II 一、边界上的蚂蚁 这题没什么好说的&#xff0c;模拟就行&#xff0c;本质就是看前缀和有几个为0。 代码如下 class S…

IDEA创建SpringBoot+Mybatis-Plus项目

IDEA创建SpringBootMybatis-Plus项目 一、配置Maven apache-maven-3.6.3的下载与安装&#xff08;详细教程&#xff09; 二、创建SpringBoot项目 在菜单栏选择File->new->project->Spring Initializr&#xff0c;然后修改Server URL为start.aliyun.com&#xff0c…

javaEE - 23( 21000 字 Servlet 入门 -1 )

一&#xff1a;Servlet 1.1 Servlet 是什么 Servlet 是一种实现动态页面的技术. 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一个 web app. 构建动态页面的技术有很多, 每种语言都有一些相关的库/框架来做这件事&#xff0c;Servlet 就是 Tomcat 这个 HTTP…

JAVA设计模式之建造者模式详解

建造者模式 1 建造者模式介绍 建造者模式 (builder pattern), 也被称为生成器模式 , 是一种创建型设计模式. 定义: 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 **建造者模式要解决的问题 ** 建造者模式可以将部件和其组装过程分开…

前端小案例——动态导航栏文字(HTML + CSS, 附源码)

一、前言 实现功能: 这案例是一个具有动态效果的导航栏。导航栏的样式设置了一个灰色的背景&#xff0c;并使用flex布局在水平方向上平均分配了四个选项。每个选项都是一个li元素&#xff0c;包含一个文本和一个横向的下划线。 当鼠标悬停在选项上时&#xff0c;选项的文本颜色…

烟火可禁却难禁,灵境难及终将及

现实痛点 2024年1月30日&#xff0c;贵阳市发生了一件令人痛心的事&#xff0c;有人在小区内放烟花导致失火&#xff0c;一男子具备足够的消防安全知识&#xff0c;知道如何使用消防栓却因设施不合格接不上消防栓&#xff0c;接上了又没水&#xff0c;消防员来也束手无策&…

【大厂AI课学习笔记】【1.5 AI技术领域】(10)对话系统

对话系统&#xff0c;Dialogue System&#xff0c;也称为会话代理。是一种模拟人类与人交谈的计算机系统&#xff0c;旨在可以与人类形成连贯通顺的对话&#xff0c;通信方式主要有语音/文本/图片&#xff0c;当然也可以手势/触觉等其他方式 一般我们将对话系统&#xff0c;分…

Docker 容器网络:C++ 客户端 — 服务器应用程序。

一、说明 在下面的文章中&#xff0c; 将向您概述 docker 容器之间的通信。docker 通信的验证将通过运行 C 客户端-服务器应用程序和标准“ping”命令来执行。将构建并运行两个单独的 Docker 映像。 由于我会关注 docker 网络方面&#xff0c;因此不会提供 C 详细信息。…

【Fabric.js】监听画布or元素的点击、选中、移动、添加、删除销毁、变形等各事件

在fabric使用过程中&#xff0c;如果想要玩各种花样&#xff0c;那么fabric的事件监听是一定、必须、肯定要掌握&#xff01;&#xff01;&#xff01; 例子就用vue项目组件里的代码&#xff0c;fabric的使用跟vue、react、angular之类的框架都没任何关系&#xff01; 并且本de…

第三百一十八回

文章目录 1. 概念介绍2. 使用方法2.1 本地缓冲2.2 服务器缓冲3. 示例代码4. 内容总结我们在上一章回中介绍了"如何让输入键盘不遮挡屏幕"相关的内容,本章回中将介绍如何有效地缓冲网络图片.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的…

部署tomcat

1 idea打包完&#xff0c;找到target目录下的网站 我的叫做 test.webSYS 2 linux 安装 tomcat 后 修改conf下的server.xml中的Connector的port <Connector port"9001" protocol"HTTP/1.1"connectionTimeout"20000"redirectPort"8443…

1、学习 Eureka 注册中心

学习 Eureka 注册中心 一、创建 Eureka 微服务0、SpringBoot 和 SpringCloud 版本1、引入 Eureka 服务端依赖2、启动类加 EnableEurekaServer 注解3、配置 yaml 文件&#xff0c;把 Eureka 服务注册到 Eureka 注册中心4、访问 Eureka 服务端&#xff0c;查看注册中心的服务列表…