cb67429d5b92378b5ac4acc869a522282803cb96
[occt.git] / src / Prs3d / Prs3d_ShapeTool.cxx
1 // Created on: 1995-08-07
2 // Created by: Modelistation
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 #include <Prs3d_ShapeTool.ixx>
18
19 #include <BRepTools.hxx>
20 #include <TopoDS.hxx>
21 #include <TopExp.hxx>
22 #include <TopTools_ListOfShape.hxx>
23 #include <TopTools_MapOfShape.hxx>
24 #include <TopTools_ListIteratorOfListOfShape.hxx>
25
26 #include <BRepBndLib.hxx>
27 #include <BRepAdaptor_Surface.hxx>
28 #include <BRepAdaptor_Curve.hxx>
29 #include <Bnd_Box.hxx>
30 #include <BRep_Tool.hxx>
31 #include <Geom_Surface.hxx>
32 #include <Geom_RectangularTrimmedSurface.hxx>
33 #include <Geom_Plane.hxx>
34
35
36 //=======================================================================
37 //function : Prs3d_ShapeTool
38 //purpose  : 
39 //=======================================================================
40
41 Prs3d_ShapeTool::Prs3d_ShapeTool (const TopoDS_Shape& theShape,
42                                   const Standard_Boolean theAllVertices)
43 : myShape (theShape)
44 {
45   myEdgeMap.Clear();
46   myVertexMap.Clear();
47   TopExp::MapShapesAndAncestors (theShape,TopAbs_EDGE,TopAbs_FACE, myEdgeMap);
48
49   TopExp_Explorer anExpl;
50   if (theAllVertices)
51   {
52     for (anExpl.Init (theShape, TopAbs_VERTEX); anExpl.More(); anExpl.Next())
53     {
54       myVertexMap.Add (anExpl.Current());
55     }
56   }
57   else
58   {
59     // Extracting isolated vertices
60     for (anExpl.Init (theShape, TopAbs_VERTEX, TopAbs_EDGE); anExpl.More(); anExpl.Next())
61     {
62       myVertexMap.Add (anExpl.Current());
63     }
64
65     // Extracting internal vertices
66     for (anExpl.Init (theShape, TopAbs_EDGE); anExpl.More(); anExpl.Next())
67     {
68       TopoDS_Iterator aIt (anExpl.Current(), Standard_False, Standard_True);
69       for (; aIt.More(); aIt.Next())
70       {
71         const TopoDS_Shape& aV = aIt.Value();
72         if (aV.Orientation() == TopAbs_INTERNAL)
73         {
74           myVertexMap.Add (aV);
75         }
76       }
77     }
78   }
79 }
80
81 //=======================================================================
82 //function : InitFace
83 //purpose  : 
84 //=======================================================================
85
86 void Prs3d_ShapeTool::InitFace() 
87 {
88   myFaceExplorer.Init(myShape,TopAbs_FACE);
89 }
90
91 //=======================================================================
92 //function : MoreFace
93 //purpose  : 
94 //=======================================================================
95
96 Standard_Boolean Prs3d_ShapeTool::MoreFace() const 
97 {
98   return myFaceExplorer.More();
99 }
100
101 //=======================================================================
102 //function : NextFace
103 //purpose  : 
104 //=======================================================================
105
106 void Prs3d_ShapeTool::NextFace() 
107 {
108   myFaceExplorer.Next();
109 }
110
111 //=======================================================================
112 //function : GetFace
113 //purpose  : 
114 //=======================================================================
115
116 const TopoDS_Face& Prs3d_ShapeTool::GetFace () const 
117 {
118   return TopoDS::Face(myFaceExplorer.Current());
119 }
120
121
122 //=======================================================================
123 //function : FaceBound
124 //purpose  : 
125 //=======================================================================
126
127 Bnd_Box Prs3d_ShapeTool::FaceBound() const 
128 {
129   const TopoDS_Face& F = TopoDS::Face(myFaceExplorer.Current());
130   Bnd_Box B;
131   BRepBndLib::Add(F, B);
132   return B;
133 }
134
135 //=======================================================================
136 //function : IsPlanarFace
137 //purpose  : 
138 //=======================================================================
139
140 Standard_Boolean Prs3d_ShapeTool::IsPlanarFace() const 
141 {
142   TopLoc_Location l;
143   const TopoDS_Face& F = TopoDS::Face(myFaceExplorer.Current());
144   const Handle(Geom_Surface)& S = BRep_Tool::Surface(F, l);
145   Handle(Standard_Type) TheType = S->DynamicType();
146
147   if (TheType == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) {
148     Handle(Geom_RectangularTrimmedSurface) 
149         RTS = *((Handle(Geom_RectangularTrimmedSurface)*)&S);
150     TheType = RTS->BasisSurface()->DynamicType();
151   }
152   return (TheType == STANDARD_TYPE(Geom_Plane));
153 }
154
155
156
157 //=======================================================================
158 //function : InitCurve
159 //purpose  : 
160 //=======================================================================
161
162 void Prs3d_ShapeTool::InitCurve() 
163 {
164   myEdge = 1;
165 }
166
167 //=======================================================================
168 //function : MoreCurve
169 //purpose  : 
170 //=======================================================================
171
172 Standard_Boolean Prs3d_ShapeTool::MoreCurve() const 
173 {
174   return myEdge <= myEdgeMap.Extent();
175 }
176
177 //=======================================================================
178 //function : NextCurve
179 //purpose  : 
180 //=======================================================================
181
182 void Prs3d_ShapeTool::NextCurve() 
183 {
184   myEdge++;
185 }
186
187 //=======================================================================
188 //function : GetCurve
189 //purpose  : 
190 //=======================================================================
191
192 const TopoDS_Edge& Prs3d_ShapeTool::GetCurve () const 
193 {
194   return  TopoDS::Edge(myEdgeMap.FindKey(myEdge));
195 }
196
197 //=======================================================================
198 //function : CurveBound
199 //purpose  : 
200 //=======================================================================
201
202 Bnd_Box Prs3d_ShapeTool::CurveBound () const 
203 {
204   const TopoDS_Edge& E = TopoDS::Edge(myEdgeMap.FindKey(myEdge));
205   Bnd_Box B;
206   BRepBndLib::Add(E, B);
207   return B;
208 }
209
210 //=======================================================================
211 //function : Neighbours
212 //purpose  : 
213 //=======================================================================
214
215 Standard_Integer Prs3d_ShapeTool::Neighbours () const 
216 {
217   const TopTools_ListOfShape& L = myEdgeMap.FindFromIndex(myEdge);
218   return L.Extent();
219 }
220
221 //=======================================================================
222 //function : FacesOfEdge
223 //purpose  : 
224 //=======================================================================
225
226 Handle(TopTools_HSequenceOfShape) Prs3d_ShapeTool::FacesOfEdge () const 
227 {
228   Handle(TopTools_HSequenceOfShape) H = new TopTools_HSequenceOfShape;
229
230   const TopTools_ListOfShape& L = myEdgeMap.FindFromIndex(myEdge);
231   TopTools_ListIteratorOfListOfShape LI;
232
233   for (LI.Initialize(L); LI.More(); LI.Next()) H->Append(LI.Value());
234   return H;
235 }
236
237
238 //=======================================================================
239 //function : InitVertex
240 //purpose  : 
241 //=======================================================================
242
243 void Prs3d_ShapeTool::InitVertex() 
244 {
245   myVertex = 1;
246 }
247
248 //=======================================================================
249 //function : MoreVertex
250 //purpose  : 
251 //=======================================================================
252
253 Standard_Boolean Prs3d_ShapeTool::MoreVertex() const 
254 {
255   return myVertex <= myVertexMap.Extent();
256 }
257
258 //=======================================================================
259 //function : NextVertex
260 //purpose  : 
261 //=======================================================================
262
263 void Prs3d_ShapeTool::NextVertex() 
264 {
265   myVertex++;
266 }
267
268 //=======================================================================
269 //function : GetVertex
270 //purpose  : 
271 //=======================================================================
272
273 const TopoDS_Vertex& Prs3d_ShapeTool::GetVertex () const 
274 {
275   return  TopoDS::Vertex(myVertexMap.FindKey(myVertex));
276 }
277
278
279 //=======================================================================
280 //function : HasSurface
281 //purpose  : 
282 //=======================================================================
283
284 Standard_Boolean Prs3d_ShapeTool::HasSurface() const
285 {
286   TopLoc_Location l;
287   const Handle(Geom_Surface)& S = BRep_Tool::Surface(GetFace(), l);
288   return (!S.IsNull());
289 }
290
291
292
293 //=======================================================================
294 //function : CurrentTriangulation
295 //purpose  : 
296 //=======================================================================
297
298 Handle(Poly_Triangulation) Prs3d_ShapeTool::CurrentTriangulation(TopLoc_Location& l) const
299 {
300   return BRep_Tool::Triangulation(GetFace(), l);
301 }
302
303
304 //=======================================================================
305 //function : HasCurve
306 //purpose  : 
307 //=======================================================================
308
309 Standard_Boolean Prs3d_ShapeTool::HasCurve() const
310 {
311   return (BRep_Tool::IsGeometric(GetCurve()));
312 }
313
314
315
316
317 //=======================================================================
318 //function : PolygonOnTriangulation
319 //purpose  : 
320 //=======================================================================
321
322 void Prs3d_ShapeTool::PolygonOnTriangulation
323 (Handle(Poly_PolygonOnTriangulation)& Indices,
324  Handle(Poly_Triangulation)&          T,
325  TopLoc_Location&                     l) const
326 {
327   BRep_Tool::PolygonOnTriangulation(GetCurve(), Indices, T, l);
328 }
329
330
331
332 //=======================================================================
333 //function : Polygon3D
334 //purpose  : 
335 //=======================================================================
336
337 Handle(Poly_Polygon3D) Prs3d_ShapeTool::Polygon3D(TopLoc_Location& l) const
338 {
339   return BRep_Tool::Polygon3D(GetCurve(), l);
340 }