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