0031642: Visualization - crash in Graphic3d_Structure::SetVisual() on redisplaying...
[occt.git] / src / BRepClass3d / BRepClass3d_BndBoxTree.hxx
CommitLineData
58e14d59 1// Copyright (c) 1994-1999 Matra Datavision
2// Copyright (c) 1999-2016 OPEN CASCADE SAS
3//
4// This file is part of Open CASCADE Technology software library.
5//
6// This library is free software; you can redistribute it and/or modify it under
7// the terms of the GNU Lesser General Public License version 2.1 as published
8// by the Free Software Foundation, with special exception defined in the file
9// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10// distribution for complete text of the license and disclaimer of any warranty.
11//
12// Alternatively, this file may be used under the terms of Open CASCADE
13// commercial license or contractual agreement.
14
15#ifndef _BRepClass3d_BndBoxTree_HeaderFile
16#define _BRepClass3d_BndBoxTree_HeaderFile
17
18
19#include <NCollection_Sequence.hxx>
20#include <NCollection_UBTreeFiller.hxx>
21#include <NCollection_UBTree.hxx>
22#include <TopTools_IndexedMapOfShape.hxx>
23#include <BRepBndLib.hxx>
24#include <TopoDS_Edge.hxx>
25#include <TopoDS_Vertex.hxx>
26#include <Geom_Line.hxx>
27#include <Bnd_Box.hxx>
28#include <gp_Lin.hxx>
29#include <GeomAdaptor_Curve.hxx>
30#include <Precision.hxx>
31
32// Typedef to reduce code complexity.
33typedef NCollection_UBTree <Standard_Integer, Bnd_Box> BRepClass3d_BndBoxTree;
34
35// Class representing tree selector for point object.
36class BRepClass3d_BndBoxTreeSelectorPoint : public BRepClass3d_BndBoxTree::Selector
37{
38public:
39 BRepClass3d_BndBoxTreeSelectorPoint(const TopTools_IndexedMapOfShape& theMapOfShape)
40 : BRepClass3d_BndBoxTreeSelectorPoint::Selector(), myMapOfShape (theMapOfShape)
41 {}
42
43 Standard_Boolean Reject (const Bnd_Box& theBox) const
44 {
45 return (theBox.IsOut (myP));
46 }
47
48 Standard_Boolean Accept (const Standard_Integer& theObj);
49
50 // Sets current point for boxes-point collisions.
51 void SetCurrentPoint (const gp_Pnt& theP)
52 {
53 myP = theP;
54 }
55
56private:
57 BRepClass3d_BndBoxTreeSelectorPoint(const BRepClass3d_BndBoxTreeSelectorPoint& );
58 BRepClass3d_BndBoxTreeSelectorPoint& operator=(const BRepClass3d_BndBoxTreeSelectorPoint& );
59
60private:
61 const TopTools_IndexedMapOfShape& myMapOfShape; //shapes (vertices + edges)
62 gp_Pnt myP;
63};
64
65// Class representing tree selector for line object.
66class BRepClass3d_BndBoxTreeSelectorLine : public BRepClass3d_BndBoxTree::Selector
67{
68public:
69
70 struct EdgeParam
71 {
72 TopoDS_Edge myE;
73 Standard_Real myParam; //par on myE
74 Standard_Real myLParam; //par on line
75 };
76
77 struct VertParam
78 {
79 TopoDS_Vertex myV;
80 Standard_Real myLParam; //par on line
81 };
82
83
84public:
85 BRepClass3d_BndBoxTreeSelectorLine(const TopTools_IndexedMapOfShape& theMapOfShape)
638ad7f3 86 : BRepClass3d_BndBoxTreeSelectorLine::Selector(),
87 myMapOfShape(theMapOfShape),
88 myIsValid(Standard_True)
58e14d59 89 {}
90
91 Standard_Boolean Reject (const Bnd_Box& theBox) const
92 {
93 return (theBox.IsOut (myL));
94 }
95
96 Standard_Boolean Accept (const Standard_Integer& theObj);
97
98 //Sets current line for boxes-line collisions
99 void SetCurrentLine (const gp_Lin& theL,
100 const Standard_Real theMaxParam)
101 {
102 myL = theL;
103 myLC.Load(new Geom_Line(theL), -Precision::PConfusion(), theMaxParam);
104 }
105
106 void GetEdgeParam(const Standard_Integer i,
107 TopoDS_Edge& theOutE,
108 Standard_Real &theOutParam,
109 Standard_Real &outLParam ) const
110 {
111 const EdgeParam& EP = myEP.Value(i);
112 theOutE = EP.myE;
113 theOutParam = EP.myParam;
114 outLParam = EP.myLParam;
115 }
116
117 void GetVertParam(const Standard_Integer i,
118 TopoDS_Vertex& theOutV,
119 Standard_Real &outLParam ) const
120 {
121 const VertParam& VP = myVP.Value(i);
122 theOutV = VP.myV;
123 outLParam = VP.myLParam;
124 }
125
126 Standard_Integer GetNbEdgeParam() const
127 {
128 return myEP.Length();
129 }
130
131 Standard_Integer GetNbVertParam() const
132 {
133 return myVP.Length();
134 }
135
136 void ClearResults()
137 {
138 myEP.Clear();
139 myVP.Clear();
638ad7f3 140 myIsValid = Standard_True;
141 }
142
143 //! Returns TRUE if correct classification is possible
144 Standard_Boolean IsCorrect() const
145 {
146 return myIsValid;
58e14d59 147 }
148
149private:
150 BRepClass3d_BndBoxTreeSelectorLine(const BRepClass3d_BndBoxTreeSelectorLine& );
151 BRepClass3d_BndBoxTreeSelectorLine& operator=(const BRepClass3d_BndBoxTreeSelectorLine& );
152
153private:
154 const TopTools_IndexedMapOfShape& myMapOfShape; //shapes (vertices + edges)
155 gp_Lin myL;
156 NCollection_Sequence<EdgeParam> myEP; //output result (edge vs line)
157 NCollection_Sequence<VertParam> myVP; //output result (vertex vs line)
158 GeomAdaptor_Curve myLC;
638ad7f3 159 Standard_Boolean myIsValid;
58e14d59 160};
161
162#endif