opencascade 得到选择的面的序列号-程序员宅基地

技术标签: 面的序列号  鼠标事件  

opencascade 得到选择的面的序列号

public:
	//头文件中
    //选择模式,鼠标点击模型,选中对应的面
    void selectMode(Handle(AIS_Shape) );

    //获取鼠标选中的对象
    void getShape();

    //提取工件中所有的面
    void pickUp(TopoDS_Shape );

    struct Show_face
    {
        int adv_face_index; //面的索引号
        TopoDS_Face face;
    };

    QVector<Show_face>  workpiece_show_faces;   //必须放在struct Show_face后面
void viewPort::pickUp(TopoDS_Shape pickup)
{
    
    //提取工件中所有的面
    TopExp_Explorer Ex;   
    workpiece_show_faces.clear();
    int index = 0;
    for (Ex.Init(pickup, TopAbs_FACE); Ex.More(); Ex.Next())        
    {
    
        index++; //按顺序给定面的索引
        TopoDS_Face current_face = TopoDS::Face(Ex.Current());   //将资源管理器里面的面对象转到容器中
        Show_face result;
        result.face = current_face;
        result.adv_face_index = index;
        workpiece_show_faces.push_back(result); //这边就是将result这个结构体放入容器workpiece_show_faces中
    }
}

void viewPort::getShape()
{
    
        TopoDS_Shape abc = m_context->DetectedShape();  //获取鼠标选中模型的那个对象      要注意的是,这边必须是选中模型,如果鼠标每选中模型,就出错
        //TopAbs_ShapeEnum bba = abc.ShapeType();
        //qDebug() << bba;   
        int size = workpiece_show_faces.size();
        for (int i = 0; i < size; i++)
        {
    
            TopoDS_Shape cur_face = workpiece_show_faces.at(i).face;
            Standard_Boolean abd = cur_face.IsEqual(abc);
            if (abd)
                qDebug() << workpiece_show_faces.at(i).adv_face_index;
        }   
}

//下面是鼠标按下事件,就是在后面添加了if (m_context->HasDetectedShape()),即“如果鼠标检测到实体”才调用getShape()函数,不然getShape()函数中的“获取鼠标选择对象”功能,在鼠标点击空白地方会出错
void viewPort::mousePressEvent(QMouseEvent* event)
{
    
    //左键按下且CTRL键也按下   平移
    if (((event->buttons() & Qt::LeftButton) && (QApplication::keyboardModifiers() == Qt::ControlModifier)))
    {
    
        m_current_mode = CurAction3d_DynamicPanning;
        m_x_max = event->pos().x(); //记录起始X位置
        m_y_max = event->pos().y(); //记录起始Y位置
        return;
    }
    else if ((event->buttons() & Qt::LeftButton) && (event->buttons() & Qt::RightButton))
    {
    
        // 鼠标左右键齐按:初始化平移
        m_current_mode = CurAction3d_DynamicPanning;
        m_x_max = event->pos().x();
        m_y_max = event->pos().y();
        return;
    }
    //中键按下      旋转
    else if ((event->buttons() & Qt::MidButton))
    {
    
        m_current_mode = CurAction3d_DynamicRotation;
        m_view->StartRotation(event->pos().x(), event->pos().y());
        return;
    }
    else if (event->buttons() & Qt::LeftButton)
    {
    
        // 按下Shift键点击鼠标左键实现多选
        if (qApp->keyboardModifiers() == Qt::ShiftModifier)
        {
    
            m_context->ShiftSelect(true);           
        }
        else
        {
    
            m_context->Select(true);          // 只点击鼠标左键 单选模型   
             //如果当前鼠标位置检测到了实体
            if (m_context->HasDetectedShape())
            {
    
                getShape();
            }
        }
    }
}

//创建一个瓶子作测试
    TopoDS_Shape t_topo_bottle = MakeBottle(70.0, 50.0, 30.0);
    Handle(AIS_Shape) t_ais_bottle = new AIS_Shape(t_topo_bottle);
    m_context->Display(t_ais_bottle, Standard_True);
    m_view->FitAll();
    selectMode(t_ais_bottle); 
    pickUp(t_topo_bottle);
    
//然后上面的程序中还存在的问题是,这个瓶子模型是相当于自己画的,因此会出现运行几次,点击模型同一个面所显示的序列号不同,这个问题在使用导入模型不会出现

//下面是我自己的使用导入模型的一些程序的修改,只是给自己参考使用
void viewPort::shapes_show()
{
    
    //显示机床固定部分
    int FIX_size = FIX_Base.size();            //FIX_Base是Handle_AIS_Shape
    if (FIX_size != 0)
    {
    
        for (int i = 0; i < FIX_size; i++)
        {
    
            m_context->SetColor(FIX_Base[i], Quantity_NOC_GREEN, Standard_False);
            m_context->SetMaterial(FIX_Base[i], Graphic3d_NOM_DEFAULT, Standard_False);
            m_context->SetDisplayMode(FIX_Base[i], 1, Standard_True);
            //m_context->SetTransparency(aShape,0.2,Standard_False);
            //m_context->Display(FIX_Base[i], Standard_False);
            m_context->Display(FIX_Base[i], Standard_True);
            
            //上面的修改是将False改为True,下面是新添加的内容,就是调用selectMode()和pickUp()函数
            TopoDS_Shape topo_FIX_Base = FIX_Base[i]->Shape();           
            m_view->FitAll(); 
            selectMode(FIX_Base[i]);
            pickUp(topo_FIX_Base);
        }
    }
}

这边是瓶子模型,选择不同的面会显示不同的序列号,但是问题就是,瓶子模型是自己画的,所以在运行几次时,会发现每运行一次,点击同一个面所显示的序列号是不同的
这个是导入的模型,不管运行几次,选择的面的序列号是相同的

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_50159400/article/details/110454622

智能推荐

辅助驾驶功能开发-功能规范篇(26)-1-紧急转向辅助ESA_esa紧急转向辅助 什么效果-程序员宅基地

文章浏览阅读708次,点赞4次,收藏2次。本文档定义了高级驾驶辅助领域中紧急转向辅助的基本控制功能及性能需求,适用于紧急转向辅助功能的功能性能开发和测试验证。_esa紧急转向辅助 什么效果

AI:2020年6月24日北京智源大会演讲分享之知识智能专题论坛——11:30-12:00唐杰 教授《CogDL:An Extensive Research Toolkit for Deep Le》_cogdl 唐杰 人工智能-程序员宅基地

文章浏览阅读6.7k次,点赞6次,收藏15次。AI:2020年6月24日北京智源大会演讲分享之知识智能专题论坛——10:05-10:50 唐杰 教授《CogDL:AnExtensiveResearchToolkitforDeepLearningonGraphs》导读:首先感谢北京智源大会进行主题演讲的各领域顶级教授,博主受益匪浅,此文章为博主在聆听各领域教授或专家演讲时,一张一张截图进行保存,希望与大家一起学习,共同进步,一起见证或筑起人工智能的下一个十年。非常欢迎国内外人工智能领域网友,前来留言探讨与分享,同时感谢点赞或..._cogdl 唐杰 人工智能

【服务器数据恢复】Hyper-V虚拟化数据恢复案例_hyper-v虚拟机备份出来还能恢复吗-程序员宅基地

文章浏览阅读1k次,点赞27次,收藏21次。Windows Server操作系统服务器,部署Hyper-V虚拟化环境,虚拟机的硬盘文件和配置文件存放在某品牌MD3200存储中,MD3200存储中有一组由4块硬盘组成的raid5阵列,存放虚拟机的数据文件;另外还有一块硬盘存放虚拟机数据文件的备份。_hyper-v虚拟机备份出来还能恢复吗

人工蜂群算法(ABC)优化最小二乘支持向量机回归预测,ABC-LSSVM回归预测,多变量输入模型。评价指标包括:R2、MAE、MSE、RMSE和MAPE等,代码质量极高,方便学习和替换数据。-程序员宅基地

文章浏览阅读27次。人工蜂群算法(ABC)优化最小二乘支持向量机回归预测,ABC-LSSVM回归预测,多变量输入模型。评价指标包括:R2、MAE、MSE、RMSE和MAPE等,代码质量极高,方便学习和替换数据。

【MATLAB】基于DCT变换的数字水印_after_2=blkproc(u_2,[8,8],'dct2')-程序员宅基地

文章浏览阅读2.1w次,点赞23次,收藏153次。一年前的媒体信号处理的课程的project,现在翻出来打算用python写一遍然而发现自己对这段代码毫无记忆 可能写的时候活在梦里 (:△」∠)翻出来回味一下……注释里面写得很详尽了。 其实因为被大佬们的恶竞刺激到了所以还写了个界面……傻瓜式的,就不贴了……由于我当时考虑的疏忽,我记得能处理的图片大小是有限制的,这一点就请大家自己调整啦。clear;clc;disp('请选择..._after_2=blkproc(u_2,[8,8],'dct2')

阿基里斯追乌龟的思考,空间,时间,速度非连续_阿基里斯“悖论”里收敛的无穷级数-程序员宅基地

文章浏览阅读702次。高中的时候才接触和了解,诺阿基里斯追乌龟的悖论,一直萦绕在自己的心头。在上大学的时候,学习了微积分,自己以为自己懂了,但是最近又思考的时候,发现大学里的那种想法还是存在着一些矛盾,自己没有意识到。再度思考,将自己的想法记录下来,如果存在问题,还请多多指教。 按照积分将追逐的过程映射为无限级数的和,然后极限求解,但是极限本身就是一个无限接近但是不可到达的过程,因此在我看来..._阿基里斯“悖论”里收敛的无穷级数

随便推点

pig install报错:Could not find a version that satisfies the requirement pandas (from versions: none)-程序员宅基地

文章浏览阅读1w次,点赞28次,收藏20次。问题描述:pip install pandas 失败,报错如下:ERROR: Could not find a version that satisfies the requirement pandas (from versions: none)ERROR: No matching distribution found for pandas解决方法:pip install pa..._could not find a version that satisfies the requirement pands (from versions

沉浸式学习51单片机(6)-单总线温度采集-程序员宅基地

文章浏览阅读645次,点赞23次,收藏10次。DS18B20是美国DALLAS公司生产的数字温度传感器,体积小、低功耗、抗干扰能力强。可直接将温度转化成数字信号传送给单片机处理,因而可省去传统的信号放大、A/D转换等外围电路。DS18B20转换时间与分辨率有关。当设定为9位时,转换时间为93.75ms;设定10位时,转换时间为187.5 ms;当设定11位时,转换时间为375ms;当设定为12位时,转换时间为750ms。通过这次学习,我掌握了:1.学习单总线温度传感器DB18B20的原理和通信时序;

LeetCode数据结构之树_leedcode上的树如何表示-程序员宅基地

文章浏览阅读434次。LeetCode数据结构之树1.树的基本概念树是一种非线性数据结构。树结构的基本单位是节点。节点之间的链接,称为分支(branch)。节点与分支形成树状,结构的开端,称为根(root),或根结点。根节点之外的节点,称为子节点(child)。没有链接到其他子节点的节点,称为叶节点(leaf)。如下图是一个典型的树结构:其他重要概念:树的高度:节点到叶子节点的最大值就是其高度。树的深度:高度和深度是相反的,高度是从下往上数,深度是从上往下。因此根节点的深度和叶子节点的高度是 0。_leedcode上的树如何表示

解决Vue3+Vite3 打包部署到nginx后配置非根目录刷新页面报错空白_nginx failed to load module script: expected a jav-程序员宅基地

文章浏览阅读9.9k次,点赞7次,收藏25次。Failed to load module script: Expected a JavaScript module script but the server responded with a MIME type of "text/html". Strict MIME type checking is enforced for module scripts per HTML spec._nginx failed to load module script: expected a javascript module script but

前端周刊:2022-5 期_20225前端资讯-程序员宅基地

文章浏览阅读60次。前端周刊:2022-5 期前端开发videojs-plugin-source-switcher–videojs 视频源切换插件.基于 videojs-resolution-switcher 项目二次开发, 支持 videojs^7.0.0; 更换构建工具为 Vite.写给自己的代码整洁之道写给自己的代码整洁之道2022 Vite vue3 EsLint 超简单配置 按步骤完成即可总算看到了这一天,不用兼职 Webpack 配置工程师了plyr-优秀的开源 WEB 播_20225前端资讯

Android-Handler机制详解,androidstudio电子书_android studio hanlder的值传给函数-程序员宅基地

文章浏览阅读298次。答:Android在设计的时候,封装了一套消息创建,传递,处理机制,如果不遵循这样的机制就没法更新UI信息,就会抛出异常。3、handler怎么用?答:1.post(Runnable)2.postDelayed(Runnable,long)3.sendMessage4sendMessageDelayed4、Android为什么要设置只能通过Handler机制更新UI?答:最根本的问题是解决多线程并发的问题假设如果一个activity中,有多个线程去更新UI,并且都没有加锁机制,那么会产生什么_android studio hanlder的值传给函数