OpenCasCade学习笔记(三):加载显示STEP格式图片,并实现平移、缩放和旋转操作
C3DWidget.h
#pragma once
#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>
#include "qevent.h"
#include "stable.h"
#define BUTTON_OFF 0
#define BUTTON_ON 1
class C3DWidget : public QWidget
{
Q_OBJECT
public:
C3DWidget(QWidget *parent = Q_NULLPTR);
protected:
//!三维场景转换模式
enum CurrentAction3d
{
CurAction3d_Nothing,
CurAction3d_DynamicPanning, //平移
CurAction3d_DynamicZooming, //缩放
CurAction3d_DynamicRotation //旋转
};
//!覆写绘图事件
void paintEvent(QPaintEvent *);
//!覆写窗口尺寸变化事件
void resizeEvent(QResizeEvent *);
//!返回窗口的绘制引擎
QPaintEngine *paintEngine() const;
//!覆写键盘按键按下事件
//void keyPressEvent(QKeyEvent *event);
//!覆写键盘按键释放事件
//void keyReleaseEvent(QKeyEvent *event);
//!覆写鼠标按键按下事件
void mousePressEvent(QMouseEvent *event);
//!覆写鼠标按键释放事件
void mouseReleaseEvent(QMouseEvent *event);
//!覆写鼠标移动事件
void mouseMoveEvent(QMouseEvent *event);
//!覆写鼠标滚轮事件
void wheelEvent(QWheelEvent *event);
//加载step模型
void loadSTEP();
//显示STEP模型
void displaySTEP();
//把屏幕坐标转换为窗口坐标
gp_Pnt ConvertClickToPoint(Standard_Real theX, Standard_Real theY, Handle(V3d_View) theView);
void DrawLineByMouse(gp_Pnt thePntStart, gp_Pnt thePntEnd);
private:
//!交互式上下文能够管理一个或多个查看器(viewer)中的图形行为和交互式对象的选择
Handle(AIS_InteractiveContext) m_context;
//!定义查看器(viewer)类型对象上的服务
Handle(V3d_Viewer) m_viewer;
//!创建一个视图
Handle(V3d_View) m_view;
//!创建3d接口定义图形驱动程序
Handle(Graphic3d_GraphicDriver) m_graphic_driver;
//存储STEP模型形状
TopoDS_Shape m_Shape;
Handle_AIS_Shape myAISShape;
//线的模型
Handle_AIS_Shape myLine;
Standard_Integer m_x_max; //!记录鼠标平移坐标X
Standard_Integer m_y_max; //!记录鼠标平移坐标Y
CurrentAction3d m_current_mode; //!三维场景转换模式(平移\缩放\旋转)
bool leftMouseBtn = BUTTON_OFF; //记录鼠标左键状态
gp_Pnt m_line_start_point; //记录鼠标画线开始点
//gp_Pnt m_line_end_point; //记录鼠标画线结束点
// bool draw_line = false;
};
C3DWidget.cpp
#include "C3DWidget.h"
#include "ProjLib.hxx"
#include "ELSLib.hxx"
#include "GC_MakeSegment.hxx"
#include "BRepBuilderAPI_MakeEdge.hxx"
#include <gl\GLU.h>
#include <GeomAPI_IntCS.hxx>
#include "qdebug.h"
C3DWidget::C3DWidget(QWidget *parent)
: QWidget(parent)
{
//若交互式上下文为空,则创建对象
if (m_context.IsNull())
{
//此对象提供与X server的连接,在Windows和Mac OS中不起作用
Handle(Aspect_DisplayConnection) m_display_donnection = new Aspect_DisplayConnection();
//创建OpenGl图形驱动
if (m_graphic_driver.IsNull())
{
m_graphic_driver = 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_viewer = new V3d_Viewer(m_graphic_driver, Standard_ExtString("viewer3d"));
//创建视图
m_view = m_viewer->CreateView();
m_view->SetWindow(wind);
//打开窗口</