f414444e5e6abc57cd596f1ef5dfb3edaa511594
[occt.git] / src / StepToTopoDS / StepToTopoDS_TranslatePolyLoop.cxx
1 // Created on: 1995-01-03
2 // Created by: Frederic MAUPAS
3 // Copyright (c) 1995-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 //gka,abv 14.09.99: S4136: eliminate BRepAPI::Precision()
18
19 #include <BRep_Builder.hxx>
20 #include <ElSLib.hxx>
21 #include <Geom2d_Line.hxx>
22 #include <Geom_CartesianPoint.hxx>
23 #include <Geom_Line.hxx>
24 #include <Geom_Plane.hxx>
25 #include <Geom_Surface.hxx>
26 #include <gp_Vec2d.hxx>
27 #include <Precision.hxx>
28 #include <ShapeAnalysis_Surface.hxx>
29 #include <StdFail_NotDone.hxx>
30 #include <StepGeom_HArray1OfCartesianPoint.hxx>
31 #include <StepShape_PolyLoop.hxx>
32 #include <StepToGeom.hxx>
33 #include <StepToTopoDS_PointPair.hxx>
34 #include <StepToTopoDS_Tool.hxx>
35 #include <StepToTopoDS_TranslatePolyLoop.hxx>
36 #include <TopoDS.hxx>
37 #include <TopoDS_Edge.hxx>
38 #include <TopoDS_Face.hxx>
39 #include <TopoDS_Shape.hxx>
40 #include <TopoDS_Vertex.hxx>
41 #include <TopoDS_Wire.hxx>
42 #include <Transfer_TransientProcess.hxx>
43
44 //#include <BRepAPI.hxx>
45 // ============================================================================
46 // Method  :
47 // Purpose :
48 // ============================================================================
49 StepToTopoDS_TranslatePolyLoop::StepToTopoDS_TranslatePolyLoop()
50 {
51   done = Standard_False;
52 }
53
54 // ============================================================================
55 // Method  :
56 // Purpose :
57 // ============================================================================
58
59 StepToTopoDS_TranslatePolyLoop::StepToTopoDS_TranslatePolyLoop(const Handle(StepShape_PolyLoop)& PL, StepToTopoDS_Tool& T, const Handle(Geom_Surface)& S, const TopoDS_Face& F)
60 {
61   Init (PL, T, S, F);
62 }
63
64 // ============================================================================
65 // Method  :
66 // Purpose :
67 // ============================================================================
68
69 void StepToTopoDS_TranslatePolyLoop::Init(const Handle(StepShape_PolyLoop)& PL, StepToTopoDS_Tool& aTool, const Handle(Geom_Surface)& GeomSurf, const TopoDS_Face& TopoFace)
70 {
71   if (!aTool.IsBound(PL)) {
72     BRep_Builder B;
73     Handle(Transfer_TransientProcess) TP = aTool.TransientProcess();
74
75 //:S4136    Standard_Real preci = BRepAPI::Precision();
76     Standard_Integer i;
77     Handle(StepGeom_CartesianPoint) P1,P2;
78     Handle(Geom_CartesianPoint) GP1, GP2;
79     TopoDS_Vertex V1, V2;
80     TopoDS_Edge E;
81     TopoDS_Wire W;
82     Handle(Geom_Line) L;
83     Handle(Geom2d_Line) L2d;
84     gp_Vec V;
85     gp_Vec2d V2d;
86     Standard_Real Magn;
87     Handle(Geom_Plane) SP = Handle(Geom_Plane)::DownCast(GeomSurf);
88     if (SP.IsNull()) TP->AddFail(PL,"Surface not planar in a FacetedBRep !");
89     Handle(ShapeAnalysis_Surface) STSU = new ShapeAnalysis_Surface ( GeomSurf );
90     Standard_Integer Nb = PL->NbPolygon();
91     Handle(StepGeom_HArray1OfCartesianPoint) Poly = 
92       new StepGeom_HArray1OfCartesianPoint(1, Nb+1);
93
94     for ( i=1; i<=Nb; i++ )
95       Poly->SetValue(i, PL->PolygonValue(i));
96
97     Nb++;
98     Poly->SetValue(Nb, PL->PolygonValue(1));
99     P1 = Poly->Value(1);
100     GP1 = StepToGeom::MakeCartesianPoint (P1);
101     if (aTool.IsVertexBound(P1)) {
102       V1 = aTool.FindVertex(P1);
103     }
104     else {
105       B.MakeVertex(V1, GP1->Pnt(), Precision::Confusion()); //:S4136: preci
106       aTool.BindVertex(P1,V1);
107     }
108     B.MakeWire(W);
109     for ( i=2; i<=Nb; i++){
110       P2 = Poly->Value(i);
111       if (P1 == P2) continue;  // peut arriver (KK)  CKY 9-DEC-1997
112       StepToTopoDS_PointPair PP(P1, P2); 
113       GP2 = StepToGeom::MakeCartesianPoint (P2);
114       TopoDS_Shape aBoundEdge;
115       Standard_Boolean isbound = aTool.IsEdgeBound(PP);
116       if ( !isbound) {
117         if (aTool.IsVertexBound(P2)) {
118           V2 = aTool.FindVertex(P2);
119         }
120         else {
121           B.MakeVertex(V2, GP2->Pnt(), Precision::Confusion()); //:S4136: preci
122           aTool.BindVertex(P2,V2);
123         }
124         V = gp_Vec( GP1->Pnt(), GP2->Pnt());
125         L = new Geom_Line( GP1->Pnt() , gp_Dir(V) );
126         B.MakeEdge(E, L, Precision::Confusion()); //:S4136: preci
127         V1.Orientation(TopAbs_FORWARD);
128         V2.Orientation(TopAbs_REVERSED);
129         B.Add(E, V1);
130         B.Add(E, V2);
131         Magn = V.Magnitude();
132         B.UpdateVertex(V1, 0., E, 0. ); //:S4136: preci
133         B.UpdateVertex(V2, Magn, E, 0. ); //:S4136: preci
134       } 
135       else {
136         aBoundEdge = aTool.FindEdge(PP);
137         E = TopoDS::Edge(aBoundEdge);
138 //  Il faut qu en finale l edge soit vue
139 //  - via sa premiere face, orientation combinee = celle de cette premiere face
140 //  - via sa deuxieme face, orientation combinee INVERSE de la precedente
141         if (TopoFace.Orientation() == TopAbs_FORWARD) E.Reverse();
142         V2 = aTool.FindVertex(P2); 
143 //      Standard_Real u1,v1,u2,v2;
144 //      ElSLib::Parameters(SP->Pln(), GP1->Pnt(), u1, v1);
145 //      ElSLib::Parameters(SP->Pln(), GP2->Pnt(), u2, v2);
146 //      V2d = gp_Vec2d( gp_Pnt2d(u1,v1), gp_Pnt2d(u2,v2) );
147 //      L2d = new Geom2d_Line( gp_Pnt2d(u1,v1), gp_Dir2d(V2d) );
148       }
149       gp_Pnt2d V2p1 = STSU->ValueOfUV (GP1->Pnt(), Precision());
150       gp_Pnt2d V2p2 = STSU->ValueOfUV (GP2->Pnt(), Precision());
151       if (E.Orientation() == TopAbs_FORWARD) {
152         V2d = gp_Vec2d( V2p1, V2p2 );
153         L2d = new Geom2d_Line( V2p1, gp_Dir2d(V2d) );
154       } else {
155         V2d = gp_Vec2d( V2p2, V2p1 );
156         L2d = new Geom2d_Line( V2p2, gp_Dir2d(V2d) );
157       }
158       B.UpdateEdge(E, L2d, TopoFace, 0.);
159 //      E.Orientation(TopAbs_FORWARD);
160       TopoDS_Edge EB = E;  // pour le binding : cumul des orientations !
161       EB.Orientation (TopoFace.Orientation());
162       if (!isbound) aTool.BindEdge(PP, EB);
163       if (!E.IsNull()) { 
164         B.Add(W,E);
165       }
166       P1  = P2;
167       GP1 = GP2;
168       V1  = V2;
169     }
170     W.Closed (BRep_Tool::IsClosed (W));
171     aTool.Bind(PL, W);
172     myResult = W;
173     myError  = StepToTopoDS_TranslatePolyLoopDone;
174     done     = Standard_True;
175   }
176   else {
177     myResult = TopoDS::Wire(aTool.Find(PL));
178     myError  = StepToTopoDS_TranslatePolyLoopDone;
179     done     = Standard_True;    
180   }
181 }
182
183 // ============================================================================
184 // Method  :
185 // Purpose :
186 // ============================================================================
187
188 const TopoDS_Shape& StepToTopoDS_TranslatePolyLoop::Value() const 
189 {
190   StdFail_NotDone_Raise_if(!done,"");
191   return myResult;
192 }
193
194 // ============================================================================
195 // Method  :
196 // Purpose :
197 // ============================================================================
198
199 StepToTopoDS_TranslatePolyLoopError StepToTopoDS_TranslatePolyLoop::Error() const
200 {
201   return myError;
202 }