天天看點

OpenCascade BRep 格式描述之一

<a href="mailto:[email protected]">[email protected]</a>

摘要Abstract:本文結合OpenCascade的BRep格式描述文檔和源程式,對BRep格式進行分析,詳細說明BRep的資料組織形式。結合源程式,可以對OpenCascade中Modeling Data子產品中的模型資料結構進行了解。

關鍵字Key Words:OpenCascade, BRep Format, ModelingData

OpenCascade中的BRep格式主要用來存儲3D模型,也可用來存儲由下列元素組成的模型:vertices, edges, wires, faces, shells, solids, compsolids, compounds, edge triangulations, face triangulations, polylines on triangulations, space location and orientation.

本格式的目的就是為了便于了解,也使用了類似BNF的定義方式。以下章節都是按下面的格式組織的:

l 該部分的示例;

l 該部分的類BNF定義;

l 該部分的詳細說明;

l 該部分的源程式片段。

BRep格式檔案的讀寫采用了ASCII的編碼方式,該格式的資料都是文本形式存儲。

BRep格式使用了下面的BNF術語:

1) &lt;\n&gt;:換行;

2) &lt;_\n&gt;:

3) &lt;_&gt;:空格;

4) &lt;flag&gt;:标志位:0和1;

5) &lt;int&gt;:整數,範圍-231到231-1;

6) &lt;real&gt;:實數,範圍-1.7976931348623159X10308到1.7976931348623158X10308;

7) &lt;2D point&gt;:二維點,兩個實數;

8) &lt;3D point&gt;:三維點,三個實數;

9) &lt;2D direction&gt;:二維方向矢量,兩個實數,平方和為1,即為機關方向矢量;

10) &lt;3D direction&gt;:三維方向矢量,三個實數,平方和為1,即為機關方向矢量;

11) &lt;+&gt;

BRep格式包含以下部分:

1) &lt;content type&gt;

2) &lt;version&gt;

3) &lt;locations&gt;

4) &lt;geometry&gt;

5) &lt;shapes&gt;

&lt;content type&gt;部分:

OpenCascade BRep 格式描述之一

&lt;content type&gt;也可以有其它的值。

&lt;version&gt;部分:

OpenCascade BRep 格式描述之一

不同版本之間的差別将會在本文檔中說明。

示例:

OpenCascade BRep 格式描述之一

BNF 定義:

OpenCascade BRep 格式描述之一

詳細說明:

&lt;location data 1&gt;定義了3X4的矩陣Q,描述了三維空間的線性變換,并滿足如下約定:

OpenCascade BRep 格式描述之一

矩陣Q是線性變換矩陣,它可以通過矩陣乘法将一個點(x, y, z)變換成另外一點(u, v, w):

OpenCascade BRep 格式描述之一

Q也可能是以下基本變換矩陣的組合:

1) 平移變換矩陣:

OpenCascade BRep 格式描述之一

2) 繞任意軸旋轉的變換矩陣,軸的方向為D(Dx, Dy, Dz),旋轉角度ψ:

OpenCascade BRep 格式描述之一

3) 縮放變換矩陣:

OpenCascade BRep 格式描述之一

4) 中心對稱變換矩陣:

OpenCascade BRep 格式描述之一

5) 軸對稱變換矩陣:

OpenCascade BRep 格式描述之一

6) 平面對稱變換矩陣:

OpenCascade BRep 格式描述之一

&lt;location data 2&gt;解釋為組合變換的幂。&lt;location data 2&gt;是整數對li, pi的序列。這個序列将被解釋為:

OpenCascade BRep 格式描述之一

Lli是&lt;location record&gt;部分的變換矩陣。

讀取&lt;locations&gt;部分的類為TopTools_LocationSet,程式代碼如下所示:

 1 //=======================================================================

 2 //function : Read

 3 //purpose  : 

 4 //=======================================================================

 5 void  TopTools_LocationSet::Read(Standard_IStream&amp; IS)

 6 {

 7   myMap.Clear();

 8 

 9   char buffer[255];

10   Standard_Integer l1,p;

11 

12   IS &gt;&gt; buffer;

13   if (strcmp(buffer,"Locations")) {

14     cout &lt;&lt; "Not a location table "&lt;&lt;endl;

15     return;

16   }

17 

18   Standard_Integer i, nbLoc;

19   IS &gt;&gt; nbLoc;

20   

21   TopLoc_Location L;

22   gp_Trsf T;

23     

24   //OCC19559

25   Message_ProgressSentry PS(GetProgress(), "Locations", 0, nbLoc, 1);

26   for (i = 1; i &lt;= nbLoc&amp;&amp; PS.More(); i++, PS.Next()) {

27     if ( !GetProgress().IsNull() ) 

28       GetProgress()-&gt;Show();

29 

30     Standard_Integer typLoc;

31     IS &gt;&gt; typLoc;

32     

33     if (typLoc == 1) {

34       ReadTrsf(T,IS);

35       L = T;

36     }

37 

38     else if (typLoc == 2) {

39       L = TopLoc_Location();

40       IS &gt;&gt; l1;

41       while (l1 != 0) { 

42     IS &gt;&gt; p;

43     TopLoc_Location L1 = myMap(l1);

44     L = L1.Powered(p) *L;

45     IS &gt;&gt; l1;

46       }

47     }

48     

49     if (!L.IsIdentity()) myMap.Add(L);

50   }

51 }

雖然代碼風格不好,縮進、括号什麼的都不工整,看起來很吃力,但是結合源程式,對上面的詳細說明的了解還是很有幫助的。

其中變量nbLoc是&lt;location record count&gt;的值,成員變量myMap是TopLoc_Location的一個map。當是&lt;location record 1&gt;時把&lt;location data 1&gt;都放到TopLoc_Location的map中。當是&lt;location record 2&gt;時将li的變換矩陣TopLoc_Location乘pi次方。&lt;flag&gt;0表示&lt;location data 2&gt;的結束。

&lt;geometry&gt;包含以下子部分:

1.&lt;2D curves&gt;

2.&lt;3D curves&gt;

3.&lt;3D polygons&gt;

4.&lt;polygons on triangulations&gt;

5.&lt;surfaces&gt;

6.&lt;triangulations&gt;

讀取&lt;geometry&gt;部分的類為BRepTools_ShapeSet,程式代碼如下所示:

 2 //function : ReadGeometry

 5 void  BRepTools_ShapeSet::ReadGeometry(Standard_IStream&amp; IS)

 7   //OCC19559

 8   myCurves2d.SetProgress(GetProgress());

 9   myCurves.SetProgress(GetProgress());

10   mySurfaces.SetProgress(GetProgress());

12   if ( !GetProgress().IsNull()) {

13     if( GetProgress()-&gt;UserBreak() ) return;

14     GetProgress()-&gt;NewScope ( 15, "2D Curves" );

15   }

16   myCurves2d.Read(IS);

18   if ( !GetProgress().IsNull()) {

19     if( GetProgress()-&gt;UserBreak() ) return;

20     GetProgress()-&gt;EndScope();

21     GetProgress()-&gt;Show();

22     

23     GetProgress()-&gt;NewScope ( 15, "3D Curves" );

24   }

25   myCurves.Read(IS);

26 

27   if ( !GetProgress().IsNull()) {

28     if( GetProgress()-&gt;UserBreak() ) return;

29     GetProgress()-&gt;EndScope();

30     GetProgress()-&gt;Show();

31     

32     GetProgress()-&gt;NewScope ( 10, "3D Polygons" );

33   }

34   ReadPolygon3D(IS);

35   if ( !GetProgress().IsNull() ) {

36     if( GetProgress()-&gt;UserBreak() ) return;

37     GetProgress()-&gt;EndScope();

38     GetProgress()-&gt;Show();

39 

40     GetProgress()-&gt;NewScope ( 10, "Polygons On Triangulation" );

41   }

42   ReadPolygonOnTriangulation(IS);

43   if ( !GetProgress().IsNull()) {

44     if( GetProgress()-&gt;UserBreak() ) return;

45     GetProgress()-&gt;EndScope();

46     GetProgress()-&gt;Show();

47     

48     GetProgress()-&gt;NewScope ( 10, "Surfaces" );

49   }

50   mySurfaces.Read(IS);

51   if ( !GetProgress().IsNull() ) {

52     if( GetProgress()-&gt;UserBreak() ) return;

53     GetProgress()-&gt;EndScope();

54     GetProgress()-&gt;Show();

55 

56     GetProgress()-&gt;NewScope ( 15, "Triangulations" );

57   }

58   ReadTriangulation(IS);

59   if ( !GetProgress().IsNull()) {

60     if( GetProgress()-&gt;UserBreak() ) return;

61     GetProgress()-&gt;EndScope();

62     GetProgress()-&gt;Show();

63   }

64 }

OpenCascade BRep 格式描述之一

BNF定義:

OpenCascade BRep 格式描述之一

由Curves開始,後面是曲線的數量,再下面是每條曲線的具體資料。

讀取&lt;curves&gt;部分的類為GeomTools_CurveSet,程式代碼如下所示:

  1 #define LINE      1

  2 #define CIRCLE    2

  3 #define ELLIPSE   3

  4 #define PARABOLA  4

  5 #define HYPERBOLA 5

  6 #define BEZIER    6

  7 #define BSPLINE   7

  8 #define TRIMMED   8

  9 #define OFFSET    9

 10 //=======================================================================

 11 //function : ReadCurve

 12 //purpose  : 

 13 //=======================================================================

 14 Standard_IStream&amp; GeomTools_CurveSet::ReadCurve(Standard_IStream&amp; IS,

 15                         Handle(Geom_Curve)&amp; C)

 16 {

 17   Standard_Integer ctype;

 18 

 19   try {

 20     OCC_CATCH_SIGNALS

 21     IS &gt;&gt; ctype;

 22     switch (ctype) {

 23 

 24     case LINE :

 25       {

 26         Handle(Geom_Line) CC;

 27         IS &gt;&gt; CC;

 28         C = CC;

 29       }

 30       break;

 31 

 32     case CIRCLE :

 33       {

 34         Handle(Geom_Circle) CC;

 35         IS &gt;&gt; CC;

 36         C = CC;

 37       }

 38       break;

 39 

 40     case ELLIPSE :

 41       {

 42         Handle(Geom_Ellipse) CC;

 43         IS &gt;&gt; CC;

 44         C = CC;

 45       }

 46       break;

 47 

 48     case PARABOLA :

 49       {

 50         Handle(Geom_Parabola) CC;

 51         IS &gt;&gt; CC;

 52         C = CC;

 53       }

 54       break;

 55 

 56     case HYPERBOLA :

 57       {

 58         Handle(Geom_Hyperbola) CC;

 59         IS &gt;&gt; CC;

 60         C = CC;

 61       }

 62       break;

 63 

 64     case BEZIER :

 65       {

 66         Handle(Geom_BezierCurve) CC;

 67         IS &gt;&gt; CC;

 68         C = CC;

 69       }

 70       break;

 71 

 72     case BSPLINE :

 73       {

 74         Handle(Geom_BSplineCurve) CC;

 75         IS &gt;&gt; CC;

 76         C = CC;

 77       }

 78       break;

 79 

 80     case TRIMMED :

 81       {

 82         Handle(Geom_TrimmedCurve) CC;

 83         IS &gt;&gt; CC;

 84         C = CC;

 85       }

 86       break;

 87 

 88     case OFFSET :

 89       {

 90         Handle(Geom_OffsetCurve) CC;

 91         IS &gt;&gt; CC;

 92         C = CC;

 93       }

 94       break;

 95       

 96     default:

 97       {

 98         Handle(Geom_Curve) CC;

 99         GeomTools::GetUndefinedTypeHandler()-&gt;ReadCurve(ctype,IS,CC);

100         C = CC;

101       }

102     }

103   }

104   catch(Standard_Failure) {

105 #ifdef DEB

106     Handle(Standard_Failure) anExc = Standard_Failure::Caught();

107     cout &lt;&lt;"EXCEPTION in GeomTools_CurveSet::ReadCurve(..)!!!" &lt;&lt; endl;

108     cout &lt;&lt; anExc &lt;&lt; endl;

109 #endif

110     C = NULL;

111   }

112   return IS;

113 }

因為重載了操作符&gt;&gt;,使不同的類調用了不同的處理函數。

因為讀取點和方向用得很頻繁,是以将讀取點和方向的函數程式先列出如下所示:

 2 //function : ReadPnt

 5 static Standard_IStream&amp; operator&gt;&gt;(Standard_IStream&amp; IS, gp_Pnt&amp; P)

 7   Standard_Real X=0.,Y=0.,Z=0.;

 8   IS &gt;&gt; X &gt;&gt; Y &gt;&gt; Z;

 9   P.SetCoord(X,Y,Z);

10   return IS;

11 }

12 

13 //=======================================================================

14 //function : ReadDir

15 //purpose  : 

16 //=======================================================================

17 static Standard_IStream&amp; operator&gt;&gt;(Standard_IStream&amp; IS, gp_Dir&amp; D)

18 {

19   Standard_Real X=0.,Y=0.,Z=0.;

20   IS &gt;&gt; X &gt;&gt; Y &gt;&gt; Z;

21   D.SetCoord(X,Y,Z);

22   return IS;

23 }

OpenCascade BRep 格式描述之一
OpenCascade BRep 格式描述之一

&lt;3D curve record 1&gt;定義了直線。直線資料由一個三維點P和一個三維方向矢量D組成。通過點P且方向為D的直線由下面的參數方程來定義:

OpenCascade BRep 格式描述之一

示例資料表示的直線為通過點P(1,0,3),方向D(0,1,0),得到的參數方程為:

OpenCascade BRep 格式描述之一

讀取直線部分的程式代碼如下所示:

 2 //function : ReadCurve

 5 static Standard_IStream&amp; operator&gt;&gt;(Standard_IStream&amp; IS,

 6                     Handle(Geom_Line)&amp; L)

 7 {

 8   gp_Pnt P(0.,0.,0.);

 9   gp_Dir AX(1.,0.,0.);

10   IS &gt;&gt; P &gt;&gt; AX;

11   L = new Geom_Line(P,AX);

12   return IS;

13 }

OpenCascade BRep 格式描述之一
OpenCascade BRep 格式描述之一

&lt;3D curve record 2&gt;定義了圓。圓的資料包含一個三維點P,一個正交坐标系的三個軸的方向N,Dx,Dy,還有一個非負的實數r。其中點P為圓心坐标,圓位于平面的法向量為N的平面上,圓的半徑為r。圓的參數方程如下所示:

OpenCascade BRep 格式描述之一

示例資料表示的圓為:圓心P(1,2,3),位于平面的法向量N(0,0,1),圓的方向Dx=(1,0,-0),Dy=(-0,1,0),半徑r=4,其參數方向為:

OpenCascade BRep 格式描述之一

讀取圓部分的程式代碼如下所示:

 6                     Handle(Geom_Circle)&amp; C)

 9   gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0.);

10   Standard_Real R=0.;

11   IS &gt;&gt; P &gt;&gt; A &gt;&gt; AX &gt;&gt; AY &gt;&gt; R;

12   C = new Geom_Circle(gp_Ax2(P,A,AX),R);

13   return IS;

14 }

OpenCascade BRep 格式描述之一
OpenCascade BRep 格式描述之一

&lt;3D curve record 3&gt;定義了橢圓。橢圓的資料包含三維點P,三維正交坐标系N、Dmaj、Dmin和兩個非負實數rmaj和rmin,且rmin&lt;=rmaj。橢圓位于中心點P,法向量為N的平面上,且長軸、短軸的方向分别為Dmaj, Dmin,長軸、短軸上的半徑分别為rmaj, rmin。橢圓的參數方程定義如下所示:

OpenCascade BRep 格式描述之一

示例資料表示的橢圓的中心點P=(1,2,3),平面的法向量N=(0,0,1),長軸方向Dmaj=(1,0,-0),短軸方向Dmin=(-0,1,0),長軸半徑為5,短軸半徑為4,

OpenCascade BRep 格式描述之一

讀取橢圓部分的程式代碼如下所示:

 6                     Handle(Geom_Ellipse)&amp; E)

10   Standard_Real R1=0.,R2=0.;

11   IS &gt;&gt; P &gt;&gt; A &gt;&gt; AX &gt;&gt; AY &gt;&gt; R1 &gt;&gt; R2;

12   E = new Geom_Ellipse(gp_Ax2(P,A,AX),R1,R2);

OpenCascade BRep 格式描述之一
OpenCascade BRep 格式描述之一

&lt;3D curve record 4&gt;定義了抛物線。抛物線資料包含三維點P,三維正交坐标系坐标軸方向N,Dx,Dy和一個非負的實數f。抛物線通過點P,且位于法向量為N的平面上,焦點長度為f,其參數方程如下所示:

OpenCascade BRep 格式描述之一

示例資料表示的抛物線過點P=(1,2,3),位于平面的法向N=(0,0,1),抛物線的另兩個軸方向Dx=(1,0,-0),Dy=(-0,1,0),焦點長度f=16。參數方程為:

OpenCascade BRep 格式描述之一

讀取抛物線部分的程式代碼如下所示:

 6                     Handle(Geom_Parabola)&amp; C)

10   Standard_Real R1=0.;

11   IS &gt;&gt; P &gt;&gt; A &gt;&gt; AX &gt;&gt; AY &gt;&gt; R1;

12   C = new Geom_Parabola(gp_Ax2(P,A,AX),R1);

OpenCascade BRep 格式描述之一
OpenCascade BRep 格式描述之一

&lt;3D curve record 5&gt;定義了雙曲線。雙曲線定義資料有三維點P,三維正交坐标系坐标軸方向為N,Dx,Dy和兩個非負實數Kx,Ky。雙曲線過P點且法向量為N的平面上,其參數方程如下所示:

OpenCascade BRep 格式描述之一

示例資料表示的雙曲線過點P=(1,2,3)且位于的平面的法向N=(0,0,1),其它的資料Dx=(1,0,-0),Dy=(-0,1,0),Kx=5和Ky=4。其參數方程為:

OpenCascade BRep 格式描述之一

讀取雙曲線部分的程式代碼如下所示:

 6                     Handle(Geom_Hyperbola)&amp; H)

12   H = new Geom_Hyperbola(gp_Ax2(P,A,AX),R1,R2);

OpenCascade BRep 格式描述之一
OpenCascade BRep 格式描述之一

&lt;3D curve record 6&gt;定義了Bezier曲線。Bezier曲線資料包含有理标志r,曲線的次數m(degree m &lt;= 25檢視源代碼可知OpenCascade可處理的B樣條次數不超過25)和帶權的控制點(weight poles)。當有理标志位r=0時,weight poles就是m+1個三維點:B0,B1...Bn;當有理标志位r=1時,weight poles就是帶權的控制點B0 h0... Bm hm。Bi是三維點,hi是[0,m]正實數,即權因子。當有理标志位r=0時,即不是有理Bezier曲線時,hi=1。Bezier曲線參數方程如下所示:

OpenCascade BRep 格式描述之一

示例資料表示的Bezier曲線是有理Bezier曲線,因其有理标志位r=1,次數m=2,帶權控制點及權因子分别為:B0=(0,1,0),h0=4,B1=(1,-2,0),h1=5,B2=(2,3,0),h2=6。Bezier曲線的參數方程如下所示:

OpenCascade BRep 格式描述之一

讀取Bezier曲線部分的程式代碼如下所示:

 6                     Handle(Geom_BezierCurve)&amp; B)

 8   Standard_Boolean rational=Standard_False;

 9   IS &gt;&gt; rational;

10 

11   // poles and weights

12   Standard_Integer i=0,degree=0;

13   IS &gt;&gt; degree;

14 

15   TColgp_Array1OfPnt poles(1,degree+1);

16   TColStd_Array1OfReal weights(1,degree+1);

17   

18   for (i = 1; i &lt;= degree+1; i++) {

19     IS &gt;&gt; poles(i);

20     if (rational)

21       IS &gt;&gt; weights(i);

22   }

23 

24   if (rational)

25     B = new Geom_BezierCurve(poles,weights);

26   else

27     B = new Geom_BezierCurve(poles);

28 

29   return IS;

30 }

OpenCascade BRep 格式描述之一
OpenCascade BRep 格式描述之一

&lt;3D curve record 7&gt;定義了B-Spline曲線。B-Spline曲線包含了有理标志位r,曲線次數m&lt;=25,控制點數n&gt;=2,重節點數k,帶權控制點wieght poles和重節點multiplicity knots。

當有理标志位r=0時,是非有理B樣條曲線,weight poles有n個三維點B1,...,Bn;當有理标志位r=1時,是有理B樣條曲線,weight poles是n個帶權控制點對:B1, h1, .... Bn, hn。這裡Bi表示一個三維點,hi表示一個[0,1]正實數。當有理标志位r=0時,hi=1。

重節點有k對u1, q1, ... uk, qk。這裡ui是重複度為qi&gt;=1的節點。

OpenCascade BRep 格式描述之一

B-Spline曲線的參數方程如下所示:

OpenCascade BRep 格式描述之一

其中Ni,j有如下的遞歸定義:

OpenCascade BRep 格式描述之一
OpenCascade BRep 格式描述之一

示例資料表示的B樣條曲線為:有理标志位r=1,次數m=1,控制點數n=3,重節點數k=5,帶權控制點:B1=(0,1,0),h1=4,B2=(1,-2,0),h2=5,B3=(2,3,0),h3=6;重節點u1=0,q1=1,u2=0.25,q2=1,u3=0.5,q3=1,u4=0.75,q4=1,u5=1,q5=1。B-Spline曲線的參數方程如下所示:

OpenCascade BRep 格式描述之一

讀取B-Spline曲線部分的程式代碼如下所示:

 6                     Handle(Geom_BSplineCurve)&amp; B)

 9   Standard_Boolean rational=Standard_False,periodic=Standard_False;

10   IS &gt;&gt; rational &gt;&gt; periodic;

12   // poles and weights

13   Standard_Integer i=0,degree=0,nbpoles=0,nbknots=0;

14   IS &gt;&gt; degree &gt;&gt; nbpoles &gt;&gt; nbknots;

15 

16   TColgp_Array1OfPnt poles(1,nbpoles);

17   TColStd_Array1OfReal weights(1,nbpoles);

18   

19   for (i = 1; i &lt;= nbpoles; i++) {

20     IS &gt;&gt; poles(i);

21     if (rational)

22       IS &gt;&gt; weights(i);

23   }

24 

25   TColStd_Array1OfReal knots(1,nbknots);

26   TColStd_Array1OfInteger mults(1,nbknots);

27 

28   for (i = 1; i &lt;= nbknots; i++) {

29     IS &gt;&gt; knots(i) &gt;&gt; mults(i);

30   }

31 

32   if (rational)

33     B = new Geom_BSplineCurve(poles,weights,knots,mults,degree,periodic);

34   else

35     B = new Geom_BSplineCurve(poles,knots,mults,degree,periodic);

36   

37   return IS;

38 }

OpenCascade BRep 格式描述之一
OpenCascade BRep 格式描述之一

&lt;3D curve record 8&gt;定義了裁剪曲線(trimmed curve)。裁剪曲線資料包含:兩個實數umin,umax和&lt;3D curve record&gt;,且umin&lt;umax。裁剪曲線是将&lt;3D curve record&gt;描述的曲線B限制在[umin,umax]。裁剪曲線的參數方程如下所示:

OpenCascade BRep 格式描述之一

示例資料表示的裁剪曲線為:umin=-4,umax=5,曲線B(u)=(1,2,3)+u(1,0,0)。裁剪曲線的參數方程如下所示:

OpenCascade BRep 格式描述之一

讀取裁剪曲線部分的程式代碼如下所示:

 5 

 6 static Standard_IStream&amp; operator&gt;&gt;(Standard_IStream&amp; IS,

 7                     Handle(Geom_TrimmedCurve)&amp; C)

 8 {

 9   Standard_Real p1=0.,p2=0.;

10   IS &gt;&gt; p1 &gt;&gt; p2;

11   Handle(Geom_Curve) BC;

12   GeomTools_CurveSet::ReadCurve(IS,BC);

13   C = new Geom_TrimmedCurve(BC,p1,p2);

14   return IS;

15 }

OpenCascade BRep 格式描述之一
OpenCascade BRep 格式描述之一
OpenCascade BRep 格式描述之一
OpenCascade BRep 格式描述之一

示例資料表示的偏移曲線為偏移距離d=2,方向D=(0,1,0),基曲線B(u)=(1,2,3)+u(1,0,0),其參數方程如下所示:

OpenCascade BRep 格式描述之一

讀取偏移曲線部分程式代碼如下所示:

 6                     Handle(Geom_OffsetCurve)&amp; C)

 8   Standard_Real p=0.;

 9   IS &gt;&gt; p;

10   gp_Dir D(1.,0.,0.);

11   IS &gt;&gt; D;

12   Handle(Geom_Curve) BC;

13   GeomTools_CurveSet::ReadCurve(IS,BC);

14   C = new Geom_OffsetCurve(BC,p,D);

15   return IS;

16 }