// Created on: 1993-07-19 // Created by: Remi LEQUETTE // Copyright (c) 1993-1999 Matra Datavision // Copyright (c) 1999-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. // Modifed: Portage NT 7-5-97 DPF (strcasecmp) #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef MacOS #define strcasecmp(p,q) strcmp(p,q) #elseif _WIN32 #define strcasecmp strcmp #elseif AIX #include #endif // Modified: 02 Nov 2000: BUC60769. JMB, PTV. In order to be able to read BRep // files that came from a platform different from where CasCade // is run, we need the following modifications. // // On NT platforms (in BRepTools_ShapeSet): // ---------------- // In Visual C++ 5 (or higher) the std::fstream::tellg method is not // conform to Standard C++ because it modifies the file pointer // position and returns a wrong position. After that the next // readings are shifted and the reading process stop with errors. // // Workaround is following: Now we don`t use tellg for get position in stream. // Now able to read file (when reading TopAbs_FACE) without tellg. // We simple check the next string if there are value that equal 2 // (It means a parametr for triangulation). //======================================================================= //function : BRepTools_ShapeSet //purpose : //======================================================================= BRepTools_ShapeSet::BRepTools_ShapeSet(const Standard_Boolean isWithTriangles) :myWithTriangles(isWithTriangles) { } //======================================================================= //function : BRepTools_ShapeSet //purpose : //======================================================================= BRepTools_ShapeSet::BRepTools_ShapeSet (const BRep_Builder& B, const Standard_Boolean isWithTriangles) : myBuilder(B), myWithTriangles(isWithTriangles) { } //======================================================================= //function : Clear //purpose : //======================================================================= void BRepTools_ShapeSet::Clear() { mySurfaces.Clear(); myCurves.Clear(); myCurves2d.Clear(); myPolygons3D.Clear(); myPolygons2D.Clear(); myNodes.Clear(); myTriangulations.Clear(); TopTools_ShapeSet::Clear(); } //======================================================================= //function : AddGeometry //purpose : //======================================================================= void BRepTools_ShapeSet::AddGeometry(const TopoDS_Shape& S) { // Add the geometry if (S.ShapeType() == TopAbs_VERTEX) { Handle(BRep_TVertex) TV = Handle(BRep_TVertex)::DownCast(S.TShape()); BRep_ListIteratorOfListOfPointRepresentation itrp(TV->Points()); while (itrp.More()) { const Handle(BRep_PointRepresentation)& PR = itrp.Value(); if (PR->IsPointOnCurve()) { myCurves.Add(PR->Curve()); } else if (PR->IsPointOnCurveOnSurface()) { myCurves2d.Add(PR->PCurve()); mySurfaces.Add(PR->Surface()); } else if (PR->IsPointOnSurface()) { mySurfaces.Add(PR->Surface()); } ChangeLocations().Add(PR->Location()); itrp.Next(); } } else if (S.ShapeType() == TopAbs_EDGE) { // Add the curve geometry Handle(BRep_TEdge) TE = Handle(BRep_TEdge)::DownCast(S.TShape()); BRep_ListIteratorOfListOfCurveRepresentation itrc(TE->Curves()); while (itrc.More()) { const Handle(BRep_CurveRepresentation)& CR = itrc.Value(); if (CR->IsCurve3D()) { if (!CR->Curve3D().IsNull()) { myCurves.Add(CR->Curve3D()); ChangeLocations().Add(CR->Location()); } } else if (CR->IsCurveOnSurface()) { mySurfaces.Add(CR->Surface()); myCurves2d.Add(CR->PCurve()); ChangeLocations().Add(CR->Location()); if (CR->IsCurveOnClosedSurface()) myCurves2d.Add(CR->PCurve2()); } else if (CR->IsRegularity()) { mySurfaces.Add(CR->Surface()); ChangeLocations().Add(CR->Location()); mySurfaces.Add(CR->Surface2()); ChangeLocations().Add(CR->Location2()); } else if (myWithTriangles) { // for XML Persistence if (CR->IsPolygon3D()) { if (!CR->Polygon3D().IsNull()) { myPolygons3D.Add(CR->Polygon3D()); ChangeLocations().Add(CR->Location()); } } else if (CR->IsPolygonOnTriangulation()) { myTriangulations.Add(CR->Triangulation()); myNodes.Add(CR->PolygonOnTriangulation()); ChangeLocations().Add(CR->Location()); if (CR->IsPolygonOnClosedTriangulation()) myNodes.Add(CR->PolygonOnTriangulation2()); } else if (CR->IsPolygonOnSurface()) { mySurfaces.Add(CR->Surface()); myPolygons2D.Add(CR->Polygon()); ChangeLocations().Add(CR->Location()); if (CR->IsPolygonOnClosedSurface()) myPolygons2D.Add(CR->Polygon2()); } } itrc.Next(); } } else if (S.ShapeType() == TopAbs_FACE) { // Add the surface geometry Handle(BRep_TFace) TF = Handle(BRep_TFace)::DownCast(S.TShape()); if (!TF->Surface().IsNull()) mySurfaces.Add(TF->Surface()); if (myWithTriangles || TF->Surface().IsNull()) { // for XML Persistence Handle(Poly_Triangulation) Tr = TF->Triangulation(); if (!Tr.IsNull()) myTriangulations.Add(Tr); } ChangeLocations().Add(TF->Location()); } } //======================================================================= //function : DumpGeometry //purpose : //======================================================================= void BRepTools_ShapeSet::DumpGeometry (Standard_OStream& OS)const { myCurves2d.Dump(OS); myCurves.Dump(OS); DumpPolygon3D(OS); DumpPolygonOnTriangulation(OS); mySurfaces.Dump(OS); DumpTriangulation(OS); } //======================================================================= //function : WriteGeometry //purpose : //======================================================================= void BRepTools_ShapeSet::WriteGeometry(Standard_OStream& OS, const Message_ProgressRange& theProgress) { // Make nested progress scope for processing geometry Message_ProgressScope aPS(theProgress, "Geometry", 100); myCurves2d.Write(OS, aPS.Next(20)); if (aPS.UserBreak()) return; myCurves.Write(OS, aPS.Next(20)); if (aPS.UserBreak()) return; WritePolygon3D(OS, Standard_True, aPS.Next(10)); if (aPS.UserBreak()) return; WritePolygonOnTriangulation(OS, Standard_True, aPS.Next(10)); if (aPS.UserBreak()) return; mySurfaces.Write(OS, aPS.Next(20)); if (aPS.UserBreak()) return; WriteTriangulation(OS, Standard_True, aPS.Next(20)); } //======================================================================= //function : ReadGeometry //purpose : //======================================================================= void BRepTools_ShapeSet::ReadGeometry(Standard_IStream& IS, const Message_ProgressRange& theProgress) { // Make nested progress scope for processing geometry Message_ProgressScope aPS(theProgress, "Geometry", 100); myCurves2d.Read(IS, aPS.Next(20)); if (aPS.UserBreak()) return; myCurves.Read(IS, aPS.Next(20)); if (aPS.UserBreak()) return; ReadPolygon3D(IS, aPS.Next(15)); if (aPS.UserBreak()) return; ReadPolygonOnTriangulation(IS, aPS.Next(15)); if (aPS.UserBreak()) return; mySurfaces.Read(IS, aPS.Next(15)); if (aPS.UserBreak()) return; ReadTriangulation(IS, aPS.Next(15)); } //======================================================================= //function : PrintRegularity //purpose : //======================================================================= static void PrintRegularity(const GeomAbs_Shape C, Standard_OStream& OS) { switch (C) { case GeomAbs_C0 : OS << "C0"; break; case GeomAbs_G1 : OS << "G1"; break; case GeomAbs_C1 : OS << "C1"; break; case GeomAbs_G2 : OS << "G2"; break; case GeomAbs_C2 : OS << "C2"; break; case GeomAbs_C3 : OS << "C3"; break; case GeomAbs_CN : OS << "CN"; break; } } //======================================================================= //function : DumpGeometry //purpose : //======================================================================= void BRepTools_ShapeSet::DumpGeometry(const TopoDS_Shape& S, Standard_OStream& OS)const { // Dump the geometry if (S.ShapeType() == TopAbs_VERTEX) { // Dump the point geometry TopoDS_Vertex V = TopoDS::Vertex(S); OS << " Tolerance : " << BRep_Tool::Tolerance(V) << "\n"; gp_Pnt p = BRep_Tool::Pnt(V); OS << " - Point 3D : "<Points()); while (itrp.More()) { const Handle(BRep_PointRepresentation)& PR = itrp.Value(); OS << " - Parameter : "<< PR->Parameter(); if (PR->IsPointOnCurve()) { OS << " on curve " << myCurves.Index(PR->Curve()); } else if (PR->IsPointOnCurveOnSurface()) { OS << " on pcurve " << myCurves2d.Index(PR->PCurve()); OS << " on surface " << mySurfaces.Index(PR->Surface()); } else if (PR->IsPointOnSurface()) { OS << ", " << PR->Parameter2() << " on surface "; OS << mySurfaces.Index(PR->Surface()); } if (!PR->Location().IsIdentity()) OS << " location " << Locations().Index(PR->Location()); OS << "\n"; itrp.Next(); } } else if (S.ShapeType() == TopAbs_EDGE) { Handle(BRep_TEdge) TE = Handle(BRep_TEdge)::DownCast(S.TShape()); gp_Pnt2d Pf,Pl; // Dump the curve geometry OS << " Tolerance : " << TE->Tolerance() << "\n"; if (TE->SameParameter()) OS << " same parametrisation of curves\n"; if (TE->SameRange()) OS << " same range on curves\n"; if (TE->Degenerated()) OS << " degenerated\n"; Standard_Real first, last; BRep_ListIteratorOfListOfCurveRepresentation itrc = TE->Curves(); while (itrc.More()) { const Handle(BRep_CurveRepresentation)& CR = itrc.Value(); if (CR->IsCurve3D()) { Handle(BRep_GCurve) GC = Handle(BRep_GCurve)::DownCast(itrc.Value()); GC->Range(first, last); if (!CR->Curve3D().IsNull()) { OS << " - Curve 3D : "<Curve3D()); if (!CR->Location().IsIdentity()) OS << " location "<Location()); OS <<", range : " << first << " " << last <<"\n"; } } else if (CR->IsCurveOnSurface()) { Handle(BRep_GCurve) GC = Handle(BRep_GCurve)::DownCast(itrc.Value()); GC->Range(first, last); OS <<" - PCurve : "<PCurve()); if (CR->IsCurveOnClosedSurface()) { OS <<", " << myCurves2d.Index(CR->PCurve2()); OS << " ("; PrintRegularity(CR->Continuity(),OS); OS <<")"; } OS << " on surface "<Surface()); if (!CR->Location().IsIdentity()) OS << " location "<Location()); OS <<", range : " << first << " " << last <<"\n"; Handle(BRep_CurveOnSurface) COS = Handle(BRep_CurveOnSurface)::DownCast(CR); COS->UVPoints(Pf,Pl); OS << " UV Points : " <IsCurveOnClosedSurface()) { Handle(BRep_CurveOnClosedSurface) COCS = Handle(BRep_CurveOnClosedSurface)::DownCast(CR); COCS->UVPoints2(Pf,Pl); OS << " UV Points : " <IsRegularity()) { OS << " - Regularity "; PrintRegularity(CR->Continuity(),OS); OS << " on surfaces : "<Surface()); if (!CR->Location().IsIdentity()) OS << " location "<Location()); OS << ", "<Surface2()); if (!CR->Location2().IsIdentity()) OS << " location "<Location2()); OS << "\n"; } else if (CR->IsPolygon3D()) { Handle(BRep_Polygon3D) GC = Handle(BRep_Polygon3D)::DownCast(itrc.Value()); if (!GC->Polygon3D().IsNull()) { OS << " - Polygon 3D : "<Polygon3D()); if (!CR->Location().IsIdentity()) OS << " location "<Location()); } } else if (CR->IsPolygonOnTriangulation()) { OS << " - PolygonOnTriangulation " << myNodes.FindIndex(CR->PolygonOnTriangulation()); if (CR->IsPolygonOnClosedTriangulation()) { OS << " " << myNodes.FindIndex(CR->PolygonOnTriangulation2()); } OS << " on triangulation " << myTriangulations.FindIndex(CR->Triangulation()); if (!CR->Location().IsIdentity()) OS << " location "<Location()); OS << "\n"; } itrc.Next(); } } else if (S.ShapeType() == TopAbs_FACE) { const TopoDS_Face& F = TopoDS::Face(S); if (BRep_Tool::NaturalRestriction(F)) OS << "NaturalRestriction\n"; // Dump the surface geometry Handle(BRep_TFace) TF = Handle(BRep_TFace)::DownCast(S.TShape()); if (!TF->Surface().IsNull()) { OS << " Tolerance : " <Tolerance() << "\n"; OS << " - Surface : "<Surface()); if (!S.Location().IsIdentity()) OS << " location "<Triangulation()).IsNull()) { // Dump the triangulation OS << " - Triangulation : " <Triangulation()); if (!S.Location().IsIdentity()) OS << " location " <Location()); OS << "\n"; } } OS << "\n"; } //======================================================================= //function : WriteGeometry //purpose : //======================================================================= void BRepTools_ShapeSet::WriteGeometry (const TopoDS_Shape& S, Standard_OStream& OS)const { // Write the geometry if (S.ShapeType() == TopAbs_VERTEX) { // Write the point geometry TopoDS_Vertex V = TopoDS::Vertex(S); OS << BRep_Tool::Tolerance(V) << "\n"; gp_Pnt p = BRep_Tool::Pnt(V); OS<Points()); while (itrp.More()) { const Handle(BRep_PointRepresentation)& PR = itrp.Value(); OS << PR->Parameter(); if (PR->IsPointOnCurve()) { OS << " 1 " << myCurves.Index(PR->Curve()); } else if (PR->IsPointOnCurveOnSurface()) { OS << " 2 " << myCurves2d.Index(PR->PCurve()); OS << " " << mySurfaces.Index(PR->Surface()); } else if (PR->IsPointOnSurface()) { OS << " 3 " << PR->Parameter2() << " "; OS << mySurfaces.Index(PR->Surface()); } OS << " " << Locations().Index(PR->Location()); OS << "\n"; itrp.Next(); } OS << "0 0\n"; // end representations } else if (S.ShapeType() == TopAbs_EDGE) { // Write the curve geometry Handle(BRep_TEdge) TE = Handle(BRep_TEdge)::DownCast(S.TShape()); OS << " " << TE->Tolerance() << " "; OS << ((TE->SameParameter()) ? 1 : 0) << " "; OS << ((TE->SameRange()) ? 1 : 0) << " "; OS << ((TE->Degenerated()) ? 1 : 0) << "\n"; Standard_Real first, last; BRep_ListIteratorOfListOfCurveRepresentation itrc = TE->Curves(); while (itrc.More()) { const Handle(BRep_CurveRepresentation)& CR = itrc.Value(); if (CR->IsCurve3D()) { if (!CR->Curve3D().IsNull()) { Handle(BRep_GCurve) GC = Handle(BRep_GCurve)::DownCast(itrc.Value()); GC->Range(first, last); OS << "1 "; // -1- Curve 3D OS << " "<Curve3D()); OS << " "<Location()); OS << " "<IsCurveOnSurface()) { Handle(BRep_GCurve) GC = Handle(BRep_GCurve)::DownCast(itrc.Value()); GC->Range(first, last); if (!CR->IsCurveOnClosedSurface()) OS << "2 "; // -2- Curve on surf else OS << "3 "; // -3- Curve on closed surf OS <<" "<PCurve()); if (CR->IsCurveOnClosedSurface()) { OS <<" " << myCurves2d.Index(CR->PCurve2()); PrintRegularity(CR->Continuity(),OS); } OS << " " << mySurfaces.Index(CR->Surface()); OS << " " << Locations().Index(CR->Location()); OS << " "<IsCurveOnClosedSurface()) { Handle(BRep_CurveOnClosedSurface) COCS = Handle(BRep_CurveOnClosedSurface)::DownCast(CR); COCS->UVPoints2(Pf,Pl); } else { Handle(BRep_CurveOnSurface) COS = Handle(BRep_CurveOnSurface)::DownCast(CR); COS->UVPoints(Pf,Pl); } OS << Pf.X() << " " << Pf.Y() << " " << Pl.X() << " " << Pl.Y() << "\n"; } } else if (CR->IsRegularity()) { OS << "4 "; // -4- Regularity PrintRegularity(CR->Continuity(),OS); OS << " "<Surface()); OS << " "<Location()); OS << " "<Surface2()); OS << " "<Location2()); OS << "\n"; } else if (myWithTriangles) { // for XML Persistence if (CR->IsPolygon3D()) { Handle(BRep_Polygon3D) GC = Handle(BRep_Polygon3D)::DownCast(itrc.Value()); if (!GC->Polygon3D().IsNull()) { OS << "5 "; // -5- Polygon3D OS << " "<Polygon3D()); OS << " "<Location()); OS << "\n"; } } else if (CR->IsPolygonOnTriangulation()) { Handle(BRep_PolygonOnTriangulation) PT = Handle(BRep_PolygonOnTriangulation)::DownCast(itrc.Value()); if (!CR->IsPolygonOnClosedTriangulation()) OS << "6 "; // -6- Polygon on triangulation else OS << "7 "; // -7- Polygon on closed triangulation OS << " " << myNodes.FindIndex(PT->PolygonOnTriangulation()); if (CR->IsPolygonOnClosedTriangulation()) { OS << " " << myNodes.FindIndex(PT->PolygonOnTriangulation2()); } OS << " " << myTriangulations.FindIndex(PT->Triangulation()); OS << " "<Location()); OS << "\n"; } } itrc.Next(); } OS << "0\n"; // end of the list of representations } else if (S.ShapeType() == TopAbs_FACE) { Handle(BRep_TFace) TF = Handle(BRep_TFace)::DownCast(S.TShape()); const TopoDS_Face& F = TopoDS::Face(S); if (!(TF->Surface()).IsNull()) { OS << ((BRep_Tool::NaturalRestriction(F)) ? 1 : 0); OS << " "; // Write the surface geometry OS << " " <Tolerance(); OS << " " <Surface()); OS << " " <Location()); OS << "\n"; } else //For correct reading of null face { OS << 0; OS << " "; OS << " " <Tolerance(); OS << " " << 0; OS << " " << 0; OS << "\n"; } if (myWithTriangles || TF->Surface().IsNull()) { // for XML Persistence if (!(TF->Triangulation()).IsNull()) { OS << 2; OS << " "; // Write the triangulation OS << " " <Triangulation()); } } } } //======================================================================= //function : ReadRegularity //purpose : //======================================================================= static GeomAbs_Shape ReadRegularity(Standard_IStream& IS) { char buffer[255]; IS >> buffer; switch (buffer[0]) { case 'C' : switch (buffer[1]) { case '0' : return GeomAbs_C0; case '1' : return GeomAbs_C1; case '2' : return GeomAbs_C2; case '3' : return GeomAbs_C3; case 'N' : return GeomAbs_CN; } break; case 'G' : switch (buffer[1]) { case '1' : return GeomAbs_G1; case '2' : return GeomAbs_G2; } break; } return GeomAbs_C0; } //======================================================================= //function : ReadGeometry //purpose : //======================================================================= void BRepTools_ShapeSet::ReadGeometry (const TopAbs_ShapeEnum T, Standard_IStream& IS, TopoDS_Shape& S) { // Read the geometry Standard_Integer val,c,pc,pc2 = 0,s,s2,l,l2,t, pt, pt2 = 0; Standard_Real tol,X,Y,Z,first,last,p1,p2; Standard_Real PfX,PfY,PlX,PlY; gp_Pnt2d aPf, aPl; Standard_Boolean closed; GeomAbs_Shape reg = GeomAbs_C0; switch (T) { //--------- // vertex //--------- case TopAbs_VERTEX : { TopoDS_Vertex& V = TopoDS::Vertex(S); // Read the point geometry GeomTools::GetReal(IS, tol); GeomTools::GetReal(IS, X); GeomTools::GetReal(IS, Y); GeomTools::GetReal(IS, Z); myBuilder.MakeVertex(V,gp_Pnt(X,Y,Z),tol); Handle(BRep_TVertex) TV = Handle(BRep_TVertex)::DownCast(V.TShape()); BRep_ListOfPointRepresentation& lpr = TV->ChangePoints(); TopLoc_Location L; do { GeomTools::GetReal(IS, p1); IS >> val; Handle(BRep_PointRepresentation) PR; switch (val) { case 1 : { IS >> c; // Modified by Sergey KHROMOV - Wed Apr 24 13:59:09 2002 Begin if (myCurves.Curve(c).IsNull()) break; // Modified by Sergey KHROMOV - Wed Apr 24 13:59:13 2002 End Handle(BRep_PointOnCurve) POC = new BRep_PointOnCurve(p1, myCurves.Curve(c), L); PR = POC; } break; case 2 : { IS >> pc >> s; // Modified by Sergey KHROMOV - Wed Apr 24 13:59:09 2002 Begin if (myCurves2d.Curve2d(pc).IsNull() || mySurfaces.Surface(s).IsNull()) break; // Modified by Sergey KHROMOV - Wed Apr 24 13:59:13 2002 End Handle(BRep_PointOnCurveOnSurface) POC = new BRep_PointOnCurveOnSurface(p1, myCurves2d.Curve2d(pc), mySurfaces.Surface(s), L); PR = POC; } break; case 3 : { GeomTools::GetReal(IS, p2); IS >> s; // Modified by Sergey KHROMOV - Wed Apr 24 13:59:09 2002 Begin if (mySurfaces.Surface(s).IsNull()) break; // Modified by Sergey KHROMOV - Wed Apr 24 13:59:13 2002 End Handle(BRep_PointOnSurface) POC = new BRep_PointOnSurface(p1,p2, mySurfaces.Surface(s), L); PR = POC; } break; } if (val > 0) { IS >> l; if (!PR.IsNull()) { PR->Location(Locations().Location(l)); lpr.Append(PR); } } } while (val > 0); } break; //--------- // edge //--------- case TopAbs_EDGE : // Create an edge { TopoDS_Edge& E = TopoDS::Edge(S); myBuilder.MakeEdge(E); // Read the curve geometry GeomTools::GetReal(IS, tol); IS >> val; myBuilder.SameParameter(E,(val == 1)); IS >> val; myBuilder.SameRange(E,(val == 1)); IS >> val; myBuilder.Degenerated(E,(val == 1)); do { IS >> val; switch (val) { case 1 : // -1- Curve 3D IS >> c >> l; if (!myCurves.Curve(c).IsNull()) { myBuilder.UpdateEdge(E,myCurves.Curve(c), Locations().Location(l),tol); } GeomTools::GetReal(IS, first); GeomTools::GetReal(IS, last); if (!myCurves.Curve(c).IsNull()) { Standard_Boolean Only3d = Standard_True; myBuilder.Range(E,first,last,Only3d); } break; case 2 : // -2- Curve on surf case 3 : // -3- Curve on closed surf closed = (val == 3); IS >> pc; if (closed) { IS >> pc2; reg = ReadRegularity(IS); } // surface, location IS >> s >> l; // range GeomTools::GetReal(IS, first); GeomTools::GetReal(IS, last); // read UV Points // for XML Persistence higher performance if (FormatNb() == 2) { GeomTools::GetReal(IS, PfX); GeomTools::GetReal(IS, PfY); GeomTools::GetReal(IS, PlX); GeomTools::GetReal(IS, PlY); aPf = gp_Pnt2d(PfX,PfY); aPl = gp_Pnt2d(PlX,PlY); } // Modified by Sergey KHROMOV - Wed Apr 24 12:11:16 2002 Begin if (myCurves2d.Curve2d(pc).IsNull() || (closed && myCurves2d.Curve2d(pc2).IsNull()) || mySurfaces.Surface(s).IsNull()) break; // Modified by Sergey KHROMOV - Wed Apr 24 12:11:17 2002 End if (closed) { if (FormatNb() == 2) myBuilder.UpdateEdge(E,myCurves2d.Curve2d(pc), myCurves2d.Curve2d(pc2), mySurfaces.Surface(s), Locations().Location(l),tol, aPf, aPl); else myBuilder.UpdateEdge(E,myCurves2d.Curve2d(pc), myCurves2d.Curve2d(pc2), mySurfaces.Surface(s), Locations().Location(l),tol); myBuilder.Continuity(E, mySurfaces.Surface(s), mySurfaces.Surface(s), Locations().Location(l), Locations().Location(l), reg); } else { if (FormatNb() == 2) myBuilder.UpdateEdge(E,myCurves2d.Curve2d(pc), mySurfaces.Surface(s), Locations().Location(l),tol, aPf, aPl); else myBuilder.UpdateEdge(E,myCurves2d.Curve2d(pc), mySurfaces.Surface(s), Locations().Location(l),tol); } myBuilder.Range(E, mySurfaces.Surface(s), Locations().Location(l), first,last); break; case 4 : // -4- Regularity reg = ReadRegularity(IS); IS >> s >> l >> s2 >> l2; // Modified by Sergey KHROMOV - Wed Apr 24 12:39:13 2002 Begin if (mySurfaces.Surface(s).IsNull() || mySurfaces.Surface(s2).IsNull()) break; // Modified by Sergey KHROMOV - Wed Apr 24 12:39:14 2002 End myBuilder.Continuity(E, mySurfaces.Surface(s), mySurfaces.Surface(s2), Locations().Location(l), Locations().Location(l2), reg); break; case 5 : // -5- Polygon3D IS >> c >> l; //szy-02.05.2004 myBuilder.UpdateEdge(E,Handle(Poly_Polygon3D)::DownCast(myPolygons3D(c))); if (c > 0 && c <= myPolygons3D.Extent()) myBuilder.UpdateEdge(E,Handle(Poly_Polygon3D)::DownCast(myPolygons3D(c)), Locations().Location(l)); break; case 6 : case 7 : closed = (val == 7); IS >> pt; if (closed) { IS >> pt2; } IS >> t >> l; if (closed) { if (t > 0 && t <= myTriangulations.Extent() && pt > 0 && pt <= myNodes.Extent() && pt2 > 0 && pt2 <= myNodes.Extent()) myBuilder.UpdateEdge (E, Handle(Poly_PolygonOnTriangulation)::DownCast(myNodes(pt)), Handle(Poly_PolygonOnTriangulation)::DownCast(myNodes(pt2)), Handle(Poly_Triangulation)::DownCast(myTriangulations(t)), Locations().Location(l)); } else { if (t > 0 && t <= myTriangulations.Extent() && pt > 0 && pt <= myNodes.Extent()) myBuilder.UpdateEdge (E,Handle(Poly_PolygonOnTriangulation)::DownCast(myNodes(pt)), Handle(Poly_Triangulation)::DownCast(myTriangulations(t)), Locations().Location(l)); } // range break; } } while (val > 0); } break; //--------- // wire //--------- case TopAbs_WIRE : myBuilder.MakeWire(TopoDS::Wire(S)); break; //--------- // face //--------- case TopAbs_FACE : { // create a face : TopoDS_Face& F = TopoDS::Face(S); // std::streampos pos; myBuilder.MakeFace(F); IS >> val; // natural restriction if (val == 0 || val == 1) { GeomTools::GetReal(IS, tol); IS >> s >> l; // Modified by Sergey KHROMOV - Wed Apr 24 12:39:13 2002 Begin if (!mySurfaces.Surface(s).IsNull()) { // Modified by Sergey KHROMOV - Wed Apr 24 12:39:14 2002 End myBuilder.UpdateFace(TopoDS::Face(S), mySurfaces.Surface(s), Locations().Location(l),tol); myBuilder.NaturalRestriction(TopoDS::Face(S),(val == 1)); } // pos = IS.tellg(); // IS >> val; } else if(val == 2) { //only triangulation IS >> s; myBuilder.UpdateFace(TopoDS::Face(S), Handle(Poly_Triangulation)::DownCast(myTriangulations(s))); } // else pos = IS.tellg(); // BUC60769 if(val == 2) break; char string[260]; IS.getline ( string, 256, '\n' ); IS.getline ( string, 256, '\n' ); if (string[0] == '2') { // cas triangulation s = atoi ( &string[2] ); if (s > 0 && s <= myTriangulations.Extent()) myBuilder.UpdateFace(TopoDS::Face(S), Handle(Poly_Triangulation)::DownCast(myTriangulations(s))); } // else IS.seekg(pos); } break; //--------- // shell //--------- case TopAbs_SHELL : myBuilder.MakeShell(TopoDS::Shell(S)); break; //--------- // solid //--------- case TopAbs_SOLID : myBuilder.MakeSolid(TopoDS::Solid(S)); break; //--------- // compsolid //--------- case TopAbs_COMPSOLID : myBuilder.MakeCompSolid(TopoDS::CompSolid(S)); break; //--------- // compound //--------- case TopAbs_COMPOUND : myBuilder.MakeCompound(TopoDS::Compound(S)); break; default: break; } } //======================================================================= //function : AddShapes //purpose : //======================================================================= void BRepTools_ShapeSet::AddShapes(TopoDS_Shape& S1, const TopoDS_Shape& S2) { myBuilder.Add(S1,S2); } //======================================================================= //function : Check //purpose : //======================================================================= void BRepTools_ShapeSet::Check(const TopAbs_ShapeEnum T, TopoDS_Shape& S) { if (T == TopAbs_FACE) { const TopoDS_Face& F = TopoDS::Face(S); BRepTools::Update(F); } } //======================================================================= //function : WritePolygonOnTriangulation //purpose : //======================================================================= void BRepTools_ShapeSet::WritePolygonOnTriangulation(Standard_OStream& OS, const Standard_Boolean Compact, const Message_ProgressRange& theProgress)const { Standard_Integer i, j, nbpOntri = myNodes.Extent(); Message_ProgressScope aPS(theProgress, "Polygons On Triangulation", nbpOntri); if (Compact) OS << "PolygonOnTriangulations " << nbpOntri << "\n"; else { OS << " -------\n"; OS <<"Dump of " << nbpOntri << " PolygonOnTriangulations\n"; OS << " -------\n"; } Handle(Poly_PolygonOnTriangulation) Poly; Handle(TColStd_HArray1OfReal) Param; for (i=1; i<=nbpOntri && aPS.More(); i++, aPS.Next()) { Poly = Handle(Poly_PolygonOnTriangulation)::DownCast(myNodes(i)); const TColStd_Array1OfInteger& Nodes = Poly->Nodes(); if (!Compact) { OS << " "<< i << " : PolygonOnTriangulation with " << Nodes.Length() << " Nodes\n"; } else OS << Nodes.Length()<<" "; if (!Compact) OS <<" "; for (j=1; j <= Nodes.Length(); j++) OS << Nodes.Value(j) << " "; OS << "\n"; // writing parameters: Param = Poly->Parameters(); if (Compact) OS <<"p "; // write the deflection if (!Compact) OS << " Deflection : "; OS <Deflection() << " "; if (!Compact) OS << "\n"; if (!Param.IsNull()) { if (!Compact) { OS << " Parameters :"; } else OS << "1 " ; if (!Compact) OS <<" "; for (j=1; j <= Param->Length(); j++) OS << Param->Value(j) << " "; OS << "\n"; } else OS <<"0 \n"; } } //======================================================================= //function : DumpPolygonOnTriangulation //purpose : //======================================================================= void BRepTools_ShapeSet::DumpPolygonOnTriangulation(Standard_OStream& OS)const { WritePolygonOnTriangulation(OS, Standard_False); } //======================================================================= //function : ReadPolygonOnTriangulation //purpose : //======================================================================= void BRepTools_ShapeSet::ReadPolygonOnTriangulation(Standard_IStream& IS, const Message_ProgressRange& theProgress) { char buffer[255]; IS >> buffer; if (strstr(buffer,"PolygonOnTriangulations") == NULL) return; Standard_Integer i, j, val, nbpol = 0, nbnodes =0; Standard_Integer hasparameters; Standard_Real par; Handle(TColStd_HArray1OfReal) Param; Handle(Poly_PolygonOnTriangulation) Poly; IS >> nbpol; //OCC19559 Message_ProgressScope aPS(theProgress, "Polygons On Triangulation", nbpol); for (i=1; i<=nbpol&& aPS.More(); i++, aPS.Next()) { IS >> nbnodes; TColStd_Array1OfInteger Nodes(1, nbnodes); for (j = 1; j <= nbnodes; j++) { IS >> val; Nodes(j) = val; } IS >> buffer; // if (!strcasecmp(buffer, "p")) { Standard_Real def; GeomTools::GetReal(IS, def); IS >> hasparameters; if (hasparameters) { TColStd_Array1OfReal Param1(1, nbnodes); for (j = 1; j <= nbnodes; j++) { GeomTools::GetReal(IS, par); Param1(j) = par; } Poly = new Poly_PolygonOnTriangulation(Nodes, Param1); } else Poly = new Poly_PolygonOnTriangulation(Nodes); Poly->Deflection(def); // } // else { // IS.seekg(ppp); // Poly = new Poly_PolygonOnTriangulation(Nodes); // } myNodes.Add(Poly); } // } // else IS.seekg(pos); } //======================================================================= //function : WritePolygon3D //purpose : //======================================================================= void BRepTools_ShapeSet::WritePolygon3D(Standard_OStream& OS, const Standard_Boolean Compact, const Message_ProgressRange& theProgress)const { Standard_Integer i, j, nbpol = myPolygons3D.Extent(); Message_ProgressScope aPS(theProgress, "3D Polygons", nbpol); if (Compact) OS << "Polygon3D " << nbpol << "\n"; else { OS << " -------\n"; OS <<"Dump of " << nbpol << " Polygon3Ds\n"; OS << " -------\n"; } Handle(Poly_Polygon3D) P; for (i = 1; i <= nbpol && aPS.More(); i++, aPS.Next()) { P = Handle(Poly_Polygon3D)::DownCast(myPolygons3D(i)); if (Compact) { OS << P->NbNodes() << " "; OS << ((P->HasParameters()) ? "1" : "0") << "\n"; } else { OS << " "<< i << " : Polygon3D with " << P->NbNodes() << " Nodes\n"; OS << ((P->HasParameters()) ? "with" : "without") << " parameters\n"; } // write the deflection if (!Compact) OS << "Deflection : "; OS << P->Deflection() << "\n"; // write the nodes if (!Compact) OS << "\nNodes :\n"; Standard_Integer i1, nbNodes = P->NbNodes(); const TColgp_Array1OfPnt& Nodes = P->Nodes(); for (j = 1; j <= nbNodes; j++) { if (!Compact) OS << std::setw(10) << j << " : "; if (!Compact) OS << std::setw(17); OS << Nodes(j).X() << " "; if (!Compact) OS << std::setw(17); OS << Nodes(j).Y() << " "; if (!Compact) OS << std::setw(17); OS << Nodes(j).Z(); if (!Compact) OS << "\n"; else OS << " "; } OS <<"\n"; if (P->HasParameters()) { if (!Compact) OS << "\nParameters :\n"; const TColStd_Array1OfReal& Param = P->Parameters(); for ( i1 = 1; i1 <= nbNodes; i1++ ) { OS << Param(i1) << " "; } OS <<"\n"; } } } //======================================================================= //function : DumpPolygon3D //purpose : //======================================================================= void BRepTools_ShapeSet::DumpPolygon3D(Standard_OStream& OS)const { WritePolygon3D(OS, Standard_False); } //======================================================================= //function : ReadPolygon3D //purpose : //======================================================================= void BRepTools_ShapeSet::ReadPolygon3D(Standard_IStream& IS, const Message_ProgressRange& theProgress) { char buffer[255]; // Standard_Integer i, j, p, val, nbpol, nbnodes, hasparameters; Standard_Integer i, j, p, nbpol=0, nbnodes =0, hasparameters = Standard_False; Standard_Real d, x, y, z; IS >> buffer; if (strstr(buffer,"Polygon3D") == NULL) return; Handle(Poly_Polygon3D) P; IS >> nbpol; //OCC19559 Message_ProgressScope aPS(theProgress, "3D Polygons", nbpol); for (i=1; i<=nbpol && aPS.More(); i++, aPS.Next()) { IS >> nbnodes; IS >> hasparameters; TColgp_Array1OfPnt Nodes(1, nbnodes); GeomTools::GetReal(IS, d); for (j = 1; j <= nbnodes; j++) { GeomTools::GetReal(IS, x); GeomTools::GetReal(IS, y); GeomTools::GetReal(IS, z); Nodes(j).SetCoord(x,y,z); } if (hasparameters) { TColStd_Array1OfReal Param(1,nbnodes); for (p = 1; p <= nbnodes; p++) { GeomTools::GetReal(IS, Param(p)); } P = new Poly_Polygon3D(Nodes, Param); } else P = new Poly_Polygon3D(Nodes); P->Deflection(d); myPolygons3D.Add(P); } } //======================================================================= //function : WriteTriangulation //purpose : //======================================================================= void BRepTools_ShapeSet::WriteTriangulation(Standard_OStream& OS, const Standard_Boolean Compact, const Message_ProgressRange& theProgress)const { Standard_Integer i, j, nbNodes, nbtri = myTriangulations.Extent(); Standard_Integer nbTriangles = 0, n1, n2, n3; Message_ProgressScope aPS(theProgress, "Triangulations", nbtri); if (Compact) OS << "Triangulations " << nbtri << "\n"; else { OS << " -------\n"; OS <<"Dump of " << nbtri << " Triangulations\n"; OS << " -------\n"; } Handle(Poly_Triangulation) T; for (i = 1; i <= nbtri && aPS.More(); i++, aPS.Next()) { T = Handle(Poly_Triangulation)::DownCast(myTriangulations(i)); if (Compact) { OS << T->NbNodes() << " " << T->NbTriangles() << " "; OS << ((T->HasUVNodes()) ? "1" : "0") << " "; } else { OS << " "<< i << " : Triangulation with " << T->NbNodes() << " Nodes and " << T->NbTriangles() <<" Triangles\n"; OS << " "<<((T->HasUVNodes()) ? "with" : "without") << " UV nodes\n"; } // write the deflection if (!Compact) OS << " Deflection : "; OS <Deflection() << "\n"; // write the 3d nodes if (!Compact) OS << "\n3D Nodes :\n"; nbNodes = T->NbNodes(); const TColgp_Array1OfPnt& Nodes = T->Nodes(); for (j = 1; j <= nbNodes; j++) { if (!Compact) OS << std::setw(10) << j << " : "; if (!Compact) OS << std::setw(17); OS << Nodes(j).X() << " "; if (!Compact) OS << std::setw(17); OS << Nodes(j).Y() << " "; if (!Compact) OS << std::setw(17); OS << Nodes(j).Z(); if (!Compact) OS << "\n"; else OS << " "; } if (T->HasUVNodes()) { if (!Compact) OS << "\nUV Nodes :\n"; const TColgp_Array1OfPnt2d& UVNodes = T->UVNodes(); for (j = 1; j <= nbNodes; j++) { if (!Compact) OS << std::setw(10) << j << " : "; if (!Compact) OS << std::setw(17); OS << UVNodes(j).X() << " "; if (!Compact) OS << std::setw(17); OS << UVNodes(j).Y(); if (!Compact) OS << "\n"; else OS << " "; } } if (!Compact) OS << "\nTriangles :\n"; nbTriangles = T->NbTriangles(); const Poly_Array1OfTriangle& Triangles = T->Triangles(); for (j = 1; j <= nbTriangles; j++) { if (!Compact) OS << std::setw(10) << j << " : "; Triangles(j).Get(n1, n2, n3); if (!Compact) OS << std::setw(10); OS << n1 << " "; if (!Compact) OS << std::setw(10); OS << n2 << " "; if (!Compact) OS << std::setw(10); OS << n3; if (!Compact) OS << "\n"; else OS << " "; } OS << "\n"; } } //======================================================================= //function : DumpTriangulation //purpose : //======================================================================= void BRepTools_ShapeSet::DumpTriangulation(Standard_OStream& OS)const { WriteTriangulation(OS, Standard_False); } //======================================================================= //function : ReadTriangulation //purpose : //======================================================================= void BRepTools_ShapeSet::ReadTriangulation(Standard_IStream& IS, const Message_ProgressRange& theProgress) { char buffer[255]; // Standard_Integer i, j, val, nbtri; Standard_Integer i, j, nbtri =0; Standard_Real d, x, y, z; Standard_Integer nbNodes =0, nbTriangles=0; Standard_Boolean hasUV= Standard_False; Handle(Poly_Triangulation) T; IS >> buffer; if (strstr(buffer,"Triangulations") == NULL) return; IS >> nbtri; //OCC19559 Message_ProgressScope aPS(theProgress, "Triangulations", nbtri); for (i=1; i<=nbtri && aPS.More();i++, aPS.Next()) { IS >> nbNodes >> nbTriangles >> hasUV; GeomTools::GetReal(IS, d); TColgp_Array1OfPnt Nodes(1, nbNodes); TColgp_Array1OfPnt2d UVNodes(1, nbNodes); for (j = 1; j <= nbNodes; j++) { GeomTools::GetReal(IS, x); GeomTools::GetReal(IS, y); GeomTools::GetReal(IS, z); Nodes(j).SetCoord(x,y,z); } if (hasUV) { for (j = 1; j <= nbNodes; j++) { GeomTools::GetReal(IS, x); GeomTools::GetReal(IS, y); UVNodes(j).SetCoord(x,y); } } // read the triangles Standard_Integer n1,n2,n3; Poly_Array1OfTriangle Triangles(1, nbTriangles); for (j = 1; j <= nbTriangles; j++) { IS >> n1 >> n2 >> n3; Triangles(j).Set(n1,n2,n3); } if (hasUV) T = new Poly_Triangulation(Nodes,UVNodes,Triangles); else T = new Poly_Triangulation(Nodes,Triangles); T->Deflection(d); myTriangulations.Add(T); } }