1 // Created on: 2004-05-18
2 // Created by: Sergey ZARITCHNY
3 // Copyright (c) 2004-2014 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
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
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.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
17 #include <BinTools.hxx>
18 #include <BinTools_Curve2dSet.hxx>
19 #include <Geom2d_BezierCurve.hxx>
20 #include <Geom2d_BSplineCurve.hxx>
21 #include <Geom2d_Circle.hxx>
22 #include <Geom2d_Curve.hxx>
23 #include <Geom2d_Ellipse.hxx>
24 #include <Geom2d_Hyperbola.hxx>
25 #include <Geom2d_Line.hxx>
26 #include <Geom2d_OffsetCurve.hxx>
27 #include <Geom2d_Parabola.hxx>
28 #include <Geom2d_TrimmedCurve.hxx>
29 #include <gp_Circ2d.hxx>
30 #include <gp_Elips2d.hxx>
31 #include <gp_Hypr2d.hxx>
32 #include <gp_Lin2d.hxx>
33 #include <gp_Parab2d.hxx>
34 #include <Standard_ErrorHandler.hxx>
35 #include <Standard_Failure.hxx>
36 #include <Standard_OutOfRange.hxx>
37 #include <Standard_Stream.hxx>
38 #include <TColgp_Array1OfPnt2d.hxx>
39 #include <TColStd_Array1OfInteger.hxx>
40 #include <TColStd_Array1OfReal.hxx>
52 //=======================================================================
53 //function : BinTools_Curve2dSet
55 //=======================================================================
57 BinTools_Curve2dSet::BinTools_Curve2dSet()
62 //=======================================================================
65 //=======================================================================
67 void BinTools_Curve2dSet::Clear()
73 //=======================================================================
76 //=======================================================================
78 Standard_Integer BinTools_Curve2dSet::Add(const Handle(Geom2d_Curve)& S)
84 //=======================================================================
87 //=======================================================================
89 Handle(Geom2d_Curve) BinTools_Curve2dSet::Curve2d
90 (const Standard_Integer I)const
92 return Handle(Geom2d_Curve)::DownCast(myMap(I));
96 //=======================================================================
99 //=======================================================================
101 Standard_Integer BinTools_Curve2dSet::Index
102 (const Handle(Geom2d_Curve)& S)const
104 return myMap.FindIndex(S);
107 //=======================================================================
108 //function : operator << (gp_Pnt2d)
110 //=======================================================================
112 static Standard_OStream& operator <<(Standard_OStream& OS, const gp_Pnt2d P)
115 BinTools::PutReal(OS, P.X());
116 return BinTools::PutReal(OS, P.Y());
119 //=======================================================================
120 //function : operator << (gp_Dir2d D)
122 //=======================================================================
124 static Standard_OStream& operator <<(Standard_OStream& OS, const gp_Dir2d D)
126 BinTools::PutReal(OS, D.X());
127 return BinTools::PutReal(OS, D.Y());
130 //=======================================================================
131 //function : operator << ((Geom2d_Line)& L)
133 //=======================================================================
135 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom2d_Line)& L)
138 OS << (Standard_Byte)LINE;
139 gp_Lin2d C2d = L->Lin2d();
140 OS << C2d.Location();//Pnt2d
141 OS << C2d.Direction();//Dir2d
145 //=======================================================================
146 //function : operator << ((Geom2d_Circle)& C)
148 //=======================================================================
150 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom2d_Circle)& C)
152 OS << (Standard_Byte)CIRCLE;
153 gp_Circ2d C2d = C->Circ2d();
154 OS << C2d.Location();
155 OS << C2d.XAxis().Direction();
156 OS << C2d.YAxis().Direction();
157 BinTools::PutReal(OS, C2d.Radius());
161 //=======================================================================
162 //function : operator <<(Geom2d_Ellipse)
164 //=======================================================================
166 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom2d_Ellipse)& E)
168 OS << (Standard_Byte)ELLIPSE;
169 gp_Elips2d C2d = E->Elips2d();
170 OS << C2d.Location();
171 OS << C2d.XAxis().Direction();
172 OS << C2d.YAxis().Direction();
173 BinTools::PutReal(OS, C2d.MajorRadius());
174 BinTools::PutReal(OS, C2d.MinorRadius());
178 //=======================================================================
179 //function : operator << (Geom2d_Parabola)
181 //=======================================================================
183 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom2d_Parabola)& P)
185 OS << (Standard_Byte)PARABOLA;
186 gp_Parab2d C2d = P->Parab2d();
187 OS << C2d.Location();//Loc
188 OS << C2d.Axis().XAxis().Direction();//XDir
189 OS << C2d.Axis().YAxis().Direction();//YDir
190 BinTools::PutReal(OS, C2d.Focal());//Focal
194 //=======================================================================
195 //function : operator <<(Geom2d_Hyperbola)
197 //=======================================================================
199 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom2d_Hyperbola)& H)
201 OS << (Standard_Byte)HYPERBOLA;
202 gp_Hypr2d C2d = H->Hypr2d();
203 OS << C2d.Location(); //Loc
204 OS << C2d.XAxis().Direction();//XDir
205 OS << C2d.YAxis().Direction();//YDir
206 BinTools::PutReal(OS, C2d.MajorRadius());//MajR
207 BinTools::PutReal(OS, C2d.MinorRadius());
211 //=======================================================================
212 //function : operator <<(Geom2d_BezierCurve)
214 //=======================================================================
216 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom2d_BezierCurve)& B)
218 OS << (Standard_Byte)BEZIER;
219 Standard_Boolean aRational = B->IsRational() ? 1:0;
220 BinTools::PutBool(OS, aRational); //rational
222 Standard_Integer i,aDegree = B->Degree();
223 BinTools::PutExtChar(OS, (Standard_ExtCharacter)aDegree); //Degree
224 for (i = 1; i <= aDegree+1; i++) {
225 OS << B->Pole(i); //Pnt2d
227 BinTools::PutReal(OS, B->Weight(i));//Real
232 //=======================================================================
233 //function : operator <<(Geom2d_BSplineCurve)
235 //=======================================================================
237 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom2d_BSplineCurve)& B)
239 OS << (Standard_Byte)BSPLINE;
240 Standard_Boolean aRational = B->IsRational() ? 1:0;
241 BinTools::PutBool(OS, aRational); //rational
242 Standard_Boolean aPeriodic = B->IsPeriodic() ? 1:0;
243 BinTools::PutBool(OS, aPeriodic); //periodic
245 Standard_Integer i,aDegree,aNbPoles,aNbKnots;
246 aDegree = B->Degree();
247 aNbPoles = B->NbPoles();
248 aNbKnots = B->NbKnots();
249 BinTools::PutExtChar(OS, (Standard_ExtCharacter) aDegree);
250 BinTools::PutInteger(OS, aNbPoles);
251 BinTools::PutInteger(OS, aNbKnots);
252 for (i = 1; i <= aNbPoles; i++) {
253 OS << B->Pole(i); // Pnt2d
255 BinTools::PutReal(OS, B->Weight(i));
258 for (i = 1; i <= aNbKnots; i++) {
259 BinTools::PutReal(OS, B->Knot(i));
260 BinTools::PutInteger(OS, B->Multiplicity(i));
266 //=======================================================================
267 //function : operator <<(Geom2d_TrimmedCurve)
269 //=======================================================================
271 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom2d_TrimmedCurve)& C)
273 OS << (Standard_Byte)TRIMMED;
274 BinTools::PutReal(OS, C->FirstParameter());
275 BinTools::PutReal(OS, C->LastParameter());
276 BinTools_Curve2dSet::WriteCurve2d(C->BasisCurve(),OS);
280 //=======================================================================
281 //function : operator <<(Geom2d_OffsetCurve)
283 //=======================================================================
285 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom2d_OffsetCurve)& C)
287 OS << (Standard_Byte)OFFSET;
288 BinTools::PutReal(OS,C->Offset());//Offset
289 BinTools_Curve2dSet::WriteCurve2d(C->BasisCurve(),OS);
293 //=======================================================================
294 //function : WriteCurve2d
296 //=======================================================================
298 void BinTools_Curve2dSet::WriteCurve2d(const Handle(Geom2d_Curve)& C,
299 Standard_OStream& OS)
301 Handle(Standard_Type) TheType = C->DynamicType();
304 if ( TheType == STANDARD_TYPE(Geom2d_Circle)) {
305 OS << Handle(Geom2d_Circle)::DownCast(C);
307 else if ( TheType ==STANDARD_TYPE(Geom2d_Line)) {
308 OS << Handle(Geom2d_Line)::DownCast(C);
310 else if ( TheType == STANDARD_TYPE(Geom2d_Ellipse)) {
311 OS << Handle(Geom2d_Ellipse)::DownCast(C);
313 else if ( TheType == STANDARD_TYPE(Geom2d_Parabola)) {
314 OS << Handle(Geom2d_Parabola)::DownCast(C);
316 else if ( TheType == STANDARD_TYPE(Geom2d_Hyperbola)) {
317 OS << Handle(Geom2d_Hyperbola)::DownCast(C);
319 else if ( TheType == STANDARD_TYPE(Geom2d_BezierCurve)) {
320 OS << Handle(Geom2d_BezierCurve)::DownCast(C);
322 else if ( TheType == STANDARD_TYPE(Geom2d_BSplineCurve)) {
323 OS << Handle(Geom2d_BSplineCurve)::DownCast(C);
325 else if ( TheType == STANDARD_TYPE(Geom2d_TrimmedCurve)) {
326 OS << Handle(Geom2d_TrimmedCurve)::DownCast(C);
328 else if ( TheType == STANDARD_TYPE(Geom2d_OffsetCurve)) {
329 OS << Handle(Geom2d_OffsetCurve)::DownCast(C);
332 throw Standard_Failure("UNKNOWN CURVE2d TYPE");
335 catch(Standard_Failure const& anException) {
336 Standard_SStream aMsg;
337 aMsg << "EXCEPTION in BinTools_Curve2dSet::WriteCurve2d(..)" << endl;
338 aMsg << anException << endl;
339 throw Standard_Failure(aMsg.str().c_str());
343 //=======================================================================
346 //=======================================================================
348 void BinTools_Curve2dSet::Write(Standard_OStream& OS)const
350 Standard_Integer i, aNbCurves = myMap.Extent();
351 OS << "Curve2ds "<< aNbCurves << "\n";
352 for (i = 1; i <= aNbCurves; i++) {
353 WriteCurve2d(Handle(Geom2d_Curve)::DownCast(myMap(i)),OS);
358 //=======================================================================
359 //function : ReadPnt2d
361 //=======================================================================
363 static Standard_IStream& operator>>(Standard_IStream& IS, gp_Pnt2d& P)
365 Standard_Real X=0.,Y=0.;
366 BinTools::GetReal(IS, X);
367 BinTools::GetReal(IS, Y);
372 //=======================================================================
373 //function : ReadDir2d
375 //=======================================================================
377 static Standard_IStream& operator>>(Standard_IStream& IS, gp_Dir2d& D)
379 Standard_Real X=0.,Y=0.;
380 BinTools::GetReal(IS, X);
381 BinTools::GetReal(IS, Y);
387 //=======================================================================
388 //function : ReadCurve2d
390 //=======================================================================
392 static Standard_IStream& operator>>(Standard_IStream& IS,
393 Handle(Geom2d_Line)& L)
398 L = new Geom2d_Line(P,AX);
402 //=======================================================================
403 //function : ReadCurve2d
405 //=======================================================================
406 static Standard_IStream& operator>>(Standard_IStream& IS,
407 Handle(Geom2d_Circle)& C)
410 gp_Dir2d AX(1.,0.),AY(1.,0.);
413 BinTools::GetReal(IS, R);
414 C = new Geom2d_Circle(gp_Ax22d(P,AX,AY),R);
418 //=======================================================================
419 //function : ReadCurve2d
421 //=======================================================================
423 static Standard_IStream& operator>>(Standard_IStream& IS,
424 Handle(Geom2d_Ellipse)& E)
427 gp_Dir2d AX(1.,0.),AY(1.,0.);
428 Standard_Real R1=0., R2=0.;
430 BinTools::GetReal(IS, R1);
431 BinTools::GetReal(IS, R2);
432 E = new Geom2d_Ellipse(gp_Ax22d(P,AX,AY),R1,R2);
436 //=======================================================================
437 //function : ReadCurve2d
439 //=======================================================================
441 static Standard_IStream& operator>>(Standard_IStream& IS,
442 Handle(Geom2d_Parabola)& C)
445 gp_Dir2d AX(1.,0.),AY(1.,0.);
448 BinTools::GetReal(IS, R1);
449 C = new Geom2d_Parabola(gp_Ax22d(P,AX,AY),R1);
453 //=======================================================================
454 //function : ReadCurve2d
456 //=======================================================================
458 static Standard_IStream& operator>>(Standard_IStream& IS,
459 Handle(Geom2d_Hyperbola)& H)
462 gp_Dir2d AX(1.,0.),AY(1.,0.);
463 Standard_Real R1=0.,R2=0.;
465 BinTools::GetReal(IS, R1);
466 BinTools::GetReal(IS, R2);
467 H = new Geom2d_Hyperbola(gp_Ax22d(P,AX,AY),R1,R2);
471 //=======================================================================
472 //function : ReadCurve2d
474 //=======================================================================
476 static Standard_IStream& operator>>(Standard_IStream& IS,
477 Handle(Geom2d_BezierCurve)& B)
479 Standard_Boolean rational=Standard_False;
480 BinTools::GetBool(IS, rational);
483 Standard_Integer i=0,degree=0;
485 Standard_ExtCharacter aVal='\0';
486 BinTools::GetExtChar(IS, aVal);
487 degree = (Standard_Integer)aVal;
489 TColgp_Array1OfPnt2d poles(1,degree+1);
490 TColStd_Array1OfReal weights(1,degree+1);
492 for (i = 1; i <= degree+1; i++) {
493 IS >> poles(i);//Pnt2d
495 BinTools::GetReal(IS, weights(i));
499 B = new Geom2d_BezierCurve(poles,weights);
501 B = new Geom2d_BezierCurve(poles);
506 //=======================================================================
507 //function : ReadCurve2d
509 //=======================================================================
511 static Standard_IStream& operator>>(Standard_IStream& IS,
512 Handle(Geom2d_BSplineCurve)& B)
515 Standard_Boolean rational=Standard_False,periodic=Standard_False;
516 BinTools::GetBool(IS, rational);
517 BinTools::GetBool(IS, periodic);
519 Standard_Integer i=0,degree=0,nbpoles=0,nbknots=0;
520 Standard_ExtCharacter aVal='\0';
522 BinTools::GetExtChar(IS, aVal);
523 degree = (Standard_Integer)aVal;
525 BinTools::GetInteger(IS, nbpoles);
527 BinTools::GetInteger(IS, nbknots);
529 TColgp_Array1OfPnt2d poles(1,nbpoles);
530 TColStd_Array1OfReal weights(1,nbpoles);
532 for (i = 1; i <= nbpoles; i++) {
533 IS >> poles(i);//Pnt2d
535 BinTools::GetReal(IS, weights(i));
538 TColStd_Array1OfReal knots(1,nbknots);
539 TColStd_Array1OfInteger mults(1,nbknots);
541 for (i = 1; i <= nbknots; i++) {
542 BinTools::GetReal(IS, knots(i));
543 BinTools::GetInteger(IS, mults(i));
547 B = new Geom2d_BSplineCurve(poles,weights,knots,mults,degree,periodic);
549 B = new Geom2d_BSplineCurve(poles,knots,mults,degree,periodic);
554 //=======================================================================
555 //function : ReadCurve2d
557 //=======================================================================
559 static Standard_IStream& operator>>(Standard_IStream& IS,
560 Handle(Geom2d_TrimmedCurve)& C)
562 Standard_Real p1=0.,p2=0.;
563 BinTools::GetReal(IS, p1);//FirstParameter
564 BinTools::GetReal(IS, p2);//LastParameter
565 Handle(Geom2d_Curve) BC;
566 BinTools_Curve2dSet::ReadCurve2d(IS,BC);
567 C = new Geom2d_TrimmedCurve(BC,p1,p2);
571 //=======================================================================
572 //function : ReadCurve2d
574 //=======================================================================
576 static Standard_IStream& operator>>(Standard_IStream& IS,
577 Handle(Geom2d_OffsetCurve)& C)
580 BinTools::GetReal(IS, p);//Offset
581 Handle(Geom2d_Curve) BC;
582 BinTools_Curve2dSet::ReadCurve2d(IS,BC);
583 C = new Geom2d_OffsetCurve(BC,p);
587 //=======================================================================
588 //function : ReadCurve2d
590 //=======================================================================
592 Standard_IStream& BinTools_Curve2dSet::ReadCurve2d(Standard_IStream& IS,
593 Handle(Geom2d_Curve)& C)
597 const Standard_Byte ctype = (Standard_Byte) IS.get();
602 Handle(Geom2d_Line) CC;
610 Handle(Geom2d_Circle) CC;
618 Handle(Geom2d_Ellipse) CC;
626 Handle(Geom2d_Parabola) CC;
634 Handle(Geom2d_Hyperbola) CC;
642 Handle(Geom2d_BezierCurve) CC;
650 Handle(Geom2d_BSplineCurve) CC;
658 Handle(Geom2d_TrimmedCurve) CC;
666 Handle(Geom2d_OffsetCurve) CC;
675 throw Standard_Failure("UNKNOWN CURVE2d TYPE");
680 catch(Standard_Failure const& anException) {
682 Standard_SStream aMsg;
683 aMsg <<"EXCEPTION in BinTools_Curve2dSet::ReadCurve2d(...)" << endl;
684 aMsg << anException << endl;
685 throw Standard_Failure(aMsg.str().c_str());
690 //=======================================================================
693 //=======================================================================
695 void BinTools_Curve2dSet::Read(Standard_IStream& IS)
700 if (IS.fail() || strcmp(buffer,"Curve2ds")) {
701 Standard_SStream aMsg;
702 aMsg << "BinTools_Curve2dSet::Read: Not a Curve2d table"<<endl;
704 cout <<"Curve2dSet buffer: " << buffer << endl;
706 throw Standard_Failure(aMsg.str().c_str());
710 Handle(Geom2d_Curve) C;
711 Standard_Integer i, aNbCurves;
713 IS.get();//remove <lf>
714 for (i = 1; i <= aNbCurves; i++) {
715 BinTools_Curve2dSet::ReadCurve2d(IS,C);