1 // Created on: 2004-05-20
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.
16 #include <BinTools_CurveSet.ixx>
17 #include <BinTools.hxx>
18 #include <Geom_Circle.hxx>
19 #include <Geom_Line.hxx>
20 #include <Geom_Ellipse.hxx>
21 #include <Geom_Parabola.hxx>
22 #include <Geom_Hyperbola.hxx>
23 #include <Geom_BezierCurve.hxx>
24 #include <Geom_BSplineCurve.hxx>
25 #include <Geom_TrimmedCurve.hxx>
26 #include <Geom_OffsetCurve.hxx>
29 #include <gp_Circ.hxx>
30 #include <gp_Elips.hxx>
31 #include <gp_Parab.hxx>
32 #include <gp_Hypr.hxx>
34 #include <TColStd_Array1OfReal.hxx>
35 #include <TColStd_Array1OfInteger.hxx>
36 #include <TColgp_Array1OfPnt.hxx>
37 #include <Standard_Failure.hxx>
38 #include <Standard_ErrorHandler.hxx>
50 //=======================================================================
51 //function : BinTools_CurveSet
53 //=======================================================================
55 BinTools_CurveSet::BinTools_CurveSet()
60 //=======================================================================
63 //=======================================================================
65 void BinTools_CurveSet::Clear()
71 //=======================================================================
74 //=======================================================================
76 Standard_Integer BinTools_CurveSet::Add(const Handle(Geom_Curve)& C)
78 return (C.IsNull()) ? 0 : myMap.Add(C);
82 //=======================================================================
85 //=======================================================================
87 Handle(Geom_Curve) BinTools_CurveSet::Curve
88 (const Standard_Integer I)const
91 Handle(Geom_Curve) dummy;
95 return Handle(Geom_Curve)::DownCast(myMap(I));
99 //=======================================================================
102 //=======================================================================
104 Standard_Integer BinTools_CurveSet::Index
105 (const Handle(Geom_Curve)& S)const
107 return S.IsNull() ? 0 : myMap.FindIndex(S);
111 //=======================================================================
112 //function : operator << (gp_Pnt)
114 //=======================================================================
116 static Standard_OStream& operator <<(Standard_OStream& OS, const gp_Pnt P)
118 BinTools::PutReal(OS, P.X());
119 BinTools::PutReal(OS, P.Y());
120 BinTools::PutReal(OS, P.Z());
124 //=======================================================================
125 //function : operator << (gp_Dir)
127 //=======================================================================
129 static Standard_OStream& operator <<(Standard_OStream& OS, const gp_Dir D)
131 BinTools::PutReal(OS, D.X());
132 BinTools::PutReal(OS, D.Y());
133 BinTools::PutReal(OS, D.Z());
138 //=======================================================================
139 //function : operator << (Geom_Line)
141 //=======================================================================
143 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_Line)& L)
145 OS << (Standard_Byte)LINE;
147 OS << C.Location();//Pnt
148 OS << C.Direction();//Dir
153 //=======================================================================
154 //function : operator <<(Geom_Circle)
156 //=======================================================================
158 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_Circle)& CC)
160 OS << (Standard_Byte)CIRCLE;
161 gp_Circ C = CC->Circ();
163 OS << C.Axis().Direction();
164 OS << C.XAxis().Direction();
165 OS << C.YAxis().Direction();
166 BinTools::PutReal(OS, C.Radius());
170 //=======================================================================
171 //function : operator <<(Geom_Ellipse)
173 //=======================================================================
175 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_Ellipse)& E)
177 OS << (Standard_Byte)ELLIPSE;
178 gp_Elips C = E->Elips();
180 OS << C.Axis().Direction();
181 OS << C.XAxis().Direction();
182 OS << C.YAxis().Direction();
183 BinTools::PutReal(OS, C.MajorRadius());
184 BinTools::PutReal(OS, C.MinorRadius());
188 //=======================================================================
189 //function : operator <<(Geom_Parabola)
191 //=======================================================================
193 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_Parabola)& P)
195 OS << (Standard_Byte)PARABOLA;
196 gp_Parab C = P->Parab();
198 OS << C.Axis().Direction();
199 OS << C.XAxis().Direction();
200 OS << C.YAxis().Direction();
201 BinTools::PutReal(OS, C.Focal());
205 //=======================================================================
206 //function : operator <<(Geom_Hyperbola)
208 //=======================================================================
210 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_Hyperbola)& H)
212 OS << (Standard_Byte)HYPERBOLA;
213 gp_Hypr C = H->Hypr();
215 OS << C.Axis().Direction();
216 OS << C.XAxis().Direction();
217 OS << C.YAxis().Direction();
218 BinTools::PutReal(OS, C.MajorRadius());
219 BinTools::PutReal(OS, C.MinorRadius());
223 //=======================================================================
224 //function : operator <<(Geom_BezierCurve)
226 //=======================================================================
228 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_BezierCurve)& B)
230 OS << (Standard_Byte)BEZIER;
231 Standard_Boolean aRational = B->IsRational() ? 1:0;
232 BinTools::PutBool(OS, aRational); //rational
234 Standard_Integer i,aDegree = B->Degree();
235 BinTools::PutExtChar(OS, (Standard_ExtCharacter)aDegree); //<< Degree
236 for (i = 1; i <= aDegree+1; i++) {
237 OS << B->Pole(i); //Pnt
239 BinTools::PutReal(OS, B->Weight(i));//Real
244 //=======================================================================
245 //function : operator <<(Geom_BSplineCurve)
247 //=======================================================================
249 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_BSplineCurve)& B)
251 OS << (Standard_Byte)BSPLINE;
252 Standard_Boolean aRational = B->IsRational() ? 1:0;
253 BinTools::PutBool(OS, aRational); //rational
254 Standard_Boolean aPeriodic = B->IsPeriodic() ? 1:0;
255 BinTools::PutBool(OS, aPeriodic); //periodic
257 Standard_Integer i,aDegree,aNbPoles,aNbKnots;
258 aDegree = B->Degree();
259 aNbPoles = B->NbPoles();
260 aNbKnots = B->NbKnots();
261 BinTools::PutExtChar(OS, (Standard_ExtCharacter) aDegree);
262 BinTools::PutInteger(OS, aNbPoles);
263 BinTools::PutInteger(OS, aNbKnots);
264 for (i = 1; i <= aNbPoles; i++) {
265 OS << B->Pole(i); // Pnt
267 BinTools::PutReal(OS, B->Weight(i));
270 for (i = 1; i <= aNbKnots; i++) {
271 BinTools::PutReal(OS, B->Knot(i));
272 BinTools::PutInteger(OS, B->Multiplicity(i));
277 //=======================================================================
278 //function : operator <<(Geom_TrimmedCurve)
280 //=======================================================================
282 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_TrimmedCurve)& C)
284 OS << (Standard_Byte)TRIMMED;
285 BinTools::PutReal(OS, C->FirstParameter());
286 BinTools::PutReal(OS, C->LastParameter());
287 BinTools_CurveSet::WriteCurve(C->BasisCurve(),OS);
291 //=======================================================================
292 //function : operator <<(Geom_OffsetCurve)
294 //=======================================================================
296 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_OffsetCurve)& C)
298 OS << (Standard_Byte)OFFSET;
299 BinTools::PutReal(OS,C->Offset());//Offset
300 OS << C->Direction();
301 BinTools_CurveSet::WriteCurve(C->BasisCurve(),OS);
305 //=======================================================================
308 //=======================================================================
310 void BinTools_CurveSet::WriteCurve(const Handle(Geom_Curve)& C,
311 Standard_OStream& OS)
313 Standard_SStream aMsg;
314 Handle(Standard_Type) TheType = C->DynamicType();
317 if ( TheType ==STANDARD_TYPE(Geom_Line)) {
318 OS << Handle(Geom_Line)::DownCast(C);
320 else if ( TheType == STANDARD_TYPE(Geom_Circle)) {
321 OS << Handle(Geom_Circle)::DownCast(C);
323 else if ( TheType == STANDARD_TYPE(Geom_Ellipse)) {
324 OS << Handle(Geom_Ellipse)::DownCast(C);
326 else if ( TheType == STANDARD_TYPE(Geom_Parabola)) {
327 OS << Handle(Geom_Parabola)::DownCast(C);
329 else if ( TheType == STANDARD_TYPE(Geom_Hyperbola)) {
330 OS << Handle(Geom_Hyperbola)::DownCast(C);
332 else if ( TheType == STANDARD_TYPE(Geom_BezierCurve)) {
333 OS << Handle(Geom_BezierCurve)::DownCast(C);
335 else if ( TheType == STANDARD_TYPE(Geom_BSplineCurve)) {
336 OS << Handle(Geom_BSplineCurve)::DownCast(C);
338 else if ( TheType == STANDARD_TYPE(Geom_TrimmedCurve)) {
339 OS << Handle(Geom_TrimmedCurve)::DownCast(C);
341 else if ( TheType == STANDARD_TYPE(Geom_OffsetCurve)) {
342 OS << Handle(Geom_OffsetCurve)::DownCast(C);
345 aMsg << "UNKNOWN CURVE TYPE" <<endl;
346 Standard_Failure::Raise(aMsg);
349 catch(Standard_Failure) {
350 aMsg << "EXCEPTION in BinTools_CurveSet::WriteCurve(..)" << endl;
351 Handle(Standard_Failure) anExc = Standard_Failure::Caught();
352 aMsg << anExc << endl;
353 Standard_Failure::Raise(aMsg);
357 //=======================================================================
360 //=======================================================================
362 void BinTools_CurveSet::Write(Standard_OStream& OS)const
364 Standard_Integer i, nbsurf = myMap.Extent();
365 OS << "Curves "<< nbsurf << "\n";
366 for (i = 1; i <= nbsurf; i++) {
367 WriteCurve(Handle(Geom_Curve)::DownCast(myMap(i)),OS);
372 //=======================================================================
375 //=======================================================================
377 static Standard_IStream& operator>>(Standard_IStream& IS, gp_Pnt& P)
379 Standard_Real X=0.,Y=0.,Z=0.;
380 BinTools::GetReal(IS, X);
381 BinTools::GetReal(IS, Y);
382 BinTools::GetReal(IS, Z);
387 //=======================================================================
390 //=======================================================================
392 static Standard_IStream& operator>>(Standard_IStream& IS, gp_Dir& D)
394 Standard_Real X=0.,Y=0.,Z=0.;
395 BinTools::GetReal(IS, X);
396 BinTools::GetReal(IS, Y);
397 BinTools::GetReal(IS, Z);
403 //=======================================================================
404 //function : ReadCurve
406 //=======================================================================
408 static Standard_IStream& operator>>(Standard_IStream& IS,
409 Handle(Geom_Line)& L)
414 L = new Geom_Line(P,AX);
418 //=======================================================================
419 //function : ReadCurve
421 //=======================================================================
423 static Standard_IStream& operator>>(Standard_IStream& IS,
424 Handle(Geom_Circle)& C)
427 gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0.);
429 IS >> P >> A >> AX >> AY;
430 BinTools::GetReal(IS, R);
431 C = new Geom_Circle(gp_Ax2(P,A,AX),R);
435 //=======================================================================
436 //function : ReadCurve
438 //=======================================================================
440 static Standard_IStream& operator>>(Standard_IStream& IS,
441 Handle(Geom_Ellipse)& E)
444 gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0.);
445 Standard_Real R1=0.,R2=0.;
446 IS >> P >> A >> AX >> AY;
447 BinTools::GetReal(IS, R1);
448 BinTools::GetReal(IS, R2);
449 E = new Geom_Ellipse(gp_Ax2(P,A,AX),R1,R2);
453 //=======================================================================
454 //function : ReadCurve
456 //=======================================================================
458 static Standard_IStream& operator>>(Standard_IStream& IS,
459 Handle(Geom_Parabola)& C)
462 gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0.);
464 IS >> P >> A >> AX >> AY;
465 BinTools::GetReal(IS, R1);
466 C = new Geom_Parabola(gp_Ax2(P,A,AX),R1);
470 //=======================================================================
471 //function : ReadCurve
473 //=======================================================================
475 static Standard_IStream& operator>>(Standard_IStream& IS,
476 Handle(Geom_Hyperbola)& H)
479 gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0);
480 Standard_Real R1=0.,R2=0.;
481 IS >> P >> A >> AX >> AY;
482 BinTools::GetReal(IS, R1);
483 BinTools::GetReal(IS, R2);
484 H = new Geom_Hyperbola(gp_Ax2(P,A,AX),R1,R2);
488 //=======================================================================
489 //function : ReadCurve
491 //=======================================================================
493 static Standard_IStream& operator>>(Standard_IStream& IS,
494 Handle(Geom_BezierCurve)& B)
496 Standard_Boolean rational=Standard_False;
497 BinTools::GetBool(IS, rational);
500 Standard_Integer i=0,degree=0;
502 Standard_ExtCharacter aVal='\0';
503 BinTools::GetExtChar(IS, aVal);
504 degree = (Standard_Integer)aVal;
506 TColgp_Array1OfPnt poles(1,degree+1);
507 TColStd_Array1OfReal weights(1,degree+1);
509 for (i = 1; i <= degree+1; i++) {
513 BinTools::GetReal(IS, weights(i));
517 B = new Geom_BezierCurve(poles,weights);
519 B = new Geom_BezierCurve(poles);
524 //=======================================================================
525 //function : ReadCurve
527 //=======================================================================
529 static Standard_IStream& operator>>(Standard_IStream& IS,
530 Handle(Geom_BSplineCurve)& B)
533 Standard_Boolean rational=Standard_False,periodic=Standard_False;
534 BinTools::GetBool(IS, rational);
535 BinTools::GetBool(IS, periodic);
538 Standard_Integer i=0,degree=0,nbpoles=0,nbknots=0;
539 Standard_ExtCharacter aVal='\0';
540 BinTools::GetExtChar(IS, aVal);
541 degree = (Standard_Integer)aVal;
543 BinTools::GetInteger(IS, nbpoles);
545 BinTools::GetInteger(IS, nbknots);
547 TColgp_Array1OfPnt poles(1,nbpoles);
548 TColStd_Array1OfReal weights(1,nbpoles);
550 for (i = 1; i <= nbpoles; i++) {
553 BinTools::GetReal(IS, weights(i));
556 TColStd_Array1OfReal knots(1,nbknots);
557 TColStd_Array1OfInteger mults(1,nbknots);
559 for (i = 1; i <= nbknots; i++) {
560 BinTools::GetReal(IS, knots(i));
561 BinTools::GetInteger(IS, mults(i));
565 B = new Geom_BSplineCurve(poles,weights,knots,mults,degree,periodic);
567 B = new Geom_BSplineCurve(poles,knots,mults,degree,periodic);
572 //=======================================================================
573 //function : ReadCurve
575 //=======================================================================
577 static Standard_IStream& operator>>(Standard_IStream& IS,
578 Handle(Geom_TrimmedCurve)& C)
580 Standard_Real p1=0.,p2=0.;
581 BinTools::GetReal(IS, p1);//FirstParameter
582 BinTools::GetReal(IS, p2);//LastParameter
583 Handle(Geom_Curve) BC;
584 BinTools_CurveSet::ReadCurve(IS,BC);
585 C = new Geom_TrimmedCurve(BC,p1,p2);
589 //=======================================================================
590 //function : ReadCurve
592 //=======================================================================
594 static Standard_IStream& operator>>(Standard_IStream& IS,
595 Handle(Geom_OffsetCurve)& C)
598 BinTools::GetReal(IS, p);//Offset
601 Handle(Geom_Curve) BC;
602 BinTools_CurveSet::ReadCurve(IS,BC);
603 C = new Geom_OffsetCurve(BC,p,D);
607 //=======================================================================
608 //function : ReadCurve
610 //=======================================================================
612 Standard_IStream& BinTools_CurveSet::ReadCurve(Standard_IStream& IS,
613 Handle(Geom_Curve)& C)
615 Standard_SStream aMsg;
618 const Standard_Byte ctype = (Standard_Byte) IS.get();
624 Handle(Geom_Line) CC;
632 Handle(Geom_Circle) CC;
640 Handle(Geom_Ellipse) CC;
648 Handle(Geom_Parabola) CC;
656 Handle(Geom_Hyperbola) CC;
664 Handle(Geom_BezierCurve) CC;
672 Handle(Geom_BSplineCurve) CC;
680 Handle(Geom_TrimmedCurve) CC;
688 Handle(Geom_OffsetCurve) CC;
697 aMsg << "UNKNOWN CURVE TYPE" << endl;
698 Standard_Failure::Raise(aMsg);
702 catch(Standard_Failure) {
704 aMsg <<"EXCEPTION in BinTools_CurveSet::ReadCurve(..)" << endl;
705 Handle(Standard_Failure) anExc = Standard_Failure::Caught();
706 Standard_Failure::Raise(aMsg);
711 //=======================================================================
714 //=======================================================================
716 void BinTools_CurveSet::Read(Standard_IStream& IS)
720 if (IS.fail() || strcmp(buffer,"Curves")) {
721 Standard_SStream aMsg;
722 aMsg << "BinTools_CurveSet::Read: Not a Curve table"<<endl;
724 cout <<"CurveSet buffer: " << buffer << endl;
726 Standard_Failure::Raise(aMsg);
730 Handle(Geom_Curve) C;
731 Standard_Integer i, nbcurve;
734 IS.get();//remove <lf>
735 for (i = 1; i <= nbcurve; i++) {
736 BinTools_CurveSet::ReadCurve(IS,C);