0024023: Revamp the OCCT Handle -- downcast (automatic)
[occt.git] / src / Prs3d / Prs3d_ShapeTool.cxx
CommitLineData
b311480e 1// Created on: 1995-08-07
2// Created by: Modelistation
3// Copyright (c) 1995-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
d5f74e42 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
973c2be1 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.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
7fd59977 16
7fd59977 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
53b15292 41Prs3d_ShapeTool::Prs3d_ShapeTool (const TopoDS_Shape& theShape,
42 const Standard_Boolean theAllVertices)
43: myShape (theShape)
7fd59977 44{
45 myEdgeMap.Clear();
46 myVertexMap.Clear();
53b15292 47 TopExp::MapShapesAndAncestors (theShape,TopAbs_EDGE,TopAbs_FACE, myEdgeMap);
7fd59977 48
53b15292 49 TopExp_Explorer anExpl;
50 if (theAllVertices)
51 {
52 for (anExpl.Init (theShape, TopAbs_VERTEX); anExpl.More(); anExpl.Next())
7fd59977 53 {
53b15292 54 myVertexMap.Add (anExpl.Current());
7fd59977 55 }
53b15292 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());
7fd59977 63 }
53b15292 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 }
7fd59977 77 }
7fd59977 78 }
7fd59977 79}
80
81//=======================================================================
82//function : InitFace
83//purpose :
84//=======================================================================
85
86void Prs3d_ShapeTool::InitFace()
87{
88 myFaceExplorer.Init(myShape,TopAbs_FACE);
89}
90
91//=======================================================================
92//function : MoreFace
93//purpose :
94//=======================================================================
95
96Standard_Boolean Prs3d_ShapeTool::MoreFace() const
97{
98 return myFaceExplorer.More();
99}
100
101//=======================================================================
102//function : NextFace
103//purpose :
104//=======================================================================
105
106void Prs3d_ShapeTool::NextFace()
107{
108 myFaceExplorer.Next();
109}
110
111//=======================================================================
112//function : GetFace
113//purpose :
114//=======================================================================
115
116const TopoDS_Face& Prs3d_ShapeTool::GetFace () const
117{
118 return TopoDS::Face(myFaceExplorer.Current());
119}
120
121
122//=======================================================================
123//function : FaceBound
124//purpose :
125//=======================================================================
126
127Bnd_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
140Standard_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)
c5f3a425 149 RTS = Handle(Geom_RectangularTrimmedSurface)::DownCast (S);
7fd59977 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
162void Prs3d_ShapeTool::InitCurve()
163{
164 myEdge = 1;
165}
166
167//=======================================================================
168//function : MoreCurve
169//purpose :
170//=======================================================================
171
172Standard_Boolean Prs3d_ShapeTool::MoreCurve() const
173{
174 return myEdge <= myEdgeMap.Extent();
175}
176
177//=======================================================================
178//function : NextCurve
179//purpose :
180//=======================================================================
181
182void Prs3d_ShapeTool::NextCurve()
183{
184 myEdge++;
185}
186
187//=======================================================================
188//function : GetCurve
189//purpose :
190//=======================================================================
191
192const TopoDS_Edge& Prs3d_ShapeTool::GetCurve () const
193{
194 return TopoDS::Edge(myEdgeMap.FindKey(myEdge));
195}
196
197//=======================================================================
198//function : CurveBound
199//purpose :
200//=======================================================================
201
202Bnd_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
215Standard_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
226Handle(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
243void Prs3d_ShapeTool::InitVertex()
244{
245 myVertex = 1;
246}
247
248//=======================================================================
249//function : MoreVertex
250//purpose :
251//=======================================================================
252
253Standard_Boolean Prs3d_ShapeTool::MoreVertex() const
254{
255 return myVertex <= myVertexMap.Extent();
256}
257
258//=======================================================================
259//function : NextVertex
260//purpose :
261//=======================================================================
262
263void Prs3d_ShapeTool::NextVertex()
264{
265 myVertex++;
266}
267
268//=======================================================================
269//function : GetVertex
270//purpose :
271//=======================================================================
272
273const 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
284Standard_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
298Handle(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
309Standard_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
322void 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
337Handle(Poly_Polygon3D) Prs3d_ShapeTool::Polygon3D(TopLoc_Location& l) const
338{
339 return BRep_Tool::Polygon3D(GetCurve(), l);
340}