FCStd模型中.brp文件解读

 

1.概述

brp文件是一种以文本形式存储数据的文件,其中包含对模型进行过的变换、模型中包含的元素(Vertices、Edges、Wires、Faces等)的信息以及模型的方向、位置等。

OpenCascade会把产生的3D模型通过brp格式的文件进行存储。

2.拓扑结构和几何结构

brp文件主要存储实体的几何信息和拓扑信息,但起初我这个初学者对这两者的概念相当模糊,后参考了一些文献才得出一些理解:

几何数据结构描述的是点、线之间的位置关系,或者说几何数据结构表达的东西更贴近我们肉眼能看到的。比如点位置在哪里、线的长度是多少、方向朝向哪里、最终这些点和线拼凑成了一个什么样的形状。

而拓扑数据结构相对来说要更抽象一些,它抽象也是为了更加注重图形更本质的特征,“拓扑”就是把实体抽象成与其大小、形状无关的“点”,而把连接实体的线路抽象成“线”,进而以图的形式来表示这些点与线之间关系的方法,其目的在于研究这些点、线之间的相连关系。

举个例子来区分一下:如一组点和线组成了长方形、圆和梯形,从几何层面来说他们分别属于不同的几何结构,因为他们点线数量、位置、长度都不同;但从拓扑层面来看,只看点和线之间连接或不连接,他们都是封闭式的连接,那他们就是同一种拓扑结构。

3.brp与BRepTools之间的调用关系

OpenCascade提供了一个类BRepTools,其主要作用是对通过brp表示的拓扑模型进行读写和打印。

OpenCASCADE的类BRepTools中提供了如下函数,可以把TopoDS_Shape中的数据进行导入导出:

1) BRepTools::Dump();

2) BRepTools::Read();

3) BRepTools::Write();

这几个函数比较常用,dump可以通过命令行将TopoDS_Shape的数据实时打印出来;read可以把brp文件中的数据读取出来;write可以把TopoDS_Shape的数据写入brp文件中。

有了这三个函数的支撑,可以自由的在FreeCAD中进行模型信息的存取和打印。

4.brp文件解读

brp文件被分为以下五个部分,其中最主要的是后三个部分

  • content type
  • version
  • location
  • geometry
  • shape

1)content type

截图中选中部分为content type

BNF含义为<content type> = "DBRep_DrawableShape" <_\n><_\n>

content type的内容也可以有其他类型,目前我还没有遇到,随学习深入会对本文章进行修改补充。

2)version

截图中选中部分为version

BNF含义为<version> = ("CASCADE Topology V1,(c) Matra-Datavision" | "CASCADE Topology V2,(c) Matra-Datavision")<_\n>;

3)location

在将模型放置在视图中后,用户或许会对其进行一些交互的视图变换,如平移、旋转、缩放等。从计算机图形学角度来讲,一切的视图调整都是来自矩阵的变换。

因此location中存储两部分:

  • 初等变换矩阵:存储数据为3*4的变换矩阵
  • 复合变换:存储数据为初等变换矩阵的编号及其幂次

上图的例子里选择部分中第二行单独的1是类型值,它代表初等变换矩阵。紧随其后的就是初等变换矩阵的数据

最后一行的 2 1 -1 0 分别表示 类型值为2所代表为复合变换 矩阵1 做-1的幂运算 0为结束

总结来说:一种是初等变换矩阵,类型值为1,直接读取矩阵数据;一种是复合变换,类型值为2,它是在初等变换矩阵的基础上通过Power来实现的复合变换。BRep中记录复合变换的数据为初等变换矩阵的编号及其幂次。通过编号Map得出其对应的初等变换矩阵。

4)geometry

geometry主要存储的是模型的几何信息,其实就是其中几何的坐标和方向,其中涵盖的类型有:

  • <2D curves>
  • <3D curves>
  • <3D polygons>
  • <polygons on triangulations>
  • <surfaces>
  • <triangulations>

整体分布结构为:

几何类型 数量

1(1表示开始) 坐标 方向

在上述例子中表示的是在草图界面中绘制的一个矩形,因为该图中只有4条Curves,因此其他类型后均为0.示意图如下:

第一条线为红色线条,是由坐标为(-52,24,0)的点向方向(1,0,0)即x轴正方向射出的一条线,因此brp文件中该行数据为1 52 24 0 1 0 0

第二条线为蓝色线条,是由坐标为(57,24,0)的点向方向(0,-1,0)即y轴负方向射出的一条线,因此brp文件中该行数据为1 57 24 0 0 -1 0

另外两条也是如此,就不赘述。

geomtry中信息暂时只更新到curves,其他类型后续用到会在此更新

5)shape

该部分存储了建模过程中出现的所有shape,第一行TShapes 9说明本文这个案例中共有9个shape,下面将分别介绍:

  • "Ve" - vertex

Ve表示这是一个vertex

第二行的1.00000001776357e-007为容差值,用来表示位置精度。顶点容差T的几何意义为以顶点为圆心半径为T的球。这个球必须包含所有与这个顶点相连的边的曲线的端点。 实际应用中可以将该点容差范围内其他点看做成一个点,方便了用户手动连线。

第三行是该点的坐标(x,y,z)

后三行暂时没有看懂,不过在我现有的brp模型中顶点后三行都是这几个数,我在文末会贴出大神的源码链接,各位网友如果能从源码中发现什么欢迎私信我或在评论区分享,谢谢。

  • “Ed” - edge

Ed表示这是一个edge

第二行1e-007是容差值,与Vertex中类似,后面的1 1 0 都是边的标志位

第三行最开始的1为起始符,第二个数1为此边的序号,第三个数0对应的是location 0 (具体含义我猜测是这条边要做location 0 一样的变换),第四、五个数0 109.709179表示这条边的range范围

源码中这几个参数被调用的情况我在此列举出来帮助大家理解,这里我把边的序号赋值为c,第location对应的数赋值为l,容差赋值为tol,range的左右边界赋值为first和last

TopoDS_Edge& E = TopoDS::Edge(S);

BRep_Builder myBuilder;

myBuilder.UpdateEdge(E,myCurves.Curve(c), Locations().Location(l),tol);

myBuilder.Range(E,first,last,Standard_True);

updateEdge()和Range()这两个函数的API从官方截图如下:

后面的数暂时也没有理解其含义,其中第四行和倒数第二行在我目前见到的所有Ed中都相同,最后一行的数各不相同。我在文末会贴出大神的源码链接,各位网友如果能从源码中发现什么欢迎私信我或在评论区分享,谢谢。

  • "Wi" - wire
  • "Fa" - face
  • "Sh" - shell
  • "So" - solid
  • "CS" - compsolid
  • "Co" - compound

剩余几种shape都比较简短,内含信息都只有我不理解的那几行,就无法罗列出来,后续随学习深入会补充,网友自己有什么理解也欢迎交流分享。

5.参考资料

eryar:

Topology and Geometry in OpenCascade-Edge:http://www.cppblog.com/eryar/archive/2013/08/24/202739.html

Topology and Geometry in OpenCascade-Vertex:https://www.cnblogs.com/opencascade/p/3603004.html

Locations Section of OpenCascade BRep:https://www.cnblogs.com/opencascade/p/3446718.html#:~:text=%E7%B1%BBTopLoc_Location%E8%A1%A8%E7%A4%BA,%E7%9A%84%E9%87%8D%E6%96%B0%E8%AE%A1%E7%AE%97

OpenCASCADE Shape Location:https://www.cnblogs.com/opencascade/p/5850490.html

OpenCascade BRep Format Description(该篇文章下方参考文献可引至源码):https://www.cnblogs.com/opencascade/p/3434720.html

OpenCascade BRep Format Description(源码在此):http://images.cppblog.com/cppblog_com/eryar/Windows-Live-Writer/OpenCascade-BRep-_13240/BREP%20Format%20Description.pdf

 

小新快跑123,读取、写入brep:https://blog.csdn.net/weixin_42755384/article/details/84931250?ops_request_misc=&request_id=&biz_id=102&utm_term=importBrep&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-84931250.pc_search_result_no_baidu_js&spm=1018.2226.3001.4187

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值