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>

示例: 

wps_clip_image-13782

BNF 定义: 

wps_clip_image-24805

详细说明: 

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

wps_clip_image-7287

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

wps_clip_image-16501

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

1) 平移变换矩阵: 

wps_clip_image-27021

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

wps_clip_image-9085

3) 缩放变换矩阵: 

wps_clip_image-14514

4) 中心对称变换矩阵: 

wps_clip_image-18420

5) 轴对称变换矩阵: 

wps_clip_image-9661

6) 平面对称变换矩阵: 

wps_clip_image-16676

<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

从输出结果可以看出,输出到文件中的内容与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. 复合变换:存储数据为初等变换矩阵的编号及其幂次。 

 

你可能感兴趣的:(location)