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

OCC Shape 操作

#pragma once
#include <iostream>
#include <string>
#include <filesystem>
#include <TopoDS_Shape.hxx>
#include <string>class GeometryIO {
public:// 加载几何模型:支持 .brep, .step/.stp, .iges/.igsstatic TopoDS_Shape Load(const std::string& filename);// 保存几何模型:支持 .brep, .step/.stp, .iges/.igsstatic bool Save(const TopoDS_Shape& shape, const std::string& filename);
};#endif // GEOMETRY_IO_H
#include "GeometryIO.h"
#include <BRepTools.hxx>
#include <BRep_Builder.hxx>
#include <STEPControl_Reader.hxx>
#include <STEPControl_Writer.hxx>
#include <IGESControl_Reader.hxx>
#include <IGESControl_Writer.hxx>
#include <Interface_Static.hxx>
#include <filesystem>
#include <iostream>TopoDS_Shape GeometryIO::Load(const std::string& filename) {std::string ext = std::filesystem::path(filename).extension().string();if (ext == ".brep") {TopoDS_Shape shape;BRep_Builder builder;if (!BRepTools::Read(shape, filename.c_str(), builder)) {std::cerr << "Failed to load BREP file: " << filename << std::endl;}return shape;}else if (ext == ".step" || ext == ".stp") {STEPControl_Reader reader;IFSelect_ReturnStatus stat = reader.ReadFile(filename.c_str());if (stat == IFSelect_RetDone) {reader.TransferRoots();return reader.OneShape();}else {std::cerr << "Failed to read STEP file: " << filename << std::endl;}}else if (ext == ".iges" || ext == ".igs") {IGESControl_Reader reader;IFSelect_ReturnStatus stat = reader.ReadFile(filename.c_str());if (stat == IFSelect_RetDone) {reader.TransferRoots();return reader.OneShape();}else {std::cerr << "Failed to read IGES file: " << filename << std::endl;}}std::cerr << "Unsupported file format: " << ext << std::endl;return TopoDS_Shape();
}bool GeometryIO::Save(const TopoDS_Shape& shape, const std::string& filename) {std::string ext = std::filesystem::path(filename).extension().string();if (ext == ".brep") {return BRepTools::Write(shape, filename.c_str());}else if (ext == ".step" || ext == ".stp") {STEPControl_Writer writer;writer.Transfer(shape, STEPControl_AsIs);IFSelect_ReturnStatus stat = writer.Write(filename.c_str());return stat == IFSelect_RetDone;}else if (ext == ".iges" || ext == ".igs") {IGESControl_Writer writer;writer.AddShape(shape);writer.ComputeModel();return writer.Write(filename.c_str());}std::cerr << "Unsupported file format for saving: " << ext << std::endl;return false;
}
// ShapeViewer.hpp
#pragma once#include <TopoDS_Shape.hxx>
#include <vtkSmartPointer.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkActor.h>
#include <vtkPolyDataMapper.h>
#include <vtkInteractorStyleTrackballCamera.h>class ShapeViewer {
public:ShapeViewer();void SetShape(const TopoDS_Shape& shape);void Show();private:vtkSmartPointer<vtkRenderer> renderer;vtkSmartPointer<vtkRenderWindow> renderWindow;vtkSmartPointer<vtkRenderWindowInteractor> interactor;vtkSmartPointer<vtkInteractorStyleTrackballCamera> interactorStyle;vtkSmartPointer<vtkActor> actor;vtkSmartPointer<vtkPolyDataMapper> mapper;
};
// ShapeViewer.cpp#include "ShapeViewer.h"
#include <IVtkTools_ShapeDataSource.hxx>
#include <IVtkOCC_Shape.hxx>ShapeViewer::ShapeViewer() {renderer = vtkSmartPointer<vtkRenderer>::New();renderWindow = vtkSmartPointer<vtkRenderWindow>::New();interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();interactorStyle = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();actor = vtkSmartPointer<vtkActor>::New();mapper = vtkSmartPointer<vtkPolyDataMapper>::New();renderWindow->AddRenderer(renderer);interactor->SetRenderWindow(renderWindow);interactor->SetInteractorStyle(interactorStyle);
}void ShapeViewer::SetShape(const TopoDS_Shape& shape) {vtkNew<IVtkTools_ShapeDataSource> occSource;occSource->SetShape(new IVtkOCC_Shape(shape));mapper->SetInputConnection(occSource->GetOutputPort());actor->SetMapper(mapper);renderer->AddActor(actor);
}void ShapeViewer::Show() {renderWindow->Render();interactor->Start();
}
// 加载并显示保存的 BoxShape
#include "ShapeViewer.h"
#include "ShapeBase.h"
#include "BoxShape.h"
#include "CylinderShape.h"
#include "ConeShape.h"
#include "CustomShape.h"#include <memory>
#include <vtkAutoInit.h>
#include <iostream>VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);int main() {// 创建并保存 BoxShapestd::unique_ptr<ShapeBase> boxShape = std::make_unique<BoxShape>(1.0, 2.0, 3.0);if (boxShape->Save("box.brep")) {std::cout << "Box shape saved successfully." << std::endl;}else {std::cerr << "Failed to save Box shape." << std::endl;}// 创建并保存 CylinderShapestd::unique_ptr<ShapeBase> cylinderShape = std::make_unique<CylinderShape>(1.0, 2.0);if (cylinderShape->Save("cylinder.brep")) {std::cout << "Cylinder shape saved successfully." << std::endl;}else {std::cerr << "Failed to save Cylinder shape." << std::endl;}// 创建并保存 ConeShapestd::unique_ptr<ShapeBase> coneShape = std::make_unique<ConeShape>(1.0, 0.5, 2.0);if (coneShape->Save("cone.brep")) {std::cout << "Cone shape saved successfully." << std::endl;}else {std::cerr << "Failed to save Cone shape." << std::endl;}// 创建并保存 CustomShapestd::unique_ptr<ShapeBase> customShape = std::make_unique<CustomShape>();if (customShape->Save("custom_shape.brep")) {std::cout << "Custom shape saved successfully." << std::endl;}else {std::cerr << "Failed to save Custom shape." << std::endl;}// 加载并显示保存的 BoxShapestd::unique_ptr<ShapeBase> loadedShape = std::make_unique<BoxShape>();if (loadedShape->Load("box.brep")) {std::cout << "Box shape loaded successfully." << std::endl;ShapeViewer viewer;viewer.SetShape(loadedShape->GetShape());viewer.Show();}else {std::cerr << "Failed to load Box shape." << std::endl;}return 0;
}

在这里插入图片描述

相关文章:

OCC Shape 操作

#pragma once #include <iostream> #include <string> #include <filesystem> #include <TopoDS_Shape.hxx> #include <string>class GeometryIO { public:// 加载几何模型&#xff1a;支持 .brep, .step/.stp, .iges/.igsstatic TopoDS_Shape L…...

深度学习入门(四):误差反向传播法

文章目录 前言链式法则什么是链式法则链式法则和计算图 反向传播加法节点的反向传播乘法节点的反向传播苹果的例子 简单层的实现乘法层的实现加法层的实现 激活函数层的实现ReLu层Sigmoid层 Affine层/SoftMax层的实现Affine层Softmax层 误差反向传播的实现参考资料 前言 上一篇…...

Linux:页表详解(虚拟地址到物理地址转换过程)

文章目录 前言一、分页式存储管理1.1 虚拟地址和页表的由来1.2 物理内存管理与页表的数据结构 二、 多级页表2.1 页表项2.2 多级页表的组成 总结 前言 在我们之前的学习中&#xff0c;我们对于页表的认识仅限于虚拟地址到物理地址转换的桥梁&#xff0c;然而对于具体的转换实现…...

AF3 OpenFoldDataLoader类解读

AlphaFold3 data_modules 模块的 OpenFoldDataLoader 类继承自 PyTorch 的 torch.utils.data.DataLoader。该类主要对原始 DataLoader 做了批数据增强与控制循环迭代次数(recycling)相关的处理。 源代码: class OpenFoldDataLoader(torch.utils.data.DataLoader):def __in…...

初见TypeScript

类型语言&#xff0c;在代码规模逐渐增大时&#xff0c;类型相关的错误难以排查。TypeScript 由微软开发&#xff0c;它本质上是 JavaScript 的超集&#xff0c;为 JavaScript 添加了静态类型系统&#xff0c;让开发者在编码阶段就能发现潜在类型错误&#xff0c;提升代码质量&…...

常见的 JavaScript 框架和库

在现代前端开发中&#xff0c;JavaScript框架和库成为了构建高效、可维护应用程序的关键工具。本文将介绍四个常见的JavaScript框架和库&#xff1a;React、Vue.js、Angular 和 Node.js&#xff0c;并探讨它们的特点、使用场景及适用场合。 1. React — 构建用户界面的JavaScri…...

机器学习代码基础——ML2 使用梯度下降的线性回归

ML2 使用梯度下降的线性回归 牛客网 描述 编写一个使用梯度下降执行线性回归的 Python 函数。该函数应将 NumPy 数组 X&#xff08;具有一列截距的特征&#xff09;和 y&#xff08;目标&#xff09;作为输入&#xff0c;以及学习率 alpha 和迭代次数&#xff0c;并返回一个…...

PostgreSQL 一文从安装到入门掌握基本应用开发能力!

本篇文章主要讲解 PostgreSQL 的安装及入门的基础开发能力,包括增删改查,建库建表等操作的说明。navcat 的日常管理方法等相关知识。 日期:2025年4月6日 作者:任聪聪 一、 PostgreSQL的介绍 特点:开源、免费、高性能、关系数据库、可靠性、稳定性。 官网地址:https://w…...

WEB安全--内网渗透--LMNTLM基础

一、前言 LM Hash和NTLM Hash是Windows系统中的两种加密算法&#xff0c;不过LM Hash加密算法存在缺陷&#xff0c;在Windows Vista 和 Windows Server 2008开始&#xff0c;默认情况下只存储NTLM Hash&#xff0c;LM Hash将不再存在。所以我们会着重分析NTLM Hash。 在我们内…...

查询条件与查询数据的ajax拼装

下面我将介绍如何使用 AJAX 动态拼装查询条件和获取查询数据&#xff0c;包括前端和后端的完整实现方案。 一、前端实现方案 1. 基础 HTML 结构 html 复制 <div class"query-container"><!-- 查询条件表单 --><form id"queryForm">…...

8.用户管理专栏主页面开发

用户管理专栏主页面开发 写在前面用户权限控制用户列表接口设计主页面开发前端account/Index.vuelangs/zh.jsstore.js 后端Paginator概述基本用法代码示例属性与方法 urls.pyviews.py 运行效果 总结 欢迎加入Gerapy二次开发教程专栏&#xff01; 本专栏专为新手开发者精心策划了…...

室内指路机器人是否支持与第三方软件对接?

嘿&#xff0c;你知道吗&#xff1f;叁仟室内指路机器人可有个超厉害的技能&#xff0c;那就是能和第三方软件 “手牵手” 哦&#xff0c;接下来就带你一探究竟&#xff01; 从技术魔法角度看哈&#xff1a;好多室内指路机器人都像拥有超能力的小魔法师&#xff0c;采用开放式…...

Apache BookKeeper Ledger 的底层存储机制解析

Apache BookKeeper 的 ledger&#xff08;账本&#xff09;是其核心数据存储单元&#xff0c;底层存储机制结合了日志追加&#xff08;append-only&#xff09;、分布式存储和容错设计。Ledger 的数据存储在 Bookie 节点的磁盘上&#xff0c;具体实现涉及 Journal&#xff08;日…...

从代码上深入学习GraphRag

网上关于该算法的解析都停留在大概流程上&#xff0c;但是具体解析细节未知&#xff0c;由于代码是PipeLine形式因此阅读起来比较麻烦&#xff0c;本文希望通过阅读项目代码来解析其算法的具体实现细节&#xff0c;特别是如何利用大模型来完成图谱生成和检索增强的实现细节。 …...

通俗地讲述DDD的设计

通俗地讲述DDD的设计 前言为什么要使用DDDDDD架构分层重构实践关键问题解决方案通过​​领域事件机制​​解耦服务依赖&#xff1a;防止逻辑下沉 领域划分电商场景下的领域划分 结语完结撒花&#xff0c;如有需要收藏的看官&#xff0c;顺便也用发财的小手点点赞哈&#xff0c;…...

【Redis】通用命令

使用者通过redis-cli客户端和redis服务器交互&#xff0c;涉及到很多的redis命令&#xff0c;redis的命令非常多&#xff0c;我们需要多练习常用的命令&#xff0c;以及学会使用redis的文档。 一、get和set命令&#xff08;最核心的命令&#xff09; Redis中最核心的两个命令&…...

网络安全技术文档

网络安全技术文档 1. 概述 网络安全是指通过技术手段和管理措施&#xff0c;保护网络系统的硬件、软件及其数据不受偶然或恶意破坏、更改、泄露&#xff0c;确保系统连续可靠运行&#xff0c;网络服务不中断。 2. 常见网络威胁 2.1 攻击类型 DDoS攻击&#xff1a;分布式拒…...

微前端随笔

✨ single-spa&#xff1a; js-entry 通过es-module 或 umd 动态插入 js 脚本 &#xff0c;在主应用中发送请求&#xff0c;来获取子应用的包&#xff0c; 该子应用的包 singleSpa.registerApplication({name: app1,app: () > import(http://localhost:8080/app1.js),active…...

【36期获取股票数据API接口】如何用Python、Java等五种主流语言实例演示获取股票行情api接口之沪深A股当天逐笔大单交易数据及接口API说明文档

​ 在量化分析领域&#xff0c;实时且准确的数据接口是成功的基石。经过多次实际测试&#xff0c;我将已确认可用的数据接口分享给正在从事量化分析的朋友们&#xff0c;希望能够对你们的研究和工作有所帮助&#xff0c;接下来我会用Python、JavaScript&#xff08;Node.js&…...

C++中的浅拷贝和深拷贝

浅拷贝只是将变量的值赋予给另外一个变量&#xff0c;在遇到指针类型时&#xff0c;浅拷贝只会把当前指针的值&#xff0c;也就是该指针指向的地址赋予给另外一个指针&#xff0c;二者指向相同的地址&#xff1b; 深拷贝在遇到指针类型时&#xff0c;会先将当前指针指向地址包…...

二叉树与红黑树核心知识点及面试重点

二叉树与红黑树核心知识点及面试重点 一、二叉树 (Binary Tree) 1. 基础概念 定义&#xff1a;每个节点最多有两个子节点&#xff08;左子节点和右子节点&#xff09; 术语&#xff1a; 根节点&#xff1a;最顶层的节点 叶子节点&#xff1a;没有子节点的节点 深度&#xf…...

GitHub 趋势日报 (2025年04月01日)

GitHub 趋势日报 (2025年04月01日) 本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星语言1punkpeye/awesome-mcp-serversA collection of MCP servers.⭐ 3280未指定2th-ch/youtube-musicYouTu…...

Java的SeleniumChromeDriver的常用方法

启动和关闭浏览器&#xff1a; driver.get(url)&#xff1a;打开指定的URL。driver.quit()&#xff1a;关闭浏览器并结束ChromeDriver会话。 元素定位&#xff1a; driver.findElement(By.id("elementId"))&#xff1a;通过元素的ID定位。driver.findElement(By.cl…...

字符串、列表、元组、字典

字符串 双引号或者单引号中的数据&#xff0c;就是字符串 字符串输入 之前在学习input的时候&#xff0c;通过它能够完成从键盘获取数据&#xff0c;然后保存到指定的变量中&#xff1b; 注意&#xff1a;input获取的数据&#xff0c;都以字符串的方式进行保存&#xff0c;即…...

【GEE学习笔记】报错解决:“Image.select: Band pattern ‘QA60‘ did not match any bands”

【GEE学习笔记】报错解决&#xff1a;“Image.select: Band pattern ‘QA60’ did not match any bands” 【GEE学习笔记】报错解决&#xff1a;“Image.select: Band pattern ‘QA60’ did not match any bands” 文章目录 【GEE学习笔记】报错解决&#xff1a;“Image.selec…...

AI可以赋能的三农产品、机械与服务

三农赛道涵盖农业、农村和农民相关的产品与服务&#xff0c;涉及农资、农业机械、智能设备、农产品加工及数字化服务等多个领域。随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;AI正在通过赋能农业的生产、管理、销售等各个环节&#xff0c;推动传统农业向…...

ngx_timezone_update

定义在 src\os\unix\ngx_time.c void ngx_timezone_update(void) { #if (NGX_FREEBSD)if (getenv("TZ")) {return;}putenv("TZUTC");tzset();unsetenv("TZ");tzset();#elif (NGX_LINUX)time_t s;struct tm *t;char buf[4];s tim…...

车载诊断架构 --- 整车重启先后顺序带来的思考

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...

GESP C++三级 知识点讲解

C编程三级标准 (一)知识点详述 (1)了解二进制数据编码:原码、反码、补码。 (2)掌握数据的进制转换:二进制、八进制、十进制、十六进制。 (3)掌握位运算:与(&)、或(|)、非(~)、异或(^)、左移(<<)、右移(>>)的基本使用方法及原理。 (4)了解算法的概念与描述&…...

前端 vs 后端:技术分工详解——从用户界面到系统逻辑的全解析

前端&#xff08;Frontend&#xff09; 和 后端&#xff08;Backend&#xff09; 是软件开发中两个核心概念&#xff0c;分别对应用户直接交互的部分和系统背后的逻辑处理部分。它们共同构成完整的应用程序&#xff0c;但分工不同。 目录 一、前端&#xff08;Frontend&#xf…...