Commit | Line | Data |
---|---|---|
b311480e | 1 | // Created on: 1995-02-20 |
2 | // Created by: Mister rmi | |
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 | |
17 | #include <Standard_NotImplemented.hxx> | |
18 | ||
19 | #include <SelectMgr_SelectableObject.ixx> | |
20 | #include <Standard_NoSuchObject.hxx> | |
21 | #include <SelectMgr_Selection.hxx> | |
22 | #include <Select3D_SensitiveEntity.hxx> | |
23 | #include <SelectBasics_EntityOwner.hxx> | |
24 | #include <SelectMgr_EntityOwner.hxx> | |
25 | #include <PrsMgr_PresentationManager3d.hxx> | |
26 | ||
0717ddc1 | 27 | #include <TopLoc_Location.hxx> |
7fd59977 | 28 | #include <gp_Pnt.hxx> |
29 | ||
30 | static Standard_Integer Search (const SelectMgr_SequenceOfSelection& seq, | |
31 | const Handle (SelectMgr_Selection)& theSel) | |
32 | { | |
33 | Standard_Integer ifound=0; | |
34 | for (Standard_Integer i=1;i<=seq.Length()&& ifound==0;i++) | |
35 | {if(theSel == seq.Value(i)) ifound=i;} | |
36 | return ifound; | |
37 | } | |
38 | ||
39 | ||
40 | ||
41 | //================================================== | |
42 | // Function: | |
43 | // Purpose : | |
44 | //================================================== | |
45 | ||
46 | SelectMgr_SelectableObject::SelectMgr_SelectableObject( const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d):PrsMgr_PresentableObject(aTypeOfPresentation3d) | |
47 | { | |
48 | myAutoHilight = Standard_True; | |
49 | } | |
50 | ||
51 | ||
52 | //================================================== | |
53 | // Function: | |
54 | // Purpose : | |
55 | //================================================== | |
56 | ||
57 | Standard_Boolean SelectMgr_SelectableObject | |
58 | ::HasSelection(const Standard_Integer aMode) const | |
59 | { | |
60 | Standard_Boolean Found=Standard_False; | |
61 | for (Standard_Integer I=1;I<= myselections.Length() && !Found;I++) | |
62 | { if(((myselections.Value(I))->Mode())==aMode) | |
63 | return Standard_True; | |
64 | } | |
65 | return Standard_False; | |
66 | } | |
67 | ||
68 | //================================================== | |
69 | // Function: UpdateSelection | |
70 | // Purpose : | |
71 | //================================================== | |
72 | void SelectMgr_SelectableObject::UpdateSelection() | |
73 | { | |
74 | for (Standard_Integer I=1;I<=myselections.Length();I++) | |
75 | { | |
76 | UpdateSelection(myselections.ChangeValue(I)->Mode()); | |
77 | } | |
78 | } | |
79 | ||
80 | Standard_Integer SelectMgr_SelectableObject::NbPossibleSelection() const | |
81 | {return 0;} | |
82 | ||
83 | //================================================== | |
84 | // Function: UpdateSelection | |
85 | // Purpose : | |
86 | //================================================== | |
87 | void SelectMgr_SelectableObject::UpdateSelection(const Standard_Integer aMode) | |
88 | { | |
89 | for (Standard_Integer i =1; i<= myselections.Length(); i++ ) { | |
90 | if (myselections.Value(i)->Mode() == aMode) { | |
91 | myselections(i)->Clear(); | |
92 | ComputeSelection(myselections(i),aMode); | |
93 | myselections(i)->UpdateStatus(SelectMgr_TOU_Partial); | |
94 | return; | |
95 | } | |
96 | } | |
97 | Handle(SelectMgr_Selection) S = new SelectMgr_Selection(aMode); | |
98 | ComputeSelection(S,aMode); | |
99 | S->UpdateStatus(SelectMgr_TOU_Partial); | |
100 | ||
101 | myselections.Append(S); | |
102 | ||
103 | } | |
104 | ||
105 | //================================================== | |
106 | // Function: ClearSelections | |
107 | // Purpose : | |
108 | //================================================== | |
109 | void SelectMgr_SelectableObject::ClearSelections(const Standard_Boolean update) | |
110 | { | |
111 | for (Standard_Integer i =1; i<= myselections.Length(); i++ ) { | |
112 | myselections.Value(i)->Clear(); | |
113 | if(update) | |
114 | myselections.Value(i)->UpdateStatus(SelectMgr_TOU_Full); | |
115 | } | |
116 | } | |
117 | ||
118 | ||
119 | //================================================== | |
120 | // Function: Selection | |
121 | // Purpose : | |
122 | //================================================== | |
123 | ||
124 | const Handle(SelectMgr_Selection)& SelectMgr_SelectableObject | |
125 | ::Selection(const Standard_Integer aMode) const | |
126 | { | |
127 | static Handle(SelectMgr_Selection) bidsel; | |
128 | Standard_Boolean Found = Standard_False; | |
129 | Standard_Integer Rank=0; | |
130 | for (Standard_Integer i=1;i<=myselections.Length() && !Found;i++) | |
131 | { | |
132 | if((myselections.Value(i))->Mode()==aMode){ Found = Standard_True; | |
133 | Rank=i;}} | |
134 | return myselections.Value(Rank); | |
135 | } | |
136 | ||
137 | ||
138 | //================================================== | |
139 | // Function: AddSelection | |
140 | // Purpose : | |
141 | //================================================== | |
142 | ||
143 | void SelectMgr_SelectableObject | |
144 | ::AddSelection(const Handle(SelectMgr_Selection)& aSel, | |
145 | const Standard_Integer aMode) | |
146 | { | |
147 | if(aSel->IsEmpty()){ | |
148 | ComputeSelection(aSel,aMode); | |
149 | aSel->UpdateStatus(SelectMgr_TOU_Partial); | |
150 | } | |
151 | if(HasSelection(aMode)) | |
152 | { | |
153 | const Handle(SelectMgr_Selection)& temp= Selection(aMode); | |
154 | Standard_Integer I = Search(myselections,temp); | |
155 | if(I!=0) myselections.Remove(I); | |
156 | } | |
157 | myselections.Append(aSel); | |
158 | ||
159 | } | |
160 | ||
161 | ||
162 | ||
163 | //======================================================================= | |
0717ddc1 | 164 | //function : ReSetTransformation |
7fd59977 | 165 | //purpose : |
166 | //======================================================================= | |
0717ddc1 | 167 | void SelectMgr_SelectableObject::ResetTransformation() |
7fd59977 | 168 | { |
169 | TopLoc_Location aLoc; | |
170 | ||
0717ddc1 | 171 | TopLoc_Location aSelfLocation (Transformation()); |
7fd59977 | 172 | |
173 | // les selections | |
174 | Handle(Select3D_SensitiveEntity) SE; | |
175 | for(Init();More();Next()){ | |
176 | const Handle(SelectMgr_Selection) & Sel = CurrentSelection(); | |
177 | for(Sel->Init();Sel->More();Sel->Next()){ | |
178 | SE = *((Handle(Select3D_SensitiveEntity)*) &(Sel->Sensitive())); | |
179 | if(!SE.IsNull()){ | |
eafb234b | 180 | if(SE->HasLocation()) { |
0717ddc1 | 181 | if( SE->Location()==aSelfLocation){ |
7fd59977 | 182 | SE->ResetLocation(); |
183 | const Handle(SelectBasics_EntityOwner)& EO = SE->OwnerId(); | |
184 | (*((Handle(SelectMgr_EntityOwner)*)&EO))->ResetLocation();} | |
185 | else{ | |
186 | const TopLoc_Location& iniloc =SE->Location(); | |
0717ddc1 | 187 | SE->SetLocation(iniloc*aSelfLocation.Inverted()); |
7fd59977 | 188 | const Handle(SelectBasics_EntityOwner)& EO = SE->OwnerId(); |
189 | (*((Handle(SelectMgr_EntityOwner)*)&EO))->SetLocation(SE->Location());} | |
eafb234b | 190 | } |
7fd59977 | 191 | } |
192 | } | |
193 | Sel->UpdateStatus(SelectMgr_TOU_None); | |
194 | } | |
195 | ||
0717ddc1 | 196 | PrsMgr_PresentableObject::ResetTransformation(); |
7fd59977 | 197 | } |
198 | ||
199 | ||
200 | //======================================================================= | |
0717ddc1 | 201 | //function : UpdateTransformation |
7fd59977 | 202 | //purpose : |
203 | //======================================================================= | |
0717ddc1 | 204 | void SelectMgr_SelectableObject::UpdateTransformation() |
7fd59977 | 205 | { |
206 | ||
207 | Handle(Select3D_SensitiveEntity) SE; | |
208 | for(Init();More();Next()){ | |
209 | const Handle(SelectMgr_Selection) & Sel = CurrentSelection(); | |
210 | Sel->UpdateStatus(SelectMgr_TOU_Partial); | |
211 | } | |
0717ddc1 | 212 | PrsMgr_PresentableObject::UpdateTransformation(); |
7fd59977 | 213 | |
214 | } | |
215 | ||
216 | ||
217 | //======================================================================= | |
0717ddc1 | 218 | //function : UpdateTransformation |
7fd59977 | 219 | //purpose : |
220 | //======================================================================= | |
0717ddc1 | 221 | void SelectMgr_SelectableObject::UpdateTransformation(const Handle(SelectMgr_Selection)& Sel) |
7fd59977 | 222 | { |
0717ddc1 | 223 | TopLoc_Location aSelfLocation (Transformation()); |
7fd59977 | 224 | Handle(Select3D_SensitiveEntity) SE; |
0717ddc1 | 225 | if(aSelfLocation.IsIdentity()) return; |
7fd59977 | 226 | for(Sel->Init();Sel->More();Sel->Next()){ |
227 | SE = *((Handle(Select3D_SensitiveEntity)*) &(Sel->Sensitive())); | |
228 | if(!SE.IsNull()){ | |
0717ddc1 | 229 | SE->UpdateLocation(aSelfLocation); |
29d43f9c A |
230 | const Handle(SelectBasics_EntityOwner)& aEOwner = SE->OwnerId(); |
231 | Handle(SelectMgr_EntityOwner) aMgrEO = | |
232 | Handle(SelectMgr_EntityOwner)::DownCast (aEOwner); | |
233 | if (!aMgrEO.IsNull()) | |
0717ddc1 | 234 | aMgrEO->SetLocation (aSelfLocation); |
7fd59977 | 235 | } |
236 | } | |
237 | } | |
238 | ||
239 | //======================================================================= | |
240 | //function : HilightSelected | |
241 | //purpose : | |
242 | //======================================================================= | |
243 | void SelectMgr_SelectableObject::HilightSelected | |
244 | ( const Handle(PrsMgr_PresentationManager3d)&, | |
245 | const SelectMgr_SequenceOfOwner&) | |
246 | { | |
247 | Standard_NotImplemented::Raise ("SelectMgr_SelectableObject::HilightSelected"); | |
248 | } | |
249 | ||
250 | //======================================================================= | |
251 | //function : ClearSelected | |
252 | //purpose : | |
253 | //======================================================================= | |
254 | void SelectMgr_SelectableObject::ClearSelected () | |
255 | { | |
7fd59977 | 256 | if( !mySelectionPrs.IsNull() ) |
2b442de5 | 257 | mySelectionPrs->Clear(); |
7fd59977 | 258 | } |
259 | ||
260 | //======================================================================= | |
261 | //function : HilightOwnerWithColor | |
262 | //purpose : | |
263 | //======================================================================= | |
264 | void SelectMgr_SelectableObject::HilightOwnerWithColor | |
265 | ( const Handle(PrsMgr_PresentationManager3d)&, | |
266 | const Quantity_NameOfColor, | |
267 | const Handle(SelectMgr_EntityOwner)&) | |
268 | { | |
269 | Standard_NotImplemented::Raise ("SelectMgr_SelectableObject::HilightOwnerWithColor"); | |
270 | } | |
271 | ||
272 | //======================================================================= | |
273 | //function : MaxFaceNodes | |
274 | //purpose : | |
275 | //======================================================================= | |
276 | Standard_Boolean SelectMgr_SelectableObject::IsAutoHilight () const | |
277 | { | |
278 | return myAutoHilight; | |
279 | } | |
280 | ||
281 | //======================================================================= | |
282 | //function : MaxFaceNodes | |
283 | //purpose : | |
284 | //======================================================================= | |
285 | void SelectMgr_SelectableObject::SetAutoHilight ( const Standard_Boolean newAutoHilight ) | |
286 | { | |
287 | myAutoHilight = newAutoHilight; | |
288 | } | |
289 | ||
290 | //======================================================================= | |
291 | //function : GetHilightPresentation | |
292 | //purpose : | |
293 | //======================================================================= | |
294 | Handle(Prs3d_Presentation) SelectMgr_SelectableObject::GetHilightPresentation( const Handle(PrsMgr_PresentationManager3d)& TheMgr ) | |
295 | { | |
296 | if( myHilightPrs.IsNull() && !TheMgr.IsNull() ) | |
297 | { | |
298 | myHilightPrs = new Prs3d_Presentation( TheMgr->StructureManager() ); | |
299 | myHilightPrs->SetTransformPersistence( GetTransformPersistenceMode(), | |
300 | GetTransformPersistencePoint() ); | |
301 | } | |
302 | ||
303 | return myHilightPrs; | |
304 | } | |
305 | ||
306 | ||
307 | //======================================================================= | |
308 | //function : GetSelectPresentation | |
309 | //purpose : | |
310 | //======================================================================= | |
311 | Handle(Prs3d_Presentation) SelectMgr_SelectableObject::GetSelectPresentation( const Handle(PrsMgr_PresentationManager3d)& TheMgr ) | |
312 | { | |
313 | if( mySelectionPrs.IsNull() && !TheMgr.IsNull() ) { | |
314 | mySelectionPrs = new Prs3d_Presentation( TheMgr->StructureManager() ); | |
315 | mySelectionPrs->SetTransformPersistence( GetTransformPersistenceMode(), | |
316 | GetTransformPersistencePoint() ); | |
317 | } | |
318 | return mySelectionPrs; | |
319 | } | |
320 | ||
59f45b7c | 321 | //======================================================================= |
322 | //function : SetZLayer | |
323 | //purpose : | |
324 | //======================================================================= | |
325 | void SelectMgr_SelectableObject::SetZLayer | |
326 | (const Handle(PrsMgr_PresentationManager)& thePrsMgr, | |
327 | const Standard_Integer theLayerId) | |
328 | { | |
329 | if (thePrsMgr.IsNull()) | |
330 | return; | |
331 | ||
332 | // update own presentations | |
333 | PrsMgr_PresentableObject::SetZLayer (thePrsMgr, theLayerId); | |
334 | ||
335 | // update selection presentations | |
336 | if (!mySelectionPrs.IsNull()) | |
337 | mySelectionPrs->SetZLayer (theLayerId); | |
338 | ||
339 | if (!myHilightPrs.IsNull()) | |
340 | myHilightPrs->SetZLayer (theLayerId); | |
341 | ||
342 | // update all entity owner presentations | |
343 | for (Init (); More () ;Next ()) | |
344 | { | |
345 | const Handle(SelectMgr_Selection)& aSel = CurrentSelection(); | |
346 | for (aSel->Init (); aSel->More (); aSel->Next ()) | |
347 | { | |
348 | Handle(Select3D_SensitiveEntity) aEntity = | |
349 | Handle(Select3D_SensitiveEntity)::DownCast (aSel->Sensitive()); | |
350 | if (!aEntity.IsNull()) | |
351 | { | |
352 | Handle(SelectMgr_EntityOwner) aOwner = | |
353 | Handle(SelectMgr_EntityOwner)::DownCast (aEntity->OwnerId()); | |
354 | if (!aOwner.IsNull()) | |
355 | aOwner->SetZLayer (thePrsMgr, theLayerId); | |
356 | } | |
357 | } | |
358 | } | |
359 | } |