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 << ((Geom2d_Line)& L)
111 //=======================================================================
113 static BinTools_OStream& operator <<(BinTools_OStream& OS, const Handle(Geom2d_Line)& L)
116 OS << (Standard_Byte)LINE;
117 gp_Lin2d C2d = L->Lin2d();
118 OS << C2d.Location();//Pnt2d
119 OS << C2d.Direction();//Dir2d
123 //=======================================================================
124 //function : operator << ((Geom2d_Circle)& C)
126 //=======================================================================
128 static BinTools_OStream& operator <<(BinTools_OStream& OS, const Handle(Geom2d_Circle)& C)
130 OS << (Standard_Byte)CIRCLE;
131 gp_Circ2d C2d = C->Circ2d();
132 OS << C2d.Location();
133 OS << C2d.XAxis().Direction();
134 OS << C2d.YAxis().Direction();
139 //=======================================================================
140 //function : operator <<(Geom2d_Ellipse)
142 //=======================================================================
144 static BinTools_OStream& operator <<(BinTools_OStream& OS, const Handle(Geom2d_Ellipse)& E)
146 OS << (Standard_Byte)ELLIPSE;
147 gp_Elips2d C2d = E->Elips2d();
148 OS << C2d.Location();
149 OS << C2d.XAxis().Direction();
150 OS << C2d.YAxis().Direction();
151 OS << C2d.MajorRadius();
152 OS << C2d.MinorRadius();
156 //=======================================================================
157 //function : operator << (Geom2d_Parabola)
159 //=======================================================================
161 static BinTools_OStream& operator <<(BinTools_OStream& OS, const Handle(Geom2d_Parabola)& P)
163 OS << (Standard_Byte)PARABOLA;
164 gp_Parab2d C2d = P->Parab2d();
165 OS << C2d.Location(); // Loc
166 OS << C2d.Axis().XAxis().Direction(); // XDir
167 OS << C2d.Axis().YAxis().Direction(); // YDir
168 OS << C2d.Focal(); // Focal
172 //=======================================================================
173 //function : operator <<(Geom2d_Hyperbola)
175 //=======================================================================
177 static BinTools_OStream& operator <<(BinTools_OStream& OS, const Handle(Geom2d_Hyperbola)& H)
179 OS << (Standard_Byte)HYPERBOLA;
180 gp_Hypr2d C2d = H->Hypr2d();
181 OS << C2d.Location(); // Loc
182 OS << C2d.XAxis().Direction(); // XDir
183 OS << C2d.YAxis().Direction(); // YDir
184 OS << C2d.MajorRadius(); // MajR
185 OS << C2d.MinorRadius();
189 //=======================================================================
190 //function : operator <<(Geom2d_BezierCurve)
192 //=======================================================================
194 static BinTools_OStream& operator <<(BinTools_OStream& OS, const Handle(Geom2d_BezierCurve)& B)
196 OS << (Standard_Byte)BEZIER;
197 Standard_Boolean aRational = B->IsRational() ? 1:0;
198 OS << aRational; // rational
200 Standard_Integer i,aDegree = B->Degree();
201 OS << (Standard_ExtCharacter)aDegree; // Degree
202 for (i = 1; i <= aDegree+1; i++) {
203 OS << B->Pole(i); // Pnt2d
205 OS << B->Weight(i); // Real
210 //=======================================================================
211 //function : operator <<(Geom2d_BSplineCurve)
213 //=======================================================================
215 static BinTools_OStream& operator <<(BinTools_OStream& OS, const Handle(Geom2d_BSplineCurve)& B)
217 OS << (Standard_Byte)BSPLINE;
218 Standard_Boolean aRational = B->IsRational() ? 1:0;
219 OS << aRational; //rational
220 Standard_Boolean aPeriodic = B->IsPeriodic() ? 1:0;
221 OS << aPeriodic; //periodic
223 Standard_Integer i,aDegree,aNbPoles,aNbKnots;
224 aDegree = B->Degree();
225 aNbPoles = B->NbPoles();
226 aNbKnots = B->NbKnots();
227 OS << (Standard_ExtCharacter) aDegree;
230 for (i = 1; i <= aNbPoles; i++) {
231 OS << B->Pole(i); // Pnt2d
236 for (i = 1; i <= aNbKnots; i++) {
238 OS << B->Multiplicity(i);
244 //=======================================================================
245 //function : operator <<(Geom2d_TrimmedCurve)
247 //=======================================================================
249 static BinTools_OStream& operator <<(BinTools_OStream& OS, const Handle(Geom2d_TrimmedCurve)& C)
251 OS << (Standard_Byte)TRIMMED;
252 OS << C->FirstParameter();
253 OS << C->LastParameter();
254 BinTools_Curve2dSet::WriteCurve2d (C->BasisCurve(), OS);
258 //=======================================================================
259 //function : operator <<(Geom2d_OffsetCurve)
261 //=======================================================================
263 static BinTools_OStream& operator <<(BinTools_OStream& OS, const Handle(Geom2d_OffsetCurve)& C)
265 OS << (Standard_Byte)OFFSET;
266 OS << C->Offset(); // Offset
267 BinTools_Curve2dSet::WriteCurve2d (C->BasisCurve(), OS);
271 //=======================================================================
272 //function : WriteCurve2d
274 //=======================================================================
276 void BinTools_Curve2dSet::WriteCurve2d(
277 const Handle(Geom2d_Curve)& C, BinTools_OStream& OS)
279 Handle(Standard_Type) TheType = C->DynamicType();
282 if ( TheType == STANDARD_TYPE(Geom2d_Circle)) {
283 OS << Handle(Geom2d_Circle)::DownCast(C);
285 else if ( TheType ==STANDARD_TYPE(Geom2d_Line)) {
286 OS << Handle(Geom2d_Line)::DownCast(C);
288 else if ( TheType == STANDARD_TYPE(Geom2d_Ellipse)) {
289 OS << Handle(Geom2d_Ellipse)::DownCast(C);
291 else if ( TheType == STANDARD_TYPE(Geom2d_Parabola)) {
292 OS << Handle(Geom2d_Parabola)::DownCast(C);
294 else if ( TheType == STANDARD_TYPE(Geom2d_Hyperbola)) {
295 OS << Handle(Geom2d_Hyperbola)::DownCast(C);
297 else if ( TheType == STANDARD_TYPE(Geom2d_BezierCurve)) {
298 OS << Handle(Geom2d_BezierCurve)::DownCast(C);
300 else if ( TheType == STANDARD_TYPE(Geom2d_BSplineCurve)) {
301 OS << Handle(Geom2d_BSplineCurve)::DownCast(C);
303 else if ( TheType == STANDARD_TYPE(Geom2d_TrimmedCurve)) {
304 OS << Handle(Geom2d_TrimmedCurve)::DownCast(C);
306 else if ( TheType == STANDARD_TYPE(Geom2d_OffsetCurve)) {
307 OS << Handle(Geom2d_OffsetCurve)::DownCast(C);
310 throw Standard_Failure("UNKNOWN CURVE2d TYPE");
313 catch(Standard_Failure const& anException) {
314 Standard_SStream aMsg;
315 aMsg << "EXCEPTION in BinTools_Curve2dSet::WriteCurve2d(..)" << std::endl;
316 aMsg << anException << std::endl;
317 throw Standard_Failure(aMsg.str().c_str());
321 //=======================================================================
324 //=======================================================================
326 void BinTools_Curve2dSet::Write (Standard_OStream& OS,
327 const Message_ProgressRange& theRange) const
329 Standard_Integer i, aNbCurves = myMap.Extent();
330 Message_ProgressScope aPS(theRange, "Writing 2D curves",aNbCurves);
331 OS << "Curve2ds "<< aNbCurves << "\n";
332 BinTools_OStream aStream (OS);
333 for (i = 1; i <= aNbCurves && aPS.More(); i++, aPS.Next()) {
334 WriteCurve2d (Handle(Geom2d_Curve)::DownCast (myMap (i)), aStream);
339 //=======================================================================
340 //function : ReadPnt2d
342 //=======================================================================
344 static Standard_IStream& operator>>(Standard_IStream& IS, gp_Pnt2d& P)
346 Standard_Real X=0.,Y=0.;
347 BinTools::GetReal(IS, X);
348 BinTools::GetReal(IS, Y);
353 //=======================================================================
354 //function : ReadDir2d
356 //=======================================================================
358 static Standard_IStream& operator>>(Standard_IStream& IS, gp_Dir2d& D)
360 Standard_Real X=0.,Y=0.;
361 BinTools::GetReal(IS, X);
362 BinTools::GetReal(IS, Y);
368 //=======================================================================
369 //function : ReadCurve2d
371 //=======================================================================
373 static Standard_IStream& operator>>(Standard_IStream& IS,
374 Handle(Geom2d_Line)& L)
379 L = new Geom2d_Line(P,AX);
383 //=======================================================================
384 //function : ReadCurve2d
386 //=======================================================================
387 static Standard_IStream& operator>>(Standard_IStream& IS,
388 Handle(Geom2d_Circle)& C)
391 gp_Dir2d AX(1.,0.),AY(1.,0.);
394 BinTools::GetReal(IS, R);
395 C = new Geom2d_Circle(gp_Ax22d(P,AX,AY),R);
399 //=======================================================================
400 //function : ReadCurve2d
402 //=======================================================================
404 static Standard_IStream& operator>>(Standard_IStream& IS,
405 Handle(Geom2d_Ellipse)& E)
408 gp_Dir2d AX(1.,0.),AY(1.,0.);
409 Standard_Real R1=0., R2=0.;
411 BinTools::GetReal(IS, R1);
412 BinTools::GetReal(IS, R2);
413 E = new Geom2d_Ellipse(gp_Ax22d(P,AX,AY),R1,R2);
417 //=======================================================================
418 //function : ReadCurve2d
420 //=======================================================================
422 static Standard_IStream& operator>>(Standard_IStream& IS,
423 Handle(Geom2d_Parabola)& C)
426 gp_Dir2d AX(1.,0.),AY(1.,0.);
429 BinTools::GetReal(IS, R1);
430 C = new Geom2d_Parabola(gp_Ax22d(P,AX,AY),R1);
434 //=======================================================================
435 //function : ReadCurve2d
437 //=======================================================================
439 static Standard_IStream& operator>>(Standard_IStream& IS,
440 Handle(Geom2d_Hyperbola)& H)
443 gp_Dir2d AX(1.,0.),AY(1.,0.);
444 Standard_Real R1=0.,R2=0.;
446 BinTools::GetReal(IS, R1);
447 BinTools::GetReal(IS, R2);
448 H = new Geom2d_Hyperbola(gp_Ax22d(P,AX,AY),R1,R2);
452 //=======================================================================
453 //function : ReadCurve2d
455 //=======================================================================
457 static Standard_IStream& operator>>(Standard_IStream& IS,
458 Handle(Geom2d_BezierCurve)& B)
460 Standard_Boolean rational=Standard_False;
461 BinTools::GetBool(IS, rational);
464 Standard_Integer i=0,degree=0;
466 Standard_ExtCharacter aVal='\0';
467 BinTools::GetExtChar(IS, aVal);
468 degree = (Standard_Integer)aVal;
470 TColgp_Array1OfPnt2d poles(1,degree+1);
471 TColStd_Array1OfReal weights(1,degree+1);
473 for (i = 1; i <= degree+1; i++) {
474 IS >> poles(i);//Pnt2d
476 BinTools::GetReal(IS, weights(i));
480 B = new Geom2d_BezierCurve(poles,weights);
482 B = new Geom2d_BezierCurve(poles);
487 //=======================================================================
488 //function : ReadCurve2d
490 //=======================================================================
492 static Standard_IStream& operator>>(Standard_IStream& IS,
493 Handle(Geom2d_BSplineCurve)& B)
496 Standard_Boolean rational=Standard_False,periodic=Standard_False;
497 BinTools::GetBool(IS, rational);
498 BinTools::GetBool(IS, periodic);
500 Standard_Integer i=0,degree=0,nbpoles=0,nbknots=0;
501 Standard_ExtCharacter aVal='\0';
503 BinTools::GetExtChar(IS, aVal);
504 degree = (Standard_Integer)aVal;
506 BinTools::GetInteger(IS, nbpoles);
508 BinTools::GetInteger(IS, nbknots);
510 TColgp_Array1OfPnt2d poles(1,nbpoles);
511 TColStd_Array1OfReal weights(1,nbpoles);
513 for (i = 1; i <= nbpoles; i++) {
514 IS >> poles(i);//Pnt2d
516 BinTools::GetReal(IS, weights(i));
519 TColStd_Array1OfReal knots(1,nbknots);
520 TColStd_Array1OfInteger mults(1,nbknots);
522 for (i = 1; i <= nbknots; i++) {
523 BinTools::GetReal(IS, knots(i));
524 BinTools::GetInteger(IS, mults(i));
528 B = new Geom2d_BSplineCurve(poles,weights,knots,mults,degree,periodic);
530 B = new Geom2d_BSplineCurve(poles,knots,mults,degree,periodic);
535 //=======================================================================
536 //function : ReadCurve2d
538 //=======================================================================
540 static Standard_IStream& operator>>(Standard_IStream& IS,
541 Handle(Geom2d_TrimmedCurve)& C)
543 Standard_Real p1=0.,p2=0.;
544 BinTools::GetReal(IS, p1);//FirstParameter
545 BinTools::GetReal(IS, p2);//LastParameter
546 Handle(Geom2d_Curve) BC;
547 BinTools_Curve2dSet::ReadCurve2d(IS,BC);
548 C = new Geom2d_TrimmedCurve(BC,p1,p2);
552 //=======================================================================
553 //function : ReadCurve2d
555 //=======================================================================
557 static Standard_IStream& operator>>(Standard_IStream& IS,
558 Handle(Geom2d_OffsetCurve)& C)
561 BinTools::GetReal(IS, p);//Offset
562 Handle(Geom2d_Curve) BC;
563 BinTools_Curve2dSet::ReadCurve2d(IS,BC);
564 C = new Geom2d_OffsetCurve(BC,p);
568 //=======================================================================
569 //function : ReadCurve2d
571 //=======================================================================
573 Standard_IStream& BinTools_Curve2dSet::ReadCurve2d(Standard_IStream& IS,
574 Handle(Geom2d_Curve)& C)
578 const Standard_Byte ctype = (Standard_Byte) IS.get();
583 Handle(Geom2d_Line) CC;
591 Handle(Geom2d_Circle) CC;
599 Handle(Geom2d_Ellipse) CC;
607 Handle(Geom2d_Parabola) CC;
615 Handle(Geom2d_Hyperbola) CC;
623 Handle(Geom2d_BezierCurve) CC;
631 Handle(Geom2d_BSplineCurve) CC;
639 Handle(Geom2d_TrimmedCurve) CC;
647 Handle(Geom2d_OffsetCurve) CC;
656 throw Standard_Failure("UNKNOWN CURVE2d TYPE");
661 catch(Standard_Failure const& anException) {
663 Standard_SStream aMsg;
664 aMsg <<"EXCEPTION in BinTools_Curve2dSet::ReadCurve2d(...)" << std::endl;
665 aMsg << anException << std::endl;
666 throw Standard_Failure(aMsg.str().c_str());
671 //=======================================================================
674 //=======================================================================
676 void BinTools_Curve2dSet::Read (Standard_IStream& IS,
677 const Message_ProgressRange& theRange)
682 if (IS.fail() || strcmp(buffer,"Curve2ds")) {
683 Standard_SStream aMsg;
684 aMsg << "BinTools_Curve2dSet::Read: Not a Curve2d table"<<std::endl;
686 std::cout <<"Curve2dSet buffer: " << buffer << std::endl;
688 throw Standard_Failure(aMsg.str().c_str());
692 Handle(Geom2d_Curve) C;
693 Standard_Integer i, aNbCurves;
695 Message_ProgressScope aPS(theRange, "Reading curves 2d", aNbCurves);
696 IS.get();//remove <lf>
697 for (i = 1; i <= aNbCurves && aPS.More(); i++, aPS.Next()) {
698 BinTools_Curve2dSet::ReadCurve2d(IS,C);