OpenCascade Primitives BRep - Box
OpenCascade Primitives BRep - Box
Abstract. BRep is short for Boundary Representation. Boundary Representation gives a complete description of an object by associating topological and geometric information for solid modeling. In this case, objects are described by their boundaries. There are two types of information in BRep: Topological information and Geometric information. This paper is concerned with the Box BRep in OpenCascade, and also show how to use Tcl script to dump box BRep info.
Key words. OpenCascade, BRep, Boundary Representation, Box, Winged-Edge Structure
1. Introduction
边界表示法(BRep: Boundary Representation)通过拓朴(Topology)和几何(Geometry)给出了一个物体完整的描述,即用边界来表示物体。
在OpenCascade中的拓朴实体有以下几种:
l Vertex: a zero-dimensional shape corresponding to a point in geometry;
l Edge: a shape corresponding to a curve, and bound by a vertex at each extremity;
l Wire: a sequence of edges connected by their vertices;
l Face: part of a plane(in 2D geometry) or a surface(in 3D geometry) bounded by a closed wire;
l Shell: a collection of faces connected by some of the edges their wire boundaries;
l Solid: part of 3D space bound by a shell;
l Compound solid: a collection of solids.
![]()
Figure 1.1 Topological Entities in OpenCascade
OpenCascade中的拓朴实体如上图所示,其中Compound可以包含很多Solid;Solid由Shell包围而成;Shell由相连的Face组成;Wire由相连的Edge组成;Edge对应一条曲线,且曲线的端点处由Vertex组成;Vertex对应空间中一个点。OpenCascade的拓朴结构的类层次关系如下图所示:
![]()
Figure 1.2 Topological Shape Hierarchy of OpenCascade
OpenCascade的BRep表示中几何曲线曲面是参数化表示的,即曲线上的点与一个参数u有关,曲面上的点与两个参数u,v来有关。因为是参数化表示的,所以曲线曲面是有向的(naturally orientated)。方向(Orientation)是重要的,对面而言方向是面上每个点处的法向。
![]()
Figure 1.3 Orientation of Faces
使用参数表示的曲线曲面还需要注意曲线曲面的有界性Bounded,奇异性Singularity(曲面上的奇点Singular Point),曲面上的曲线(PCurve: Curve on Surface)等概念。
本文通过使用Tcl脚本将OpenCascade中的基本形状长方体Box的边界表示BRep数据导出到文件,继而方便分析Box在OpenCascade中的边界表示。
2. Dump Box BRep Info by Tcl
为了得到长方体的边界表示数据,先要用类BRepPrimAPI_MakeBox来生成一个TopoDS_Shape,再使用BRepTools::Dump()可以将这个TopoDS_Shape的信息以便于理解的方式输出。如果用C++来编程,只有这两句,但是为了编译链接成功,需要包含相关的头文件及引用相关的库,需要编译工具来编译链接,还是比较麻烦的。本文使用Tcl脚本来输出,体验一下在OpenCascade中使用Tcl脚本编程的便利。
在Draw Test Harness中输入以下三行Tcl命令,即可以将Box的BRep信息输出到屏幕:
![]()
Figure 2.1 Dump Box BRep info in Draw Test Harness
考虑到输出内容过多,在命令窗口查看不便,有些信息被覆盖,于是将这些信息导出到文件,Tcl代码如下所示:
#
# Copyright (c) 2014 eryar All Rights Reserved.
#
# File : box.tcl
# Author : eryar@163.com
# Date : 2014-03-17 19:00
# Version : 1.0v
#
# Description : Dump OpenCascade primitive box topology info to file.
#
# Key Words : OpenCascade, BRep, Tcl, Box
#
# # Load Modeling algorithms.
pload MODELING # Make the box.
box theBox 1.0 2.0 3.0
set boxInfo [dump theBox] # Save box BRep info to file.
if [catch {open d:/box.txt w+} theFile] {
puts "Cannot open d:/box.txt for writing: $theFile"
} else {
puts $theFile $boxInfo
flush $theFile
close $theFile
} puts "Dump Info Finished!"
将上述内容保存到文件box.tcl,并在Draw Test Harness中输入如下命令:
![]()
Figure 2.2 Run a Tcl File in Draw Test Harness
执行成功后会在D盘中生成一个box.txt的文件,文件部分内容如下所示:
![]()
Figure 2.3 Box BRep Info Generated by Tcl Script
为了方便读者测试及本文中分析的Box数据的准确性,box.tcl和box.txt都可通过文章后面的链接下载。
3. Box BRep in OpenCascade
翼边结构(Winged-Edge Structure)及其边的表格方式(Edge Table)可以清晰地表达出形状的拓朴关系,表中内容有:
l 边的名称,即边的编号Edge Name;
l 边的起止顶点Start vertex and end vertex;
l 相连的两个面 Left face and right face;
l 遍历左面时访问边的顺序The predecessor and successor edges when traversing its left face;
l 遍历右面时访问边的顺序The predecessor and successor edges when traversing its right face;
如下图所示为Edge Table表示的翼边结构:
![]()
Figure 3.1 Edge Table of Winged-Edge Structure
从上图可知,给出一个边a后,从表中可以清晰看出与边a相连的顶点及面的信息。
如下图所示为一个Edge Table的示例:
![]()
Figure 3.2 Complete Edge Table for Pyramid
由上可知,给出翼边结构表示中的一个边,可以很方便得到与之相连的顶点和面的信息。
但是OpenCascade中没有使用翼边结构来表示形状,可以从图1.2所示的类结构得出。因为每个形状只包含子形状的数据,不包含其父形状的数据,所以在OpenCascade中不能反向访问其父形状(In OpenCascade, there is no back pointer from sub-shapes to ancestor shapes.),所以若想得到与给定顶点或边相连的面或环等信息,必须使用这个工具:
TopExp::MapShapesAndAncestors()
如下图所示使用上述工具得到与指定边相连的所有面的信息:
![]()
Figure 3.3 Get Ancestor Shapes in OpenCascade
根据前面使用Tcl脚本生成的Box,尺寸分别为1.0,2.0,3.0:
![]()
Figure 3.4 The Box generated by Tcl Script
为了正确显示出Box,每个面的法向必须与上图中的箭头方向一致。下面通过box.txt中的拓朴信息的编号,从vertex开始来组装成一个Solid的形状。对应顶点的编号及其在空间中的坐标如下图所示:
![]()
Figure 3.5 Vertex of the Box BRep
![]()
Figure 3.6 Edges of the Box BRep
上图中根据边中的顶点的方向,标示出边的方向:从标号为+正的顶点到标号为-负的顶点。
![]()
![]()
Figure 3.7 Wire #4 of Box BRep
由图可知,由于Wire #4是由边E30,E9,E20,E13组成,由于30和9号边前有负号,所以需要反向,方向反向的边用红色箭头标示。其它Wire的处理与此类似。通过上面左右两幅图的对比,可以清楚知道哪些Edge在组成Wire时反向了。
![]()
Figure 3.8 Faces and Shells of Box BRep
由上图可知,每个Face由一个Wire组成。注意到由Face组成Shell时,Face前面有方向性。如Face 5#前面有负号,意思是面的法向与Wire的方向相反,其他类似。
最后的Solid由Shell组成。这样Box的拓朴数据就形成了。其中Face, Edge, Vertex中包含了几何数据。Face的参数表示的几何数据位于surfaces部分,如下图所示:
![]()
Figure 3.9 Parametric Surfaces of the Box
Edge中包含了多种曲线数据,在Box的Edge中就包含两种曲线数据,一种是三维曲线;一种是曲面上的曲线。如下图所示:
![]()
Figure 3.10 Curve info of the Edge in Box
其中Curve3D对应的就是参数化的三维曲线,这个很好理解。PCurve为曲面上的曲线。下面以Edge#9为例,来说明边中的几何数据。三维曲线#12是原点为(0,2,3)方向为X方向的直线,在参数区间[0,1]的端点处,直线对应的两个点为(0,2,3)和(1,2,3),分别对应#31Vertex和#21Vertex。所以Vertex前面的-负号表示Edge中曲线终点,+正号表示Edge中曲线的起点。
PCurve为#4号平面上的#23号参数曲线,由下图可知#4号曲面对应的Face为#7,对应的Wire为#8:
![]()
Figure 3.11 Surface of Face
![]()
根据#23号二维参数曲线计算得出曲面上的U,V分别为(3, 0)和(3, 1),将得到U,V代入#4曲面中得出对应的曲面上的点,计算过程如下所示:
![]()
从中可以看出,PCurve表示的曲线与三维曲线#12相同,不过其中还保存了曲面的信息。
4. Conclusion
本文通过使用Tcl在OpenCascade中生成Box的边界表示信息,通过对数据的分析,得出Box在OpenCascade中的边界表示方式。并通过与翼边结构的对比,说明OpenCascade中的拓朴结构不是翼边结构。通过分析边界表示中的几何数据,来理解边界表示中几何数据的应用。
若对文中内容有任何意见、建议都可以与我取得联系,邮箱:eryar@163.com,欢迎讨论、交流、指导。
5. References
1. OpenCascade, Test Harness User’s Guide 2013
2. OpenCascade, BRep Format Description White Paper, 2013
3. John K. Ousterhout, Tcl and Tk Toolkit, 1993
PDF Version and Tcl Script: OpenCascade Primitives BRep-Box
OpenCascade Primitives BRep - Box的更多相关文章
- OpenCascade Primitives BRep - Sphere
OpenCascade Primitives BRep - Sphere eryar@163.com Abstract. BRep is short for Boundary Representati ...
- OpenCascade Primitives BRep-Cone
OpenCascade Primitives BRep-Cone eryar@163.com Abstract. BRep is short for Boundary Representation. ...
- OpenCascade Primitives BRep-Torus
OpenCascade Primitives BRep-Torus eryar@163.com Abstract. BRep is short for Boundary Representation. ...
- OpenCascade Primitives BRep-Cylinder
OpenCascade Primitives BRep-Cylinder eryar@163.com Abstract. BRep is short for Boundary Representati ...
- OpenCASCADE Make Primitives-Sphere
OpenCASCADE Make Primitives-Sphere eryar@163.com Abstract. The sphere is the simplest topology shape ...
- OpenCASCADE BRep vs. OpenNURBS BRep
OpenCASCADE BRep vs. OpenNURBS BRep eryar@163.com Abstract. BRep short for Boundary Representation. ...
- Topology Shapes of OpenCascade BRep
Topology Shapes of OpenCascade BRep eryar@163.com 摘要Abstract:通过对OpenCascade中的BRep数据的读写,理解边界表示法的概念及实现 ...
- Representation Data in OpenCascade BRep
Representation Data in OpenCascade BRep eryar@163.com 摘要Abstract:现在的显示器大多数是光栅显示器,即可以看做一个像素的矩阵.在光栅显示器 ...
- Geometry Surface of OpenCascade BRep
Geometry Surface of OpenCascade BRep eryar@163.com 摘要Abstract:几何曲面是参数表示的曲面 ,在边界表示中其数据存在于BRep_TFace中, ...
随机推荐
- bdb log file 预设长度的性能优化
看代码随手记:log_put.c, __log_write() /* * If we're writing the first block in a log file on a filesystem ...
- 转发 win7+iis7.5+asp.net下 CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files 解决方案
win7+iis7.5+asp.net下 CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NE ...
- 解决ie8(及其以下)不支持getElementsByClassName的问题
这篇技术笔记与大家分享的是:解决IE8(及以下)不支持getElementsByClassName的方法.如果有说错的地方,麻烦留言告诉我,我及时更正,一来是更新一下我的认知,二来也是不要误导的他人, ...
- JavaScript 基础第四天
一.前言 昨天我们了解了Js的很重要的一个概念叫做函数,函数就是对于冗余和垃圾代码的一种封装机制.简单的讲就是为了能让程序更好更快的执行我们将一些重复性的代码提取,封装成一个有名字的小盒子,等到我们需 ...
- 关于windows phone教务在线客户端
本人是个大二学生,由于学校的教务在线一直没出windows phone的教务在线,而且本身也对wp开发感兴趣,所以就尝试着开发一下 由于没有系统的学习,只能在摸索中前进,这背后的原理很简单,可不容易实 ...
- ABP框架详解(七)Caching
在ABP框架中存在一个缓存机制,使用ICache的继承类来存储最终需要缓存的数据,可以吧ICache看成一个字典对象,使用Key作为真实数据的具有唯一性的表示.使用上与字典对象完全相同,Get方法传递 ...
- 去掉table中的空隙
将cellspacing与cellpadding设置为0即可 <style> td{ border:1px; } </style> <table cellspacing= ...
- sql 优化 链接提示 查询提示 标提示
SQL Server的查询优化器在select查询执行的时候产生一个高效的查询执行计划.如果优化器不能选择最优的计划,那么就需要检查查询计划.统计信息.支持的索引等,而通过使用提示可以改变优化器选择查 ...
- Android前端人员与后台开发的撕逼(一)
首先表明一下身份,本人是Android前端开发人员,本篇只做合理性探讨,不进行人身攻击: 其次希望各位大神进行点评!点评!点评! 我们讨论一下接口的两种返回方式,直接举例说明一下,假设书籍信息表有30 ...
- C# 调用restful服务开源库
.NET环境下我们想调用其它开放平台的服务接口,不需要自己去实现底层,开源的库用起来会很方便 hammock http://www.cnblogs.com/shanyou/archive/2012/0 ...