// Created on: 1995-01-03 // Created by: Frederic MAUPAS // Copyright (c) 1995-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. //gka,abv 14.09.99: S4136: eliminate BRepAPI::Precision() #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 // ============================================================================ // Method : // Purpose : // ============================================================================ StepToTopoDS_TranslatePolyLoop::StepToTopoDS_TranslatePolyLoop() { done = Standard_False; } // ============================================================================ // Method : // Purpose : // ============================================================================ StepToTopoDS_TranslatePolyLoop::StepToTopoDS_TranslatePolyLoop(const Handle(StepShape_PolyLoop)& PL, StepToTopoDS_Tool& T, const Handle(Geom_Surface)& S, const TopoDS_Face& F) { Init (PL, T, S, F); } // ============================================================================ // Method : // Purpose : // ============================================================================ void StepToTopoDS_TranslatePolyLoop::Init(const Handle(StepShape_PolyLoop)& PL, StepToTopoDS_Tool& aTool, const Handle(Geom_Surface)& GeomSurf, const TopoDS_Face& TopoFace) { if (!aTool.IsBound(PL)) { BRep_Builder B; Handle(Transfer_TransientProcess) TP = aTool.TransientProcess(); //:S4136 Standard_Real preci = BRepAPI::Precision(); Standard_Integer i; Handle(StepGeom_CartesianPoint) P1,P2; Handle(Geom_CartesianPoint) GP1, GP2; TopoDS_Vertex V1, V2; TopoDS_Edge E; TopoDS_Wire W; Handle(Geom_Line) L; Handle(Geom2d_Line) L2d; gp_Vec V; gp_Vec2d V2d; Standard_Real Magn; Handle(Geom_Plane) SP = Handle(Geom_Plane)::DownCast(GeomSurf); if (SP.IsNull()) TP->AddFail(PL,"Surface not planar in a FacetedBRep !"); Handle(ShapeAnalysis_Surface) STSU = new ShapeAnalysis_Surface ( GeomSurf ); Standard_Integer Nb = PL->NbPolygon(); Handle(StepGeom_HArray1OfCartesianPoint) Poly = new StepGeom_HArray1OfCartesianPoint(1, Nb+1); for ( i=1; i<=Nb; i++ ) Poly->SetValue(i, PL->PolygonValue(i)); Nb++; Poly->SetValue(Nb, PL->PolygonValue(1)); P1 = Poly->Value(1); GP1 = StepToGeom::MakeCartesianPoint (P1); if (aTool.IsVertexBound(P1)) { V1 = aTool.FindVertex(P1); } else { B.MakeVertex(V1, GP1->Pnt(), Precision::Confusion()); //:S4136: preci aTool.BindVertex(P1,V1); } B.MakeWire(W); for ( i=2; i<=Nb; i++){ P2 = Poly->Value(i); if (P1 == P2) continue; // peut arriver (KK) CKY 9-DEC-1997 StepToTopoDS_PointPair PP(P1, P2); GP2 = StepToGeom::MakeCartesianPoint (P2); TopoDS_Shape aBoundEdge; Standard_Boolean isbound = aTool.IsEdgeBound(PP); if ( !isbound) { if (aTool.IsVertexBound(P2)) { V2 = aTool.FindVertex(P2); } else { B.MakeVertex(V2, GP2->Pnt(), Precision::Confusion()); //:S4136: preci aTool.BindVertex(P2,V2); } V = gp_Vec( GP1->Pnt(), GP2->Pnt()); L = new Geom_Line( GP1->Pnt() , gp_Dir(V) ); B.MakeEdge(E, L, Precision::Confusion()); //:S4136: preci V1.Orientation(TopAbs_FORWARD); V2.Orientation(TopAbs_REVERSED); B.Add(E, V1); B.Add(E, V2); Magn = V.Magnitude(); B.UpdateVertex(V1, 0., E, 0. ); //:S4136: preci B.UpdateVertex(V2, Magn, E, 0. ); //:S4136: preci } else { aBoundEdge = aTool.FindEdge(PP); E = TopoDS::Edge(aBoundEdge); // Il faut qu en finale l edge soit vue // - via sa premiere face, orientation combinee = celle de cette premiere face // - via sa deuxieme face, orientation combinee INVERSE de la precedente if (TopoFace.Orientation() == TopAbs_FORWARD) E.Reverse(); V2 = aTool.FindVertex(P2); // Standard_Real u1,v1,u2,v2; // ElSLib::Parameters(SP->Pln(), GP1->Pnt(), u1, v1); // ElSLib::Parameters(SP->Pln(), GP2->Pnt(), u2, v2); // V2d = gp_Vec2d( gp_Pnt2d(u1,v1), gp_Pnt2d(u2,v2) ); // L2d = new Geom2d_Line( gp_Pnt2d(u1,v1), gp_Dir2d(V2d) ); } gp_Pnt2d V2p1 = STSU->ValueOfUV (GP1->Pnt(), Precision()); gp_Pnt2d V2p2 = STSU->ValueOfUV (GP2->Pnt(), Precision()); if (E.Orientation() == TopAbs_FORWARD) { V2d = gp_Vec2d( V2p1, V2p2 ); L2d = new Geom2d_Line( V2p1, gp_Dir2d(V2d) ); } else { V2d = gp_Vec2d( V2p2, V2p1 ); L2d = new Geom2d_Line( V2p2, gp_Dir2d(V2d) ); } B.UpdateEdge(E, L2d, TopoFace, 0.); // E.Orientation(TopAbs_FORWARD); TopoDS_Edge EB = E; // pour le binding : cumul des orientations ! EB.Orientation (TopoFace.Orientation()); if (!isbound) aTool.BindEdge(PP, EB); if (!E.IsNull()) { B.Add(W,E); } P1 = P2; GP1 = GP2; V1 = V2; } W.Closed (BRep_Tool::IsClosed (W)); aTool.Bind(PL, W); myResult = W; myError = StepToTopoDS_TranslatePolyLoopDone; done = Standard_True; } else { myResult = TopoDS::Wire(aTool.Find(PL)); myError = StepToTopoDS_TranslatePolyLoopDone; done = Standard_True; } } // ============================================================================ // Method : // Purpose : // ============================================================================ const TopoDS_Shape& StepToTopoDS_TranslatePolyLoop::Value() const { StdFail_NotDone_Raise_if(!done,""); return myResult; } // ============================================================================ // Method : // Purpose : // ============================================================================ StepToTopoDS_TranslatePolyLoopError StepToTopoDS_TranslatePolyLoop::Error() const { return myError; }