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>
41 #include <Message_ProgressScope.hxx>
53 //=======================================================================
54 //function : BinTools_Curve2dSet
56 //=======================================================================
58 BinTools_Curve2dSet::BinTools_Curve2dSet()
63 //=======================================================================
66 //=======================================================================
68 void BinTools_Curve2dSet::Clear()
74 //=======================================================================
77 //=======================================================================
79 Standard_Integer BinTools_Curve2dSet::Add(const Handle(Geom2d_Curve)& S)
85 //=======================================================================
88 //=======================================================================
90 Handle(Geom2d_Curve) BinTools_Curve2dSet::Curve2d
91 (const Standard_Integer I)const
93 return Handle(Geom2d_Curve)::DownCast(myMap(I));
97 //=======================================================================
100 //=======================================================================
102 Standard_Integer BinTools_Curve2dSet::Index
103 (const Handle(Geom2d_Curve)& S)const
105 return myMap.FindIndex(S);
108 //=======================================================================
109 //function : operator << (gp_Pnt2d)
111 //=======================================================================
113 static Standard_OStream& operator <<(Standard_OStream& OS, const gp_Pnt2d P)
116 BinTools::PutReal(OS, P.X());
117 return BinTools::PutReal(OS, P.Y());
120 //=======================================================================
121 //function : operator << (gp_Dir2d D)
123 //=======================================================================
125 static Standard_OStream& operator <<(Standard_OStream& OS, const gp_Dir2d D)
127 BinTools::PutReal(OS, D.X());
128 return BinTools::PutReal(OS, D.Y());
131 //=======================================================================
132 //function : operator << ((Geom2d_Line)& L)
134 //=======================================================================
136 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom2d_Line)& L)
139 OS << (Standard_Byte)LINE;
140 gp_Lin2d C2d = L->Lin2d();
141 OS << C2d.Location();//Pnt2d
142 OS << C2d.Direction();//Dir2d
146 //=======================================================================
147 //function : operator << ((Geom2d_Circle)& C)
149 //=======================================================================
151 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom2d_Circle)& C)
153 OS << (Standard_Byte)CIRCLE;
154 gp_Circ2d C2d = C->Circ2d();
155 OS << C2d.Location();
156 OS << C2d.XAxis().Direction();
157 OS << C2d.YAxis().Direction();
158 BinTools::PutReal(OS, C2d.Radius());
162 //=======================================================================
163 //function : operator <<(Geom2d_Ellipse)
165 //=======================================================================
167 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom2d_Ellipse)& E)
169 OS << (Standard_Byte)ELLIPSE;
170 gp_Elips2d C2d = E->Elips2d();
171 OS << C2d.Location();
172 OS << C2d.XAxis().Direction();
173 OS << C2d.YAxis().Direction();
174 BinTools::PutReal(OS, C2d.MajorRadius());
175 BinTools::PutReal(OS, C2d.MinorRadius());
179 //=======================================================================
180 //function : operator << (Geom2d_Parabola)
182 //=======================================================================
184 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom2d_Parabola)& P)
186 OS << (Standard_Byte)PARABOLA;
187 gp_Parab2d C2d = P->Parab2d();
188 OS << C2d.Location();//Loc
189 OS << C2d.Axis().XAxis().Direction();//XDir
190 OS << C2d.Axis().YAxis().Direction();//YDir
191 BinTools::PutReal(OS, C2d.Focal());//Focal
195 //=======================================================================
196 //function : operator <<(Geom2d_Hyperbola)
198 //=======================================================================
200 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom2d_Hyperbola)& H)
202 OS << (Standard_Byte)HYPERBOLA;
203 gp_Hypr2d C2d = H->Hypr2d();
204 OS << C2d.Location(); //Loc
205 OS << C2d.XAxis().Direction();//XDir
206 OS << C2d.YAxis().Direction();//YDir
207 BinTools::PutReal(OS, C2d.MajorRadius());//MajR
208 BinTools::PutReal(OS, C2d.MinorRadius());
212 //=======================================================================
213 //function : operator <<(Geom2d_BezierCurve)
215 //=======================================================================
217 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom2d_BezierCurve)& B)
219 OS << (Standard_Byte)BEZIER;
220 Standard_Boolean aRational = B->IsRational() ? 1:0;
221 BinTools::PutBool(OS, aRational); //rational
223 Standard_Integer i,aDegree = B->Degree();
224 BinTools::PutExtChar(OS, (Standard_ExtCharacter)aDegree); //Degree
225 for (i = 1; i <= aDegree+1; i++) {
226 OS << B->Pole(i); //Pnt2d
228 BinTools::PutReal(OS, B->Weight(i));//Real
233 //=======================================================================
234 //function : operator <<(Geom2d_BSplineCurve)
236 //=======================================================================
238 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom2d_BSplineCurve)& B)
240 OS << (Standard_Byte)BSPLINE;
241 Standard_Boolean aRational = B->IsRational() ? 1:0;
242 BinTools::PutBool(OS, aRational); //rational
243 Standard_Boolean aPeriodic = B->IsPeriodic() ? 1:0;
244 BinTools::PutBool(OS, aPeriodic); //periodic
246 Standard_Integer i,aDegree,aNbPoles,aNbKnots;
247 aDegree = B->Degree();
248 aNbPoles = B->NbPoles();
249 aNbKnots = B->NbKnots();
250 BinTools::PutExtChar(OS, (Standard_ExtCharacter) aDegree);
251 BinTools::PutInteger(OS, aNbPoles);
252 BinTools::PutInteger(OS, aNbKnots);
253 for (i = 1; i <= aNbPoles; i++) {
254 OS << B->Pole(i); // Pnt2d
256 BinTools::PutReal(OS, B->Weight(i));
259 for (i = 1; i <= aNbKnots; i++) {
260 BinTools::PutReal(OS, B->Knot(i));
261 BinTools::PutInteger(OS, B->Multiplicity(i));
267 //=======================================================================
268 //function : operator <<(Geom2d_TrimmedCurve)
270 //=======================================================================
272 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom2d_TrimmedCurve)& C)
274 OS << (Standard_Byte)TRIMMED;
275 BinTools::PutReal(OS, C->FirstParameter());
276 BinTools::PutReal(OS, C->LastParameter());
277 BinTools_Curve2dSet::WriteCurve2d(C->BasisCurve(),OS);
281 //=======================================================================
282 //function : operator <<(Geom2d_OffsetCurve)
284 //=======================================================================
286 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom2d_OffsetCurve)& C)
288 OS << (Standard_Byte)OFFSET;
289 BinTools::PutReal(OS,C->Offset());//Offset
290 BinTools_Curve2dSet::WriteCurve2d(C->BasisCurve(),OS);
294 //=======================================================================
295 //function : WriteCurve2d
297 //=======================================================================
299 void BinTools_Curve2dSet::WriteCurve2d(const Handle(Geom2d_Curve)& C,
300 Standard_OStream& OS)
302 Handle(Standard_Type) TheType = C->DynamicType();
305 if ( TheType == STANDARD_TYPE(Geom2d_Circle)) {
306 OS << Handle(Geom2d_Circle)::DownCast(C);
308 else if ( TheType ==STANDARD_TYPE(Geom2d_Line)) {
309 OS << Handle(Geom2d_Line)::DownCast(C);
311 else if ( TheType == STANDARD_TYPE(Geom2d_Ellipse)) {
312 OS << Handle(Geom2d_Ellipse)::DownCast(C);
314 else if ( TheType == STANDARD_TYPE(Geom2d_Parabola)) {
315 OS << Handle(Geom2d_Parabola)::DownCast(C);
317 else if ( TheType == STANDARD_TYPE(Geom2d_Hyperbola)) {
318 OS << Handle(Geom2d_Hyperbola)::DownCast(C);
320 else if ( TheType == STANDARD_TYPE(Geom2d_BezierCurve)) {
321 OS << Handle(Geom2d_BezierCurve)::DownCast(C);
323 else if ( TheType == STANDARD_TYPE(Geom2d_BSplineCurve)) {
324 OS << Handle(Geom2d_BSplineCurve)::DownCast(C);
326 else if ( TheType == STANDARD_TYPE(Geom2d_TrimmedCurve)) {
327 OS << Handle(Geom2d_TrimmedCurve)::DownCast(C);
329 else if ( TheType == STANDARD_TYPE(Geom2d_OffsetCurve)) {
330 OS << Handle(Geom2d_OffsetCurve)::DownCast(C);
333 throw Standard_Failure("UNKNOWN CURVE2d TYPE");
336 catch(Standard_Failure const& anException) {
337 Standard_SStream aMsg;
338 aMsg << "EXCEPTION in BinTools_Curve2dSet::WriteCurve2d(..)" << std::endl;
339 aMsg << anException << std::endl;
340 throw Standard_Failure(aMsg.str().c_str());
344 //=======================================================================
347 //=======================================================================
349 void BinTools_Curve2dSet::Write (Standard_OStream& OS,
350 const Message_ProgressRange& theRange) const
352 Standard_Integer i, aNbCurves = myMap.Extent();
353 Message_ProgressScope aPS(theRange, "Writing 2D curves",aNbCurves);
354 OS << "Curve2ds "<< aNbCurves << "\n";
355 for (i = 1; i <= aNbCurves && aPS.More(); i++, aPS.Next()) {
356 WriteCurve2d(Handle(Geom2d_Curve)::DownCast(myMap(i)),OS);
361 //=======================================================================
362 //function : ReadPnt2d
364 //=======================================================================
366 static Standard_IStream& operator>>(Standard_IStream& IS, gp_Pnt2d& P)
368 Standard_Real X=0.,Y=0.;
369 BinTools::GetReal(IS, X);
370 BinTools::GetReal(IS, Y);
375 //=======================================================================
376 //function : ReadDir2d
378 //=======================================================================
380 static Standard_IStream& operator>>(Standard_IStream& IS, gp_Dir2d& D)
382 Standard_Real X=0.,Y=0.;
383 BinTools::GetReal(IS, X);
384 BinTools::GetReal(IS, Y);
390 //=======================================================================
391 //function : ReadCurve2d
393 //=======================================================================
395 static Standard_IStream& operator>>(Standard_IStream& IS,
396 Handle(Geom2d_Line)& L)
401 L = new Geom2d_Line(P,AX);
405 //=======================================================================
406 //function : ReadCurve2d
408 //=======================================================================
409 static Standard_IStream& operator>>(Standard_IStream& IS,
410 Handle(Geom2d_Circle)& C)
413 gp_Dir2d AX(1.,0.),AY(1.,0.);
416 BinTools::GetReal(IS, R);
417 C = new Geom2d_Circle(gp_Ax22d(P,AX,AY),R);
421 //=======================================================================
422 //function : ReadCurve2d
424 //=======================================================================
426 static Standard_IStream& operator>>(Standard_IStream& IS,
427 Handle(Geom2d_Ellipse)& E)
430 gp_Dir2d AX(1.,0.),AY(1.,0.);
431 Standard_Real R1=0., R2=0.;
433 BinTools::GetReal(IS, R1);
434 BinTools::GetReal(IS, R2);
435 E = new Geom2d_Ellipse(gp_Ax22d(P,AX,AY),R1,R2);
439 //=======================================================================
440 //function : ReadCurve2d
442 //=======================================================================
444 static Standard_IStream& operator>>(Standard_IStream& IS,
445 Handle(Geom2d_Parabola)& C)
448 gp_Dir2d AX(1.,0.),AY(1.,0.);
451 BinTools::GetReal(IS, R1);
452 C = new Geom2d_Parabola(gp_Ax22d(P,AX,AY),R1);
456 //=======================================================================
457 //function : ReadCurve2d
459 //=======================================================================
461 static Standard_IStream& operator>>(Standard_IStream& IS,
462 Handle(Geom2d_Hyperbola)& H)
465 gp_Dir2d AX(1.,0.),AY(1.,0.);
466 Standard_Real R1=0.,R2=0.;
468 BinTools::GetReal(IS, R1);
469 BinTools::GetReal(IS, R2);
470 H = new Geom2d_Hyperbola(gp_Ax22d(P,AX,AY),R1,R2);
474 //=======================================================================
475 //function : ReadCurve2d
477 //=======================================================================
479 static Standard_IStream& operator>>(Standard_IStream& IS,
480 Handle(Geom2d_BezierCurve)& B)
482 Standard_Boolean rational=Standard_False;
483 BinTools::GetBool(IS, rational);
486 Standard_Integer i=0,degree=0;
488 Standard_ExtCharacter aVal='\0';
489 BinTools::GetExtChar(IS, aVal);
490 degree = (Standard_Integer)aVal;
492 TColgp_Array1OfPnt2d poles(1,degree+1);
493 TColStd_Array1OfReal weights(1,degree+1);
495 for (i = 1; i <= degree+1; i++) {
496 IS >> poles(i);//Pnt2d
498 BinTools::GetReal(IS, weights(i));
502 B = new Geom2d_BezierCurve(poles,weights);
504 B = new Geom2d_BezierCurve(poles);
509 //=======================================================================
510 //function : ReadCurve2d
512 //=======================================================================
514 static Standard_IStream& operator>>(Standard_IStream& IS,
515 Handle(Geom2d_BSplineCurve)& B)
518 Standard_Boolean rational=Standard_False,periodic=Standard_False;
519 BinTools::GetBool(IS, rational);
520 BinTools::GetBool(IS, periodic);
522 Standard_Integer i=0,degree=0,nbpoles=0,nbknots=0;
523 Standard_ExtCharacter aVal='\0';
525 BinTools::GetExtChar(IS, aVal);
526 degree = (Standard_Integer)aVal;
528 BinTools::GetInteger(IS, nbpoles);
530 BinTools::GetInteger(IS, nbknots);
532 TColgp_Array1OfPnt2d poles(1,nbpoles);
533 TColStd_Array1OfReal weights(1,nbpoles);
535 for (i = 1; i <= nbpoles; i++) {
536 IS >> poles(i);//Pnt2d
538 BinTools::GetReal(IS, weights(i));
541 TColStd_Array1OfReal knots(1,nbknots);
542 TColStd_Array1OfInteger mults(1,nbknots);
544 for (i = 1; i <= nbknots; i++) {
545 BinTools::GetReal(IS, knots(i));
546 BinTools::GetInteger(IS, mults(i));
550 B = new Geom2d_BSplineCurve(poles,weights,knots,mults,degree,periodic);
552 B = new Geom2d_BSplineCurve(poles,knots,mults,degree,periodic);
557 //=======================================================================
558 //function : ReadCurve2d
560 //=======================================================================
562 static Standard_IStream& operator>>(Standard_IStream& IS,
563 Handle(Geom2d_TrimmedCurve)& C)
565 Standard_Real p1=0.,p2=0.;
566 BinTools::GetReal(IS, p1);//FirstParameter
567 BinTools::GetReal(IS, p2);//LastParameter
568 Handle(Geom2d_Curve) BC;
569 BinTools_Curve2dSet::ReadCurve2d(IS,BC);
570 C = new Geom2d_TrimmedCurve(BC,p1,p2);
574 //=======================================================================
575 //function : ReadCurve2d
577 //=======================================================================
579 static Standard_IStream& operator>>(Standard_IStream& IS,
580 Handle(Geom2d_OffsetCurve)& C)
583 BinTools::GetReal(IS, p);//Offset
584 Handle(Geom2d_Curve) BC;
585 BinTools_Curve2dSet::ReadCurve2d(IS,BC);
586 C = new Geom2d_OffsetCurve(BC,p);
590 //=======================================================================
591 //function : ReadCurve2d
593 //=======================================================================
595 Standard_IStream& BinTools_Curve2dSet::ReadCurve2d(Standard_IStream& IS,
596 Handle(Geom2d_Curve)& C)
600 const Standard_Byte ctype = (Standard_Byte) IS.get();
605 Handle(Geom2d_Line) CC;
613 Handle(Geom2d_Circle) CC;
621 Handle(Geom2d_Ellipse) CC;
629 Handle(Geom2d_Parabola) CC;
637 Handle(Geom2d_Hyperbola) CC;
645 Handle(Geom2d_BezierCurve) CC;
653 Handle(Geom2d_BSplineCurve) CC;
661 Handle(Geom2d_TrimmedCurve) CC;
669 Handle(Geom2d_OffsetCurve) CC;
678 throw Standard_Failure("UNKNOWN CURVE2d TYPE");
683 catch(Standard_Failure const& anException) {
685 Standard_SStream aMsg;
686 aMsg <<"EXCEPTION in BinTools_Curve2dSet::ReadCurve2d(...)" << std::endl;
687 aMsg << anException << std::endl;
688 throw Standard_Failure(aMsg.str().c_str());
693 //=======================================================================
696 //=======================================================================
698 void BinTools_Curve2dSet::Read (Standard_IStream& IS,
699 const Message_ProgressRange& theRange)
704 if (IS.fail() || strcmp(buffer,"Curve2ds")) {
705 Standard_SStream aMsg;
706 aMsg << "BinTools_Curve2dSet::Read: Not a Curve2d table"<<std::endl;
708 std::cout <<"Curve2dSet buffer: " << buffer << std::endl;
710 throw Standard_Failure(aMsg.str().c_str());
714 Handle(Geom2d_Curve) C;
715 Standard_Integer i, aNbCurves;
717 Message_ProgressScope aPS(theRange, "Reading curves 2d", aNbCurves);
718 IS.get();//remove <lf>
719 for (i = 1; i <= aNbCurves && aPS.More(); i++, aPS.Next()) {
720 BinTools_Curve2dSet::ReadCurve2d(IS,C);