// Created on: 2004-05-20 // Created by: Sergey ZARITCHNY // Copyright (c) 2004-2014 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // // This library is free software; you can redistribute it and/or modify it under // the terms of the GNU Lesser General Public License version 2.1 as published // by the Free Software Foundation, with special exception defined in the file // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT // distribution for complete text of the license and disclaimer of any warranty. // // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define LINE 1 #define CIRCLE 2 #define ELLIPSE 3 #define PARABOLA 4 #define HYPERBOLA 5 #define BEZIER 6 #define BSPLINE 7 #define TRIMMED 8 #define OFFSET 9 //======================================================================= //function : BinTools_CurveSet //purpose : //======================================================================= BinTools_CurveSet::BinTools_CurveSet() { } //======================================================================= //function : Clear //purpose : //======================================================================= void BinTools_CurveSet::Clear() { myMap.Clear(); } //======================================================================= //function : Add //purpose : //======================================================================= Standard_Integer BinTools_CurveSet::Add(const Handle(Geom_Curve)& C) { return (C.IsNull()) ? 0 : myMap.Add(C); } //======================================================================= //function : Curve //purpose : //======================================================================= Handle(Geom_Curve) BinTools_CurveSet::Curve (const Standard_Integer I)const { if (I == 0) { Handle(Geom_Curve) dummy; return dummy; } else return Handle(Geom_Curve)::DownCast(myMap(I)); } //======================================================================= //function : Index //purpose : //======================================================================= Standard_Integer BinTools_CurveSet::Index (const Handle(Geom_Curve)& S)const { return S.IsNull() ? 0 : myMap.FindIndex(S); } //======================================================================= //function : operator << (gp_Pnt) //purpose : //======================================================================= static Standard_OStream& operator <<(Standard_OStream& OS, const gp_Pnt P) { BinTools::PutReal(OS, P.X()); BinTools::PutReal(OS, P.Y()); BinTools::PutReal(OS, P.Z()); return OS; } //======================================================================= //function : operator << (gp_Dir) //purpose : //======================================================================= static Standard_OStream& operator <<(Standard_OStream& OS, const gp_Dir D) { BinTools::PutReal(OS, D.X()); BinTools::PutReal(OS, D.Y()); BinTools::PutReal(OS, D.Z()); return OS; } //======================================================================= //function : operator << (Geom_Line) //purpose : //======================================================================= static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_Line)& L) { OS << (Standard_Byte)LINE; gp_Lin C = L->Lin(); OS << C.Location();//Pnt OS << C.Direction();//Dir return OS; } //======================================================================= //function : operator <<(Geom_Circle) //purpose : //======================================================================= static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_Circle)& CC) { OS << (Standard_Byte)CIRCLE; gp_Circ C = CC->Circ(); OS << C.Location(); OS << C.Axis().Direction(); OS << C.XAxis().Direction(); OS << C.YAxis().Direction(); BinTools::PutReal(OS, C.Radius()); return OS; } //======================================================================= //function : operator <<(Geom_Ellipse) //purpose : //======================================================================= static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_Ellipse)& E) { OS << (Standard_Byte)ELLIPSE; gp_Elips C = E->Elips(); OS << C.Location(); OS << C.Axis().Direction(); OS << C.XAxis().Direction(); OS << C.YAxis().Direction(); BinTools::PutReal(OS, C.MajorRadius()); BinTools::PutReal(OS, C.MinorRadius()); return OS; } //======================================================================= //function : operator <<(Geom_Parabola) //purpose : //======================================================================= static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_Parabola)& P) { OS << (Standard_Byte)PARABOLA; gp_Parab C = P->Parab(); OS << C.Location(); OS << C.Axis().Direction(); OS << C.XAxis().Direction(); OS << C.YAxis().Direction(); BinTools::PutReal(OS, C.Focal()); return OS; } //======================================================================= //function : operator <<(Geom_Hyperbola) //purpose : //======================================================================= static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_Hyperbola)& H) { OS << (Standard_Byte)HYPERBOLA; gp_Hypr C = H->Hypr(); OS << C.Location(); OS << C.Axis().Direction(); OS << C.XAxis().Direction(); OS << C.YAxis().Direction(); BinTools::PutReal(OS, C.MajorRadius()); BinTools::PutReal(OS, C.MinorRadius()); return OS; } //======================================================================= //function : operator <<(Geom_BezierCurve) //purpose : //======================================================================= static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_BezierCurve)& B) { OS << (Standard_Byte)BEZIER; Standard_Boolean aRational = B->IsRational() ? 1:0; BinTools::PutBool(OS, aRational); //rational // poles and weights Standard_Integer i,aDegree = B->Degree(); BinTools::PutExtChar(OS, (Standard_ExtCharacter)aDegree); //<< Degree for (i = 1; i <= aDegree+1; i++) { OS << B->Pole(i); //Pnt if (aRational) BinTools::PutReal(OS, B->Weight(i));//Real } return OS; } //======================================================================= //function : operator <<(Geom_BSplineCurve) //purpose : //======================================================================= static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_BSplineCurve)& B) { OS << (Standard_Byte)BSPLINE; Standard_Boolean aRational = B->IsRational() ? 1:0; BinTools::PutBool(OS, aRational); //rational Standard_Boolean aPeriodic = B->IsPeriodic() ? 1:0; BinTools::PutBool(OS, aPeriodic); //periodic // poles and weights Standard_Integer i,aDegree,aNbPoles,aNbKnots; aDegree = B->Degree(); aNbPoles = B->NbPoles(); aNbKnots = B->NbKnots(); BinTools::PutExtChar(OS, (Standard_ExtCharacter) aDegree); BinTools::PutInteger(OS, aNbPoles); BinTools::PutInteger(OS, aNbKnots); for (i = 1; i <= aNbPoles; i++) { OS << B->Pole(i); // Pnt if (aRational) BinTools::PutReal(OS, B->Weight(i)); } for (i = 1; i <= aNbKnots; i++) { BinTools::PutReal(OS, B->Knot(i)); BinTools::PutInteger(OS, B->Multiplicity(i)); } return OS; } //======================================================================= //function : operator <<(Geom_TrimmedCurve) //purpose : //======================================================================= static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_TrimmedCurve)& C) { OS << (Standard_Byte)TRIMMED; BinTools::PutReal(OS, C->FirstParameter()); BinTools::PutReal(OS, C->LastParameter()); BinTools_CurveSet::WriteCurve(C->BasisCurve(),OS); return OS; } //======================================================================= //function : operator <<(Geom_OffsetCurve) //purpose : //======================================================================= static Standard_OStream& operator <<(Standard_OStream& OS, const Handle(Geom_OffsetCurve)& C) { OS << (Standard_Byte)OFFSET; BinTools::PutReal(OS,C->Offset());//Offset OS << C->Direction(); BinTools_CurveSet::WriteCurve(C->BasisCurve(),OS); return OS; } //======================================================================= //function : //purpose : //======================================================================= void BinTools_CurveSet::WriteCurve(const Handle(Geom_Curve)& C, Standard_OStream& OS) { Handle(Standard_Type) TheType = C->DynamicType(); try { OCC_CATCH_SIGNALS if ( TheType ==STANDARD_TYPE(Geom_Line)) { OS << Handle(Geom_Line)::DownCast(C); } else if ( TheType == STANDARD_TYPE(Geom_Circle)) { OS << Handle(Geom_Circle)::DownCast(C); } else if ( TheType == STANDARD_TYPE(Geom_Ellipse)) { OS << Handle(Geom_Ellipse)::DownCast(C); } else if ( TheType == STANDARD_TYPE(Geom_Parabola)) { OS << Handle(Geom_Parabola)::DownCast(C); } else if ( TheType == STANDARD_TYPE(Geom_Hyperbola)) { OS << Handle(Geom_Hyperbola)::DownCast(C); } else if ( TheType == STANDARD_TYPE(Geom_BezierCurve)) { OS << Handle(Geom_BezierCurve)::DownCast(C); } else if ( TheType == STANDARD_TYPE(Geom_BSplineCurve)) { OS << Handle(Geom_BSplineCurve)::DownCast(C); } else if ( TheType == STANDARD_TYPE(Geom_TrimmedCurve)) { OS << Handle(Geom_TrimmedCurve)::DownCast(C); } else if ( TheType == STANDARD_TYPE(Geom_OffsetCurve)) { OS << Handle(Geom_OffsetCurve)::DownCast(C); } else { throw Standard_Failure("UNKNOWN CURVE TYPE"); } } catch(Standard_Failure const& anException) { Standard_SStream aMsg; aMsg << "EXCEPTION in BinTools_CurveSet::WriteCurve(..)" << std::endl; aMsg << anException << std::endl; throw Standard_Failure(aMsg.str().c_str()); } } //======================================================================= //function : Write //purpose : //======================================================================= void BinTools_CurveSet::Write (Standard_OStream& OS, const Handle(Message_ProgressIndicator)& theProgress)const { Standard_Integer i, nbcurv = myMap.Extent(); Message_ProgressSentry aPS(theProgress, "Writing curves", 0, nbcurv, 1); OS << "Curves "<< nbcurv << "\n"; for (i = 1; i <= nbcurv &&aPS.More(); i++, aPS.Next()) { WriteCurve(Handle(Geom_Curve)::DownCast(myMap(i)),OS); } } //======================================================================= //function : ReadPnt //purpose : //======================================================================= static Standard_IStream& operator>>(Standard_IStream& IS, gp_Pnt& P) { Standard_Real X=0.,Y=0.,Z=0.; BinTools::GetReal(IS, X); BinTools::GetReal(IS, Y); BinTools::GetReal(IS, Z); P.SetCoord(X,Y,Z); return IS; } //======================================================================= //function : ReadDir //purpose : //======================================================================= static Standard_IStream& operator>>(Standard_IStream& IS, gp_Dir& D) { Standard_Real X=0.,Y=0.,Z=0.; BinTools::GetReal(IS, X); BinTools::GetReal(IS, Y); BinTools::GetReal(IS, Z); D.SetCoord(X,Y,Z); return IS; } //======================================================================= //function : ReadCurve //purpose : //======================================================================= static Standard_IStream& operator>>(Standard_IStream& IS, Handle(Geom_Line)& L) { gp_Pnt P(0.,0.,0.); gp_Dir AX(1.,0.,0.); IS >> P >> AX; L = new Geom_Line(P,AX); return IS; } //======================================================================= //function : ReadCurve //purpose : //======================================================================= static Standard_IStream& operator>>(Standard_IStream& IS, Handle(Geom_Circle)& C) { gp_Pnt P(0.,0.,0.); gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0.); Standard_Real R=0.; IS >> P >> A >> AX >> AY; BinTools::GetReal(IS, R); C = new Geom_Circle(gp_Ax2(P,A,AX),R); return IS; } //======================================================================= //function : ReadCurve //purpose : //======================================================================= static Standard_IStream& operator>>(Standard_IStream& IS, Handle(Geom_Ellipse)& E) { gp_Pnt P(0.,0.,0.); gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0.); Standard_Real R1=0.,R2=0.; IS >> P >> A >> AX >> AY; BinTools::GetReal(IS, R1); BinTools::GetReal(IS, R2); E = new Geom_Ellipse(gp_Ax2(P,A,AX),R1,R2); return IS; } //======================================================================= //function : ReadCurve //purpose : //======================================================================= static Standard_IStream& operator>>(Standard_IStream& IS, Handle(Geom_Parabola)& C) { gp_Pnt P(0.,0.,0.); gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0.); Standard_Real R1=0.; IS >> P >> A >> AX >> AY; BinTools::GetReal(IS, R1); C = new Geom_Parabola(gp_Ax2(P,A,AX),R1); return IS; } //======================================================================= //function : ReadCurve //purpose : //======================================================================= static Standard_IStream& operator>>(Standard_IStream& IS, Handle(Geom_Hyperbola)& H) { gp_Pnt P(0.,0.,0.); gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0); Standard_Real R1=0.,R2=0.; IS >> P >> A >> AX >> AY; BinTools::GetReal(IS, R1); BinTools::GetReal(IS, R2); H = new Geom_Hyperbola(gp_Ax2(P,A,AX),R1,R2); return IS; } //======================================================================= //function : ReadCurve //purpose : //======================================================================= static Standard_IStream& operator>>(Standard_IStream& IS, Handle(Geom_BezierCurve)& B) { Standard_Boolean rational=Standard_False; BinTools::GetBool(IS, rational); // poles and weights Standard_Integer i=0,degree=0; // degree; Standard_ExtCharacter aVal='\0'; BinTools::GetExtChar(IS, aVal); degree = (Standard_Integer)aVal; TColgp_Array1OfPnt poles(1,degree+1); TColStd_Array1OfReal weights(1,degree+1); for (i = 1; i <= degree+1; i++) { IS >> poles(i);//Pnt if (rational) // weights(i); BinTools::GetReal(IS, weights(i)); } if (rational) B = new Geom_BezierCurve(poles,weights); else B = new Geom_BezierCurve(poles); return IS; } //======================================================================= //function : ReadCurve //purpose : //======================================================================= static Standard_IStream& operator>>(Standard_IStream& IS, Handle(Geom_BSplineCurve)& B) { Standard_Boolean rational=Standard_False,periodic=Standard_False; BinTools::GetBool(IS, rational); BinTools::GetBool(IS, periodic); // poles and weights Standard_Integer i=0,degree=0,nbpoles=0,nbknots=0; Standard_ExtCharacter aVal='\0'; BinTools::GetExtChar(IS, aVal); degree = (Standard_Integer)aVal; BinTools::GetInteger(IS, nbpoles); BinTools::GetInteger(IS, nbknots); TColgp_Array1OfPnt poles(1,nbpoles); TColStd_Array1OfReal weights(1,nbpoles); for (i = 1; i <= nbpoles; i++) { IS >> poles(i);//Pnt if (rational) BinTools::GetReal(IS, weights(i)); } TColStd_Array1OfReal knots(1,nbknots); TColStd_Array1OfInteger mults(1,nbknots); for (i = 1; i <= nbknots; i++) { BinTools::GetReal(IS, knots(i)); BinTools::GetInteger(IS, mults(i)); } if (rational) B = new Geom_BSplineCurve(poles,weights,knots,mults,degree,periodic); else B = new Geom_BSplineCurve(poles,knots,mults,degree,periodic); return IS; } //======================================================================= //function : ReadCurve //purpose : //======================================================================= static Standard_IStream& operator>>(Standard_IStream& IS, Handle(Geom_TrimmedCurve)& C) { Standard_Real p1=0.,p2=0.; BinTools::GetReal(IS, p1);//FirstParameter BinTools::GetReal(IS, p2);//LastParameter Handle(Geom_Curve) BC; BinTools_CurveSet::ReadCurve(IS,BC); C = new Geom_TrimmedCurve(BC,p1,p2); return IS; } //======================================================================= //function : ReadCurve //purpose : //======================================================================= static Standard_IStream& operator>>(Standard_IStream& IS, Handle(Geom_OffsetCurve)& C) { Standard_Real p=0.; BinTools::GetReal(IS, p);//Offset gp_Dir D(1.,0.,0.); IS >> D; Handle(Geom_Curve) BC; BinTools_CurveSet::ReadCurve(IS,BC); C = new Geom_OffsetCurve(BC,p,D); return IS; } //======================================================================= //function : ReadCurve //purpose : //======================================================================= Standard_IStream& BinTools_CurveSet::ReadCurve(Standard_IStream& IS, Handle(Geom_Curve)& C) { try { OCC_CATCH_SIGNALS const Standard_Byte ctype = (Standard_Byte) IS.get(); switch (ctype) { case LINE : { Handle(Geom_Line) CC; IS >> CC; C = CC; } break; case CIRCLE : { Handle(Geom_Circle) CC; IS >> CC; C = CC; } break; case ELLIPSE : { Handle(Geom_Ellipse) CC; IS >> CC; C = CC; } break; case PARABOLA : { Handle(Geom_Parabola) CC; IS >> CC; C = CC; } break; case HYPERBOLA : { Handle(Geom_Hyperbola) CC; IS >> CC; C = CC; } break; case BEZIER : { Handle(Geom_BezierCurve) CC; IS >> CC; C = CC; } break; case BSPLINE : { Handle(Geom_BSplineCurve) CC; IS >> CC; C = CC; } break; case TRIMMED : { Handle(Geom_TrimmedCurve) CC; IS >> CC; C = CC; } break; case OFFSET : { Handle(Geom_OffsetCurve) CC; IS >> CC; C = CC; } break; default: { C = NULL; throw Standard_Failure("UNKNOWN CURVE TYPE"); } } } catch(Standard_Failure const& anException) { C = NULL; Standard_SStream aMsg; aMsg <<"EXCEPTION in BinTools_CurveSet::ReadCurve(..)" << std::endl; aMsg << anException << std::endl; throw Standard_Failure(aMsg.str().c_str()); } return IS; } //======================================================================= //function : Read //purpose : //======================================================================= void BinTools_CurveSet::Read (Standard_IStream& IS, const Handle(Message_ProgressIndicator)& theProgress) { char buffer[255]; IS >> buffer; if (IS.fail() || strcmp(buffer,"Curves")) { Standard_SStream aMsg; aMsg << "BinTools_CurveSet::Read: Not a Curve table"<> nbcurve; Message_ProgressSentry aPS(theProgress, "Reading curves", 0, nbcurve, 1); IS.get();//remove for (i = 1; i <= nbcurve && aPS.More(); i++, aPS.Next()) { BinTools_CurveSet::ReadCurve(IS,C); myMap.Add(C); } }