opencascade鼠标拖拽框选功能

1.首先在OccView中添加用于显示矩形框的类    

//! rubber rectangle for the mouse selection.
    Handle(AIS_RubberBand) mRectBand;

2.设置框选的属性

mRectBand = new AIS_RubberBand();
//设置属性
mRectBand->SetLineType(Aspect_TOL_SOLID); //设置变宽线型为实线
mRectBand->SetLineColor(Quantity_NOC_RED);

3.在鼠标移动的事件中添加新的事件

void OccView::mouseMoveEvent(QMouseEvent* theEvent)
{
    if ((theEvent->buttons() & Qt::LeftButton) && (theEvent->buttons() & Qt::RightButton))
    {
        //鼠标左右按键一起按,执行平移
        myView->Pan(theEvent->pos().x() - myXmax, myYmax - theEvent->pos().y());//沿视图投影的x和y轴平移视图中心,可用于交互式平移操作
        myXmax = theEvent->x();
        myYmax = theEvent->y();
    }
    else if (theEvent->buttons() & Qt::MiddleButton)
    {
        //鼠标滚轮按键
        if (qApp->keyboardModifiers() == Qt::ShiftModifier) //且按下shift按键
        {
            //鼠标滚轮按键执行平移
            myView->Pan(theEvent->pos().x() - myXmax, myYmax - theEvent->pos().y());
            myXmax = theEvent->x();
            myYmax = theEvent->y();
        }
        else
        {
            myView->Rotation(theEvent->x(), theEvent->y());
        }
    }
    else if (theEvent->buttons() & Qt::LeftButton)
    {
        //绘制选择框
        //获得视口尺寸
        int winViewWidth = 0;
        int winViewHeight = 0;
        myView->Window()->Size(winViewWidth, winViewHeight);
        //设置矩形边界
        mRectBand->SetRectangle(myXmax, winViewHeight - myYmax, theEvent->pos().x(), winViewHeight - theEvent->pos().y());
        //更新显示
        if (myContext->IsDisplayed(mRectBand))
        {
            myContext->Redisplay(mRectBand, true);
        }
        else
        {
            myContext->Display(mRectBand, true);
        }
        myContext->SelectRectangle(Graphic3d_Vec2i(myXmax, myYmax), Graphic3d_Vec2i(theEvent->pos().x(), theEvent->pos().y()), myView);
    }
    else
    {
        //将鼠标位置传递到交互环境
        myContext->MoveTo(theEvent->pos().x(), theEvent->pos().y(), myView, Standard_Boolean(true));
    }
}

4.在鼠标释放事件中清空框选

void OccView::mouseReleaseEvent(QMouseEvent* theEvent)
{
    std::cout << myContext->IsDisplayed(mRectBand) << std::endl;
    if (myContext->IsDisplayed(mRectBand))
    {
        myContext->Remove(mRectBand, Standard_True);
        myView->Update();
    }

    //将鼠标位置传递到交互环境
    myContext->MoveTo(theEvent->pos().x(), theEvent->pos().y(), myView, Standard_Boolean(true));
}

效果图:

设计一个opencascade application framework框架需要考虑以下几个方面: 1. 架构设计 首先需要确定框架的架构设计,包括模块、组件、接口等。可以采用MVC(Model-View-Controller)架构或者MVVM(Model-View-ViewModel)架构等,根据具体需求进行选择。在设计时需要考虑到框架的扩展性、可维护性和可重用性。 2. 接口设计 接口是opencascade application framework框架的核心,需要设计好各个组件之间的接口,包括数据传输、消息通信等。在设计接口时需要考虑到框架的可扩展性和可重用性。 3. 模块设计 模块是opencascade application framework框架的基本单元,需要根据具体需求设计各个模块,包括绘图模块、几何模块、数据模块等。在设计模块时需要考虑到模块之间的依赖关系和接口设计。 4. 功能设计 opencascade application framework框架的功能需要根据具体需求进行设计,包括绘图、几何计算、数据管理等。在设计功能时需要考虑到功能的扩展性和可重用性。 5. 测试和调试 测试和调试是框架设计的关键步骤,需要对框架进行全面的测试和调试,确保框架的稳定性和可靠性。可以采用单元测试、集成测试等方法对框架进行测试和调试。 总之,设计一个opencascade application framework框架需要考虑到各个方面,包括架构设计、接口设计、模块设计、功能设计和测试和调试等。需要根据具体需求进行选择和设计,确保框架的稳定性、可扩展性和可重用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值