0031668: Visualization - WebGL sample doesn't work on Emscripten 1.39
[occt.git] / src / BinTools / BinTools_SurfaceSet.cxx
CommitLineData
b311480e 1// Created on: 2004-05-20
2// Created by: Sergey ZARITCHNY
973c2be1 3// Copyright (c) 2004-2014 OPEN CASCADE SAS
b311480e 4//
973c2be1 5// This file is part of Open CASCADE Technology software library.
b311480e 6//
d5f74e42 7// This library is free software; you can redistribute it and/or modify it under
8// the terms of the GNU Lesser General Public License version 2.1 as published
973c2be1 9// by the Free Software Foundation, with special exception defined in the file
10// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11// distribution for complete text of the license and disclaimer of any warranty.
b311480e 12//
973c2be1 13// Alternatively, this file may be used under the terms of Open CASCADE
14// commercial license or contractual agreement.
7fd59977 15
7fd59977 16
42cf5bc1 17#include <BinTools.hxx>
7fd59977 18#include <BinTools_CurveSet.hxx>
42cf5bc1 19#include <BinTools_SurfaceSet.hxx>
20#include <Geom_BezierSurface.hxx>
21#include <Geom_BSplineSurface.hxx>
7fd59977 22#include <Geom_ConicalSurface.hxx>
42cf5bc1 23#include <Geom_CylindricalSurface.hxx>
24#include <Geom_OffsetSurface.hxx>
25#include <Geom_Plane.hxx>
26#include <Geom_RectangularTrimmedSurface.hxx>
7fd59977 27#include <Geom_SphericalSurface.hxx>
42cf5bc1 28#include <Geom_Surface.hxx>
7fd59977 29#include <Geom_SurfaceOfLinearExtrusion.hxx>
30#include <Geom_SurfaceOfRevolution.hxx>
42cf5bc1 31#include <Geom_ToroidalSurface.hxx>
7fd59977 32#include <gp_Cone.hxx>
42cf5bc1 33#include <gp_Cylinder.hxx>
34#include <gp_Pln.hxx>
7fd59977 35#include <gp_Sphere.hxx>
36#include <gp_Torus.hxx>
42cf5bc1 37#include <Standard_ErrorHandler.hxx>
38#include <Standard_Failure.hxx>
39#include <Standard_OutOfRange.hxx>
7fd59977 40#include <TColgp_Array1OfPnt.hxx>
7fd59977 41#include <TColgp_Array2OfPnt.hxx>
42cf5bc1 42#include <TColStd_Array1OfInteger.hxx>
43#include <TColStd_Array1OfReal.hxx>
44#include <TColStd_Array2OfReal.hxx>
7fd59977 45
46#define PLANE 1
47#define CYLINDER 2
48#define CONE 3
49#define SPHERE 4
50#define TORUS 5
51#define LINEAREXTRUSION 6
52#define REVOLUTION 7
53#define BEZIER 8
54#define BSPLINE 9
55#define RECTANGULAR 10
56#define OFFSET 11
57
58//=======================================================================
59//function : BinTools_SurfaceSet
60//purpose :
61//=======================================================================
62
63BinTools_SurfaceSet::BinTools_SurfaceSet()
64{
65}
66
67
68//=======================================================================
69//function : Clear
70//purpose :
71//=======================================================================
72
73void BinTools_SurfaceSet::Clear()
74{
75 myMap.Clear();
76}
77
78
79//=======================================================================
80//function : Add
81//purpose :
82//=======================================================================
83
84Standard_Integer BinTools_SurfaceSet::Add(const Handle(Geom_Surface)& S)
85{
86 return myMap.Add(S);
87}
88
89
90//=======================================================================
91//function : Surface
92//purpose :
93//=======================================================================
94
95Handle(Geom_Surface) BinTools_SurfaceSet::Surface
96 (const Standard_Integer I)const
97{
98 return Handle(Geom_Surface)::DownCast(myMap(I));
99}
100
101
102//=======================================================================
103//function : Index
104//purpose :
105//=======================================================================
106
107Standard_Integer BinTools_SurfaceSet::Index
108 (const Handle(Geom_Surface)& S)const
109{
110 return myMap.FindIndex(S);
111}
112
113//=======================================================================
114//function : operator << (gp_Pnt)
115//purpose :
116//=======================================================================
117
118static Standard_OStream& operator <<(Standard_OStream& OS, const gp_Pnt P)
119{
120 BinTools::PutReal(OS, P.X());
121 BinTools::PutReal(OS, P.Y());
122 BinTools::PutReal(OS, P.Z());
123 return OS;
124}
125
126//=======================================================================
127//function : operator << (gp_Dir)
128//purpose :
129//=======================================================================
130
131static Standard_OStream& operator <<(Standard_OStream& OS, const gp_Dir D)
132{
133 BinTools::PutReal(OS, D.X());
134 BinTools::PutReal(OS, D.Y());
135 BinTools::PutReal(OS, D.Z());
136 return OS;
137}
138
139
140//=======================================================================
141//function : operator <<(Geom_Plane)
142//purpose :
143//=======================================================================
144
145static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_Plane)& S)
146{
147 OS << (Standard_Byte)PLANE;
148 gp_Pln P = S->Pln();
149 OS << P.Location();//Pnt
150 OS << P.Axis().Direction();
151 OS << P.XAxis().Direction();
152 OS << P.YAxis().Direction();
153 return OS;
154}
155
156
157//=======================================================================
158//function : operator <<(Geom_CylindricalSurface)
159//purpose :
160//=======================================================================
161
162static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_CylindricalSurface)& S)
163{
164 OS << (Standard_Byte)CYLINDER;
165 gp_Cylinder P = S->Cylinder();
166 OS << P.Location();//Pnt
167 OS << P.Axis().Direction();
168 OS << P.XAxis().Direction();
169 OS << P.YAxis().Direction();
170 BinTools::PutReal(OS, P.Radius());
171 return OS;
172}
173
174
175//=======================================================================
176//function : operator <<(Geom_ConicalSurface)
177//purpose :
178//=======================================================================
179
180static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_ConicalSurface)& S)
181{
182 OS << (Standard_Byte)CONE;
183 gp_Cone P = S->Cone();
184 OS << P.Location();//Pnt
185 OS << P.Axis().Direction();
186 OS << P.XAxis().Direction();
187 OS << P.YAxis().Direction();
188 BinTools::PutReal(OS, P.RefRadius());
189 BinTools::PutReal(OS, P.SemiAngle());
190 return OS;
191}
192
193
194//=======================================================================
195//function : operator <<(Geom_SphericalSurface)
196//purpose :
197//=======================================================================
198
199static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_SphericalSurface)& S)
200{
201 OS << (Standard_Byte)SPHERE;
202 gp_Sphere P = S->Sphere();
203 OS << P.Location();//Pnt
204 OS << P.Position().Axis().Direction();
205 OS << P.XAxis().Direction();
206 OS << P.YAxis().Direction();
207 BinTools::PutReal(OS, P.Radius());
208 return OS;
209}
210
211
212//=======================================================================
213//function : operator <<(Geom_ToroidalSurface)
214//purpose :
215//=======================================================================
216
217static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_ToroidalSurface)& S)
218{
219 OS << (Standard_Byte)TORUS;
220 gp_Torus P = S->Torus();
221 OS << P.Location();//Pnt
222 OS << P.Axis().Direction();
223 OS << P.XAxis().Direction();
224 OS << P.YAxis().Direction();
225 BinTools::PutReal(OS, P.MajorRadius());
226 BinTools::PutReal(OS, P.MinorRadius());
227 return OS;
228}
229
230
231//=======================================================================
232//function : operator <<(Geom_SurfaceOfLinearExtrusion)
233//purpose :
234//=======================================================================
235
236static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_SurfaceOfLinearExtrusion)& S)
237{
238 OS << (Standard_Byte)LINEAREXTRUSION;
239 OS << S->Direction();
240 BinTools_CurveSet::WriteCurve(S->BasisCurve(),OS);
241 return OS;
242}
243
244
245//=======================================================================
246//function : operator <<(Geom_SurfaceOfRevolution)
247//purpose :
248//=======================================================================
249
250static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_SurfaceOfRevolution)& S)
251{
252 OS << (Standard_Byte)REVOLUTION;
253 OS << S->Location();
254 OS << S->Direction();
255 BinTools_CurveSet::WriteCurve(S->BasisCurve(),OS);
256 return OS;
257}
258
259
260//=======================================================================
261//function : operator <<(Geom_BezierSurface)
262//purpose :
263//=======================================================================
264
265static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_BezierSurface)& S)
266{
267 OS << (Standard_Byte)BEZIER;
268 Standard_Boolean urational = S->IsURational() ? 1:0;
269 Standard_Boolean vrational = S->IsVRational() ? 1:0;
270 BinTools::PutBool(OS, urational); //rational
271 BinTools::PutBool(OS, vrational);
04232180 272// std::cout << "Bezier Surface:"<< std::endl;
273// std::cout << "\turational = "<<urational<<" vrational = " <<vrational<<std::endl;
7fd59977 274
275// poles and weights
276 Standard_Integer i,j,udegree,vdegree;
277 udegree = S->UDegree();
278 vdegree = S->VDegree();
7fd59977 279 BinTools::PutExtChar(OS, (Standard_ExtCharacter)udegree);
280 BinTools::PutExtChar(OS, (Standard_ExtCharacter)vdegree);
281 for (i = 1; i <= udegree+1; i++) {
282 for (j = 1; j <= vdegree+1; j++) {
283 OS << S->Pole(i,j); //Pnt
7fd59977 284 if (urational || vrational) {
285 BinTools::PutReal(OS, S->Weight(i,j));//Real
7fd59977 286 }
287 }
288 }
7fd59977 289 return OS;
290}
291
292
293//=======================================================================
294//function : operator <<(Geom_BSplineSurface)
295//purpose :
296//=======================================================================
297
298static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_BSplineSurface)& S)
299{
300 OS << (Standard_Byte)BSPLINE;
301 Standard_Boolean urational = S->IsURational() ? 1:0;
302 Standard_Boolean vrational = S->IsVRational() ? 1:0;
303 Standard_Boolean uperiodic = S->IsUPeriodic() ? 1:0;
304 Standard_Boolean vperiodic = S->IsVPeriodic() ? 1:0;
305 BinTools::PutBool(OS, urational);
306 BinTools::PutBool(OS, vrational);
307 BinTools::PutBool(OS, uperiodic);
308 BinTools::PutBool(OS, vperiodic);
309
310// poles and weights
311 Standard_Integer i,j,udegree,vdegree,nbupoles,nbvpoles,nbuknots,nbvknots;
312 udegree = S->UDegree();
313 vdegree = S->VDegree();
314 nbupoles = S->NbUPoles();
315 nbvpoles = S->NbVPoles();
316 nbuknots = S->NbUKnots();
317 nbvknots = S->NbVKnots();
318 BinTools::PutExtChar(OS, (Standard_ExtCharacter) udegree);
319 BinTools::PutExtChar(OS, (Standard_ExtCharacter) vdegree);
320 BinTools::PutInteger(OS, nbupoles);
321 BinTools::PutInteger(OS, nbvpoles);
322 BinTools::PutInteger(OS, nbuknots);
323 BinTools::PutInteger(OS, nbvknots);
324 for (i = 1; i <= nbupoles; i++) {
325 for (j = 1; j <= nbvpoles; j++) {
326 OS << S->Pole(i,j); //Pnt
327 if (urational || vrational)
328 BinTools::PutReal(OS, S->Weight(i,j));//Real
329 }
330 }
331
332 for (i = 1; i <= nbuknots; i++) {
333 BinTools::PutReal(OS,S->UKnot(i));
334 BinTools::PutInteger(OS, S->UMultiplicity(i));
335 }
336
337 for (i = 1; i <= nbvknots; i++) {
338 BinTools::PutReal(OS,S->VKnot(i));
339 BinTools::PutInteger(OS, S->VMultiplicity(i));
340 }
341 return OS;
342}
343
344
345//=======================================================================
346//function : operator <<(Geom_RectangularTrimmedSurface)
347//purpose :
348//=======================================================================
349
350static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_RectangularTrimmedSurface)& S)
351{
352 OS << (Standard_Byte)RECTANGULAR;
353 Standard_Real U1,U2,V1,V2;
354 S->Bounds(U1,U2,V1,V2);
355 BinTools::PutReal(OS, U1);
356 BinTools::PutReal(OS, U2);
357 BinTools::PutReal(OS, V1);
358 BinTools::PutReal(OS, V2);
359 BinTools_SurfaceSet::WriteSurface(S->BasisSurface(),OS);
360 return OS;
361}
362
363
364//=======================================================================
365//function : operator <<(Geom_OffsetSurface)
366//purpose :
367//=======================================================================
368
369static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_OffsetSurface)& S)
370{
371 OS << (Standard_Byte)OFFSET;
372 BinTools::PutReal(OS, S->Offset());
373 BinTools_SurfaceSet::WriteSurface(S->BasisSurface(),OS);
374 return OS;
375}
376
377
378//=======================================================================
379//function : WriteSurface
380//purpose :
381//=======================================================================
382
383void BinTools_SurfaceSet::WriteSurface(const Handle(Geom_Surface)& S,
384 Standard_OStream& OS)
385{
7fd59977 386 Handle(Standard_Type) TheType = S->DynamicType();
387 try {
388 OCC_CATCH_SIGNALS
389 if ( TheType == STANDARD_TYPE(Geom_Plane)) {
390 OS << Handle(Geom_Plane)::DownCast(S);
391 }
392 else if ( TheType == STANDARD_TYPE(Geom_CylindricalSurface)) {
393 OS << Handle(Geom_CylindricalSurface)::DownCast(S);
394 }
395 else if ( TheType == STANDARD_TYPE(Geom_ConicalSurface)) {
396 OS << Handle(Geom_ConicalSurface)::DownCast(S);
397 }
398 else if ( TheType == STANDARD_TYPE(Geom_SphericalSurface)) {
399 OS << Handle(Geom_SphericalSurface)::DownCast(S);
400 }
401 else if ( TheType == STANDARD_TYPE(Geom_ToroidalSurface)) {
402 OS << Handle(Geom_ToroidalSurface)::DownCast(S);
403 }
404 else if ( TheType == STANDARD_TYPE(Geom_SurfaceOfLinearExtrusion)) {
405 OS << Handle(Geom_SurfaceOfLinearExtrusion)::DownCast(S);
406 }
407 else if ( TheType == STANDARD_TYPE(Geom_SurfaceOfRevolution)) {
408 OS << Handle(Geom_SurfaceOfRevolution)::DownCast(S);
409 }
410 else if ( TheType == STANDARD_TYPE(Geom_BezierSurface)) {
411 OS << Handle(Geom_BezierSurface)::DownCast(S);
412 }
413 else if ( TheType == STANDARD_TYPE(Geom_BSplineSurface)) {
414 OS << Handle(Geom_BSplineSurface)::DownCast(S);
415 }
416 else if ( TheType == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) {
417 OS << Handle(Geom_RectangularTrimmedSurface)::DownCast(S);
418 }
419 else if ( TheType == STANDARD_TYPE(Geom_OffsetSurface)) {
420 OS << Handle(Geom_OffsetSurface)::DownCast(S);
421 }
422 else {
9775fa61 423 throw Standard_Failure("UNKNOWN SURFACE TYPE");
7fd59977 424 }
425 }
9775fa61 426 catch(Standard_Failure const& anException) {
4525373b 427 Standard_SStream aMsg;
04232180 428 aMsg << "EXCEPTION in BinTools_SurfaceSet::WriteSurface(..)" << std::endl;
429 aMsg << anException << std::endl;
9775fa61 430 throw Standard_Failure(aMsg.str().c_str());
7fd59977 431 }
432}
433
434//=======================================================================
435//function : Write
436//purpose :
437//=======================================================================
438
439void BinTools_SurfaceSet::Write(Standard_OStream& OS)const
440{
441
442 Standard_Integer i, nbsurf = myMap.Extent();
443 OS << "Surfaces "<< nbsurf << "\n";
444 for (i = 1; i <= nbsurf; i++) {
445 WriteSurface(Handle(Geom_Surface)::DownCast(myMap(i)),OS);
446 }
447
448}
449
450
451//=======================================================================
452//function : ReadPnt
453//purpose :
454//=======================================================================
455
456static Standard_IStream& operator>>(Standard_IStream& IS, gp_Pnt& P)
457{
458 Standard_Real X=0.,Y=0.,Z=0.;
459 BinTools::GetReal(IS, X);
460 BinTools::GetReal(IS, Y);
461 BinTools::GetReal(IS, Z);
462 P.SetCoord(X,Y,Z);
463 return IS;
464}
465
466//=======================================================================
467//function : ReadDir
468//purpose :
469//=======================================================================
470
471static Standard_IStream& operator>>(Standard_IStream& IS, gp_Dir& D)
472{
473 Standard_Real X=0.,Y=0.,Z=0.;
474 BinTools::GetReal(IS, X);
475 BinTools::GetReal(IS, Y);
476 BinTools::GetReal(IS, Z);
477 D.SetCoord(X,Y,Z);
478 return IS;
479}
480
481//=======================================================================
482//function : ReadAx3
483//purpose :
484//=======================================================================
485
486static Standard_IStream& operator>>(Standard_IStream& IS, gp_Ax3& A3)
487{
488 gp_Pnt P(0.,0.,0.);
489 gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0.);
490 IS >> P >> A >> AX >> AY;
491 gp_Ax3 ax3(P,A,AX);
492 if (AY.DotCross(A,AX) < 0)
493 ax3.YReverse();
494 A3 = ax3;
495 return IS;
496}
497
498
499//=======================================================================
500//function : operator>>
501//purpose :
502//=======================================================================
503
504static Standard_IStream& operator>>(Standard_IStream& IS,
505 Handle(Geom_Plane)& S)
506{
507 gp_Ax3 A;
508 IS >> A;
509 S = new Geom_Plane(A);
510 return IS;
511}
512
513//=======================================================================
514//function : operator>>
515//purpose :
516//=======================================================================
517
518static Standard_IStream& operator>>(Standard_IStream& IS,
519 Handle(Geom_CylindricalSurface)& S)
520{
521 gp_Ax3 A;
522 Standard_Real R=0.;
523 IS >> A;
524 BinTools::GetReal(IS, R);
525 S = new Geom_CylindricalSurface(A,R);
526 return IS;
527}
528
529//=======================================================================
530//function : operator>>
531//purpose :
532//=======================================================================
533
534static Standard_IStream& operator>>(Standard_IStream& IS,
535 Handle(Geom_ConicalSurface)& S)
536{
537 gp_Ax3 A;
538 Standard_Real R=0.,Ang=0.;
539 IS >> A;
540 BinTools::GetReal(IS, R);
541 BinTools::GetReal(IS, Ang);
542 S = new Geom_ConicalSurface(A,Ang,R);
543 return IS;
544}
545
546//=======================================================================
547//function : operator>>
548//purpose :
549//=======================================================================
550
551static Standard_IStream& operator>>(Standard_IStream& IS,
552 Handle(Geom_SphericalSurface)& S)
553{
554 gp_Ax3 A;
555 Standard_Real R=0.;
556 IS >> A;
557 BinTools::GetReal(IS, R);
558 S = new Geom_SphericalSurface(A,R);
559 return IS;
560}
561
562//=======================================================================
563//function : operator>>
564//purpose :
565//=======================================================================
566
567static Standard_IStream& operator>>(Standard_IStream& IS,
568 Handle(Geom_ToroidalSurface)& S)
569{
570 gp_Ax3 A;
571 Standard_Real R1=0.,R2=0.;
572 IS >> A;
573 BinTools::GetReal(IS, R1);
574 BinTools::GetReal(IS, R2);
575 S = new Geom_ToroidalSurface(A,R1,R2);
576 return IS;
577}
578
579//=======================================================================
580//function : operator>>
581//purpose :
582//=======================================================================
583
584static Standard_IStream& operator>>(Standard_IStream& IS,
585 Handle(Geom_SurfaceOfLinearExtrusion)& S)
586{
587 gp_Dir D(1.,0.,0.);
588 Handle(Geom_Curve) C;
589 IS >> D;
590 BinTools_CurveSet::ReadCurve(IS,C);
591 S = new Geom_SurfaceOfLinearExtrusion(C,D);
592 return IS;
593}
594
595//=======================================================================
596//function : operator>>
597//purpose :
598//=======================================================================
599
600static Standard_IStream& operator>>(Standard_IStream& IS,
601 Handle(Geom_SurfaceOfRevolution)& S)
602{
603 gp_Pnt P(0.,0.,0.);
604 gp_Dir D(1.,0.,0.);
605 Handle(Geom_Curve) C;
606 IS >> P >> D;
607 BinTools_CurveSet::ReadCurve(IS, C);
608 S = new Geom_SurfaceOfRevolution(C,gp_Ax1(P,D));
609 return IS;
610}
611
612//=======================================================================
613//function : operator>>
614//purpose :
615//=======================================================================
616
617static Standard_IStream& operator>>(Standard_IStream& IS,
618 Handle(Geom_BezierSurface)& S)
619{
04232180 620// std::cout << "BezierSurface:" <<std::endl;
7fd59977 621 Standard_Boolean urational=Standard_False, vrational=Standard_False;
622 BinTools::GetBool(IS, urational);
623 BinTools::GetBool(IS, vrational);
624
04232180 625// std::cout << "\turational = " << urational << " vrational = " << vrational<<std::endl;
7fd59977 626 Standard_Integer udegree=0, vdegree=0;
627 Standard_ExtCharacter aVal='\0';
628 BinTools::GetExtChar(IS, aVal);
629
630 udegree = (Standard_Integer)aVal;
631 BinTools::GetExtChar(IS, aVal);
632 vdegree = (Standard_Integer)aVal;
04232180 633// std::cout << "\ttudegree = " << udegree << ", vdegree = " << vdegree << std::endl;
7fd59977 634
635 TColgp_Array2OfPnt poles(1,udegree+1,1,vdegree+1);
636 TColStd_Array2OfReal weights(1,udegree+1,1,vdegree+1);
637
638 Standard_Integer i,j;
639 for (i = 1; i <= udegree+1; i++) {
640 for (j = 1; j <= vdegree+1; j++) {
641 IS >> poles(i,j);//Pnt
04232180 642// std::cout <<"Pole X = " <<poles(i,j).X()<< " Y = " <<poles(i,j).Y()<< " Z = " << poles(i,j).Z()<<std::endl;
7fd59977 643 if (urational || vrational)
644 BinTools::GetReal(IS, weights(i,j));
645 }
646 }
647
648 if (urational || vrational)
649 S = new Geom_BezierSurface(poles,weights);
650 else
651 S = new Geom_BezierSurface(poles);
652 return IS;
653}
654
655//=======================================================================
656//function : operator>>
657//purpose :
658//=======================================================================
659
660static Standard_IStream& operator>>(Standard_IStream& IS,
661 Handle(Geom_BSplineSurface)& S)
662{
663 Standard_Boolean urational=Standard_False, vrational=Standard_False,
664 uperiodic=Standard_False, vperiodic=Standard_False;
665 BinTools::GetBool(IS, urational);
666 BinTools::GetBool(IS, vrational);
667 BinTools::GetBool(IS, uperiodic);
668 BinTools::GetBool(IS, vperiodic);
669
670 Standard_Integer udegree=0, vdegree=0,nbupoles=0,nbvpoles=0,nbuknots=0,nbvknots=0;
671 Standard_ExtCharacter aVal='\0';
672 BinTools::GetExtChar(IS, aVal);
673 udegree = (Standard_Integer)aVal;
674 BinTools::GetExtChar(IS, aVal);
675 vdegree = (Standard_Integer)aVal;
676 BinTools::GetInteger(IS, nbupoles);
677 BinTools::GetInteger(IS, nbvpoles);
678 BinTools::GetInteger(IS, nbuknots);
679 BinTools::GetInteger(IS, nbvknots);
680
681 TColgp_Array2OfPnt poles(1,nbupoles,1,nbvpoles);
682 TColStd_Array2OfReal weights(1,nbupoles,1,nbvpoles);
683
684 Standard_Integer i,j;
685 for (i = 1; i <= nbupoles; i++) {
686 for (j = 1; j <= nbvpoles; j++) {
687 IS >> poles(i,j);//Pnt
688 if (urational || vrational)
689 BinTools::GetReal(IS, weights(i,j));
690 }
691 }
692
693 TColStd_Array1OfReal uknots(1,nbuknots);
694 TColStd_Array1OfInteger umults(1,nbuknots);
695 for (i = 1; i <= nbuknots; i++) {
696 BinTools::GetReal(IS, uknots(i));
697 BinTools::GetInteger(IS, umults(i));
698 }
699
700 TColStd_Array1OfReal vknots(1,nbvknots);
701 TColStd_Array1OfInteger vmults(1,nbvknots);
702 for (i = 1; i <= nbvknots; i++) {
703 BinTools::GetReal(IS, vknots(i));
704 BinTools::GetInteger(IS, vmults(i));
705 }
706
707 if (urational || vrational)
708 S = new Geom_BSplineSurface(poles,weights,uknots,vknots,umults,vmults,
709 udegree,vdegree,uperiodic,vperiodic);
710 else
711 S = new Geom_BSplineSurface(poles,uknots,vknots,umults,vmults,
712 udegree,vdegree,uperiodic,vperiodic);
713 return IS;
714}
715
716//=======================================================================
717//function : operator>>
718//purpose :
719//=======================================================================
720
721static Standard_IStream& operator>>(Standard_IStream& IS,
722 Handle(Geom_RectangularTrimmedSurface)& S)
723{
724 Standard_Real U1=0.,U2=0.,V1=0.,V2=0.;
725 BinTools::GetReal(IS, U1);
726 BinTools::GetReal(IS, U2);
727 BinTools::GetReal(IS, V1);
728 BinTools::GetReal(IS, V2);
729 Handle(Geom_Surface) BS;
730 BinTools_SurfaceSet::ReadSurface(IS, BS);
731 S = new Geom_RectangularTrimmedSurface(BS,U1,U2,V1,V2);
732 return IS;
733}
734
735//=======================================================================
736//function : operator>>
737//purpose :
738//=======================================================================
739
740static Standard_IStream& operator>>(Standard_IStream& IS,
741 Handle(Geom_OffsetSurface)& S)
742{
743 Standard_Real O=0.;
744 BinTools::GetReal(IS, O);
745 Handle(Geom_Surface) BS;
746 BinTools_SurfaceSet::ReadSurface(IS, BS);
747 S = new Geom_OffsetSurface(BS,O);
748 return IS;
749}
750
751
752//=======================================================================
753//function : ReadSurface
754//purpose :
755//=======================================================================
756
757Standard_IStream& BinTools_SurfaceSet::ReadSurface(Standard_IStream& IS,
758 Handle(Geom_Surface)& S)
759{
7fd59977 760 try {
761 OCC_CATCH_SIGNALS
762 const Standard_Byte stype = (Standard_Byte) IS.get();
7fd59977 763 switch (stype) {
764
765 case PLANE :
766 {
767 Handle(Geom_Plane) SS;
768 IS >> SS;
769 S = SS;
770 }
771 break;
772
773 case CYLINDER :
774 {
775 Handle(Geom_CylindricalSurface) SS;
776 IS >> SS;
777 S = SS;
778 }
779 break;
780
781 case CONE :
782 {
783 Handle(Geom_ConicalSurface) SS;
784 IS >> SS;
785 S = SS;
786 }
787 break;
788
789 case SPHERE :
790 {
791 Handle(Geom_SphericalSurface) SS;
792 IS >> SS;
793 S = SS;
794 }
795 break;
796
797 case TORUS :
798 {
799 Handle(Geom_ToroidalSurface) SS;
800 IS >> SS;
801 S = SS;
802 }
803 break;
804
805 case LINEAREXTRUSION :
806 {
807 Handle(Geom_SurfaceOfLinearExtrusion) SS;
808 IS >> SS;
809 S = SS;
810 }
811 break;
812
813 case REVOLUTION :
814 {
815 Handle(Geom_SurfaceOfRevolution) SS;
816 IS >> SS;
817 S = SS;
818 }
819 break;
820
821 case BEZIER :
822 {
823 Handle(Geom_BezierSurface) SS;
824 IS >> SS;
825 S = SS;
826 }
827 break;
828
829 case BSPLINE :
830 {
831 Handle(Geom_BSplineSurface) SS;
832 IS >> SS;
833 S = SS;
834 }
835 break;
836
837 case RECTANGULAR :
838 {
839 Handle(Geom_RectangularTrimmedSurface) SS;
840 IS >> SS;
841 S = SS;
842 }
843 break;
844
845 case OFFSET :
846 {
847 Handle(Geom_OffsetSurface) SS;
848 IS >> SS;
849 S = SS;
850 }
851 break;
852
853 default :
854 {
855 S = NULL;
9775fa61 856 throw Standard_Failure("UNKNOWN SURFACE TYPE");
7fd59977 857 }
858 break;
859 }
860 }
9775fa61 861 catch(Standard_Failure const& anException) {
7fd59977 862 S = NULL;
4525373b 863 Standard_SStream aMsg;
04232180 864 aMsg << "EXCEPTION in BinTools_SurfaceSet::ReadSurface(..)" << std::endl;
865 aMsg << anException << std::endl;
9775fa61 866 throw Standard_Failure(aMsg.str().c_str());
7fd59977 867 }
868 return IS;
869}
870
871//=======================================================================
872//function : Read
873//purpose :
874//=======================================================================
875
876void BinTools_SurfaceSet::Read(Standard_IStream& IS)
877{
878 char buffer[255];
879 IS >> buffer;
880 if (IS.fail() || strcmp(buffer,"Surfaces")) {
881 Standard_SStream aMsg;
04232180 882 aMsg << "BinTools_SurfaceSet::Read: Not a surface table"<<std::endl;
0797d9d3 883#ifdef OCCT_DEBUG
04232180 884 std::cout <<"SurfaceSet buffer: " << buffer << std::endl;
7fd59977 885#endif
9775fa61 886 throw Standard_Failure(aMsg.str().c_str());
7fd59977 887 return;
888 }
889
890 Handle(Geom_Surface) S;
891 Standard_Integer i, nbsurf;
892 IS >> nbsurf;
893 IS.get ();//remove <lf>
894 for (i = 1; i <= nbsurf; i++) {
895 BinTools_SurfaceSet::ReadSurface(IS,S);
896 myMap.Add(S);
897 }
898}
899