VS2022+Qt5创建openCASCADE渲染窗口并实现基本交互

一、项目背景

        Open CASCADE(简称OCC)是一个开源的三维几何建模内核软件包,由法国Matra Datavision公司开发,广泛应用于CAD(计算机辅助设计)、CAM(计算机辅助制造)和CAE(计算机辅助工程)相关的应用程序开发中。本项目主要是想通过Open CASCADE构建一款CAD建模软件。(注:本人并非专业开发者,文中难免有专业性的错误,恳请广大读者批评指正!)

二、View窗口的构建

        参考官方以及大多数例子,多数将交互和渲染窗口分开构建。这里仅仅构建两个文件“occview.h”和“occview.c”,然后直接在qt界面中使用QTabWidget添加渲染窗口。

头文件如下:

#ifndef _OCCWIDGET_H__
#define _OCCWIDGET_H__

#include <QtWidgets/QWidget>
#include <QtWidgets/QWidget>
#include<AIS_InteractiveContext.hxx>
#include<OpenGl_GraphicDriver.hxx>
#include<V3d_View.hxx>
#include<V3d_Viewer.hxx>
#include<WNT_Window.hxx>
#include<Quantity_NameOfColor.hxx>
#include<gp_Pnt2d.hxx>
#include<TopoDS_Shape.hxx>
#include<ProjLib.hxx>
#include<ElSLib.hxx>
#include <AIS_Manipulator.hxx>
#include<TopoDS_Face.hxx>
#include<BRepBuilderAPI_MakeFace.hxx>
#include<AIS_Shape.hxx>
#include <AIS_ViewCube.hxx>
#include <Standard_Integer.hxx>
#include <TopoDS_Shape.hxx>
#include <BrepPrimAPI_MakeBox.hxx>
#include <Prs3d_DatumAspect.hxx>
#include <AIS_RubberBand.hxx>
#include <AIS_Plane.hxx>
#include <AIS_ViewController.hxx>
#include <Resource_Unicode.hxx>
#include <AIS_TextLabel.hxx>
#include <QtGui/QMouseEvent>
#include <QtGui/QPainter>
#include <QMessageBox>
#include <QDebug>
#include <Geom_Line.hxx>
#include <AIS_Axis.hxx>
#include <Prs3d_LineAspect.hxx>
#include <V3d_SpotLight.hxx>
#include <V3d_PositionalLight.hxx>
#include <Graphic3d_MaterialAspect.hxx>
#include <AIS_Point.hxx>
#include <Geom_Point.hxx>
#include <BRepBuilderAPI_MakeVertex.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <gce_MakeLin.hxx>
#include <gc_MakeCircle.hxx>


class OccWidget : public QWidget, protected AIS_ViewController
{
    Q_OBJECT
signals:
    void drawPointSignal();
    void drawLineSignal();
    void drawCircleSignal();
    void drawRectSignal();


public:
    explicit OccWidget(QWidget* parent = nullptr);
    ~OccWidget();


public:
    enum OCCViewMode {
        VIEW_2D,
        VIEW_3D
    };

    enum OCCDrawMode {
        DRAW_POINT,
        DRAW_LINE,
        DRAW_RECT,
        DRAW_CIRCLE,
        DRAW_POLYLINE,
        DRAW_NOTHING
    };

    OCCViewMode _VIEW_MODE;
    OCCDrawMode _DRAW_MODE;

protected:
    enum Actions {
        Nothings,
        Panning,
        Zooming,
        Rotation,
        Selection,
    };

    Standard_Integer m_x;
    Standard_Integer m_y;
    Standard_Integer select_start_x;
    Standard_Integer select_start_y;
    Actions m_mode;
    Standard_Integer view_width = 0;//视口窗体宽度
    Standard_Integer view_height = 0;//视口窗体高度

public:
    Handle(AIS_InteractiveContext) get_AIS_Context();
    Handle(V3d_View) get_AIS_View();

public:
    /*模型切换为线框模式*/
    void onButtonWire();
    /*模型切换为实体模式*/
    void onButtonSolid();
    /*切换为模型的上部视角*/
    void onButtonUp();
    /*切换为模型的底部视角*/
    void onButtonBottom();
    /*切换为模型的左侧视角*/
    void onButtonLeft();
    /*切换为模型的右侧视角*/
    void onButtonRight();
    /*切换为模型的前面视角*/
    void onButtonFront();
    /*切换为模型的后面视角*/
    void onButtonBack();
    /*切换为模型的等轴测视角*/
    void onButtonSide();


public:
    virtual void setOccViewMode(OCCViewMode view_mode);
    virtual void setDrawMode(OCCDrawMode draw_mode);

private:

    Handle(V3d_View) m_view;
    Handle(V3d_Viewer) m_viewer;
    Handle(AIS_RubberBand) m_selection_rect;
    Handle(AIS_InteractiveContext) m_context;
    Handle(Graphic3d_GraphicDriver) m_graphic_driver;

protected:
    void paintEvent(QPaintEvent* event) override;
    void resizeEvent(QResizeEvent* event) override;
    void wheelEvent(QWheelEvent* event) override;
    void mousePressEvent(QMouseEvent* event) override;
    void mouseMoveEvent(QMouseEvent* event) override;
    void mouseReleaseEvent(QMouseEvent* event) override;
    virtual QPaintEngine* paintEngine() const;

protected:

    Handle(AIS_ViewCube) Create_AIS_ViewCube();
    Handle(AIS_TextLabel) Create_AIS_2DLabel(Standard_CString _str);
    void Create_AIS_Datum();


};


#endif // OCCVIEW_H

源文件如下:

#include "occwidget.h"



OccWidget::OccWidget(QWidget* parent) :
    QWidget(parent),
    AIS_ViewController(),
    _DRAW_MODE(DRAW_NOTHING),
    _VIEW_MODE(VIEW_3D)
{
    /*初始化选择框*/
    this->setFont(QFont("Microsoft YaHei", 9));
    /*初始化*/
    SetAllowRotation(Standard_True);
    //m_view->ChangeRenderingParams().Method = Graphic3d_RM_RAYTRACING;


    if (m_context.IsNull()){
        //此对象提供与X server的连接,在Windows和Mac OS中不起作用
        Handle(Aspect_DisplayConnection) m_display_connection = new Aspect_DisplayConnection();
        //创建OpenGl图形驱动
        if (m_graphic_driver.IsNull()){
            m_graphic_driver = new OpenGl_GraphicDriver(m_display_connection);
        }
        //获取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);
        //创建视图
        m_view = m_viewer->CreateView();
        m_view->SetWindow(wind);
        //打开窗口
        if (!wind->IsMapped()){
            wind->Map();
        }
        //创建交互式上下文
        m_context = new AIS_InteractiveContext(m_viewer);
        m_context->DefaultDrawer()->SetFaceBoundaryDraw(Standard_True);
        //设置查看器的光照
        m_viewer->SetDefaultLights();
        //Handle(V3d_PositionalLight) aPositionalLight =
        //    new V3d_PositionalLight(gp_Pnt(0.0, -100.0, 5.0), Quantity_NOC_GREEN);
        //aPositionalLight->SetAttenuation(1, 0);
        //m_view->SetLightOn(aPositionalLight);

        //打开背景灯光
        m_viewer->SetLightOn();
        //设置视图的背景颜色为黑色
        m_view->SetBackgroundColor(Quantity_NOC_BLACK);
        /*显示直角坐标系,可以配置在窗口显示位置、文字颜色、大小、样式*/
        m_view->TriedronDisplay(Aspect_TOTP_LEFT_LOWER, Quantity_NOC_BLACK, 0.12, V3d_WIREFRAME);
        /*通过提供颜色和填充方法(默认为水平)来定义视图的渐变背景色*/
        m_view->SetBgGradientColors(Quantity_NOC_GRAY, Quantity_NOC_WHITE, Aspect_GFM_VER);
        m_view->MustBeResized();
        /*建模测试*/
        /* 
        TopoDS_Shape box = BRepPrimAPI_MakeBox(1.0,1.0,1.0).Shape();
        Handle(AIS_Shape) aix_box = new AIS_Shape(box);
       Quantity_Color color = Quantity_Color(0.3, 0.5, 0.3, Quantity_TOC_RGB);
        m_context->SetMaterial(aix_box, Graphic3d_NameOfMaterial_Stone, Standard_False);
        m_context->SetColor(aix_box, color, Standard_False);

        m_context->Display(aix_box, 1,1,Standard_True);*/

        /*建立视角立方体*/
        Handle(AIS_ViewCube) H_AisViewCube = Create_AIS_ViewCube();
        m_context->Display(H_AisViewCube, Standard_True);
        /*显示文字*/
        Handle(AIS_TextLabel) H_Label = Create_AIS_2DLabel("Origin.");
        m_context->Display(H_Label, Standard_True);

        /*显示基准面*/
        this->Create_AIS_Datum();



        /* 设置交互式上下文的显示模式*/
        m_context->SetDisplayMode(AIS_Shaded, Standard_True);
        /*
        设置模型高亮风格
        颜色显示方式
        设置高亮颜色
        整体高亮
        设置透明度
        */
        //m_context->HighlightStyle(Prs3d_TypeOfHighlight_LocalDynamic)->SetColor(Quantity_NameOfColor::Quantity_NOC_BLUE);
        //m_context->HighlightStyle(Prs3d_TypeOfHighlight_LocalDynamic)->SetMethod(Aspect_TOHM_COLOR);
        //m_context->HighlightStyle(Prs3d_TypeOfHighlight_LocalDynamic)->SetDisplayMode(-1);
        //m_context->HighlightStyle(Prs3d_TypeOfHighlight_LocalDynamic)->SetTransparency(0.f);
        /*
        设置选择模型的风格
        获取选择风格
        颜色显示方式
        设置选择后颜色
        整体高亮
        设置透明度
        */ 
        //m_context->SelectionStyle()->SetColor(Quantity_NameOfColor::Quantity_NOC_BLUE);
        //m_context->SelectionStyle()->SetMethod(Aspect_TOHM_COLOR);
        //m_context->SelectionStyle()->SetDisplayMode(-1);
        //m_context->SelectionStyle()->SetTransparency(0.f);
    }
    //setAttribute(Qt::WA_PaintOnScreen);
    setAttribute(Qt::WA_NoSystemBackground);
    setBackgroundRole(QPalette::NoRole);
    setFocusPolicy(Qt::StrongFocus);
    setMouseTracking(true);

    m_viewer->Redraw();
    m_view->FitAll();


    //初始化选择框
    m_selection_rect = new AIS_RubberBand();
    m_selection_rect->SetLineType(Aspect_TOL_DASH); // 设置线条类型为实线  
    m_selection_rect->SetLineColor(Quantity_NOC_BLACK); // 设置线条颜色为黑色

}



Handle(AIS_TextLabel) OccWidget::Create_AIS_2DLabel(Standard_CString _str) {

    TCollection_ExtendedString tostr;
    Resource_Unicode::ConvertGBToUnicode(_str, tostr);
    Handle(AIS_TextLabel) a_Label = new AIS_TextLabel();
    a_Label->SetPosition(gp_Pnt(0, 0, 0)); // 设置文本位置
    a_Label->SetText(tostr);
    a_Label->SetColor(Quantity_NOC_RED);
    a_Label->SetFont("Microsoft YaHei");//一定要设置合适的字体,不然不能实现功能
    /*显示点*/

    return a_Label;
}

#include <AIS_InteractiveContext.hxx>
#include <Geom_Plane.hxx>


void OccWidget::Create_AIS_Datum() {
    ///*绘制基准面*/
    Handle(Geom_Plane) planeXY = new Geom_Plane(gp_Pln(gp::XOY()));
    Handle(AIS_Plane) aisPlaneXY = new AIS_Plane(planeXY);
    aisPlaneXY->SetTransformPersistence(new Graphic3d_TransformPers(Graphic3d_TMF_ZoomPers, gp_Pnt(0, 0, 0)));
    aisPlaneXY->SetZLayer(Graphic3d_ZLayerId_Topmost);
    aisPlaneXY->SetDisplayMode(0);
    m_context->Display(aisPlaneXY, Standard_False);

    Handle(Geom_Plane) planeXZ = new Geom_Plane(gp_Pln(gp::ZOX()));
    Handle(AIS_Plane) aisPlaneXZ = new AIS_Plane(planeXZ);
    aisPlaneXZ->SetTransformPersistence(new Graphic3d_TransformPers(Graphic3d_TMF_ZoomPers, gp_Pnt(0, 0, 0)));
    aisPlaneXZ->SetZLayer(Graphic3d_ZLayerId_Topmost);
    aisPlaneXZ->SetDisplayMode(0);
    m_context->Display(aisPlaneXZ, Standard_False);

    Handle(Geom_Plane) planeYZ = new Geom_Plane(gp_Pln(gp::YOZ()));
    Handle(AIS_Plane) aisPlaneYZ = new AIS_Plane(planeYZ);
    aisPlaneYZ->SetTransformPersistence(new Graphic3d_TransformPers(Graphic3d_TMF_ZoomPers, gp_Pnt(0, 0, 0)));
    aisPlaneYZ->SetZLayer(Graphic3d_ZLayerId_Topmost);
    aisPlaneYZ->SetDisplayMode(0);
    m_context->Display(aisPlaneYZ, Standard_False);

    /*创建中心坐标轴*/
    gp_Pnt origin(0, 0, 0);

    gp_Dir xDir(1, 0, 0);
    Handle(AIS_Axis) xAxis = new AIS_Axis(gp_Ax1(origin, xDir));
    xAxis->SetInfiniteState(Standard_False);
    xAxis->SetColor(Quantity_NOC_RED);
    xAxis->SetTransformPersistence(new Graphic3d_TransformPers(Graphic3d_TMF_ZoomPers, origin));
    xAxis->Attributes()->SetZLayer(Graphic3d_ZLayerId_Topmost);
    m_context->Display(xAxis, Standard_True);
    gp_Dir yDir(0, 1, 0);
    Handle(AIS_Axis) yAxis = new AIS_Axis(gp_Ax1(origin, yDir));
    yAxis->SetColor(Quantity_NOC_GREEN);
    yAxis->SetTransformPersistence(new Graphic3d_TransformPers(Graphic3d_TMF_ZoomPers, origin));
    yAxis->Attributes()->SetZLayer(Graphic3d_ZLayerId_Topmost);
    m_context->Display(yAxis, Standard_True);
    gp_Dir zDir(0, 0, 1);
    Handle(AIS_Axis) zAxis = new AIS_Axis(gp_Ax1(origin, zDir));
    zAxis->SetColor(Quantity_NOC_BLUE);
    zAxis->SetTransformPersistence(new Graphic3d_TransformPers(Graphic3d_TMF_ZoomPers, origin));
    zAxis->Attributes()->SetZLayer(Graphic3d_ZLayerId_Topmost);
    m_context->Display(zAxis, Standard_True);
    // 开始交互
    m_view->FitAll();
    m_view->ZFitAll();
    m_view->MustBeResized();


}


Handle(AIS_ViewCube) OccWidget::Create_AIS_ViewCube() {
    //设置视方体
    Handle(AIS_ViewCube) H_AisViewCube = new AIS_ViewCube();
    //下面是自定义每个面的文本
    H_AisViewCube->SetBoxSideLabel(V3d_Xpos, "Right");
    H_AisViewCube->SetBoxSideLabel(V3d_Ypos, "Back");
    H_AisViewCube->SetBoxSideLabel(V3d_Zpos, "Top");
    H_AisViewCube->SetBoxSideLabel(V3d_Xneg, "Left");
    H_AisViewCube->SetBoxSideLabel(V3d_Yneg, "Front");
    H_AisViewCube->SetBoxSideLabel(V3d_Zneg, "Bottom");
    H_AisViewCube->SetSize(45.0, Standard_True); 
    H_AisViewCube->SetBoxColor(Quantity_NOC_WHITE); //设置视方体为白色
    H_AisViewCube->SetTransparency(0.8); 
    //设置视方体每个面的字体为黑色
    H_AisViewCube->SetTextColor(Quantity_Color(Quantity_NOC_MATRABLUE));
    H_AisViewCube->SetFontHeight(18); 

    //设置视方体每个面的边界线
    const Handle(Prs3d_Drawer)& drawer = H_AisViewCube->Attributes();
    drawer->SetupOwnFaceBoundaryAspect(); 
    drawer->SetFaceBoundaryDraw(true);
    //设置边界线的颜色为Quantity_NOC_GRAY
    drawer->FaceBoundaryAspect()->SetColor(Quantity_NameOfColor::Quantity_NOC_GREENYELLOW);
    drawer->FaceBoundaryAspect()->SetWidth(0.5);
    H_AisViewCube->SetMaterial(Graphic3d_MaterialAspect(Graphic3d_NOM_DEFAULT));

    //设置视方体基准线
    drawer->SetDatumAspect(new Prs3d_DatumAspect());
    const Handle_Prs3d_DatumAspect& datumAspect = H_AisViewCube->Attributes()->DatumAspect();
    //设置轴颜色
    datumAspect->ShadingAspect(Prs3d_DP_XAxis)->SetColor(Quantity_NOC_RED);
    datumAspect->ShadingAspect(Prs3d_DP_YAxis)->SetColor(Quantity_NOC_GREEN);
    datumAspect->ShadingAspect(Prs3d_DP_ZAxis)->SetColor(Quantity_NOC_BLUE);
    //设置X,Y,Z文本颜色
    datumAspect->TextAspect(Prs3d_DP_XAxis)->SetColor(Quantity_NOC_RED);
    datumAspect->TextAspect(Prs3d_DP_YAxis)->SetColor(Quantity_NOC_GREEN);
    datumAspect->TextAspect(Prs3d_DP_ZAxis)->SetColor(Quantity_NOC_BLUE);
    /*设置在右上角*/
    H_AisViewCube->SetTransformPersistence(
        new Graphic3d_TransformPers(
            Graphic3d_TMF_TriedronPers,
            Aspect_TOTP_RIGHT_UPPER,
            Graphic3d_Vec2i(100, 100)));


    return H_AisViewCube;

}


void OccWidget::paintEvent(QPaintEvent*){
    m_view->Redraw();
    QPainter* paint = new QPainter;
    paint->begin(this);
    paint->setPen(QPen(Qt::blue, 4, Qt::DashLine));//设置画笔形式 
    paint->setBrush(QBrush(Qt::red, Qt::SolidPattern));//设置画刷形式 
    paint->drawRect(20, 20, 160, 160);
    paint->end();
}

void OccWidget::resizeEvent(QResizeEvent*){
    if (!m_view.IsNull())
    {
        m_view->MustBeResized();
    }
}
QPaintEngine* OccWidget::paintEngine() const{
    return 0;

}
OccWidget::~OccWidget()
{

}

void OccWidget::wheelEvent(QWheelEvent* event) {
    m_view->StartZoomAtPoint(event->position().x(), event->position().y());
    m_view->ZoomAtPoint(0, 0, event->angleDelta().y()*0.06, 0);
}



void OccWidget::mousePressEvent(QMouseEvent* event) {
    /*设置选择框的开始点*/
    select_start_x = event->pos().x();
    select_start_y = event->pos().y();
    /*消息处理*/
    if (event->buttons() & Qt::RightButton) {
        m_mode = Panning;
        m_x = event->pos().x();
        m_y = event->pos().y();
    }
    else if (event->buttons() & Qt::MidButton) {
        if (_VIEW_MODE == VIEW_3D) {
            m_mode = Rotation;
            m_view->StartRotation(event->pos().x(), event->pos().y());
        }
    }
    else if (event->buttons() & Qt::LeftButton) {
        m_mode = Selection;
        select_start_x = event->pos().x();
        select_start_y = event->pos().y();
        /*查看选中的模型*/
        AIS_StatusOfPick sta = m_context->Select(false);
        m_context->UpdateSelected(true);
    }
    /*绘制选择矩形框*/



    /*绘制*/
    if (_DRAW_MODE == DRAW_POINT && event->buttons() & Qt::LeftButton){
        Standard_Real x, y, z;
        m_view->Convert(event->pos().x(), event->pos().y(), x, y, z);
        std::cout << "X:" << x << "Y:" << y << "Z:" << z << std::endl;
        gp_Pnt pnt(x, y, z);
        BRepBuilderAPI_MakeVertex mkVtx(pnt);
        TopoDS_Vertex vertex = mkVtx.Vertex();
        Handle(AIS_Shape) vertex_shape = new AIS_Shape(vertex);
        vertex_shape->SetColor(Quantity_NOC_BLUE);
        emit drawPointSignal();

        
        m_context->Display(vertex_shape, true);

    }
    /*绘制线段*/
    else if (_DRAW_MODE == DRAW_LINE && event->buttons() & Qt::LeftButton) {
        static std::vector<gp_Pnt>points;
        Standard_Real x, y, z;
        m_view->Convert(event->pos().x(), event->pos().y(), x, y, z);
        gp_Pnt pnt(x, y, z);
        points.push_back(pnt);
        std::cout << points.size();
        if (points.size()>=2){
            gp_Lin line = gce_MakeLin(points[0], points[1]);
            TopoDS_Shape edge = BRepBuilderAPI_MakeEdge(line, 0, points[0].Distance(points[1]));
            Handle(AIS_Shape) edge_shape = new AIS_Shape(edge);
            edge_shape->SetColor(Quantity_NOC_BLUE);
            m_context->Display(edge_shape, true);

            points.clear();
        }

        emit drawLineSignal();

    }
    else if (_DRAW_MODE == DRAW_RECT && event->buttons() & Qt::LeftButton) {
        static std::vector<gp_Pnt>points;
        Standard_Real x, y, z;
        m_view->Convert(event->pos().x(), event->pos().y(), x, y, z);
        gp_Pnt pnt(x, y, z);
        points.push_back(pnt);
        std::cout << points.size();
        if (points.size() >= 2) {
            /*绘制*/

            points.clear();
        }

        emit drawRectSignal();

    }
    else if (_DRAW_MODE == DRAW_CIRCLE && event->buttons() & Qt::LeftButton) {
        emit drawCircleSignal();

    }
    else if (_DRAW_MODE == DRAW_POLYLINE && event->buttons() & Qt::LeftButton) {


    }

}


void OccWidget::mouseMoveEvent(QMouseEvent* event) {
    Q_UNUSED(event);
    m_context->MoveTo(event->pos().x(), event->pos().y(), m_view, Standard_True);
    switch (m_mode){
    case OccWidget::Nothings:
        break;
    case OccWidget::Panning:
        m_view->Pan(event->pos().x() - m_x, m_y - event->pos().y());
        m_x = event->pos().x();
        m_y = event->pos().y();
        break;
    case OccWidget::Rotation:
        m_view->Rotation(event->pos().x(), event->pos().y());
        break;
    case OccWidget::Selection:
        m_context->Select(select_start_x, select_start_y, event->pos().x(), event->pos().y(), m_view, Standard_True);
        // TODO:  在此添加命令处理程序代码
        m_view->Window()->Size(view_width, view_height);//获取窗体尺寸
        //设置矩形边界
        m_selection_rect->SetRectangle(select_start_x, view_height - select_start_y, event->pos().x(), view_height - event->pos().y());
        //更新或显示选择框
        if (m_context->IsDisplayed(m_selection_rect))
            m_context->Redisplay(m_selection_rect, Standard_True);
        else
            m_context->Display(m_selection_rect, Standard_True);

        break;
    default:
        break;
    }
}


void OccWidget::setOccViewMode(OCCViewMode view_mode) {
    _VIEW_MODE = view_mode;
    Standard_Integer aWidth = 0, aHeight = 0, anOffset = 0;
    Handle(Graphic3d_AspectMarker3d) aGridAspect = new Graphic3d_AspectMarker3d(Aspect_TOM_RING1, Quantity_NOC_WHITE, 2);
    switch (view_mode) {
    case OccWidget::VIEW_2D:
        this->SetAllowRotation(Standard_False);
        m_viewer->SetGridEcho(aGridAspect);
        m_view->Window()->Size(aWidth, aHeight);
        m_viewer->SetRectangularGridGraphicValues(aWidth, aHeight, anOffset);
        m_viewer->ActivateGrid(Aspect_GT_Rectangular, Aspect_GDM_Lines);
        m_view->SetProj(V3d_Zpos);
        m_viewer->Redraw();
        break;
    case OccWidget::VIEW_3D:
        SetAllowRotation(Standard_True);
        m_viewer->DeactivateGrid();
        m_view->SetBackgroundColor(Quantity_Color(0.0, 0.2, 0.0, Quantity_TOC_RGB));
        m_view->SetProj(V3d_XposYposZpos);
        break;
    default:
        break;
    }

}


void OccWidget::setDrawMode(OCCDrawMode draw_mode) {
    _DRAW_MODE = draw_mode;

}


void OccWidget::mouseReleaseEvent(QMouseEvent* event) {
    m_mode = Nothings;
    /*如果松开左键-取消矩形框*/
    if (event->button() & Qt::LeftButton && m_context->IsDisplayed(m_selection_rect)) {
        m_context->Remove(m_selection_rect, Standard_True);
        m_view->Update();
    }

    //for (m_context->InitSelected(); m_context->MoreSelected(); m_context->NextSelected()){
    //    //选取的asi显示对象
    //    Handle(AIS_InteractiveObject)  aisObj = m_context->SelectedInteractive();
    //    //选的具体对象边 线 面
    //    TopoDS_Shape aShape = m_context->SelectedShape();
    //    if (aShape.IsNull())
    //        return;
    //    //选取的shape对象类型	
    //    std::string strType = "NULL";
    //    TopAbs_ShapeEnum aShapeType = aShape.ShapeType();
    //    switch (aShapeType){
    //    case TopAbs_COMPOUND:
    //        strType = "TopAbs_COMPOUND";
    //        break;
    //    case TopAbs_COMPSOLID:
    //        strType = "TopAbs_COMPSOLID";
    //        break;
    //    case TopAbs_SOLID:
    //        strType = "TopAbs_SOLID";
    //        break;
    //    case TopAbs_SHELL:
    //        strType = "TopAbs_SHELL";
    //        break;
    //    case TopAbs_FACE:
    //        strType = "TopAbs_FACE";
    //        break;
    //    case TopAbs_WIRE:
    //        strType = "TopAbs_WIRE";
    //        break;
    //    case TopAbs_EDGE:
    //        strType = "TopAbs_EDGE";
    //        break;
    //    case TopAbs_VERTEX:
    //        strType = "TopAbs_VERTEX";
    //        break;
    //    case TopAbs_SHAPE:
    //        strType = "TopAbs_SHAPE";
    //        break;
    //    default:
    //        break;
    //    }

    //    //QMessageBox::information(this, tr("选取"), tr(strType.c_str()));
    //}

}

//模型切换为线框模式
void OccWidget::onButtonWire(){
    // TODO: 在此添加命令处理程序代码
    m_context->SetDisplayMode(AIS_WireFrame, Standard_True);  //设置显示模式为网状体
}


//模型切换为实体模式
void OccWidget::onButtonSolid(){
    // TODO: 在此添加命令处理程序代码
    m_context->SetDisplayMode(AIS_Shaded, Standard_True);   //设置显示模式为实体
}


//切换为模型的上部视角
void OccWidget::onButtonUp(){
    // TODO: 在此添加命令处理程序代码
    m_view->SetProj(V3d_Zpos, Standard_True);
    m_view->FitAll();
    m_view->ZFitAll();
}

//切换为模型的底部视角
void OccWidget::onButtonBottom(){
    // TODO: 在此添加命令处理程序代码
    m_view->SetProj(V3d_Zneg, Standard_True);
    m_view->FitAll();
    m_view->ZFitAll();
}

//切换为模型的左侧视角
void OccWidget::onButtonLeft(){
    // TODO: 在此添加命令处理程序代码
    m_view->SetProj(V3d_Xneg, Standard_True);
    m_view->FitAll();
    m_view->ZFitAll();

}

//切换为模型的右侧视角
void OccWidget::onButtonRight(){
    // TODO: 在此添加命令处理程序代码
    m_view->SetProj(V3d_Xpos, Standard_True);
    m_view->FitAll();
    m_view->ZFitAll();
}

//切换为模型的前面视角
void OccWidget::onButtonFront(){
    // TODO: 在此添加命令处理程序代码
    m_view->SetProj(V3d_Yneg, Standard_True);
    m_view->FitAll();
    m_view->ZFitAll();
}

//切换为模型的后面视角
void OccWidget::onButtonBack(){
    // TODO: 在此添加命令处理程序代码
    m_view->SetProj(V3d_Ypos, Standard_True);
    m_view->FitAll();
    m_view->ZFitAll();
}


//切换为模型的等轴测视角
void OccWidget::onButtonSide(){
    // TODO: 在此添加命令处理程序代码
    m_view->SetProj(V3d_XposYposZpos, Standard_True);
    m_view->FitAll();
    m_view->ZFitAll();
}

Handle(AIS_InteractiveContext) OccWidget::get_AIS_Context() {
    return m_context;
}
Handle(V3d_View) OccWidget::get_AIS_View() {
    return m_view;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鱼爱码士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值