OpenCascade Primitives BRep - Box

eryar@163.com

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的更多相关文章

  1. OpenCascade Primitives BRep - Sphere

    OpenCascade Primitives BRep - Sphere eryar@163.com Abstract. BRep is short for Boundary Representati ...

  2. OpenCascade Primitives BRep-Cone

    OpenCascade Primitives BRep-Cone eryar@163.com Abstract. BRep is short for Boundary Representation. ...

  3. OpenCascade Primitives BRep-Torus

    OpenCascade Primitives BRep-Torus eryar@163.com Abstract. BRep is short for Boundary Representation. ...

  4. OpenCascade Primitives BRep-Cylinder

    OpenCascade Primitives BRep-Cylinder eryar@163.com Abstract. BRep is short for Boundary Representati ...

  5. OpenCASCADE Make Primitives-Sphere

    OpenCASCADE Make Primitives-Sphere eryar@163.com Abstract. The sphere is the simplest topology shape ...

  6. OpenCASCADE BRep vs. OpenNURBS BRep

    OpenCASCADE BRep vs. OpenNURBS BRep eryar@163.com Abstract. BRep short for Boundary Representation. ...

  7. Topology Shapes of OpenCascade BRep

    Topology Shapes of OpenCascade BRep eryar@163.com 摘要Abstract:通过对OpenCascade中的BRep数据的读写,理解边界表示法的概念及实现 ...

  8. Representation Data in OpenCascade BRep

    Representation Data in OpenCascade BRep eryar@163.com 摘要Abstract:现在的显示器大多数是光栅显示器,即可以看做一个像素的矩阵.在光栅显示器 ...

  9. Geometry Surface of OpenCascade BRep

    Geometry Surface of OpenCascade BRep eryar@163.com 摘要Abstract:几何曲面是参数表示的曲面 ,在边界表示中其数据存在于BRep_TFace中, ...

随机推荐

  1. MATLAB常用操作

    1.点乘,点除,点乘方 点乘(对应元素相乘),必须同维或者其中一个是标量,a.*b 点除,a.\b表示矩阵b的每个元素除以a中对应元素或者除以常数a,a./b表示常数a除以矩阵b中每个元素或者矩阵a除 ...

  2. Kernel Functions for Machine Learning Applications

    In recent years, Kernel methods have received major attention, particularly due to the increased pop ...

  3. java基础1_Java数据类型

    一 . Java的数据类型分为 1.原生数据类型 也叫基本数据类型,分为整形,浮点型,字符型,布尔型.整形有 byte,short,int,long:浮点型有float,double;字符型有 cha ...

  4. Lua与C++互相调用(上)

    int main1(int argc, const char * argv[]) { lua_State* L = luaL_newstate();//创建栈 luaopen_base(L); lua ...

  5. Java-ios推送

    之前做的消息推送,向Android和ios客户端推送.这里只说ios的推送,ios的推送最后都会推送到苹果的APNS服务器上,再有APNS服务器推送到ios设备上.因为考虑到这一点,第一版的消息推送苹 ...

  6. 利用反射实现类通用的DAO层

    public void add(Object object) throws SQLException { ResultSet rs=null; PreparedStatement ps=null; C ...

  7. Git 更换仓库地址

    github国内访问偶尔抽风速度太慢了,想把项目转到oschina上来,今天实践了一下,还是挺简单的. 1.  从原始地址 clone 一份不包含 work copy的仓库: git clone -- ...

  8. spring 装配核心笔记

    (1)自动装配 开启ComponentScan(自动扫描), 通过在类使用注解@Component(默认bean id为类名第一个字符小写), 使用@Autowired实现属性,构造函数,成员函数的自 ...

  9. 用StackExchange.Redis客户端连接阿里云Redis服务遇到的问题

    阿里云推荐的Redis服务.NET客户端是ServiceStack.Redis,但ServiceStack.Redis不支持异步,不支持.NET Core,于是尝试使用StackExchange.Re ...

  10. Java设计模式3:工厂方法模式

    工厂方法模式 工厂方法模式是类的创建模式.工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工厂推迟到子类中. 工厂方法模式 工厂方法模式是对简单工厂模式进一步抽象的结果. 假如是不使用反 ...