Locations Section of OpenCascade BRep

Locations Section of OpenCascade BRep

[email protected]

摘要Abstract:本文结合OpenCascade的BRep格式描述文档和源程序,对BRep格式进行分析,详细说明BRep的数据组织形式。本文主要通过对BRep文件中的Locations部分的读写代码进行分析,来完全理解OpenCascade中的Location部分。

关键字Key Words:OpenCascade, BRep Format, Location, Location Set

一、引言 Introduction

为了跟踪拓朴体的位置(Shape Location),每个形状都有一个局部坐标系。局部坐标系可以通过如下两种方式来表示:

l 一个右手法则表示的三个互相垂直的向量,对应的类是gp_Ax2;

l 一个相对于世界坐标系的变换(the transformation of coordinates between local and global references frames),对应的类是gp_Trsf;

类TopLoc_Location表示了初等矩阵经过一系列变换后得到的坐标系,保存累积变换后的结果避免了矩阵变换的重新计算。

二、<locations>部分 Section <locations>

示例:

Locations Section of OpenCascade BRep_第1张图片

BNF 定义:

Locations Section of OpenCascade BRep_第2张图片

详细说明:

<location data 1>定义了3X4的矩阵Q,描述了三维空间的线性变换,并满足如下约定:

Locations Section of OpenCascade BRep_第3张图片

矩阵Q是线性变换矩阵,它可以通过矩阵乘法将一个点(x, y, z)变换成另外一点(u, v, w):

Locations Section of OpenCascade BRep_第4张图片

Q也可能是以下基本变换矩阵的组合:

1) 平移变换矩阵:

Locations Section of OpenCascade BRep_第5张图片

2) 绕任意轴旋转的变换矩阵,轴的方向为D(Dx, Dy, Dz),旋转角度ψ:

wps_clip_image-9085

3) 缩放变换矩阵:

Locations Section of OpenCascade BRep_第6张图片

4) 中心对称变换矩阵:

Locations Section of OpenCascade BRep_第7张图片

5) 轴对称变换矩阵:

Locations Section of OpenCascade BRep_第8张图片

6) 平面对称变换矩阵:

Locations Section of OpenCascade BRep_第9张图片

<location data 2>解释为组合变换的幂。<location data 2>是整数对li, pi的序列。这个序列将被解释为:

wps_clip_image-2646

Lli是<location record>部分的变换矩阵。

三、示例程序

通过分析Location数据输出和读取的程序,可以完全理解Location类的作用。Location的输出与读取都是通过类TopTools_LocationSet来实现的。调试跟踪其代码,可以理解其具体实现了。

3.1 输出位置数据 Output Location data

将Location中的数据输出有两种方式,一种是在Debug模式下,可以输出到屏幕显示;一种是输出到文件。输出到文件还可以被读取。示例程序如下所示:

 

 1  /*
 2  *    Copyright (c) 2013 eryar All Rights Reserved.
 3  *
 4  *        File    : Main.cpp
 5  *        Author  : [email protected]
 6  *        Date    : 2013-11-16 20:08
 7  *        Version : 1.0v
 8  *
 9  *    Description : Keeping track of shape location.
10  *                  The TopLoc_Location class represents a marker composed of
11  *                  references to elementary markers. The resulting cumulative
12  *                  transformation is stored in order to avoid recalculating the
13  *                  sum of the transformations for the whole list.
14  */
15 
16  #define  WNT
17  #include  < gp_Trsf.hxx >
18  #include  < TopLoc_Location.hxx >
19  #include  < TopTools_LocationSet.hxx >
20 
21  #pragma comment(lib,  " TKernel.lib " )
22  #pragma comment(lib,  " TKMath.lib " )
23  #pragma comment(lib,  " TKBRep.lib " )
24 
25  int  main( void )
26  {
27      ofstream dumpFile( " LocationTest.txt " );
28 
29      TopTools_LocationSet locationSet;
30 
31       //  1. Null transformation, identity matrix.
32      gp_Trsf trsfNull;
33      TopLoc_Location locationNull(trsfNull);
34 
35      locationSet.Add(locationNull);
36      locationSet.Add(locationNull.Powered( 2 ));
37      
38       //  2. Translate transformation.
39      gp_Trsf trsfTranslate;
40      trsfTranslate.SetTranslation(gp_Vec( 100 200 0 ));
41      TopLoc_Location locationTranslate(trsfTranslate);
42 
43      locationSet.Add(locationTranslate);
44      locationSet.Add(locationTranslate.Powered( 3 ));
45 
46       //  3. Rotate transformation.
47      gp_Trsf trsfRotate;
48      trsfRotate.SetRotation(gp::OX(), M_PI_2);
49      TopLoc_Location locationRotate(trsfRotate);
50 
51      locationSet.Add(locationRotate);
52      locationSet.Add(locationRotate.Powered( 6 ));
53 
54       //  dump the location set and write to file.
55      locationSet.Dump(std::cout);
56      locationSet.Write(dumpFile);
57 
58       return   0 ;
59  }

Debug模式下屏幕上输出结果为:

 1 
 2 
 3 
 4    -------
 5   Dump of  6  Locations
 6    -------
 7 
 8       1  :
 9  Elementary location
10  (                1                 0                 0                 0   )
11  (                0                 1                 0                 0   )
12  (                0                 0                 1                 0   )
13       2  :
14  Complex : L1 ^ 2
15  (                1                 0                 0                 0   )
16  (                0                 1                 0                 0   )
17  (                0                 0                 1                 0   )
18       3  :
19  Elementary location
20  (                1                 0                 0               100   )
21  (                0                 1                 0               200   )
22  (                0                 0                 1                 0   )
23       4  :
24  Complex : L3 ^ 3
25  (                1                 0                 0               300   )
26  (                0                 1                 0               600   )
27  (                0                 0                 1                 0   )
28       5  :
29  Elementary location
30  (                1                 0                 0                 0   )
31  (                0      1.11022e-016                - 1                 0   )
32  (                0                 1      1.11022e-016                 0   )
33       6  :
34  Complex : L5 ^ 6
35  (                1                 0                 0                 0   )
36  (                0                - 1     - 6.66134e-016                 0   )
37  (                0      6.66134e-016                - 1                 0   )
38  Press any key to  continue  . . .


输出到文件中的内容为:

 1  Locations  6
 2  1
 3                 1                 0                 0                 0  
 4                 0                 1                 0                 0  
 5                 0                 0                 1                 0  
 6  2    1   2   0
 7  1
 8                 1                 0                 0               100  
 9                 0                 1                 0               200  
10                 0                 0                 1                 0  
11  2    3   3   0
12  1
13                 1                 0                 0                 0  
14                 0   1.11022302462516e-016                - 1                 0  
15                 0                 1   1.11022302462516e-016                 0  
16  2    5   6   0
17 

从输出结果可以看出,输出到文件中的内容与BRep文件中的内容一致。Location有两种类型,当类型为1时,即是一个初等变换矩阵(Elementary location);当类型为2时,是一个复合变换(Complex),即在初等变换矩阵的基础上做的一些变换操作。

3.2 读取位置数据 Input Location data

读取<locations>部分的类为TopTools_LocationSet,程序代码如下所示:

 1  // =======================================================================
 2  // function : Read
 3  // purpose  : 
 4  // =======================================================================
 5 
 6  void   TopTools_LocationSet::Read(Standard_IStream &  IS)
 7  {
 8    myMap.Clear();
 9 
10     char  buffer[ 255 ];
11    Standard_Integer l1,p;
12 
13    IS  >>  buffer;
14     if  (strcmp(buffer, " Locations " )) {
15      cout  <<   " Not a location table  " << endl;
16       return ;
17    }
18 
19    Standard_Integer i, nbLoc;
20    IS  >>  nbLoc;
21    
22    TopLoc_Location L;
23    gp_Trsf T;
24      
25     // OCC19559
26    Message_ProgressSentry PS(GetProgress(),  " Locations " 0 , nbLoc,  1 );
27     for  (i  =   1 ; i  <=  nbLoc &&  PS.More(); i ++ , PS.Next()) {
28       if  (  ! GetProgress().IsNull() ) 
29        GetProgress() -> Show();
30 
31      Standard_Integer typLoc;
32      IS  >>  typLoc;
33      
34       if  (typLoc  ==   1 ) {
35        ReadTrsf(T,IS);
36        L  =  T;
37      }
38 
39       else   if  (typLoc  ==   2 ) {
40        L  =  TopLoc_Location();
41        IS  >>  l1;
42         while  (l1  !=   0 ) { 
43      IS  >>  p;
44      TopLoc_Location L1  =  myMap(l1);
45      L  =  L1.Powered(p)  * L;
46      IS  >>  l1;
47        }
48      }
49      
50       if  ( ! L.IsIdentity()) myMap.Add(L);
51    }
52  }


从读取Location部分的代码可以看出,分两情况来处理。一种是初等变换矩阵,类型值为1,直接读取矩阵数据;一种是复合变换,类型值为2,它是在初等变换矩阵的基础上通过Power来实现的复合变换。BRep中记录复合变换的数据为初等变换矩阵的编号及其幂次。通过编号Map得出其对应的初等变换矩阵。结合读取Location的代码,对BRep中Location部分的数据有了清晰认识。

四、结论

通过对OpenCascade中BRep文件中的Locations部分的数据的输出与读取,理解其实现。即对Location分为两种类型:

1. 初等变换矩阵:存储数据为3X4变换矩阵;

2. 复合变换:存储数据为初等变换矩阵的编号及其幂次。

 

PDF Version: Location Section of BRep File

你可能感兴趣的:(Locations Section of OpenCascade BRep)