OpenCASCADE+Qt创建建模平台

news2024/11/17 10:25:22

1、建模平台效果

在这里插入图片描述
在这里插入图片描述

2、三维控件OCCWidget

  将V3d_View视图与控件句柄绑定即可实现3d视图嵌入Qt中,为了方便也可以基于QOpenGLWidget控件进行封装,方便嵌入各种窗体使用并自由缩放。

#ifndef OCCTWIDGET_H
#define OCCTWIDGET_H

#include <QWidget>
#include <QMouseEvent>
#include <QWheelEvent>
#include <QKeyEvent>
#include <QApplication>
#include <AIS_InteractiveContext.hxx>
#include <OpenGl_GraphicDriver.hxx>
#include <V3d_View.hxx>
#include <Aspect_Handle.hxx>
#include <Aspect_DisplayConnection.hxx>
#include <Graphic3d_GraphicDriver.hxx>
#include <QOpenGLWidget>
#include <WNT_Window.hxx>

//三维显示窗口

class OCCTWidget : public QOpenGLWidget
{
    Q_OBJECT

public:
    explicit OCCTWidget(QWidget *parent = nullptr);

    //  获取三维环境交互对象
    Handle(AIS_InteractiveContext) getInteractiveContext(){return m_InteractiveContext;}

    //  获取三维显示界面
    Handle(V3d_View)  get3dView(){return m_3dView;}

private:

    // 初始化交互环境
    void initializeInteractiveContext();

    // 交互式上下文能够管理一个或多个查看器(viewer)中的图形行为和交互式对象的选择
    Handle(AIS_InteractiveContext) m_InteractiveContext;

    // 定义查看器(viewer)类型对象上的服务
    Handle(V3d_Viewer) m_3dViewer;

    // 创建一个视图
    Handle(V3d_View) m_3dView;

    // 创建3d接口定义图形驱动程序
    Handle(Graphic3d_GraphicDriver) m_graphicDriver;

protected:

    // 覆写绘图事件
    void paintEvent(QPaintEvent *);

    // 覆写窗口尺寸变化事件
    void resizeEvent(QResizeEvent *);

    // 覆写鼠标按键按下事件
    void mousePressEvent(QMouseEvent *event);

    // 覆写鼠标按键释放事件
    void mouseReleaseEvent(QMouseEvent *event);

    // 覆写鼠标移动事件
    void mouseMoveEvent(QMouseEvent *event);

    // 覆写鼠标滚轮事件
    void wheelEvent(QWheelEvent *event);
private:
    Standard_Integer m_xValue;    // 记录鼠标平移坐标X
    Standard_Integer m_yValue;    // 记录鼠标平移坐标Y
    CurrentAction3d m_currentMode; // 三维场景转换模式
};

#endif // OCCTWIDGET_H
void OCCTWidget::initializeInteractiveContext()
{
    //若交互式上下文为空,则创建对象
    if (m_InteractiveContext.IsNull())
    {
        //此对象提供与X server的连接,在Windows和Mac OS中不起作用
        Handle(Aspect_DisplayConnection) m_display_donnection = new Aspect_DisplayConnection();
        //创建OpenGl图形驱动
        if (m_graphicDriver.IsNull())
        {
            m_graphicDriver = new OpenGl_GraphicDriver(m_display_donnection);
        }
        //获取QWidget的窗口系统标识符
        WId window_handle = (WId) winId();
        
        // 创建Windows NT 窗口
        Handle(WNT_Window) wind = new WNT_Window((Aspect_Handle) window_handle);

        //创建3D查看器
        m_3dViewer = new V3d_Viewer(m_graphicDriver);

        //创建视图
        m_3dView = m_3dViewer->CreateView();
        m_3dView->SetWindow(wind);

        //打开窗口
        if (!wind->IsMapped())
        {
            wind->Map();
        }
        //创建交互式上下文
        m_InteractiveContext = new AIS_InteractiveContext(m_3dViewer);  
        ……………………………………
        ……………………………………
    }
}

3、三维建模类OCCModeling

  对OCC提供的各种建模函数进行验证,并实现较为复杂的水瓶建模。

#include <BRepPrimAPI_MakeSphere.hxx>
#include <BRepPrimAPI_MakeCone.hxx>
#include <BRepPrimAPI_MakeTorus.hxx>
#include <BRepPrimAPI_MakeBox.hxx>
#include <BRepOffsetAPI_MakePipe.hxx>  
#include <AIS_Shape.hxx>

#include <Geom_TrimmedCurve.hxx>
#include <GC_MakeArcOfCircle.hxx>
#include <GC_MakeSegment.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <TopoDS_Wire.hxx>
#include <BRepBuilderAPI_MakeWire.hxx>
#include <BRepBuilderAPI_Transform.hxx>
#include <BRepBuilderAPI_MakeFace.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <TopoDS.hxx>
#include <BRepPrimAPI_MakePrism.hxx>
#include <BRepFilletAPI_MakeFillet.hxx>
#include <TopExp_Explorer.hxx>
#include <BRepPrimAPI_MakeCylinder.hxx>
#include <BRepAlgoAPI_Fuse.hxx>
#include <Geom_Plane.hxx>
#include <TopoDS_Edge.hxx>
#include <BRepOffsetAPI_MakeThickSolid.hxx>
#include <Geom_CylindricalSurface.hxx>
#include <Geom2d_Ellipse.hxx>
#include <Geom2d_TrimmedCurve.hxx>
#include <GCE2d_MakeSegment.hxx>
#include <BRepLib.hxx>
#include <BRepOffsetAPI_ThruSections.hxx>
#include <Geom_BezierCurve.hxx>

class OCCTModeling
{
public:
	//  生成立方体
	static TopoDS_Shape CreateBoxModel(Standard_Real _dx = 1.0, Standard_Real _dy = 1.0, Standard_Real _dz = 1.0);

	//  生成圆柱
	static TopoDS_Shape CreateCylinder(Standard_Real _R = 0.5, Standard_Real _H = 2.0);

	//  球体
	static TopoDS_Shape CreateSphere(Standard_Real _R = 1.0);

	//  生成圆锥
	static TopoDS_Shape CreateCone(Standard_Real _R1 = 1.0, Standard_Real _R2 = 0.0, Standard_Real _H = 2.0);

	//  生成圆环体
	static TopoDS_Shape CreateTorus(Standard_Real _R1 = 2.0, Standard_Real _R2 = 0.5);

	//  生成水瓶 
	static TopoDS_Shape CreateBottle(Standard_Real _Width = 60.0, Standard_Real _Height = 40.0, Standard_Real _Thickness = 20.0);

	//  生成直管
	static TopoDS_Shape CreatePipe(const Standard_Real dRadius = 20.0, const Standard_Real dThickness = 2.0, const Standard_Real dLength = 100.0);
};

4、源码地址

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

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

相关文章

C++面向对象程序设计-北京大学-郭炜【课程笔记(五)】

C面向对象程序设计-北京大学-郭炜【课程笔记&#xff08;五&#xff09;】 1、常量对象、常量成员函数1.1、常量对象1.2、常量成员函数1.3、常引用 2、友元&#xff08;friends&#xff09;2.1、友元函数2.2、友元类 3、运算符重载的基本概念3.1、运算符重载 4、赋值运算符的重…

C语言数组地址详解及相关题——各种奇奇怪怪的偏难怪

文章目录 一、数组二、[]使用原理三、指针数组与数组指针指针数组数组指针 四、数组名、*数组名与&数组名的区别一维数组二维数组 空间移动计算总结 一、数组 数组&#xff08;英文 array&#xff09;就是一组同类型变量的集合。它具有三个特性&#xff1a;长度固定、连续…

mysql 8.0 日志文件无权限问题处理

无论如何修改权限总是报这个日志文件权限问题。 解决方法 输入指令&#xff1a; setenforce 0 systemctl restart mysgld

解答关于:水牛社软件是做什么的?水牛社软件靠谱么?

很多对我们软件感兴趣但是没有入手的观望者都会有这样的疑问&#xff1a;水牛社软件具体是做什么的&#xff1f;水牛社软件靠谱么&#xff1f; 其实软件的简介已经讲的很清楚了&#xff0c;但是软件不是功能性软件&#xff0c;所以不能给大家免费试用&#xff0c;短期任务版块…

官宣!百度智能云千帆产品发布会3月21日北京见!

回望2023大模型狂奔的一年&#xff0c;百度智能云千帆大模型平台无疑是浓墨重彩的一笔。自2023年3月27日正式问世后&#xff0c;百度智能云千帆大模型平台以突飞猛进的速度持续发展。从模型、应用到生态&#xff0c;“千帆”书写着自身在大模型时代的答卷。 作为全球首个一站式…

老司机都懂的!【打赏】完美运营的最新视频打赏系统

完美运营的最新视频打赏系统优于市面上95%的打赏系统&#xff0c;与其他打赏系统相比&#xff0c;功能更加强大&#xff0c;完美运营且无bug。支付会调、短链接生成、代理后台、价格设置和试看功能等均没有问题。 以上为原简介&#xff0c;经测试验证。成功搭建并可以正常进入…

Linux环境下安装nmp(Centos环境)保姆级教学 一步到位

在CentOS上安装npm&#xff0c;您需要先安装Node.js&#xff0c;因为npm是Node.js的包管理器。以下是安装步骤&#xff1a; 更新系统软件包&#xff1a;在安装Node.js之前&#xff0c;建议先更新系统软件包&#xff0c;以确保安装的是最新版本的软件包。运行命令 sudo yum upda…

DetNet论文速读

paper&#xff1a;DetNet: A Backbone network for Object Detection 存在的问题 最近的目标检测模型通常依赖于在ImageNet分类数据集上预训练的骨干网络。由于ImageNet的分类任务不同于目标检测&#xff0c;后者不仅需要识别对象的类别&#xff0c;而且需要对边界框进行空间…

几种常见的python开发工具

​ Python是一种功能强大且易于学习的编程语言&#xff0c;被广泛应用于数据科学、机器学习、Web开发等领域。随着Python在各个领域的应用越来越广泛&#xff0c;越来越多的Python开发工具也涌现出来。但是&#xff0c;对于新手来说&#xff0c;选择一款合适的Python开发工具可…

SPSS直接输出三线表

STEP1 下载三线表.stt至安装目录的Looks文件夹 STEP2 在SPSS菜单栏中找到 编辑-选项-透视表 表外观下拉到最底&#xff0c;选择三线表&#xff08;如果第一步没保存对是不会出现的&#xff09;&#xff0c;然后点击确定 效果&#xff1a;

穿越牛熊,股市的春天还有多远?

2023年&#xff0c;资本市场的严冬令无数投资者和机构投资者都感受到了前所未有的压力。VC/PE、公募基金、股权投资类公司等机构&#xff0c;在这一年里业绩普遍不佳&#xff0c;寒意弥漫。VC/PE机构的营业收入普遍呈现负增长&#xff0c;公募基金更是历史上首次连续两年亏损&a…

牛客网 华为机试 合唱队

本题抽象出来&#xff0c;我们需要找到最长递增子序列&#xff0c;还需要一个最长递减子序列&#xff0c;然后两个子序列的长度相加减去1就是我们这个合唱队的最大长度。然后我们用所有的人数减去合唱队最大长度&#xff0c;就是我们要求的最少需要几位同学出列。 这个题和上一…

JavaWeb - 3 - JavaScript(JS)

JavaScript(JS)官方参考文档&#xff1a;JavaScript 教程 JavaScript&#xff08;简称&#xff1a;JS&#xff09;是一门跨平台、面向对象的脚本语言&#xff0c;是用来控制网页行为的&#xff0c;它能使网页可交互&#xff08;脚本语言就不需要编译&#xff0c;直接通过浏览器…

Java数组常用操作

创建数组 int[] a {1,2,3};int[] a new int[]{1,2,3};int[] a new int[3];ArrayList<Integer> arr new ArrayList<>(); 添加元素 arr.add(99); //将99加入到数组末尾arr.add(3,99); //将99加入到指定索引3处访问元素 int c1 c[1]; int arr1 arr.get(1); …

基于PHP的汽车能耗优化系统设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 ThinkPHP框架 3 1.2 MySQL数据库 3 1.3 Vue框架 3 1.4 Bootstrap 3 1.5 Highcharts 3 1.6 本章小结 4 2 系统分析 5 2.1 功能需求 5 2.2 用例分析 6 2.3 非功能需求 8 2.4 本章小结 8 3 系统设计 9 3.1 系统总体设计 9 3.…

C++的类与对象(二):this指针

目录 结构体内存对其规则 相关面试题 this指针 相关面试题 右箭头选择运算符-> C语言和C实现Stack的对比 结构体内存对其规则 1、第一个成员在与结构体偏移量为0的地址处 2、其它成员变量要对齐到某个数字&#xff08;对齐数&#xff09;的整数倍的地址处 对齐数 编…

Jumpserver 使用

目录 1、邮箱设置 2、用户管理 创建用户组 创建用户 3、资产管理 创建被管理机器的账号 添加资产 测试资产联通 推送账号 4、权限管理 资产授权 建命令过滤器 测试 使用 Xshell 登录 5、查看命令记录 查看回放 1、邮箱设置 修改当前站点的URL为本机IP或者jumps…

3.8题目练习

1.数的计算 题目其他部分&#xff1a; 这道题目可以先试着自己推一下找一下规律&#xff0c;题目给出的数字是一个小于等于一千的数字&#xff0c;这里我们不妨考虑一下从小往大推&#xff0c;我们从1开始&#xff0c;用f[i]来表示对应i共有几个合法的序列&#xff1a; 当n为1…

设计模式大题做题记录

设计模式大题 09年 上半年&#xff1a; 09年下半年 10年上半年 10年下半年 11年上半年 11年下半年 12年上半年 12年下半年 13年上半年 13年下半年

MindOpt优化器: 浅谈版本0.x和1.x之间API的差异

Mindopt 是一个优化求解器&#xff0c;如果它有两个主要版本——0.xx和1.x.x&#xff08;最新版本1.1.1&#xff09;&#xff0c;它们代表着软件开发的两个不同阶段。版本1.0.0表示软件的一个大的里程碑&#xff0c;代表着软件第一个正式的“成熟”发布版本&#xff0c;而0.25是…