OCC Shape 操作

news2025/4/9 11:08:55
#pragma once
#include <iostream>
#include <string>
#include <filesystem>
#include <TopoDS_Shape.hxx>
#include <string>

class GeometryIO {
public:
    // 加载几何模型:支持 .brep, .step/.stp, .iges/.igs
    static TopoDS_Shape Load(const std::string& filename);

    // 保存几何模型:支持 .brep, .step/.stp, .iges/.igs
    static 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() {
    // 创建并保存 BoxShape
    std::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;
    }

    // 创建并保存 CylinderShape
    std::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;
    }

    // 创建并保存 ConeShape
    std::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;
    }

    // 创建并保存 CustomShape
    std::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;
    }

    // 加载并显示保存的 BoxShape
    std::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;
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

从代码上深入学习GraphRag

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

【Redis】通用命令

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

微前端随笔

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

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

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

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

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

【C++11(下)】—— 我与C++的不解之缘(三十二)

前言 随着 C11 的引入&#xff0c;现代 C 语言在语法层面上变得更加灵活、简洁。其中最受欢迎的新特性之一就是 lambda 表达式&#xff08;Lambda Expression&#xff09;&#xff0c;它让我们可以在函数内部直接定义匿名函数。配合 std::function 包装器 使用&#xff0c;可以…

Windows 10/11系统优化工具

家庭或工作电脑使用时间久了&#xff0c;会出现各种各样问题&#xff0c;今天给大家推荐一款专为Windows 10/11系统设计的全能优化工具&#xff0c;该软件集成了超过40项专业级实用程序&#xff0c;可针对系统性能进行深度优化、精准调校、全面清理、加速响应及故障修复。通过系…

浅谈在HTTP中GET与POST的区别

从 HTTP 报文来看&#xff1a; GET请求方式将请求信息放在 URL 后面&#xff0c;请求信息和 URL 之间以 &#xff1f;隔开&#xff0c;请求信息的格式为键值对&#xff0c;这种请求方式将请求信息直接暴露在 URL 中&#xff0c;安全性比较低。另外从报文结构上来看&#xff0c…

LightRAG实战:轻松构建知识图谱,破解传统RAG多跳推理难题

作者&#xff1a;后端小肥肠 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; 2025防失业预警&#xff1a;不会用DeepSeek-RAG建知识库的人正在被淘汰_deepseek-embedding-CSDN博客 从PDF到精准答案&#xff1a;Coze…

C++多线程编码二

1.lock和try_lock lock是一个函数模板&#xff0c;可以支持多个锁对象同时锁定同一个&#xff0c;如果其中一个锁对象没有锁住&#xff0c;lock函数会把已经锁定的对象解锁并进入阻塞&#xff0c;直到多个锁锁定一个对象。 try_lock也是一个函数模板&#xff0c;尝试对多个锁…

垃圾回收——三色标记法(golang使用)

三色标记法(tricolor mark-and-sweep algorithm)是传统 Mark-Sweep 的一个改进&#xff0c;它是一个并发的 GC 算法&#xff0c;在Golang中被用作垃圾回收的算法&#xff0c;但是也会有一个缺陷&#xff0c;可能程序中的垃圾产生的速度会大于垃圾收集的速度&#xff0c;这样会导…

Windows环境下开发pyspark程序

Windows环境下开发pyspark程序 一、环境准备 1.1. Anaconda/Miniconda&#xff08;Python环境&#xff09; 如果不怕包的版本管理混乱&#xff0c;可以直接使用已有的Python环境。 需要安装anaconda/miniconda&#xff08;python3.8版本以上&#xff09;&#xff1a;Anaconda…

SSM婚纱摄影网的设计

&#x1f345;点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345; 项目视频 SS…

1110+款专业网站应用程序UI界面设计矢量图标figma格式素材 Icon System | 1,100+ Icons Easily Customize

1110款专业网站应用程序UI界面设计矢量图标figma格式素材 Icon System | 1,100 Icons Easily Customize 产品特点 — 24 x 24 px 网格大小 — 2px 线条描边 — 所有形状都是基于矢量的 — 平滑和圆角 — 易于更改颜色 类别 &#x1f6a8; 警报和反馈 ⬆️ 箭头 &…