Opencascade显示模块小测试

因为之前一直使用OSG做显示,最近想试试OCC自带的显示效果怎么样,所以这篇文章做了一个简单的测试,添加一些小功能,说说感受。

我是直接在github上下载eryar老师的occqt例子进行修改的,配置的话比较简单,因为不熟悉AIS,所以也花了一些时间去了解怎么添加一些功能。话不多说,先来看下效果:

简单的实现了下基本的旋转、拖动、缩放、平移以及视图效果。 这个比较简单,就不贴具体的代码了,直接调用即可。这里就提提一下如何实现aisViewCube的位置摆放,这里需要修改SetTransformPersistence的第三个参数。比如如下代码实现aisviewcube在右上角:

aisViewCube->SetTransformPersistence(
        new Graphic3d_TransformPers(
            Graphic3d_TMF_TriedronPers,
            toOccCorner(m_viewTrihedronCorner),
            Graphic3d_Vec2i(85, 85)));

其中:Qt::Corner m_viewTrihedronCorner = Qt::TopRightCorner;//右上角  

如果要在其他地方的话,可以参考如下:

Aspect_TypeOfTriedronPosition OccView::toOccCorner(Qt::Corner corner)
{
    switch (corner) {
    case Qt::TopLeftCorner: return Aspect_TOTP_LEFT_UPPER;
    case Qt::TopRightCorner: return Aspect_TOTP_RIGHT_UPPER;
    case Qt::BottomLeftCorner: return Aspect_TOTP_LEFT_LOWER;
    case Qt::BottomRightCorner: return Aspect_TOTP_RIGHT_LOWER;
    }

    return Aspect_TOTP_LEFT_UPPER; // Fallback
}

渐变色背景实现一般就是这2句:
    Quantity_Color blue = Quantity_Color(152 / 255.0, 152 / 255.0, 152 / 255.0, Quantity_TOC_RGB);
    myView->SetBgGradientColors(blue, Quantity_NOC_WHITE, Aspect_GFM_VER);

意思也很好理解,这里就不多复述了。

后面简单测试了下碰撞检测,用的是求交方法,这个方法对于简单模型还是比较有效的,但是如果模型很大,那么求交就会很慢,所以对于大模型还是不推荐使用这个方法,求交也是OCC自带的功能,可以以2个shape作为参数写成一个函数,参考如下:

bool occQt::IsCommon(TopoDS_Shape shapeA, TopoDS_Shape shapeB)
{
    if (shapeA.IsNull() || shapeB.IsNull())
    {
        qDebug() << "no model imported";
        return false;
    }

    //没有实时性要求,采用bool求交的方法
    Standard_Boolean bRunParallel;
    Standard_Real aFuzzyValue;
    BRepAlgoAPI_Common aBuilder;

    // perpare the arguments
    TopTools_ListOfShape aLS;
    TopTools_ListOfShape aLT;

    aLS.Append(shapeA);  //xx   m_TppoTargetBody
    aLT.Append(shapeB);  //yy   m_TopoMoveBody

    bRunParallel = Standard_True;
    aFuzzyValue = 2.1e-5;

    // set the arguments
    aBuilder.SetArguments(aLS);
    aBuilder.SetTools(aLT);

    aBuilder.SetRunParallel(bRunParallel);
    aBuilder.SetFuzzyValue(aFuzzyValue);

    // run the algorithm
    aBuilder.Build();
    if (aBuilder.HasErrors())
    {
        std::ofstream fout;
        fout.open("errormessage.txt", std::ios_base::app);
        aBuilder.DumpErrors(fout);
        fout.flush();
        fout.close();
        qDebug() << "error";
        return false;
    }

    // result of the operation aR
    const TopoDS_Shape& aR = aBuilder.Shape();

    Bnd_Box B;
    BRepBndLib::Add(aR, B);

    double Xmin, Ymin, Zmin, Xmax, Ymax, Zmax;
    if (!B.IsVoid())
    {
        B.Get(Xmin, Ymin, Zmin, Xmax, Ymax, Zmax);
    }
    int nb = aR.NbChildren();

    if (!B.IsVoid())   //交集部分的最小包围box存在,则说明碰撞
    {
        std::cout << "common" << std::endl;
        return true;
    }
    else
    {
        std::cout << "no common" << std::endl;
        return false;
    }
}

后记:对于OCC的AIS显示做了初步了解,AIS有些功能封装的很不错,但是有些功能还是不怎么方便,显示速度还是不错的。值得继续学习研究。。。。

 

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
Open CASCADE是一个开源的CAD(计算机辅助设计)软件开发平台,它提供了一系列功能模块,可以用于处理几何建模、绘图、网格生成等CAD相关任务。 首先,Open CASCADE的几何模型模块提供了基本的几何数据结构和算法。它支持几何实体的创建、编辑和查询,包括点、线、圆、曲线、曲面、体等。这些实体可以进行各种几何操作,如平移、旋转、缩放、布尔运算等。 其次,Open CASCADE的绘图模块提供了用于生成二维和三维图形的工具。它支持绘制线段、圆弧、多边形等基本图形,并且可以对这些图形进行颜色、线型和填充等属性设置。可以通过这个模块生成各种类型的绘图文件,如SVG(可缩放矢量图形)、PDF(便携式文档格式)等。 此外,Open CASCADE还包含了用于进行网格生成和处理的模块。它可以对几何模型进行离散化,生成三角面网格或四边形网格。生成的网格可以用于有限元分析、计算流体力学等领域的模拟和分析。 还有,Open CASCADE提供了一些用于几何算法和数据处理的模块。例如,它包含了求解线性方程组、图形转换和比较、曲线和曲面拟合、几何间距和交互等算法。这些算法可以帮助开发人员解决各种几何计算和数据处理问题。 总之,Open CASCADE是一个功能强大的CAD软件开发平台,它提供了丰富的功能模块,可以用于处理几何建模、绘图、网格生成等任务,并且它是一个开源项目,可以自由使用和定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值