• BRep Shapes Based on Tessellated Geometry


    BRep Shapes Based on Tessellated Geometry

    eryar@163.com

    Key Words. BRep Shape, Tessellated Geometry, Mesh, STL

    1. Introduction

    OCCTTopoDS允许定义只包含显示数据的BRep体,如只包含边的显示数据:多段线;面的显示数据:网格,而不包含几何曲线和曲面。只包含显示数据的BRep体有时候很有用,如只需要显示一下而不对其做任何修改。但是OCC7.3.0版本之前是不支持这些显示数据的。这里说的不支持的意思是不支持显示数据的功能,如不能显示只包含显示数据的BRep体等等。

    OCC7.3.0版本之后陆续想添加对只包含显示数据的BRep的支持,包括如下功能:

    计算包围盒;

    计算网格面积;

    计算两个BRep之间的距离;

    计算HLR(隐藏线消除);

    相关的内容在其官网上,网址: https://tracker.dev.opencascade.org/view.php?id=28125

    2. Display Mesh

    OCC中支持的网格文件只有STL文件,在Draw Test Harness中提供了读取STL文件的命令readstl,命令参数如下图所示:

     

    Figure 1. Draw readstl command

    第一个参数shape是读取STL生成的BRep名称;

    第二个参数fileSTL文件名;

    第三个参数triangulation是可选参数,如果输入triangulation,则采用新的方式即直接生成网格;否则采用原来的方式,即将网格的每个三角形生成一个TopoDS_Face

     

    下面将这些命令写在一个Tcl脚本文件中,把OCC数据data文件夹中的STL文件进行显示, 

    pload ALL
    
    readstl s [pwd]/data/stl/bearing.stl triangulation
    
    vdisplay s

    下面对上述脚本进行解释。

    第一行pload ALL是加载OCC所有的脚本命令;

    第二行使用readstl命令,且设置成triangulation读取模式;

    第三行是在三维视图窗口中显示读取的STL模型;

     

    直接在Draw Test Harness中输入上述命令也可以,反正只有几行。或者把这几行命令保存成一个文件,再使用source命令来加载也可以。下面是在3D Viewer中显示读取的STL模型:

     

    Figure 2. Shaded STL model in 3D Viewer

    使用快捷键S/W来切换显示模式,S表示Shaded,是着色渲染模式;W表示Wireframe,是线框显示模式。下图为切换到线框显示模式的效果:

     

    Figure 3. Wireframe STL model in 3D Viewer

    从上图可知,采用直接显示网格的方式显示的STL模型在线框模式的时候,效果不是很理想。一般的三维软件对于这种网格的线框模式就是直接显示每个三角形。如下图所示:

     

    Figure 4. Wireframe of the STL model

    所以,如果有需要在OCC中显示STL模型的线框,则需要自己再作处理,可以选择一些边加到BRep体中,不一定像上图所示那样显示每一个网格三角形。

    3. Source Code

    根据原来介绍的通过Draw的命令查找其源实现的方法,找到readstl命令的源码在文件XSDRAWSTLVRML.cxx中,源码如下所示:

    //=============================================================================
    //function : readstl
    //purpose  : Reads stl file
    //=============================================================================
    static Standard_Integer readstl(Draw_Interpretor& theDI,
                                    Standard_Integer theArgc,
                                    const char** theArgv)
    {
      if (theArgc < 3)
      {
        theDI << "wrong number of parameters" << "
    ";
        return 1;
      }
      else
      {
        if (theArgc == 4 &&
            strcmp("triangulation", theArgv[3]) == 0)
        {
          // Read STL file to the triangulation.
          Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator (theDI, 1);
          Handle(Poly_Triangulation) aTriangulation = RWStl::ReadFile (theArgv[2], aProgress);
    
          TopoDS_Face aFace;
          BRep_Builder aB;
          aB.MakeFace(aFace);
          aB.UpdateFace(aFace, aTriangulation);
          DBRep::Set(theArgv[1], aFace);
        }
        else
        {
          TopoDS_Shape aShape;
          Standard_DISABLE_DEPRECATION_WARNINGS
          StlAPI::Read(aShape, theArgv[2]);
          Standard_ENABLE_DEPRECATION_WARNINGS
          DBRep::Set(theArgv[1], aShape);
        }
      }
    
      return 0;
    }

    当使用选项triangulation时,采用新的读取STL函数得到网格数据,再用BRep体的底层函数生成一个TopoDS_Face,直接将网格数据aTriangulation设置在Face中。

    当不使用选项triangulation时,还是采用老的方式来读取STL模型。老的方式读取速度慢,且将网格中每个三角形生成一个TopoDS_Face,占用大量内存,是效率不高的方式,所以标记为作废状态。开发者应尽量采用新的方式。

      

    4. Conclusion

    OCC7.3版本开始支持只包含显示数据的BRep体,这样只包含显示数据的BRep体可以直接显示,与原来的将网格数据中的每个三角形都生成TopoDS_Face的方式相比,将会大大提高显示效率。

    因为网格数据中没有包含线框的信息,所以直接显示的网格模型切换到线框模式的效果不好,有时甚至不显示线框。

     

    Figure 5 Propeller STL model

    上图所示的STL螺旋桨模型切换到线线框模式后,就没有了。这时OCC的选择功能也不能使用,即选不中这个模型了。

    如果要显示网格模型的线框,需要自己根据实际情况添加一些Edge以达到理想效果。

    5. References

    1. https://tracker.dev.opencascade.org/view.php?id=28125

     

  • 相关阅读:
    第十六节:Linq用法大全(四)
    第十五节:EF Core大数据量处理(一)之EFCore.BulkExtensions
    第十四节:EF Core性能优化
    查看mysql执行的线程,并杀掉他
    docker安装与卸载
    新手根据菜鸟教程安装docker,从No package docker-io available开始遇到的坑...(转)
    MySQL启动出现The server quit without updating PID file错误解决办法
    Linux下彻底卸载mysql详解
    Linux 下的 Redis 安装 && 启动 && 关闭 && 卸载
    Linux安装mysql
  • 原文地址:https://www.cnblogs.com/opencascade/p/MeshedBRep.html
Copyright © 2020-2023  润新知