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.
17 #include <BinTools.hxx>
18 #include <BinTools_CurveSet.hxx>
19 #include <Geom_BezierCurve.hxx>
20 #include <Geom_BSplineCurve.hxx>
21 #include <Geom_Circle.hxx>
22 #include <Geom_Curve.hxx>
23 #include <Geom_Ellipse.hxx>
24 #include <Geom_Hyperbola.hxx>
25 #include <Geom_Line.hxx>
26 #include <Geom_OffsetCurve.hxx>
27 #include <Geom_Parabola.hxx>
28 #include <Geom_TrimmedCurve.hxx>
29 #include <gp_Circ.hxx>
30 #include <gp_Elips.hxx>
31 #include <gp_Hypr.hxx>
33 #include <gp_Parab.hxx>
34 #include <Standard_ErrorHandler.hxx>
35 #include <Standard_Failure.hxx>
36 #include <Standard_OutOfRange.hxx>
37 #include <TColgp_Array1OfPnt.hxx>
38 #include <TColStd_Array1OfInteger.hxx>
39 #include <TColStd_Array1OfReal.hxx>
51 //=======================================================================
52 //function : BinTools_CurveSet
54 //=======================================================================
56 BinTools_CurveSet::BinTools_CurveSet()
61 //=======================================================================
64 //=======================================================================
66 void BinTools_CurveSet::Clear()
72 //=======================================================================
75 //=======================================================================
77 Standard_Integer BinTools_CurveSet::Add(const Handle(Geom_Curve)& C)
79 return (C.IsNull()) ? 0 : myMap.Add(C);
83 //=======================================================================
86 //=======================================================================
88 Handle(Geom_Curve) BinTools_CurveSet::Curve
89 (const Standard_Integer I)const
92 Handle(Geom_Curve) dummy;
96 return Handle(Geom_Curve)::DownCast(myMap(I));
100 //=======================================================================
103 //=======================================================================
105 Standard_Integer BinTools_CurveSet::Index
106 (const Handle(Geom_Curve)& S)const
108 return S.IsNull() ? 0 : myMap.FindIndex(S);
112 //=======================================================================
113 //function : operator << (gp_Pnt)
115 //=======================================================================
117 static Standard_OStream& operator <<(Standard_OStream& OS, const gp_Pnt P)
119 BinTools::PutReal(OS, P.X());
120 BinTools::PutReal(OS, P.Y());
121 BinTools::PutReal(OS, P.Z());
125 //=======================================================================
126 //function : operator << (gp_Dir)
128 //=======================================================================
130 static Standard_OStream& operator <<(Standard_OStream& OS, const gp_Dir D)
132 BinTools::PutReal(OS, D.X());
133 BinTools::PutReal(OS, D.Y());
134 BinTools::PutReal(OS, D.Z());
139 //=======================================================================
140 //function : operator << (Geom_Line)
142 //=======================================================================
144 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_Line)& L)
146 OS << (Standard_Byte)LINE;
148 OS << C.Location();//Pnt
149 OS << C.Direction();//Dir
154 //=======================================================================
155 //function : operator <<(Geom_Circle)
157 //=======================================================================
159 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_Circle)& CC)
161 OS << (Standard_Byte)CIRCLE;
162 gp_Circ C = CC->Circ();
164 OS << C.Axis().Direction();
165 OS << C.XAxis().Direction();
166 OS << C.YAxis().Direction();
167 BinTools::PutReal(OS, C.Radius());
171 //=======================================================================
172 //function : operator <<(Geom_Ellipse)
174 //=======================================================================
176 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_Ellipse)& E)
178 OS << (Standard_Byte)ELLIPSE;
179 gp_Elips C = E->Elips();
181 OS << C.Axis().Direction();
182 OS << C.XAxis().Direction();
183 OS << C.YAxis().Direction();
184 BinTools::PutReal(OS, C.MajorRadius());
185 BinTools::PutReal(OS, C.MinorRadius());
189 //=======================================================================
190 //function : operator <<(Geom_Parabola)
192 //=======================================================================
194 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_Parabola)& P)
196 OS << (Standard_Byte)PARABOLA;
197 gp_Parab C = P->Parab();
199 OS << C.Axis().Direction();
200 OS << C.XAxis().Direction();
201 OS << C.YAxis().Direction();
202 BinTools::PutReal(OS, C.Focal());
206 //=======================================================================
207 //function : operator <<(Geom_Hyperbola)
209 //=======================================================================
211 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_Hyperbola)& H)
213 OS << (Standard_Byte)HYPERBOLA;
214 gp_Hypr C = H->Hypr();
216 OS << C.Axis().Direction();
217 OS << C.XAxis().Direction();
218 OS << C.YAxis().Direction();
219 BinTools::PutReal(OS, C.MajorRadius());
220 BinTools::PutReal(OS, C.MinorRadius());
224 //=======================================================================
225 //function : operator <<(Geom_BezierCurve)
227 //=======================================================================
229 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_BezierCurve)& B)
231 OS << (Standard_Byte)BEZIER;
232 Standard_Boolean aRational = B->IsRational() ? 1:0;
233 BinTools::PutBool(OS, aRational); //rational
235 Standard_Integer i,aDegree = B->Degree();
236 BinTools::PutExtChar(OS, (Standard_ExtCharacter)aDegree); //<< Degree
237 for (i = 1; i <= aDegree+1; i++) {
238 OS << B->Pole(i); //Pnt
240 BinTools::PutReal(OS, B->Weight(i));//Real
245 //=======================================================================
246 //function : operator <<(Geom_BSplineCurve)
248 //=======================================================================
250 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_BSplineCurve)& B)
252 OS << (Standard_Byte)BSPLINE;
253 Standard_Boolean aRational = B->IsRational() ? 1:0;
254 BinTools::PutBool(OS, aRational); //rational
255 Standard_Boolean aPeriodic = B->IsPeriodic() ? 1:0;
256 BinTools::PutBool(OS, aPeriodic); //periodic
258 Standard_Integer i,aDegree,aNbPoles,aNbKnots;
259 aDegree = B->Degree();
260 aNbPoles = B->NbPoles();
261 aNbKnots = B->NbKnots();
262 BinTools::PutExtChar(OS, (Standard_ExtCharacter) aDegree);
263 BinTools::PutInteger(OS, aNbPoles);
264 BinTools::PutInteger(OS, aNbKnots);
265 for (i = 1; i <= aNbPoles; i++) {
266 OS << B->Pole(i); // Pnt
268 BinTools::PutReal(OS, B->Weight(i));
271 for (i = 1; i <= aNbKnots; i++) {
272 BinTools::PutReal(OS, B->Knot(i));
273 BinTools::PutInteger(OS, B->Multiplicity(i));
278 //=======================================================================
279 //function : operator <<(Geom_TrimmedCurve)
281 //=======================================================================
283 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_TrimmedCurve)& C)
285 OS << (Standard_Byte)TRIMMED;
286 BinTools::PutReal(OS, C->FirstParameter());
287 BinTools::PutReal(OS, C->LastParameter());
288 BinTools_CurveSet::WriteCurve(C->BasisCurve(),OS);
292 //=======================================================================
293 //function : operator <<(Geom_OffsetCurve)
295 //=======================================================================
297 static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_OffsetCurve)& C)
299 OS << (Standard_Byte)OFFSET;
300 BinTools::PutReal(OS,C->Offset());//Offset
301 OS << C->Direction();
302 BinTools_CurveSet::WriteCurve(C->BasisCurve(),OS);
306 //=======================================================================
309 //=======================================================================
311 void BinTools_CurveSet::WriteCurve(const Handle(Geom_Curve)& C,
312 Standard_OStream& OS)
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 throw Standard_Failure("UNKNOWN CURVE TYPE");
348 catch(Standard_Failure const& anException) {
349 Standard_SStream aMsg;
350 aMsg << "EXCEPTION in BinTools_CurveSet::WriteCurve(..)" << std::endl;
351 aMsg << anException << std::endl;
352 throw Standard_Failure(aMsg.str().c_str());
356 //=======================================================================
359 //=======================================================================
361 void BinTools_CurveSet::Write(Standard_OStream& OS)const
363 Standard_Integer i, nbsurf = myMap.Extent();
364 OS << "Curves "<< nbsurf << "\n";
365 for (i = 1; i <= nbsurf; i++) {
366 WriteCurve(Handle(Geom_Curve)::DownCast(myMap(i)),OS);
371 //=======================================================================
374 //=======================================================================
376 static Standard_IStream& operator>>(Standard_IStream& IS, gp_Pnt& P)
378 Standard_Real X=0.,Y=0.,Z=0.;
379 BinTools::GetReal(IS, X);
380 BinTools::GetReal(IS, Y);
381 BinTools::GetReal(IS, Z);
386 //=======================================================================
389 //=======================================================================
391 static Standard_IStream& operator>>(Standard_IStream& IS, gp_Dir& D)
393 Standard_Real X=0.,Y=0.,Z=0.;
394 BinTools::GetReal(IS, X);
395 BinTools::GetReal(IS, Y);
396 BinTools::GetReal(IS, Z);
402 //=======================================================================
403 //function : ReadCurve
405 //=======================================================================
407 static Standard_IStream& operator>>(Standard_IStream& IS,
408 Handle(Geom_Line)& L)
413 L = new Geom_Line(P,AX);
417 //=======================================================================
418 //function : ReadCurve
420 //=======================================================================
422 static Standard_IStream& operator>>(Standard_IStream& IS,
423 Handle(Geom_Circle)& C)
426 gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0.);
428 IS >> P >> A >> AX >> AY;
429 BinTools::GetReal(IS, R);
430 C = new Geom_Circle(gp_Ax2(P,A,AX),R);
434 //=======================================================================
435 //function : ReadCurve
437 //=======================================================================
439 static Standard_IStream& operator>>(Standard_IStream& IS,
440 Handle(Geom_Ellipse)& E)
443 gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0.);
444 Standard_Real R1=0.,R2=0.;
445 IS >> P >> A >> AX >> AY;
446 BinTools::GetReal(IS, R1);
447 BinTools::GetReal(IS, R2);
448 E = new Geom_Ellipse(gp_Ax2(P,A,AX),R1,R2);
452 //=======================================================================
453 //function : ReadCurve
455 //=======================================================================
457 static Standard_IStream& operator>>(Standard_IStream& IS,
458 Handle(Geom_Parabola)& C)
461 gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0.);
463 IS >> P >> A >> AX >> AY;
464 BinTools::GetReal(IS, R1);
465 C = new Geom_Parabola(gp_Ax2(P,A,AX),R1);
469 //=======================================================================
470 //function : ReadCurve
472 //=======================================================================
474 static Standard_IStream& operator>>(Standard_IStream& IS,
475 Handle(Geom_Hyperbola)& H)
478 gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0);
479 Standard_Real R1=0.,R2=0.;
480 IS >> P >> A >> AX >> AY;
481 BinTools::GetReal(IS, R1);
482 BinTools::GetReal(IS, R2);
483 H = new Geom_Hyperbola(gp_Ax2(P,A,AX),R1,R2);
487 //=======================================================================
488 //function : ReadCurve
490 //=======================================================================
492 static Standard_IStream& operator>>(Standard_IStream& IS,
493 Handle(Geom_BezierCurve)& B)
495 Standard_Boolean rational=Standard_False;
496 BinTools::GetBool(IS, rational);
499 Standard_Integer i=0,degree=0;
501 Standard_ExtCharacter aVal='\0';
502 BinTools::GetExtChar(IS, aVal);
503 degree = (Standard_Integer)aVal;
505 TColgp_Array1OfPnt poles(1,degree+1);
506 TColStd_Array1OfReal weights(1,degree+1);
508 for (i = 1; i <= degree+1; i++) {
512 BinTools::GetReal(IS, weights(i));
516 B = new Geom_BezierCurve(poles,weights);
518 B = new Geom_BezierCurve(poles);
523 //=======================================================================
524 //function : ReadCurve
526 //=======================================================================
528 static Standard_IStream& operator>>(Standard_IStream& IS,
529 Handle(Geom_BSplineCurve)& B)
532 Standard_Boolean rational=Standard_False,periodic=Standard_False;
533 BinTools::GetBool(IS, rational);
534 BinTools::GetBool(IS, periodic);
537 Standard_Integer i=0,degree=0,nbpoles=0,nbknots=0;
538 Standard_ExtCharacter aVal='\0';
539 BinTools::GetExtChar(IS, aVal);
540 degree = (Standard_Integer)aVal;
542 BinTools::GetInteger(IS, nbpoles);
544 BinTools::GetInteger(IS, nbknots);
546 TColgp_Array1OfPnt poles(1,nbpoles);
547 TColStd_Array1OfReal weights(1,nbpoles);
549 for (i = 1; i <= nbpoles; i++) {
552 BinTools::GetReal(IS, weights(i));
555 TColStd_Array1OfReal knots(1,nbknots);
556 TColStd_Array1OfInteger mults(1,nbknots);
558 for (i = 1; i <= nbknots; i++) {
559 BinTools::GetReal(IS, knots(i));
560 BinTools::GetInteger(IS, mults(i));
564 B = new Geom_BSplineCurve(poles,weights,knots,mults,degree,periodic);
566 B = new Geom_BSplineCurve(poles,knots,mults,degree,periodic);
571 //=======================================================================
572 //function : ReadCurve
574 //=======================================================================
576 static Standard_IStream& operator>>(Standard_IStream& IS,
577 Handle(Geom_TrimmedCurve)& C)
579 Standard_Real p1=0.,p2=0.;
580 BinTools::GetReal(IS, p1);//FirstParameter
581 BinTools::GetReal(IS, p2);//LastParameter
582 Handle(Geom_Curve) BC;
583 BinTools_CurveSet::ReadCurve(IS,BC);
584 C = new Geom_TrimmedCurve(BC,p1,p2);
588 //=======================================================================
589 //function : ReadCurve
591 //=======================================================================
593 static Standard_IStream& operator>>(Standard_IStream& IS,
594 Handle(Geom_OffsetCurve)& C)
597 BinTools::GetReal(IS, p);//Offset
600 Handle(Geom_Curve) BC;
601 BinTools_CurveSet::ReadCurve(IS,BC);
602 C = new Geom_OffsetCurve(BC,p,D);
606 //=======================================================================
607 //function : ReadCurve
609 //=======================================================================
611 Standard_IStream& BinTools_CurveSet::ReadCurve(Standard_IStream& IS,
612 Handle(Geom_Curve)& C)
616 const Standard_Byte ctype = (Standard_Byte) IS.get();
622 Handle(Geom_Line) CC;
630 Handle(Geom_Circle) CC;
638 Handle(Geom_Ellipse) CC;
646 Handle(Geom_Parabola) CC;
654 Handle(Geom_Hyperbola) CC;
662 Handle(Geom_BezierCurve) CC;
670 Handle(Geom_BSplineCurve) CC;
678 Handle(Geom_TrimmedCurve) CC;
686 Handle(Geom_OffsetCurve) CC;
695 throw Standard_Failure("UNKNOWN CURVE TYPE");
699 catch(Standard_Failure const& anException) {
701 Standard_SStream aMsg;
702 aMsg <<"EXCEPTION in BinTools_CurveSet::ReadCurve(..)" << std::endl;
703 aMsg << anException << std::endl;
704 throw Standard_Failure(aMsg.str().c_str());
709 //=======================================================================
712 //=======================================================================
714 void BinTools_CurveSet::Read(Standard_IStream& IS)
718 if (IS.fail() || strcmp(buffer,"Curves")) {
719 Standard_SStream aMsg;
720 aMsg << "BinTools_CurveSet::Read: Not a Curve table"<<std::endl;
722 std::cout <<"CurveSet buffer: " << buffer << std::endl;
724 throw Standard_Failure(aMsg.str().c_str());
728 Handle(Geom_Curve) C;
729 Standard_Integer i, nbcurve;
732 IS.get();//remove <lf>
733 for (i = 1; i <= nbcurve; i++) {
734 BinTools_CurveSet::ReadCurve(IS,C);