OpenCASCADE+Qt创建建模平台

1、建模平台效果


2、三维控件OCCWidget

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

cpp 复制代码
#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
cpp 复制代码
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提供的各种建模函数进行验证,并实现较为复杂的水瓶建模。

cpp 复制代码
#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、源码地址

相关推荐
用户805533698034 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner4 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz9 天前
QML Hello World 入门示例
qt
xcyxiner12 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner12 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner13 天前
DicomViewer (添加模型类)3
qt
xcyxiner13 天前
DicomViewer (目录调整) 2
qt
xcyxiner13 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00615 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术15 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript