0a094a66b9ddeb2c2de42b33dc62693b8225e77b
[occt.git] / src / MeshVS / MeshVS_SensitiveMesh.cxx
1 // Created on: 2007-01-29
2 // Created by: Sergey KOCHETKOV
3 // Copyright (c) 2007-2012 OPEN CASCADE SAS
4 //
5 // The content of this file is subject to the Open CASCADE Technology Public
6 // License Version 6.5 (the "License"). You may not use the content of this file
7 // except in compliance with the License. Please obtain a copy of the License
8 // at http://www.opencascade.org and read it completely before using this file.
9 //
10 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
11 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
12 //
13 // The Original Code and all software distributed under the License is
14 // distributed on an "AS IS" basis, without warranty of any kind, and the
15 // Initial Developer hereby disclaims all such warranties, including without
16 // limitation, any warranties of merchantability, fitness for a particular
17 // purpose or non-infringement. Please see the License for the specific terms
18 // and conditions governing the rights and limitations under the License.
19
20
21 #include <MeshVS_SensitiveMesh.ixx>
22
23 #include <TColgp_Array1OfPnt.hxx>
24 #include <TColStd_Array1OfReal.hxx>
25 #include <TColStd_HPackedMapOfInteger.hxx>
26 #include <Select3D_Projector.hxx>
27 #include <TopLoc_Location.hxx>
28 #include <MeshVS_DataSource.hxx>
29 #include <MeshVS_MeshOwner.hxx>
30
31 //=======================================================================
32 // name    : MeshVS_SensitiveMesh::MeshVS_SensitiveMesh
33 // Purpose :
34 //=======================================================================
35 MeshVS_SensitiveMesh::MeshVS_SensitiveMesh (const Handle(SelectBasics_EntityOwner)& theOwnerId,
36                                             const Standard_Integer theMode)
37 : Select3D_SensitiveEntity( theOwnerId )
38 {
39   myMode = theMode;
40   mybox.SetVoid();
41   Handle(MeshVS_MeshOwner) anOwner = Handle(MeshVS_MeshOwner)::DownCast( OwnerId() );
42   if( !anOwner.IsNull() )
43   {
44     Handle(MeshVS_DataSource) aDS = anOwner->GetDataSource();
45     if( !aDS.IsNull() )
46       mybox = aDS->GetBoundingBox();
47   }
48 }
49
50 //================================================================
51 // Function : GetMode
52 // Purpose  :
53 //================================================================
54 Standard_Integer MeshVS_SensitiveMesh::GetMode () const
55 {
56   return myMode;
57 }
58
59 //=======================================================================
60 // name    : Matches
61 // Purpose :
62 //=======================================================================
63 Standard_Boolean MeshVS_SensitiveMesh::Matches(const Standard_Real X,
64                                                const Standard_Real Y,
65                                                const Standard_Real aTol,
66                                                Standard_Real&  DMin)
67 {
68   DMin = 0.;
69   
70   Handle(MeshVS_MeshOwner) anOwner = Handle(MeshVS_MeshOwner)::DownCast( OwnerId() );
71   if( anOwner.IsNull() ) return Standard_False;
72   Handle(MeshVS_Mesh) aMeshPrs = Handle(MeshVS_Mesh)::DownCast( anOwner->Selectable() );
73   if( aMeshPrs.IsNull() ) return Standard_False;
74   Handle(MeshVS_DataSource) aDS = anOwner->GetDataSource();
75   if( aDS.IsNull() ) return Standard_False;
76   Handle(TColStd_HPackedMapOfInteger) NodesMap;
77   Handle(TColStd_HPackedMapOfInteger) ElemsMap;
78   // Mesh data source should provide the algorithm for computation
79   // of detected entities from 2D point
80   Standard_Boolean isDetected = aDS->GetDetectedEntities( aMeshPrs, X, Y, aTol, NodesMap, ElemsMap, DMin );
81   // The detected entites will be available from mesh owner
82   anOwner->SetDetectedEntities( NodesMap, ElemsMap );
83   
84   return isDetected;
85 }
86
87 //=======================================================================
88 // name    : Matches
89 // Purpose :
90 //=======================================================================
91 Standard_Boolean MeshVS_SensitiveMesh::Matches(const Standard_Real XMin,
92                                                const Standard_Real YMin,
93                                                const Standard_Real XMax,
94                                                const Standard_Real YMax,
95                                                const Standard_Real aTol)
96 {
97   Handle(MeshVS_MeshOwner) anOwner = Handle(MeshVS_MeshOwner)::DownCast( OwnerId() );
98   if( anOwner.IsNull() ) return Standard_False;
99   Handle(MeshVS_Mesh) aMeshPrs = Handle(MeshVS_Mesh)::DownCast( anOwner->Selectable() );
100   if( aMeshPrs.IsNull() ) return Standard_False;
101   Handle(MeshVS_DataSource) aDS = anOwner->GetDataSource();
102   if( aDS.IsNull() ) return Standard_False;
103   Handle(TColStd_HPackedMapOfInteger) NodesMap;
104   Handle(TColStd_HPackedMapOfInteger) ElemsMap;
105   // Mesh data source should provide the algorithm for computation
106   // of detected entities from 2D box area
107   Standard_Boolean isDetected = aDS->GetDetectedEntities( aMeshPrs, XMin, YMin, XMax, YMax, aTol, NodesMap, ElemsMap );
108   // The detected entites will be available from mesh owner
109   anOwner->SetDetectedEntities( NodesMap, ElemsMap );
110   
111   return isDetected;
112 }
113
114 //=======================================================================
115 // name    : Matches
116 // Purpose :
117 //=======================================================================
118 Standard_Boolean MeshVS_SensitiveMesh::Matches(const TColgp_Array1OfPnt2d& Polyline,
119                                                const Bnd_Box2d&            aBox,
120                                                const Standard_Real         aTol)
121 {
122   Handle(MeshVS_MeshOwner) anOwner = Handle(MeshVS_MeshOwner)::DownCast( OwnerId() );
123   if( anOwner.IsNull() ) return Standard_False;
124   Handle(MeshVS_Mesh) aMeshPrs = Handle(MeshVS_Mesh)::DownCast( anOwner->Selectable() );
125   if( aMeshPrs.IsNull() ) return Standard_False;
126   Handle(MeshVS_DataSource) aDS = anOwner->GetDataSource();
127   if( aDS.IsNull() ) return Standard_False;
128   Handle(TColStd_HPackedMapOfInteger) NodesMap;
129   Handle(TColStd_HPackedMapOfInteger) ElemsMap;
130   // Mesh data source should provide the algorithm for computation
131   // of detected entities from 2D polyline
132   Standard_Boolean isDetected = aDS->GetDetectedEntities( aMeshPrs, Polyline, aBox, aTol, NodesMap, ElemsMap );
133   // The detected entites will be available from mesh owner
134   anOwner->SetDetectedEntities( NodesMap, ElemsMap );
135  
136   return isDetected;
137 }
138
139 //=======================================================================
140 // name    : GetConnected
141 // Purpose :
142 //=======================================================================
143 Handle(Select3D_SensitiveEntity) MeshVS_SensitiveMesh::GetConnected( const TopLoc_Location& aLoc ) 
144 {
145   Handle(MeshVS_SensitiveMesh) aMeshEnt = new MeshVS_SensitiveMesh( myOwnerId );
146   if(HasLocation()) aMeshEnt->SetLocation( Location() );
147   aMeshEnt->UpdateLocation( aLoc );
148   return aMeshEnt;
149 }
150
151 //=======================================================================
152 //function : ComputeDepth
153 //purpose  : 
154 //=======================================================================
155 Standard_Real MeshVS_SensitiveMesh::ComputeDepth( const gp_Lin& /*EyeLine*/ ) const
156 {
157   return Precision::Infinite();
158 }
159
160 //==================================================
161 // Function: ProjectOneCorner
162 // Purpose :
163 //==================================================
164 void MeshVS_SensitiveMesh::ProjectOneCorner(const Handle(Select3D_Projector)& theProj,
165                                             const Standard_Real theX, 
166                                             const Standard_Real theY, 
167                                             const Standard_Real theZ)
168 {
169   gp_Pnt aPnt( theX, theY, theZ );  
170   gp_Pnt2d aProjPnt;
171   if( HasLocation() )
172     theProj->Project( aPnt.Transformed(Location().Transformation()), aProjPnt );
173   else 
174     theProj->Project( aPnt, aProjPnt );
175   mybox2d.Add( aProjPnt );
176 }
177
178 //==================================================
179 // Function: Project
180 // Purpose :
181 //==================================================
182 void MeshVS_SensitiveMesh::Project(const Handle(Select3D_Projector)& aProj)
183 {
184   Select3D_SensitiveEntity::Project(aProj); // to set the field last proj...
185
186   mybox2d.SetVoid();
187   if (mybox.IsVoid())
188     return;
189   // Compute the 2D bounding box - projection of mesh bounding box
190   Handle(MeshVS_MeshOwner) anOwner = Handle(MeshVS_MeshOwner)::DownCast( OwnerId() );
191   if( anOwner.IsNull() ) return;
192   Handle(MeshVS_DataSource) aDS = anOwner->GetDataSource();
193   if( aDS.IsNull() ) return;
194
195   Standard_Real XMin, YMin, ZMin, XMax, YMax, ZMax;
196   mybox.Get( XMin, YMin, ZMin, XMax, YMax, ZMax );  
197
198   ProjectOneCorner (aProj, XMin, YMin, ZMin);
199   ProjectOneCorner (aProj, XMin, YMin, ZMax);
200   ProjectOneCorner (aProj, XMin, YMax, ZMin);
201   ProjectOneCorner (aProj, XMin, YMax, ZMax);
202   ProjectOneCorner (aProj, XMax, YMin, ZMin);
203   ProjectOneCorner (aProj, XMax, YMin, ZMax);
204   ProjectOneCorner (aProj, XMax, YMax, ZMin);
205   ProjectOneCorner (aProj, XMax, YMax, ZMax);
206 }
207
208 //==================================================
209 // Function: Areas 
210 // Purpose :
211 //==================================================
212 void MeshVS_SensitiveMesh::Areas( SelectBasics_ListOfBox2d& aSeq )
213 {
214   aSeq.Append(mybox2d);
215 }