0024023: Revamp the OCCT Handle -- downcast (automatic)
[occt.git] / src / TopOpeBRepDS / TopOpeBRepDS_GapTool.cxx
1 // Created on: 1998-08-21
2 // Created by: Yves FRICAUD
3 // Copyright (c) 1998-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 #include <TopOpeBRepDS_GapTool.ixx>
18 #include <TopOpeBRepDS_ListIteratorOfListOfInterference.hxx>
19 #include <Standard_OutOfRange.hxx>
20 #include <TopOpeBRepDS_CurvePointInterference.hxx>
21
22 #ifdef OCCT_DEBUG
23 extern Standard_Boolean TopOpeBRepDS_GettraceGAP();
24 #endif
25
26 //=======================================================================
27 //function : TopOpeBRepDS_GapTool
28 //purpose  : 
29 //=======================================================================
30
31 TopOpeBRepDS_GapTool::TopOpeBRepDS_GapTool()
32 {
33 }
34
35 //=======================================================================
36 //function : TopOpeBRepDS_GapTool
37 //purpose  : 
38 //=======================================================================
39
40 TopOpeBRepDS_GapTool::TopOpeBRepDS_GapTool(const Handle(TopOpeBRepDS_HDataStructure)& HDS)
41 {
42   Init(HDS);
43 }
44
45 //=======================================================================
46 //function : StoreGToI
47 //purpose  : 
48 //=======================================================================
49
50 static void StoreGToI(TopOpeBRepDS_DataMapOfIntegerListOfInterference& GToI,
51                       const Handle(TopOpeBRepDS_Interference)&         I)
52 {
53   Standard_Integer G = I->Geometry();
54   if (!GToI.IsBound(G)) {
55     TopOpeBRepDS_ListOfInterference empty;
56     GToI.Bind(G,empty);
57   }
58   GToI(G).Append(I);
59 }
60 //=======================================================================
61 //function : Init
62 //purpose  : 
63 //=======================================================================
64
65 void TopOpeBRepDS_GapTool::Init(const Handle(TopOpeBRepDS_HDataStructure)& HDS) 
66 {
67   myHDS = HDS;
68   Standard_Integer i,Nb = myHDS->NbShapes();
69   for (i = 1; i <= Nb; i++) {
70     const TopoDS_Shape& S = myHDS->Shape(i);
71     const TopOpeBRepDS_ListOfInterference& LI = myHDS->DS().ShapeInterferences(S);
72     for (TopOpeBRepDS_ListIteratorOfListOfInterference it(LI); it.More(); it.Next()) {
73       if (it.Value()->GeometryType() == TopOpeBRepDS_POINT) { 
74         myInterToShape.Bind(it.Value(),S);
75         StoreGToI(myGToI,it.Value());
76       }
77     }
78   }
79   Standard_Integer NbCurves = myHDS->NbCurves();
80   for (i = 1; i <= NbCurves; i++) {
81     TopOpeBRepDS_ListOfInterference& LI = myHDS->ChangeDS().ChangeCurveInterferences(i);
82     for (TopOpeBRepDS_ListIteratorOfListOfInterference it(LI); it.More(); it.Next()) {
83       if (it.Value()->GeometryType() == TopOpeBRepDS_POINT) 
84         StoreGToI(myGToI,it.Value());
85     }
86   }
87 }
88
89 //=======================================================================
90 //function :Curve 
91 //purpose  : 
92 //=======================================================================
93
94 Standard_Boolean TopOpeBRepDS_GapTool::Curve(const Handle(TopOpeBRepDS_Interference)& I,
95                                                TopOpeBRepDS_Curve& C) const
96 {
97   if (I->GeometryType() == TopOpeBRepDS_POINT) {
98     TopOpeBRepDS_Kind GK,SK;
99     Standard_Integer  G,S;
100     
101     I->GKGSKS(GK,G,SK,S);
102     if (SK == TopOpeBRepDS_CURVE) {
103       C = myHDS->Curve(S);
104       return 1;
105     }
106     const TopOpeBRepDS_ListOfInterference& LI = myGToI(G);
107     for (TopOpeBRepDS_ListIteratorOfListOfInterference it(LI); it.More(); it.Next()) {
108       it.Value()->GKGSKS(GK,G,SK,S);
109       if (SK == TopOpeBRepDS_CURVE) {
110         C = myHDS->Curve(S);
111         return 1;
112       }
113     }
114   }
115 #ifdef OCCT_DEBUG
116   if (TopOpeBRepDS_GettraceGAP()) {
117     cout <<"TopOpeBRepDS_GapTool::Curve Point "<<I->Geometry()<<" -> Pas sur Courbe "<<endl;
118   }
119 #endif 
120   return 0;
121 }
122
123
124 //=======================================================================
125 //function :Interferences
126 //purpose  :
127 //=======================================================================
128
129 const TopOpeBRepDS_ListOfInterference& TopOpeBRepDS_GapTool::Interferences(const Standard_Integer IP) const
130 {
131   return myGToI(IP);
132 }
133
134
135 //=======================================================================
136 //function : SameInterferences
137 //purpose  : 
138 //=======================================================================
139
140 const TopOpeBRepDS_ListOfInterference& TopOpeBRepDS_GapTool::SameInterferences
141 (const Handle(TopOpeBRepDS_Interference)& I) const
142 {
143   return myGToI(I->Geometry());
144 }
145
146
147 //=======================================================================
148 //function : ChangeSameInterferences
149 //purpose  : 
150 //=======================================================================
151
152 TopOpeBRepDS_ListOfInterference& TopOpeBRepDS_GapTool::ChangeSameInterferences
153 (const Handle(TopOpeBRepDS_Interference)& I) 
154 {
155   return myGToI.ChangeFind (I->Geometry());
156 }
157
158
159 //=======================================================================
160 //function : ShapeSupport
161 //purpose  : 
162 //=======================================================================
163
164 Standard_Boolean TopOpeBRepDS_GapTool::EdgeSupport(const Handle(TopOpeBRepDS_Interference)& I,
165                                                      TopoDS_Shape&                            E) const
166 {
167   if (I->GeometryType() == TopOpeBRepDS_POINT) { 
168     if (myInterToShape.IsBound(I)) {
169       const TopoDS_Shape& S = myInterToShape(I);
170       if (S.ShapeType() == TopAbs_EDGE) {
171         E = S;
172         return 1;
173       }
174     }
175     const TopOpeBRepDS_ListOfInterference& LI = myGToI(I->Geometry());
176     for (TopOpeBRepDS_ListIteratorOfListOfInterference it(LI); it.More(); it.Next()) {
177       const Handle(TopOpeBRepDS_Interference)& II = it.Value();
178       if (myInterToShape.IsBound(II)) {
179         const TopoDS_Shape& S = myInterToShape(II);
180         if (S.ShapeType() == TopAbs_EDGE) {
181           E = S;
182           return 1;
183         }
184       }
185     }
186   }
187   return 0;
188 }
189
190
191 //=======================================================================
192 //function : FacesSupport
193 //purpose  : 
194 //=======================================================================
195
196 Standard_Boolean TopOpeBRepDS_GapTool::FacesSupport(const Handle(TopOpeBRepDS_Interference)& I,
197                                                       TopoDS_Shape& F1,
198                                                       TopoDS_Shape& F2) const
199 {
200   TopOpeBRepDS_Curve C;
201   if (Curve(I,C)) {
202     C.GetShapes(F1,F2);
203     return 1;
204   }
205   return 0;
206 }
207
208
209 //=======================================================================
210 //function : ParameterOnEdge
211 //purpose  : 
212 //=======================================================================
213
214 Standard_Boolean TopOpeBRepDS_GapTool::ParameterOnEdge(const Handle(TopOpeBRepDS_Interference)& I,
215                                                          const TopoDS_Shape& E,
216                                                          Standard_Real&      U) const
217 {
218   if (I->GeometryType() == TopOpeBRepDS_POINT) { 
219     if (myInterToShape.IsBound(I)) {
220       const TopoDS_Shape& S = myInterToShape(I);
221       if (S.IsSame(E)) {
222         U = Handle(TopOpeBRepDS_CurvePointInterference)::DownCast (I)->Parameter();
223         return 1;
224       }
225     }
226     const TopOpeBRepDS_ListOfInterference& LI = myGToI(I->Geometry());
227     for (TopOpeBRepDS_ListIteratorOfListOfInterference it(LI); it.More(); it.Next()) {
228       const Handle(TopOpeBRepDS_Interference)& II = it.Value();
229       if (myInterToShape.IsBound(II)) {
230         const TopoDS_Shape& S = myInterToShape(II);
231         if (S.IsSame(E)) {
232           U = Handle(TopOpeBRepDS_CurvePointInterference)::DownCast (II)->Parameter();
233           return 1;
234         }       
235       }
236     }
237   }
238   return 0;
239 }
240
241 //=======================================================================
242 //function : ParameterOnEdge
243 //purpose  : 
244 //=======================================================================
245
246 void TopOpeBRepDS_GapTool::SetParameterOnEdge(const Handle(TopOpeBRepDS_Interference)& I,
247                                                 const TopoDS_Shape&       E,
248                                                 const Standard_Real       U) 
249 {
250   if (I->GeometryType() == TopOpeBRepDS_POINT) { 
251     if (myInterToShape.IsBound(I)) {
252       const TopoDS_Shape& S = myInterToShape(I);
253       if (S.IsSame(E)) {
254         Handle(TopOpeBRepDS_CurvePointInterference)::DownCast (I)->Parameter(U);
255       }
256     }
257     const TopOpeBRepDS_ListOfInterference& LI = myGToI(I->Geometry());
258     for (TopOpeBRepDS_ListIteratorOfListOfInterference it(LI); it.More(); it.Next()) {
259       const Handle(TopOpeBRepDS_Interference)& II = it.Value();
260       if (myInterToShape.IsBound(II)) {
261         const TopoDS_Shape& S = myInterToShape(II);
262         if (S.IsSame(E)) {
263           Handle(TopOpeBRepDS_CurvePointInterference)::DownCast (II)->Parameter(U);
264         }       
265       }
266     }
267   }
268 }
269
270 //=======================================================================
271 //function : SetPoint
272 //purpose  : 
273 //=======================================================================
274
275 void TopOpeBRepDS_GapTool::SetPoint(const Handle(TopOpeBRepDS_Interference)& I,
276                                       const Standard_Integer            IP)
277 {
278   if (IP != I->Geometry()) {
279     const TopOpeBRepDS_ListOfInterference& LI = myGToI(I->Geometry());
280     for (TopOpeBRepDS_ListIteratorOfListOfInterference it(LI); it.More(); it.Next()) {
281       Handle(TopOpeBRepDS_Interference) II = it.Value();
282       II->Geometry(IP);  
283       StoreGToI(myGToI,II);
284     }
285   }
286 }
287
288