Commit | Line | Data |
---|---|---|
b311480e | 1 | // Created on: 1997-01-29 |
2 | // Created by: Robert COUBLANC | |
3 | // Copyright (c) 1997-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 | |
18 | #include <AIS_DataMapIteratorOfDataMapOfIOStatus.hxx> | |
7fd59977 | 19 | #include <AIS_GlobalStatus.hxx> |
42cf5bc1 | 20 | #include <AIS_InteractiveContext.hxx> |
21 | #include <AIS_InteractiveObject.hxx> | |
22 | #include <AIS_LocalContext.hxx> | |
23 | #include <AIS_MapIteratorOfMapOfInteractive.hxx> | |
24 | #include <AIS_MapOfInteractive.hxx> | |
25 | #include <AIS_Selection.hxx> | |
7fd59977 | 26 | #include <AIS_Shape.hxx> |
42cf5bc1 | 27 | #include <AIS_StatusOfDetection.hxx> |
28 | #include <AIS_StatusOfPick.hxx> | |
679ecdee | 29 | #include <Aspect_Grid.hxx> |
42cf5bc1 | 30 | #include <Prs3d_BasicAspect.hxx> |
31 | #include <Prs3d_LineAspect.hxx> | |
32 | #include <Prs3d_Presentation.hxx> | |
33 | #include <Quantity_Color.hxx> | |
34 | #include <SelectBasics_SensitiveEntity.hxx> | |
35 | #include <SelectMgr_EntityOwner.hxx> | |
36 | #include <SelectMgr_Filter.hxx> | |
37 | #include <SelectMgr_OrFilter.hxx> | |
38 | #include <SelectMgr_Selection.hxx> | |
39 | #include <SelectMgr_SelectionManager.hxx> | |
40 | #include <Standard_Transient.hxx> | |
c3282ec1 | 41 | #include <StdSelect_BRepOwner.hxx> |
42cf5bc1 | 42 | #include <StdSelect_ViewerSelector3d.hxx> |
43 | #include <TCollection_AsciiString.hxx> | |
44 | #include <TCollection_ExtendedString.hxx> | |
45 | #include <TColStd_ListIteratorOfListOfInteger.hxx> | |
46 | #include <TopLoc_Location.hxx> | |
42cf5bc1 | 47 | #include <V3d_AmbientLight.hxx> |
48 | #include <V3d_DirectionalLight.hxx> | |
7fd59977 | 49 | #include <V3d_Light.hxx> |
50 | #include <V3d_PositionalLight.hxx> | |
51 | #include <V3d_SpotLight.hxx> | |
42cf5bc1 | 52 | #include <V3d_View.hxx> |
53 | #include <V3d_Viewer.hxx> | |
7fd59977 | 54 | |
c3282ec1 | 55 | typedef NCollection_DataMap<Handle(AIS_InteractiveObject), NCollection_Handle<SelectMgr_SequenceOfOwner> > AIS_MapOfObjSelectedOwners; |
56 | ||
016e5959 | 57 | namespace |
58 | { | |
896faa72 | 59 | TopoDS_Shape AIS_InteractiveContext_myDummyShape; |
016e5959 | 60 | } |
61 | ||
c3282ec1 | 62 | //======================================================================= |
63 | //function : highlightWithColor | |
64 | //purpose : | |
65 | //======================================================================= | |
66 | void AIS_InteractiveContext::highlightWithColor (const Handle(SelectMgr_EntityOwner)& theOwner, | |
c3282ec1 | 67 | const Handle(V3d_Viewer)& theViewer) |
68 | { | |
f838dac4 | 69 | const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable()); |
c3282ec1 | 70 | if (anObj.IsNull()) |
f838dac4 | 71 | { |
c3282ec1 | 72 | return; |
f838dac4 | 73 | } |
74 | ||
75 | const Handle(Prs3d_Drawer)& aStyle = getHiStyle (anObj, theOwner); | |
76 | const Standard_Integer aHiMode = getHilightMode (anObj, aStyle, -1); | |
c3282ec1 | 77 | |
78 | myMainPM->BeginImmediateDraw(); | |
f838dac4 | 79 | theOwner->HilightWithColor (myMainPM, aStyle, aHiMode); |
c3282ec1 | 80 | myMainPM->EndImmediateDraw (theViewer.IsNull() ? myMainVwr : theViewer); |
81 | } | |
82 | ||
83 | //======================================================================= | |
84 | //function : highlightSelected | |
85 | //purpose : | |
86 | //======================================================================= | |
8e5fb5ea | 87 | void AIS_InteractiveContext::highlightSelected (const Handle(SelectMgr_EntityOwner)& theOwner) |
c3282ec1 | 88 | { |
f838dac4 | 89 | const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable()); |
c3282ec1 | 90 | if (anObj.IsNull()) |
f838dac4 | 91 | { |
c3282ec1 | 92 | return; |
f838dac4 | 93 | } |
c3282ec1 | 94 | |
95 | if (!theOwner->IsAutoHilight()) | |
96 | { | |
c3282ec1 | 97 | SelectMgr_SequenceOfOwner aSeq; |
02974a19 | 98 | for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next()) |
c3282ec1 | 99 | { |
8e5fb5ea | 100 | if (aSelIter.Value()->IsSameSelectable (anObj)) |
02974a19 | 101 | { |
102 | aSeq.Append (aSelIter.Value()); | |
103 | } | |
c3282ec1 | 104 | } |
105 | anObj->HilightSelected (myMainPM, aSeq); | |
106 | } | |
107 | else | |
108 | { | |
f838dac4 | 109 | const Handle(Prs3d_Drawer)& aStyle = getSelStyle (anObj, theOwner); |
110 | const Standard_Integer aHiMode = getHilightMode (anObj, aStyle, -1); | |
111 | theOwner->HilightWithColor (myMainPM, aStyle, aHiMode); | |
8e5fb5ea | 112 | } |
113 | } | |
114 | ||
115 | //======================================================================= | |
116 | //function : highlightGlobal | |
117 | //purpose : | |
118 | //======================================================================= | |
119 | void AIS_InteractiveContext::highlightGlobal (const Handle(AIS_InteractiveObject)& theObj, | |
f838dac4 | 120 | const Handle(Prs3d_Drawer)& theStyle, |
121 | const Standard_Integer theDispMode) const | |
8e5fb5ea | 122 | { |
123 | if (theObj.IsNull()) | |
f838dac4 | 124 | { |
8e5fb5ea | 125 | return; |
f838dac4 | 126 | } |
127 | ||
128 | const Standard_Integer aHiMode = getHilightMode (theObj, theStyle, theDispMode); | |
8e5fb5ea | 129 | const Handle(SelectMgr_EntityOwner)& aGlobOwner = theObj->GlobalSelOwner(); |
130 | ||
131 | if (aGlobOwner.IsNull()) | |
132 | { | |
f838dac4 | 133 | myMainPM->Color (theObj, theStyle, aHiMode); |
8e5fb5ea | 134 | return; |
135 | } | |
136 | ||
137 | if (!aGlobOwner->IsAutoHilight()) | |
138 | { | |
139 | SelectMgr_SequenceOfOwner aSeq; | |
140 | for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next()) | |
141 | { | |
142 | if (aSelIter.Value()->IsSameSelectable (theObj)) | |
143 | { | |
144 | aSeq.Append (aSelIter.Value()); | |
145 | } | |
146 | } | |
147 | theObj->HilightSelected (myMainPM, aSeq); | |
148 | } | |
149 | else | |
150 | { | |
f838dac4 | 151 | aGlobOwner->HilightWithColor (myMainPM, theStyle, aHiMode); |
c3282ec1 | 152 | } |
153 | } | |
154 | ||
b4006117 | 155 | //======================================================================= |
156 | //function : unhighlightSelected | |
157 | //purpose : | |
158 | //======================================================================= | |
159 | void AIS_InteractiveContext::unhighlightSelected (const Standard_Boolean theIsToHilightSubIntensity) | |
160 | { | |
b4006117 | 161 | NCollection_IndexedMap<Handle(AIS_InteractiveObject)> anObjToClear; |
02974a19 | 162 | for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next()) |
b4006117 | 163 | { |
02974a19 | 164 | const Handle(SelectMgr_EntityOwner) anOwner = aSelIter.Value(); |
165 | const Handle(AIS_InteractiveObject) anInteractive = Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable()); | |
f838dac4 | 166 | Handle(AIS_GlobalStatus) aStatus; |
167 | if (!myObjects.Find (anInteractive, aStatus)) | |
168 | { | |
169 | continue; | |
170 | } | |
171 | ||
b4006117 | 172 | if (anOwner->IsAutoHilight()) |
173 | { | |
f838dac4 | 174 | anOwner->Unhilight (myMainPM); |
b4006117 | 175 | if (theIsToHilightSubIntensity) |
176 | { | |
f838dac4 | 177 | if (aStatus->IsSubIntensityOn()) |
b4006117 | 178 | { |
f838dac4 | 179 | const Standard_Integer aHiMode = getHilightMode (anInteractive, aStatus->HilightStyle(), aStatus->DisplayMode()); |
8e5fb5ea | 180 | highlightWithSubintensity (anOwner, aHiMode); |
b4006117 | 181 | } |
182 | } | |
183 | } | |
184 | else | |
185 | { | |
f838dac4 | 186 | anObjToClear.Add (anInteractive); |
b4006117 | 187 | } |
f838dac4 | 188 | anOwner->SetSelected (Standard_False); |
b4006117 | 189 | if (anOwner == anInteractive->GlobalSelOwner()) |
190 | { | |
191 | myObjects.ChangeFind (anInteractive)->SetHilightStatus (Standard_False); | |
192 | } | |
193 | } | |
194 | for (NCollection_IndexedMap<Handle(AIS_InteractiveObject)>::Iterator anIter (anObjToClear); anIter.More(); anIter.Next()) | |
195 | { | |
196 | const Handle(AIS_InteractiveObject)& anObj = anIter.Value(); | |
f838dac4 | 197 | myMainPM->Unhighlight (anObj); |
b4006117 | 198 | anObj->ClearSelected(); |
199 | } | |
200 | } | |
201 | ||
8e5fb5ea | 202 | //======================================================================= |
203 | //function : unhighlightGlobal | |
204 | //purpose : | |
205 | //======================================================================= | |
f838dac4 | 206 | void AIS_InteractiveContext::unhighlightGlobal (const Handle(AIS_InteractiveObject)& theObj) const |
8e5fb5ea | 207 | { |
208 | if (theObj.IsNull()) | |
f838dac4 | 209 | { |
8e5fb5ea | 210 | return; |
f838dac4 | 211 | } |
8e5fb5ea | 212 | |
f838dac4 | 213 | const Handle(SelectMgr_EntityOwner)& aGlobOwner = theObj->GlobalSelOwner(); |
8e5fb5ea | 214 | if (aGlobOwner.IsNull()) |
215 | { | |
f838dac4 | 216 | myMainPM->Unhighlight (theObj); |
8e5fb5ea | 217 | return; |
218 | } | |
219 | ||
220 | if (aGlobOwner->IsAutoHilight()) | |
221 | { | |
f838dac4 | 222 | aGlobOwner->Unhilight (myMainPM); |
8e5fb5ea | 223 | } |
224 | else | |
225 | { | |
f838dac4 | 226 | myMainPM->Unhighlight (theObj); |
8e5fb5ea | 227 | theObj->ClearSelected(); |
228 | } | |
229 | } | |
230 | ||
231 | //======================================================================= | |
232 | //function : turnOnSubintensity | |
233 | //purpose : | |
234 | //======================================================================= | |
235 | void AIS_InteractiveContext::turnOnSubintensity (const Handle(AIS_InteractiveObject)& theObject, | |
236 | const Standard_Integer theDispMode, | |
237 | const Standard_Boolean theIsDisplayedOnly) const | |
238 | { | |
f838dac4 | 239 | // the only differ with selection highlight is color, so sync transparency values |
240 | const Handle(Prs3d_Drawer)& aSubStyle = myStyles[Prs3d_TypeOfHighlight_SubIntensity]; | |
241 | aSubStyle->SetTransparency (myStyles[Prs3d_TypeOfHighlight_Selected]->Transparency()); | |
8e5fb5ea | 242 | |
243 | if (theObject.IsNull()) | |
244 | { | |
245 | for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjsIter (myObjects); anObjsIter.More(); anObjsIter.Next()) | |
246 | { | |
247 | const Handle(AIS_GlobalStatus)& aStatus = anObjsIter.Value(); | |
248 | if (aStatus->GraphicStatus() != AIS_DS_Displayed && theIsDisplayedOnly) | |
249 | continue; | |
250 | ||
251 | aStatus->SubIntensityOn(); | |
f838dac4 | 252 | myMainPM->Color (anObjsIter.Key(), aSubStyle, theDispMode != -1 ? theDispMode : aStatus->DisplayMode()); |
8e5fb5ea | 253 | } |
254 | } | |
255 | else | |
256 | { | |
257 | Handle(AIS_GlobalStatus) aStatus; | |
258 | if (!myObjects.Find (theObject, aStatus)) | |
259 | return; | |
260 | ||
261 | if (aStatus->GraphicStatus() != AIS_DS_Displayed && theIsDisplayedOnly) | |
f838dac4 | 262 | return; |
8e5fb5ea | 263 | |
264 | aStatus->SubIntensityOn(); | |
f838dac4 | 265 | myMainPM->Color (theObject, aSubStyle, theDispMode != -1 ? theDispMode : aStatus->DisplayMode()); |
8e5fb5ea | 266 | } |
267 | } | |
268 | ||
269 | //======================================================================= | |
270 | //function : highlightWithSubintensity | |
271 | //purpose : | |
272 | //======================================================================= | |
273 | void AIS_InteractiveContext::highlightWithSubintensity (const Handle(AIS_InteractiveObject)& theObject, | |
274 | const Standard_Integer theMode) const | |
275 | { | |
276 | // the only differ with selection highlight is color, so | |
277 | // sync transparency values | |
f838dac4 | 278 | myStyles[Prs3d_TypeOfHighlight_SubIntensity]->SetTransparency (myStyles[Prs3d_TypeOfHighlight_Selected]->Transparency()); |
8e5fb5ea | 279 | |
f838dac4 | 280 | myMainPM->Color (theObject, myStyles[Prs3d_TypeOfHighlight_SubIntensity], theMode); |
8e5fb5ea | 281 | } |
282 | ||
283 | //======================================================================= | |
284 | //function : highlightWithSubintensity | |
285 | //purpose : | |
286 | //======================================================================= | |
287 | void AIS_InteractiveContext::highlightWithSubintensity (const Handle(SelectMgr_EntityOwner)& theOwner, | |
288 | const Standard_Integer theMode) const | |
289 | { | |
290 | // the only differ with selection highlight is color, so | |
291 | // sync transparency values | |
f838dac4 | 292 | myStyles[Prs3d_TypeOfHighlight_SubIntensity]->SetTransparency (myStyles[Prs3d_TypeOfHighlight_Selected]->Transparency()); |
8e5fb5ea | 293 | |
f838dac4 | 294 | theOwner->HilightWithColor (myMainPM, myStyles[Prs3d_TypeOfHighlight_SubIntensity], theMode); |
8e5fb5ea | 295 | } |
296 | ||
7fd59977 | 297 | //======================================================================= |
298 | //function : MoveTo | |
679ecdee | 299 | //purpose : |
7fd59977 | 300 | //======================================================================= |
679ecdee | 301 | AIS_StatusOfDetection AIS_InteractiveContext::MoveTo (const Standard_Integer theXPix, |
302 | const Standard_Integer theYPix, | |
303 | const Handle(V3d_View)& theView, | |
304 | const Standard_Boolean theToRedrawOnUpdate) | |
7fd59977 | 305 | { |
679ecdee | 306 | if (HasOpenedContext()) |
307 | { | |
7fd59977 | 308 | myWasLastMain = Standard_True; |
679ecdee | 309 | return myLocalContexts (myCurLocalIndex)->MoveTo (theXPix, theYPix, theView, theToRedrawOnUpdate); |
7fd59977 | 310 | } |
311 | ||
f0cddd16 | 312 | myCurDetected = 0; |
313 | myCurHighlighted = 0; | |
314 | myDetectedSeq.Clear(); | |
7fd59977 | 315 | |
679ecdee | 316 | if (theView->Viewer() != myMainVwr) |
317 | { | |
7fd59977 | 318 | return AIS_SOD_Error; |
679ecdee | 319 | } |
320 | ||
321 | // preliminaires | |
322 | myLastPicked = myLastinMain; | |
323 | myWasLastMain = Standard_True; | |
324 | AIS_StatusOfDetection aStatus = AIS_SOD_Nothing; | |
325 | Standard_Boolean toUpdateViewer = Standard_False; | |
326 | ||
a272ed94 | 327 | myFilters->SetDisabledObjects (theView->View()->HiddenObjects()); |
679ecdee | 328 | myMainSel->Pick (theXPix, theYPix, theView); |
329 | ||
330 | // filling of myAISDetectedSeq sequence storing information about detected AIS objects | |
331 | // (the objects must be AIS_Shapes) | |
332 | const Standard_Integer aDetectedNb = myMainSel->NbPicked(); | |
54a16ee4 | 333 | Standard_Integer aNewDetected = 0; |
14c4193d | 334 | Standard_Boolean toIgnoreDetTop = Standard_False; |
679ecdee | 335 | for (Standard_Integer aDetIter = 1; aDetIter <= aDetectedNb; ++aDetIter) |
7fd59977 | 336 | { |
679ecdee | 337 | Handle(SelectMgr_EntityOwner) anOwner = myMainSel->Picked (aDetIter); |
338 | if (anOwner.IsNull() | |
339 | || !myFilters->IsOk (anOwner)) | |
340 | { | |
14c4193d | 341 | if (myPickingStrategy == SelectMgr_PickingStrategy_OnlyTopmost) |
342 | { | |
343 | toIgnoreDetTop = Standard_True; | |
344 | } | |
679ecdee | 345 | continue; |
346 | } | |
347 | ||
14c4193d | 348 | if (aNewDetected < 1 |
349 | && !toIgnoreDetTop) | |
54a16ee4 | 350 | { |
351 | aNewDetected = aDetIter; | |
352 | } | |
f0cddd16 | 353 | |
354 | myDetectedSeq.Append (aDetIter); | |
7fd59977 | 355 | } |
7fd59977 | 356 | |
54a16ee4 | 357 | if (aNewDetected >= 1) |
7fd59977 | 358 | { |
f0cddd16 | 359 | myCurHighlighted = myDetectedSeq.Lower(); |
360 | ||
29627b4c | 361 | // Does nothing if previously detected object is equal to the current one. |
362 | // However in advanced selection modes the owners comparison | |
363 | // is not effective because in that case only one owner manage the | |
364 | // selection in current selection mode. It is necessary to check the current detected | |
365 | // entity and hilight it only if the detected entity is not the same as | |
366 | // previous detected (IsForcedHilight call) | |
54a16ee4 | 367 | Handle(SelectMgr_EntityOwner) aNewPickedOwner = myMainSel->Picked (aNewDetected); |
29627b4c | 368 | if (aNewPickedOwner == myLastPicked && !aNewPickedOwner->IsForcedHilight()) |
eafb234b | 369 | { |
c3282ec1 | 370 | return myLastPicked->IsSelected() |
8abada55 | 371 | ? AIS_SOD_Selected |
372 | : AIS_SOD_OnlyOneDetected; | |
679ecdee | 373 | } |
81bba717 | 374 | |
7fd59977 | 375 | // Previously detected object is unhilighted if it is not selected or hilighted |
376 | // with selection color if it is selected. Such highlighting with selection color | |
377 | // is needed only if myToHilightSelected flag is true. In this case previously detected | |
378 | // object has been already highlighted with myHilightColor during previous MoveTo() | |
379 | // method call. As result it is necessary to rehighligt it with mySelectionColor. | |
c3282ec1 | 380 | if (!myLastPicked.IsNull() && myLastPicked->HasSelectable()) |
7fd59977 | 381 | { |
731c9b5b | 382 | clearDynamicHighlight(); |
383 | toUpdateViewer = Standard_True; | |
7fd59977 | 384 | } |
be6e564e | 385 | |
679ecdee | 386 | // initialize myLastPicked field with currently detected object |
c3282ec1 | 387 | myLastPicked = aNewPickedOwner; |
679ecdee | 388 | myLastinMain = myLastPicked; |
be6e564e | 389 | |
679ecdee | 390 | // highlight detected object if it is not selected or myToHilightSelected flag is true |
c3282ec1 | 391 | if (myLastPicked->HasSelectable()) |
7fd59977 | 392 | { |
c3282ec1 | 393 | if (!myLastPicked->IsSelected() || myToHilightSelected) |
679ecdee | 394 | { |
8e5fb5ea | 395 | highlightWithColor (myLastPicked, theView->Viewer()); |
679ecdee | 396 | toUpdateViewer = Standard_True; |
397 | } | |
be6e564e | 398 | |
c3282ec1 | 399 | aStatus = myLastPicked->IsSelected() |
8abada55 | 400 | ? AIS_SOD_Selected |
401 | : AIS_SOD_OnlyOneDetected; | |
be6e564e | 402 | } |
7fd59977 | 403 | } |
c3282ec1 | 404 | else |
7fd59977 | 405 | { |
679ecdee | 406 | // previously detected object is unhilighted if it is not selected or hilighted |
407 | // with selection color if it is selected | |
408 | aStatus = AIS_SOD_Nothing; | |
c3282ec1 | 409 | if (!myLastPicked.IsNull() && myLastPicked->HasSelectable()) |
7fd59977 | 410 | { |
731c9b5b | 411 | clearDynamicHighlight(); |
412 | toUpdateViewer = Standard_True; | |
7fd59977 | 413 | } |
be6e564e | 414 | |
679ecdee | 415 | myLastinMain.Nullify(); |
8abada55 | 416 | myLastPicked.Nullify(); |
7fd59977 | 417 | } |
679ecdee | 418 | |
2eea6525 | 419 | if (toUpdateViewer |
420 | && theToRedrawOnUpdate) | |
679ecdee | 421 | { |
2eea6525 | 422 | theView->Viewer()->Update(); |
679ecdee | 423 | } |
424 | ||
679ecdee | 425 | return aStatus; |
7fd59977 | 426 | } |
427 | ||
016e5959 | 428 | //======================================================================= |
429 | //function : AddSelect | |
430 | //purpose : | |
431 | //======================================================================= | |
02974a19 | 432 | AIS_StatusOfPick AIS_InteractiveContext::AddSelect (const Handle(SelectMgr_EntityOwner)& theObject) |
016e5959 | 433 | { |
434 | if (HasOpenedContext()) | |
435 | { | |
436 | return myLocalContexts(myCurLocalIndex)->AddSelect (theObject); | |
437 | } | |
438 | mySelection->AddSelect (theObject); | |
439 | ||
440 | Standard_Integer aSelNum = NbSelected(); | |
441 | return (aSelNum == 0) ? AIS_SOP_NothingSelected | |
442 | : (aSelNum == 1) ? AIS_SOP_OneSelected | |
443 | : AIS_SOP_SeveralSelected; | |
444 | } | |
445 | ||
7fd59977 | 446 | //======================================================================= |
447 | //function : Select | |
448 | //purpose : | |
449 | //======================================================================= | |
c398b00e | 450 | AIS_StatusOfPick AIS_InteractiveContext::Select (const Standard_Integer theXPMin, |
451 | const Standard_Integer theYPMin, | |
452 | const Standard_Integer theXPMax, | |
453 | const Standard_Integer theYPMax, | |
454 | const Handle(V3d_View)& theView, | |
455 | const Standard_Boolean toUpdateViewer) | |
7fd59977 | 456 | { |
81bba717 | 457 | // all objects detected by the selector are taken, previous current objects are emptied, |
458 | // new objects are put... | |
7fd59977 | 459 | |
c398b00e | 460 | if (HasOpenedContext()) |
461 | { | |
462 | return myLocalContexts(myCurLocalIndex)->Select (theXPMin, theYPMin, | |
463 | theXPMax, theYPMax, | |
464 | theView, toUpdateViewer); | |
465 | } | |
7fd59977 | 466 | |
c3282ec1 | 467 | ClearSelected (Standard_False); |
eb4320f2 | 468 | |
c398b00e | 469 | Handle(StdSelect_ViewerSelector3d) aSelector; |
7fd59977 | 470 | |
c398b00e | 471 | if (theView->Viewer() == myMainVwr) |
7fd59977 | 472 | { |
c398b00e | 473 | aSelector = myMainSel; |
474 | myWasLastMain = Standard_True; | |
7fd59977 | 475 | } |
c398b00e | 476 | |
477 | aSelector->Pick (theXPMin, theYPMin, theXPMax, theYPMax, theView); | |
aa75c0cf | 478 | for (Standard_Integer aPickIter = 1; aPickIter <= aSelector->NbPicked(); ++aPickIter) |
7fd59977 | 479 | { |
aa75c0cf | 480 | const Handle(SelectMgr_EntityOwner)& aCurOwner = aSelector->Picked (aPickIter); |
c3282ec1 | 481 | if (aCurOwner.IsNull() || !aCurOwner->HasSelectable() || !myFilters->IsOk (aCurOwner)) |
482 | continue; | |
7fd59977 | 483 | |
016e5959 | 484 | mySelection->Select (aCurOwner); |
f838dac4 | 485 | aCurOwner->SetSelected (Standard_True); |
c398b00e | 486 | } |
487 | ||
c3282ec1 | 488 | HilightSelected (toUpdateViewer); |
c398b00e | 489 | |
c3282ec1 | 490 | Standard_Integer aSelNum = NbSelected(); |
c398b00e | 491 | |
492 | return (aSelNum == 0) ? AIS_SOP_NothingSelected | |
493 | : (aSelNum == 1) ? AIS_SOP_OneSelected | |
494 | : AIS_SOP_SeveralSelected; | |
7fd59977 | 495 | |
496 | } | |
497 | ||
498 | //======================================================================= | |
499 | //function : Select | |
500 | //purpose : Selection by polyline | |
501 | //======================================================================= | |
c398b00e | 502 | AIS_StatusOfPick AIS_InteractiveContext::Select (const TColgp_Array1OfPnt2d& thePolyline, |
503 | const Handle(V3d_View)& theView, | |
504 | const Standard_Boolean toUpdateViewer) | |
7fd59977 | 505 | { |
81bba717 | 506 | // all objects detected by the selector are taken, previous current objects are emptied, |
507 | // new objects are put... | |
7fd59977 | 508 | |
c398b00e | 509 | if (HasOpenedContext()) |
510 | { | |
511 | return myLocalContexts(myCurLocalIndex)->Select (thePolyline, theView, toUpdateViewer); | |
512 | } | |
eb4320f2 | 513 | |
c3282ec1 | 514 | ClearSelected (Standard_False); |
7fd59977 | 515 | |
c398b00e | 516 | Handle(StdSelect_ViewerSelector3d) aSelector; |
7fd59977 | 517 | |
c398b00e | 518 | if (theView->Viewer() == myMainVwr) |
7fd59977 | 519 | { |
c398b00e | 520 | aSelector = myMainSel; |
521 | myWasLastMain = Standard_True; | |
7fd59977 | 522 | } |
c398b00e | 523 | |
524 | aSelector->Pick (thePolyline, theView); | |
aa75c0cf | 525 | for (Standard_Integer aPickIter = 1; aPickIter <= aSelector->NbPicked(); ++aPickIter) |
7fd59977 | 526 | { |
aa75c0cf | 527 | const Handle(SelectMgr_EntityOwner) anOwner = aSelector->Picked (aPickIter); |
c3282ec1 | 528 | if (anOwner.IsNull() || !anOwner->HasSelectable() || !myFilters->IsOk (anOwner)) |
529 | continue; | |
c398b00e | 530 | |
016e5959 | 531 | mySelection->Select (anOwner); |
f838dac4 | 532 | anOwner->SetSelected (Standard_True); |
c398b00e | 533 | } |
534 | ||
c3282ec1 | 535 | HilightSelected (toUpdateViewer); |
c398b00e | 536 | |
c3282ec1 | 537 | Standard_Integer aSelNum = NbSelected(); |
c398b00e | 538 | |
539 | return (aSelNum == 0) ? AIS_SOP_NothingSelected | |
540 | : (aSelNum == 1) ? AIS_SOP_OneSelected | |
541 | : AIS_SOP_SeveralSelected; | |
7fd59977 | 542 | |
543 | } | |
544 | ||
545 | //======================================================================= | |
546 | //function : Select | |
547 | //purpose : | |
548 | //======================================================================= | |
c398b00e | 549 | AIS_StatusOfPick AIS_InteractiveContext::Select (const Standard_Boolean toUpdateViewer) |
7fd59977 | 550 | { |
c398b00e | 551 | if (HasOpenedContext()) |
552 | { | |
7fd59977 | 553 | if(myWasLastMain) |
c398b00e | 554 | { |
555 | return myLocalContexts(myCurLocalIndex)->Select (toUpdateViewer); | |
556 | } | |
7fd59977 | 557 | else |
c398b00e | 558 | { |
c3282ec1 | 559 | myLocalContexts(myCurLocalIndex)->SetSelected (Handle(AIS_InteractiveObject)::DownCast (myLastPicked->Selectable()), toUpdateViewer); |
c398b00e | 560 | return AIS_SOP_OneSelected; |
561 | } | |
562 | } | |
563 | ||
731c9b5b | 564 | clearDynamicHighlight(); |
c398b00e | 565 | if (myWasLastMain && !myLastinMain.IsNull()) |
566 | { | |
731c9b5b | 567 | if (!myLastinMain->IsSelected() || myLastinMain->IsForcedHilight()) |
c398b00e | 568 | { |
c3282ec1 | 569 | SetSelected (myLastinMain, Standard_False); |
c398b00e | 570 | if(toUpdateViewer) |
7fd59977 | 571 | { |
c398b00e | 572 | UpdateCurrentViewer(); |
7fd59977 | 573 | } |
c398b00e | 574 | } |
7fd59977 | 575 | } |
c398b00e | 576 | else |
577 | { | |
b4006117 | 578 | unhighlightSelected (Standard_True); |
c398b00e | 579 | |
02974a19 | 580 | mySelection->Clear(); |
c398b00e | 581 | if (toUpdateViewer && myWasLastMain) |
582 | { | |
eb4320f2 | 583 | UpdateCurrentViewer(); |
7fd59977 | 584 | } |
585 | } | |
c398b00e | 586 | |
c3282ec1 | 587 | Standard_Integer aSelNum = NbSelected(); |
c398b00e | 588 | |
589 | return (aSelNum == 0) ? AIS_SOP_NothingSelected | |
590 | : (aSelNum == 1) ? AIS_SOP_OneSelected | |
591 | : AIS_SOP_SeveralSelected; | |
7fd59977 | 592 | } |
593 | ||
594 | //======================================================================= | |
595 | //function : ShiftSelect | |
596 | //purpose : | |
597 | //======================================================================= | |
c398b00e | 598 | AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const Standard_Boolean toUpdateViewer) |
7fd59977 | 599 | { |
c398b00e | 600 | if (HasOpenedContext()) |
601 | { | |
7fd59977 | 602 | if(myWasLastMain) |
c398b00e | 603 | { |
604 | return myLocalContexts (myCurLocalIndex)->ShiftSelect (toUpdateViewer); | |
605 | } | |
606 | else | |
607 | { | |
608 | myLocalContexts (myCurLocalIndex)->AddOrRemoveSelected (myLastPicked, toUpdateViewer); | |
609 | ||
610 | Standard_Integer aSelNum = NbSelected(); | |
611 | return (aSelNum == 0) ? AIS_SOP_NothingSelected | |
612 | : (aSelNum == 1) ? AIS_SOP_OneSelected | |
613 | : AIS_SOP_SeveralSelected; | |
7fd59977 | 614 | } |
615 | } | |
eb4320f2 | 616 | |
731c9b5b | 617 | clearDynamicHighlight(); |
c398b00e | 618 | if (myWasLastMain && !myLastinMain.IsNull()) |
619 | { | |
c3282ec1 | 620 | AddOrRemoveSelected (myLastinMain, toUpdateViewer); |
c398b00e | 621 | } |
7fd59977 | 622 | |
c3282ec1 | 623 | Standard_Integer aSelNum = NbSelected(); |
c398b00e | 624 | |
c3282ec1 | 625 | return (aSelNum == 0) ? AIS_SOP_NothingSelected |
626 | : (aSelNum == 1) ? AIS_SOP_OneSelected | |
627 | : AIS_SOP_SeveralSelected; | |
c398b00e | 628 | } |
7fd59977 | 629 | |
630 | //======================================================================= | |
631 | //function : ShiftSelect | |
632 | //purpose : | |
633 | //======================================================================= | |
c398b00e | 634 | AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const Standard_Integer theXPMin, |
635 | const Standard_Integer theYPMin, | |
636 | const Standard_Integer theXPMax, | |
637 | const Standard_Integer theYPMax, | |
638 | const Handle(V3d_View)& theView, | |
639 | const Standard_Boolean toUpdateViewer) | |
7fd59977 | 640 | { |
c398b00e | 641 | if (HasOpenedContext()) |
642 | { | |
643 | return myLocalContexts(myCurLocalIndex)->ShiftSelect (theXPMin, theYPMin, theXPMax, theYPMax, | |
644 | theView, toUpdateViewer); | |
645 | } | |
646 | ||
c3282ec1 | 647 | UnhilightSelected (Standard_False); |
c398b00e | 648 | |
649 | Handle(StdSelect_ViewerSelector3d) aSelector; | |
650 | if (theView->Viewer() == myMainVwr) | |
651 | { | |
652 | aSelector = myMainSel; | |
653 | myWasLastMain = Standard_True; | |
654 | } | |
7fd59977 | 655 | else |
c398b00e | 656 | { |
7fd59977 | 657 | return AIS_SOP_NothingSelected; |
c398b00e | 658 | } |
659 | ||
660 | aSelector->Pick (theXPMin, theYPMin, theXPMax, theYPMax, theView); | |
aa75c0cf | 661 | for (Standard_Integer aPickIter = 1; aPickIter <= aSelector->NbPicked(); ++aPickIter) |
c398b00e | 662 | { |
aa75c0cf | 663 | const Handle(SelectMgr_EntityOwner) anOwner = aSelector->Picked (aPickIter); |
c3282ec1 | 664 | if (anOwner.IsNull() || !anOwner->HasSelectable() || !myFilters->IsOk (anOwner)) |
665 | continue; | |
666 | ||
016e5959 | 667 | AIS_SelectStatus aSelStatus = mySelection->Select (anOwner); |
f838dac4 | 668 | anOwner->SetSelected (aSelStatus == AIS_SS_Added); |
7fd59977 | 669 | } |
c398b00e | 670 | |
c3282ec1 | 671 | HilightSelected (toUpdateViewer); |
c398b00e | 672 | |
c3282ec1 | 673 | Standard_Integer aSelNum = NbSelected(); |
c398b00e | 674 | |
675 | return (aSelNum == 0) ? AIS_SOP_NothingSelected | |
676 | : (aSelNum == 1) ? AIS_SOP_OneSelected | |
677 | : AIS_SOP_SeveralSelected; | |
678 | ||
7fd59977 | 679 | } |
680 | ||
681 | //======================================================================= | |
682 | //function : ShiftSelect | |
683 | //purpose : | |
684 | //======================================================================= | |
c398b00e | 685 | AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const TColgp_Array1OfPnt2d& thePolyline, |
686 | const Handle(V3d_View)& theView, | |
687 | const Standard_Boolean toUpdateViewer) | |
7fd59977 | 688 | { |
c398b00e | 689 | if (HasOpenedContext()) |
690 | { | |
691 | return myLocalContexts(myCurLocalIndex)->ShiftSelect (thePolyline, theView, toUpdateViewer); | |
692 | } | |
7fd59977 | 693 | |
c3282ec1 | 694 | UnhilightSelected (Standard_False); |
c398b00e | 695 | |
696 | Handle(StdSelect_ViewerSelector3d) aSelector; | |
697 | ||
698 | if (theView->Viewer() == myMainVwr) | |
699 | { | |
700 | aSelector= myMainSel; | |
701 | myWasLastMain = Standard_True; | |
702 | } | |
703 | else | |
704 | { | |
705 | return AIS_SOP_NothingSelected; | |
706 | } | |
707 | ||
708 | aSelector->Pick (thePolyline, theView); | |
aa75c0cf | 709 | for (Standard_Integer aPickIter = 1; aPickIter <= aSelector->NbPicked(); ++aPickIter) |
c398b00e | 710 | { |
aa75c0cf | 711 | const Handle(SelectMgr_EntityOwner) anOwner = aSelector->Picked (aPickIter); |
c3282ec1 | 712 | if (anOwner.IsNull() || !anOwner->HasSelectable() || !myFilters->IsOk (anOwner)) |
713 | continue; | |
714 | ||
016e5959 | 715 | AIS_SelectStatus aSelStatus = mySelection->Select (anOwner); |
f838dac4 | 716 | anOwner->SetSelected (aSelStatus == AIS_SS_Added); |
c398b00e | 717 | } |
718 | ||
c3282ec1 | 719 | HilightSelected (toUpdateViewer); |
c398b00e | 720 | |
c3282ec1 | 721 | Standard_Integer aSelNum = NbSelected(); |
c398b00e | 722 | |
723 | return (aSelNum == 0) ? AIS_SOP_NothingSelected | |
724 | : (aSelNum == 1) ? AIS_SOP_OneSelected | |
725 | : AIS_SOP_SeveralSelected; | |
7fd59977 | 726 | } |
727 | ||
728 | //======================================================================= | |
729 | //function : SetCurrentObject | |
c3282ec1 | 730 | //purpose : OBSOLETE, please use SetSelected() instead |
731 | //TODO : Remove in process of local context deletion | |
7fd59977 | 732 | //======================================================================= |
c3282ec1 | 733 | void AIS_InteractiveContext::SetCurrentObject (const Handle(AIS_InteractiveObject)& theObject, |
734 | const Standard_Boolean theToUpdateViewer) | |
7fd59977 | 735 | { |
c3282ec1 | 736 | if (HasOpenedContext()) |
7fd59977 | 737 | return; |
7fd59977 | 738 | |
c3282ec1 | 739 | SetSelected (theObject, theToUpdateViewer); |
7fd59977 | 740 | } |
741 | ||
742 | //======================================================================= | |
743 | //function : AddOrRemoveCurrentObject | |
c3282ec1 | 744 | //purpose : OBSOLETE, please use AddOrRemoveSelected() instead |
745 | //TODO : Remove in process of local context deletion | |
7fd59977 | 746 | //======================================================================= |
c3282ec1 | 747 | void AIS_InteractiveContext::AddOrRemoveCurrentObject (const Handle(AIS_InteractiveObject)& theObj, |
748 | const Standard_Boolean theIsToUpdateViewer) | |
7fd59977 | 749 | { |
c3282ec1 | 750 | if (HasOpenedContext()) |
751 | return; | |
7fd59977 | 752 | |
c3282ec1 | 753 | AddOrRemoveSelected (theObj, theIsToUpdateViewer); |
7fd59977 | 754 | } |
755 | //======================================================================= | |
756 | //function : UpdateCurrent | |
c3282ec1 | 757 | //purpose : OBSOLETE, please use UpdateSelected() instead |
758 | //TODO : Remove in process of local context deletion | |
7fd59977 | 759 | //======================================================================= |
7fd59977 | 760 | void AIS_InteractiveContext::UpdateCurrent() |
761 | { | |
0577ae8c | 762 | UpdateSelected (Standard_True); |
7fd59977 | 763 | } |
764 | ||
765 | //======================================================================= | |
766 | //function : IsCurrent | |
c3282ec1 | 767 | //purpose : OBSOLETE, please use IsSelected() instead |
768 | //TODO : Remove in process of local context deletion | |
7fd59977 | 769 | //======================================================================= |
c3282ec1 | 770 | Standard_Boolean AIS_InteractiveContext::IsCurrent (const Handle(AIS_InteractiveObject)& theObject) const |
7fd59977 | 771 | { |
c3282ec1 | 772 | return IsSelected (theObject); |
7fd59977 | 773 | } |
774 | ||
775 | //======================================================================= | |
776 | //function : InitCurrent | |
c3282ec1 | 777 | //purpose : OBSOLETE, please use InitSelected() instead |
778 | //TODO : Remove in process of local context deletion | |
7fd59977 | 779 | //======================================================================= |
7fd59977 | 780 | void AIS_InteractiveContext::InitCurrent() |
781 | { | |
c3282ec1 | 782 | if (HasOpenedContext()) |
783 | return; | |
784 | ||
785 | InitSelected(); | |
7fd59977 | 786 | } |
787 | ||
788 | //======================================================================= | |
789 | //function : MoreCurrent | |
c3282ec1 | 790 | //purpose : OBSOLETE, please use MoreSelected() instead |
791 | //TODO : Remove in process of local context deletion | |
7fd59977 | 792 | //======================================================================= |
7fd59977 | 793 | Standard_Boolean AIS_InteractiveContext::MoreCurrent() const |
794 | { | |
c3282ec1 | 795 | return !HasOpenedContext() && MoreSelected(); |
7fd59977 | 796 | } |
797 | ||
798 | //======================================================================= | |
799 | //function : NextCurrent | |
c3282ec1 | 800 | //purpose : OBSOLETE, please use NextSelected() instead |
801 | //TODO : Remove in process of local context deletion | |
7fd59977 | 802 | //======================================================================= |
7fd59977 | 803 | void AIS_InteractiveContext::NextCurrent() |
804 | { | |
c3282ec1 | 805 | if (HasOpenedContext()) |
806 | return; | |
807 | ||
808 | NextSelected(); | |
7fd59977 | 809 | } |
810 | ||
811 | //======================================================================= | |
812 | //function : Current | |
c3282ec1 | 813 | //purpose : OBSOLETE, please use SelectedInteractive() instead |
814 | //TODO : Remove in process of local context deletion | |
7fd59977 | 815 | //======================================================================= |
7fd59977 | 816 | Handle(AIS_InteractiveObject) AIS_InteractiveContext::Current() const |
817 | { | |
c3282ec1 | 818 | return HasOpenedContext() ? NULL : SelectedInteractive(); |
7fd59977 | 819 | } |
820 | ||
821 | //======================================================================= | |
822 | //function : NbCurrents | |
c3282ec1 | 823 | //purpose : OBSOLETE, please use NbSelected() instead |
824 | //TODO : Remove in process of local context deletion | |
7fd59977 | 825 | //======================================================================= |
826 | Standard_Integer AIS_InteractiveContext::NbCurrents() | |
827 | { | |
c3282ec1 | 828 | return HasOpenedContext() ? -1 : NbSelected(); |
7fd59977 | 829 | } |
830 | ||
831 | //======================================================================= | |
832 | //function : HilightCurrents | |
c3282ec1 | 833 | //purpose : OBSOLETE, please use HilightSelected() instead |
834 | //TODO : Remove in process of local context deletion | |
7fd59977 | 835 | //======================================================================= |
c3282ec1 | 836 | void AIS_InteractiveContext::HilightCurrents (const Standard_Boolean theToUpdateViewer) |
7fd59977 | 837 | { |
c3282ec1 | 838 | if (HasOpenedContext()) |
839 | return; | |
840 | ||
841 | HilightSelected (theToUpdateViewer); | |
7fd59977 | 842 | } |
843 | ||
844 | //======================================================================= | |
845 | //function : UnhilightCurrents | |
c3282ec1 | 846 | //purpose : OBSOLETE, please use UnhilightSelected() instead |
847 | //TODO : Remove in process of local context deletion | |
7fd59977 | 848 | //======================================================================= |
c3282ec1 | 849 | void AIS_InteractiveContext::UnhilightCurrents (const Standard_Boolean theToUpdateViewer) |
7fd59977 | 850 | { |
c3282ec1 | 851 | if (HasOpenedContext()) |
852 | return; | |
853 | ||
854 | UnhilightSelected (theToUpdateViewer); | |
7fd59977 | 855 | } |
856 | ||
857 | //======================================================================= | |
858 | //function : ClearCurrents | |
c3282ec1 | 859 | //purpose : OBSOLETE, please use ClearCurrents() instead |
860 | //TODO : Remove in process of local context deletion | |
7fd59977 | 861 | //======================================================================= |
c3282ec1 | 862 | void AIS_InteractiveContext::ClearCurrents(const Standard_Boolean theToUpdateViewer) |
7fd59977 | 863 | { |
c3282ec1 | 864 | if (HasOpenedContext()) |
865 | return; | |
866 | ||
867 | ClearSelected (theToUpdateViewer); | |
7fd59977 | 868 | } |
869 | ||
870 | ||
871 | //======================================================================= | |
872 | //function : HilightSelected | |
c3282ec1 | 873 | //purpose : |
7fd59977 | 874 | //======================================================================= |
c3282ec1 | 875 | void AIS_InteractiveContext::HilightSelected (const Standard_Boolean theToUpdateViewer) |
7fd59977 | 876 | { |
c3282ec1 | 877 | if (HasOpenedContext()) |
878 | { | |
879 | return myLocalContexts (myCurLocalIndex)->HilightPicked (theToUpdateViewer); | |
880 | } | |
881 | ||
882 | // In case of selection without using local context | |
731c9b5b | 883 | clearDynamicHighlight(); |
c3282ec1 | 884 | AIS_MapOfObjSelectedOwners anObjOwnerMap; |
02974a19 | 885 | for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next()) |
c3282ec1 | 886 | { |
02974a19 | 887 | const Handle(SelectMgr_EntityOwner) anOwner = aSelIter.Value(); |
888 | const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable()); | |
f838dac4 | 889 | const Handle(Prs3d_Drawer)& anObjSelStyle = getSelStyle (anObj, anOwner); |
890 | Handle(AIS_GlobalStatus)& aState = myObjects.ChangeFind(anObj); | |
02974a19 | 891 | if (anOwner == anObj->GlobalSelOwner()) |
c3282ec1 | 892 | { |
02974a19 | 893 | aState->SetHilightStatus (Standard_True); |
8e5fb5ea | 894 | aState->SetHilightStyle (anObjSelStyle); |
02974a19 | 895 | } |
f838dac4 | 896 | anOwner->SetSelected (Standard_True); |
02974a19 | 897 | if (!anOwner->IsAutoHilight()) |
898 | { | |
899 | NCollection_Handle<SelectMgr_SequenceOfOwner> aSeq; | |
900 | if (anObjOwnerMap.Find (anObj, aSeq)) | |
c3282ec1 | 901 | { |
02974a19 | 902 | aSeq->Append (anOwner); |
c3282ec1 | 903 | } |
904 | else | |
905 | { | |
02974a19 | 906 | aSeq = new SelectMgr_SequenceOfOwner(); |
907 | aSeq->Append (anOwner); | |
908 | anObjOwnerMap.Bind (anObj, aSeq); | |
c3282ec1 | 909 | } |
7fd59977 | 910 | } |
02974a19 | 911 | else |
912 | { | |
f838dac4 | 913 | const Standard_Integer aHiMode = getHilightMode (anObj, anObjSelStyle, aState->DisplayMode()); |
8e5fb5ea | 914 | anOwner->HilightWithColor (myMainPM, anObjSelStyle, aHiMode); |
02974a19 | 915 | } |
7fd59977 | 916 | } |
c3282ec1 | 917 | |
918 | if (!anObjOwnerMap.IsEmpty()) | |
919 | { | |
920 | for (AIS_MapOfObjSelectedOwners::Iterator anIter (anObjOwnerMap); anIter.More(); anIter.Next()) | |
7fd59977 | 921 | { |
c3282ec1 | 922 | anIter.Key()->HilightSelected (myMainPM, *anIter.Value()); |
7fd59977 | 923 | } |
c3282ec1 | 924 | anObjOwnerMap.Clear(); |
925 | } | |
926 | ||
927 | if (theToUpdateViewer) | |
7fd59977 | 928 | UpdateCurrentViewer(); |
929 | } | |
930 | ||
931 | //======================================================================= | |
932 | //function : UnhilightSelected | |
c3282ec1 | 933 | //purpose : |
7fd59977 | 934 | //======================================================================= |
c3282ec1 | 935 | void AIS_InteractiveContext::UnhilightSelected (const Standard_Boolean theToUpdateViewer) |
7fd59977 | 936 | { |
c3282ec1 | 937 | if (HasOpenedContext()) |
938 | { | |
939 | return myLocalContexts (myCurLocalIndex)->UnhilightPicked (theToUpdateViewer); | |
7fd59977 | 940 | } |
c3282ec1 | 941 | |
02974a19 | 942 | for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next()) |
c3282ec1 | 943 | { |
02974a19 | 944 | const Handle(SelectMgr_EntityOwner) anOwner = aSelIter.Value(); |
945 | const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable()); | |
946 | if (anOwner == anObj->GlobalSelOwner()) | |
7fd59977 | 947 | { |
02974a19 | 948 | myObjects.ChangeFind (anObj)->SetHilightStatus (Standard_False); |
7fd59977 | 949 | } |
02974a19 | 950 | |
f838dac4 | 951 | anOwner->SetSelected (Standard_False); |
952 | anOwner->Unhilight (myMainPM); | |
c3282ec1 | 953 | } |
954 | ||
955 | if (theToUpdateViewer) | |
956 | UpdateCurrentViewer(); | |
7fd59977 | 957 | } |
958 | ||
959 | ||
960 | //======================================================================= | |
961 | //function : ClearSelected | |
c3282ec1 | 962 | //purpose : |
7fd59977 | 963 | //======================================================================= |
c3282ec1 | 964 | void AIS_InteractiveContext::ClearSelected (const Standard_Boolean theToUpdateViewer) |
7fd59977 | 965 | { |
c3282ec1 | 966 | if (HasOpenedContext()) |
967 | return myLocalContexts (myCurLocalIndex)->ClearSelected (theToUpdateViewer); | |
7fd59977 | 968 | |
c3282ec1 | 969 | if (NbSelected() == 0) |
970 | return; | |
7fd59977 | 971 | |
b4006117 | 972 | unhighlightSelected(); |
7fd59977 | 973 | |
02974a19 | 974 | mySelection->Clear(); |
731c9b5b | 975 | clearDynamicHighlight(); |
7fd59977 | 976 | |
c3282ec1 | 977 | if (theToUpdateViewer) |
978 | UpdateCurrentViewer(); | |
7fd59977 | 979 | } |
980 | ||
981 | //======================================================================= | |
c3282ec1 | 982 | //function : UpdateSelected |
983 | //purpose : | |
7fd59977 | 984 | //======================================================================= |
c3282ec1 | 985 | void AIS_InteractiveContext::UpdateSelected (const Standard_Boolean theToUpdateViewer) |
986 | { | |
987 | if (HasOpenedContext()) | |
988 | { | |
989 | return myLocalContexts(myCurLocalIndex)->UpdateSelected (theToUpdateViewer); | |
990 | } | |
7fd59977 | 991 | |
c3282ec1 | 992 | HilightSelected (theToUpdateViewer); |
993 | } | |
994 | ||
995 | //======================================================================= | |
996 | //function : SetSelected | |
997 | //purpose : Sets the whole object as selected and highlights it with selection color | |
998 | //======================================================================= | |
999 | void AIS_InteractiveContext::SetSelected (const Handle(AIS_InteractiveObject)& theObject, | |
1000 | const Standard_Boolean theToUpdateViewer) | |
7fd59977 | 1001 | { |
f838dac4 | 1002 | if (HasOpenedContext()) |
c3282ec1 | 1003 | { |
1004 | return myLocalContexts (myCurLocalIndex)->SetSelected (theObject, theToUpdateViewer); | |
1005 | } | |
1006 | ||
1007 | if (theObject.IsNull()) | |
f838dac4 | 1008 | { |
7fd59977 | 1009 | return; |
f838dac4 | 1010 | } |
1011 | ||
1012 | if (!myObjects.IsBound (theObject)) | |
1013 | { | |
c3282ec1 | 1014 | Display (theObject, Standard_False); |
f838dac4 | 1015 | } |
0d5880e1 | 1016 | if (!theObject->HasSelection (theObject->GlobalSelectionMode())) |
f838dac4 | 1017 | { |
c3282ec1 | 1018 | return; |
f838dac4 | 1019 | } |
1020 | Handle(SelectMgr_EntityOwner) anOwner = theObject->GlobalSelOwner(); | |
1021 | if (anOwner.IsNull()) | |
1022 | { | |
1023 | return; | |
1024 | } | |
c3282ec1 | 1025 | |
f838dac4 | 1026 | const Handle(Prs3d_Drawer)& anObjSelStyle = getSelStyle (theObject, anOwner); |
e1b01c73 | 1027 | if (NbSelected() == 1 && myObjects (theObject)->IsHilighted()) |
c3282ec1 | 1028 | { |
f838dac4 | 1029 | Handle(Prs3d_Drawer) aCustomStyle; |
8e5fb5ea | 1030 | if (HighlightStyle (theObject, aCustomStyle)) |
c3282ec1 | 1031 | { |
8e5fb5ea | 1032 | if (!aCustomStyle.IsNull() && anObjSelStyle != aCustomStyle) |
c3282ec1 | 1033 | { |
8e5fb5ea | 1034 | HilightWithColor (theObject, anObjSelStyle, theToUpdateViewer); |
c3282ec1 | 1035 | } |
1036 | } | |
1037 | return; | |
1038 | } | |
1039 | ||
016e5959 | 1040 | for (mySelection->Init(); mySelection->More(); mySelection->Next()) |
c3282ec1 | 1041 | { |
f838dac4 | 1042 | const Handle(SelectMgr_EntityOwner) aSelOwner = mySelection->Value(); |
1043 | if (!myFilters->IsOk (aSelOwner)) | |
02974a19 | 1044 | { |
c3282ec1 | 1045 | continue; |
02974a19 | 1046 | } |
c3282ec1 | 1047 | |
f838dac4 | 1048 | Handle(AIS_InteractiveObject) aSelectable = Handle(AIS_InteractiveObject)::DownCast (aSelOwner->Selectable()); |
c3282ec1 | 1049 | Unhilight (aSelectable, Standard_False); |
f838dac4 | 1050 | aSelOwner->SetSelected (Standard_False); |
1051 | if (aSelOwner == aSelectable->GlobalSelOwner()) | |
e1b01c73 | 1052 | { |
1053 | myObjects.ChangeFind (aSelectable)->SetHilightStatus (Standard_False); | |
1054 | } | |
c3282ec1 | 1055 | } |
1056 | ||
1057 | // added to avoid untimely viewer update... | |
016e5959 | 1058 | mySelection->ClearAndSelect (anOwner); |
0d5880e1 | 1059 | |
f838dac4 | 1060 | Handle(Prs3d_Drawer) aCustomStyle; |
8e5fb5ea | 1061 | if (HighlightStyle (theObject, aCustomStyle)) |
c3282ec1 | 1062 | { |
8e5fb5ea | 1063 | if (!aCustomStyle.IsNull() && anObjSelStyle != aCustomStyle) |
c3282ec1 | 1064 | { |
8e5fb5ea | 1065 | HilightWithColor (theObject, anObjSelStyle, Standard_False); |
c3282ec1 | 1066 | } |
7fd59977 | 1067 | } |
c3282ec1 | 1068 | else |
1069 | { | |
8e5fb5ea | 1070 | HilightWithColor (theObject, anObjSelStyle, Standard_False); |
c3282ec1 | 1071 | } |
f838dac4 | 1072 | anOwner->SetSelected (Standard_True); |
c3282ec1 | 1073 | |
1074 | if (theToUpdateViewer) | |
1075 | UpdateCurrentViewer(); | |
7fd59977 | 1076 | } |
1077 | ||
1078 | //======================================================================= | |
c3282ec1 | 1079 | //function : SetSelected |
1080 | //purpose : Sets the whole object as selected and highlights it with selection color | |
7fd59977 | 1081 | //======================================================================= |
c3282ec1 | 1082 | void AIS_InteractiveContext::SetSelected (const Handle(SelectMgr_EntityOwner)& theOwner, |
1083 | const Standard_Boolean theToUpdateViewer) | |
7fd59977 | 1084 | { |
b4006117 | 1085 | if (theOwner.IsNull() || !theOwner->HasSelectable() || !myFilters->IsOk (theOwner)) |
c3282ec1 | 1086 | return; |
1087 | ||
f838dac4 | 1088 | const Handle(AIS_InteractiveObject) anObject = Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable()); |
1089 | const Handle(Prs3d_Drawer)& anObjSelStyle = getSelStyle (anObject, theOwner); | |
731c9b5b | 1090 | if (NbSelected() == 1 && theOwner->IsSelected() && !theOwner->IsForcedHilight()) |
c3282ec1 | 1091 | { |
f838dac4 | 1092 | Handle(Prs3d_Drawer) aCustomStyle; |
8e5fb5ea | 1093 | if (HighlightStyle (theOwner, aCustomStyle)) |
c3282ec1 | 1094 | { |
8e5fb5ea | 1095 | if (!aCustomStyle.IsNull() && anObjSelStyle != aCustomStyle) |
c3282ec1 | 1096 | { |
1097 | const Standard_Integer aHiMode = anObject->HasHilightMode() ? anObject->HilightMode() : 0; | |
8e5fb5ea | 1098 | theOwner->HilightWithColor (myMainPM, anObjSelStyle, aHiMode); |
c3282ec1 | 1099 | } |
1100 | } | |
1101 | return; | |
1102 | } | |
1103 | ||
1104 | if (!myObjects.IsBound (anObject)) | |
1105 | Display (anObject, Standard_False); | |
1106 | ||
b4006117 | 1107 | unhighlightSelected(); |
c3282ec1 | 1108 | |
016e5959 | 1109 | mySelection->ClearAndSelect (theOwner); |
f838dac4 | 1110 | Handle(Prs3d_Drawer) aCustomStyle; |
8e5fb5ea | 1111 | if (!HighlightStyle (theOwner, aCustomStyle) || |
1112 | (!aCustomStyle.IsNull() && aCustomStyle != anObjSelStyle)) | |
c3282ec1 | 1113 | { |
f838dac4 | 1114 | theOwner->SetSelected (Standard_True); |
8e5fb5ea | 1115 | highlightSelected (theOwner); |
c3282ec1 | 1116 | } |
1117 | ||
f838dac4 | 1118 | theOwner->SetSelected (Standard_True); |
e1b01c73 | 1119 | if (theOwner == anObject->GlobalSelOwner()) |
1120 | { | |
1121 | Handle(AIS_GlobalStatus)& aState = myObjects.ChangeFind (anObject); | |
1122 | aState->SetHilightStatus (Standard_True); | |
8e5fb5ea | 1123 | aState->SetHilightStyle (anObjSelStyle); |
e1b01c73 | 1124 | } |
1125 | ||
c3282ec1 | 1126 | if (theToUpdateViewer) |
1127 | UpdateCurrentViewer(); | |
7fd59977 | 1128 | } |
1129 | ||
1130 | //======================================================================= | |
1131 | //function : AddOrRemoveSelected | |
c3282ec1 | 1132 | //purpose : Adds or removes current object from AIS selection and highlights/unhighlights it. |
1133 | // Since this method makes sence only for neutral point selection of a whole object, | |
1134 | // if 0 selection of the object is empty this method simply does nothing. | |
7fd59977 | 1135 | //======================================================================= |
c3282ec1 | 1136 | void AIS_InteractiveContext::AddOrRemoveSelected (const Handle(AIS_InteractiveObject)& theObject, |
1137 | const Standard_Boolean theToUpdateViewer) | |
7fd59977 | 1138 | { |
95081657 | 1139 | if (theObject.IsNull()) |
1140 | return; | |
c3282ec1 | 1141 | |
1142 | if (HasOpenedContext()) | |
1143 | return myLocalContexts (myCurLocalIndex)->AddOrRemoveSelected (theObject, theToUpdateViewer); | |
1144 | ||
95081657 | 1145 | const Standard_Integer aGlobalSelMode = theObject->GlobalSelectionMode(); |
1146 | if (!myObjects.IsBound (theObject) || !theObject->HasSelection (aGlobalSelMode)) | |
c3282ec1 | 1147 | return; |
1148 | ||
2ec85268 | 1149 | setContextToObject (theObject); |
7411850a | 1150 | const Handle(SelectMgr_EntityOwner) anOwner = theObject->GlobalSelOwner(); |
c3282ec1 | 1151 | |
1152 | if (anOwner.IsNull() || !anOwner->HasSelectable()) | |
1153 | return; | |
1154 | ||
1155 | AddOrRemoveSelected (anOwner, theToUpdateViewer); | |
7fd59977 | 1156 | } |
1157 | //======================================================================= | |
1158 | //function : AddOrRemoveSelected | |
1159 | //purpose : | |
1160 | //======================================================================= | |
1161 | ||
c3282ec1 | 1162 | void AIS_InteractiveContext::AddOrRemoveSelected (const TopoDS_Shape& aShap, |
7fd59977 | 1163 | const Standard_Boolean updateviewer) |
1164 | { | |
1165 | if(!HasOpenedContext()) { | |
0797d9d3 | 1166 | #ifdef OCCT_DEBUG |
7fd59977 | 1167 | cout<<" Attempt to remove a selected shape with no opened local context"<<endl; |
1168 | #endif | |
1169 | return; | |
1170 | } | |
1171 | ||
1172 | myLocalContexts(myCurLocalIndex)->AddOrRemoveSelected(aShap,updateviewer); | |
1173 | if(updateviewer) UpdateCurrentViewer(); | |
1174 | ||
1175 | } | |
c3282ec1 | 1176 | |
7fd59977 | 1177 | //======================================================================= |
1178 | //function : AddOrRemoveSelected | |
c3282ec1 | 1179 | //purpose : Allows to highlight or unhighlight the owner given depending on |
1180 | // its selection status | |
7fd59977 | 1181 | //======================================================================= |
c3282ec1 | 1182 | void AIS_InteractiveContext::AddOrRemoveSelected (const Handle(SelectMgr_EntityOwner)& theOwner, |
1183 | const Standard_Boolean theToUpdateViewer) | |
1184 | { | |
1185 | if (HasOpenedContext()) | |
1186 | return myLocalContexts(myCurLocalIndex)->AddOrRemoveSelected (theOwner, theToUpdateViewer); | |
7fd59977 | 1187 | |
c3282ec1 | 1188 | if (theOwner.IsNull() || !theOwner->HasSelectable()) |
7fd59977 | 1189 | return; |
c3282ec1 | 1190 | |
4d901cde | 1191 | if (!myFilters->IsOk(theOwner) && !theOwner->IsSelected()) |
1192 | return; | |
1193 | ||
016e5959 | 1194 | AIS_SelectStatus aSelStat = mySelection->Select (theOwner); |
f838dac4 | 1195 | theOwner->SetSelected (aSelStat == AIS_SS_Added); |
c3282ec1 | 1196 | const Handle(AIS_InteractiveObject) anObj = |
1197 | Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable()); | |
1198 | const Standard_Boolean isGlobal = anObj->GlobalSelOwner() == theOwner; | |
e1b01c73 | 1199 | Handle(AIS_GlobalStatus)& aStatus = myObjects.ChangeFind (anObj); |
f838dac4 | 1200 | if (theOwner->IsSelected()) |
c3282ec1 | 1201 | { |
8e5fb5ea | 1202 | highlightSelected (theOwner); |
c3282ec1 | 1203 | if (isGlobal) |
1204 | { | |
1205 | aStatus->SetHilightStatus (Standard_True); | |
f838dac4 | 1206 | aStatus->SetHilightStyle (getSelStyle (anObj, theOwner)); |
c3282ec1 | 1207 | } |
1208 | } | |
1209 | else | |
1210 | { | |
1211 | if (theOwner->IsAutoHilight()) | |
f838dac4 | 1212 | { |
1213 | theOwner->Unhilight (myMainPM); | |
1214 | } | |
c3282ec1 | 1215 | else |
f838dac4 | 1216 | { |
c3282ec1 | 1217 | anObj->ClearSelected(); |
f838dac4 | 1218 | } |
c3282ec1 | 1219 | aStatus->SetHilightStatus (Standard_False); |
f838dac4 | 1220 | aStatus->SetHilightStyle (Handle(Prs3d_Drawer)()); |
7fd59977 | 1221 | } |
7fd59977 | 1222 | |
c3282ec1 | 1223 | if (theToUpdateViewer) |
1224 | UpdateCurrentViewer(); | |
1225 | } | |
7fd59977 | 1226 | |
1227 | ||
1228 | //======================================================================= | |
1229 | //function : IsSelected | |
c3282ec1 | 1230 | //purpose : |
7fd59977 | 1231 | //======================================================================= |
c3282ec1 | 1232 | Standard_Boolean AIS_InteractiveContext::IsSelected (const Handle(AIS_InteractiveObject)& theObj) const |
7fd59977 | 1233 | { |
c3282ec1 | 1234 | if(HasOpenedContext()) |
1235 | return myLocalContexts(myCurLocalIndex)->IsSelected (theObj); | |
1236 | ||
1237 | if (theObj.IsNull() || !myObjects.IsBound (theObj)) | |
1238 | return Standard_False; | |
1239 | ||
1240 | const Standard_Integer aGlobalSelMode = theObj->GlobalSelectionMode(); | |
1241 | const TColStd_ListOfInteger& anActivatedModes = myObjects (theObj)->SelectionModes(); | |
1242 | Standard_Boolean isGlobalModeActivated = Standard_False; | |
1243 | for (TColStd_ListIteratorOfListOfInteger aModeIter (anActivatedModes); aModeIter.More(); aModeIter.Next()) | |
1244 | { | |
1245 | if (aModeIter.Value() == aGlobalSelMode) | |
1246 | { | |
1247 | isGlobalModeActivated = Standard_True; | |
1248 | break; | |
1249 | } | |
1250 | } | |
95081657 | 1251 | if (!theObj->HasSelection (aGlobalSelMode) || !isGlobalModeActivated || theObj->GlobalSelOwner().IsNull()) |
c3282ec1 | 1252 | return Standard_False; |
1253 | ||
f838dac4 | 1254 | return theObj->GlobalSelOwner()->IsSelected(); |
7fd59977 | 1255 | } |
1256 | ||
c3282ec1 | 1257 | //======================================================================= |
1258 | //function : IsSelected | |
1259 | //purpose : Returns true is the owner given is selected | |
1260 | //======================================================================= | |
1261 | Standard_Boolean AIS_InteractiveContext::IsSelected (const Handle(SelectMgr_EntityOwner)& theOwner) const | |
1262 | { | |
1263 | if (HasOpenedContext()) | |
1264 | return myLocalContexts(myCurLocalIndex)->IsSelected (theOwner); | |
1265 | ||
1266 | if (theOwner.IsNull()) | |
1267 | return Standard_False; | |
1268 | ||
1269 | return theOwner->IsSelected(); | |
1270 | } | |
7fd59977 | 1271 | |
1272 | //======================================================================= | |
1273 | //function : InitSelected | |
c3282ec1 | 1274 | //purpose : |
7fd59977 | 1275 | //======================================================================= |
7fd59977 | 1276 | void AIS_InteractiveContext::InitSelected() |
1277 | { | |
c3282ec1 | 1278 | if (HasOpenedContext()) |
1279 | { | |
1280 | myLocalContexts (myCurLocalIndex)->InitSelected(); | |
1281 | return; | |
1282 | } | |
1283 | ||
016e5959 | 1284 | mySelection->Init(); |
7fd59977 | 1285 | } |
1286 | ||
1287 | //======================================================================= | |
1288 | //function : MoreSelected | |
c3282ec1 | 1289 | //purpose : |
7fd59977 | 1290 | //======================================================================= |
c3282ec1 | 1291 | Standard_Boolean AIS_InteractiveContext::MoreSelected() const |
7fd59977 | 1292 | { |
c3282ec1 | 1293 | if (HasOpenedContext()) |
1294 | return myLocalContexts (myCurLocalIndex)->MoreSelected(); | |
1295 | ||
016e5959 | 1296 | return mySelection->More(); |
7fd59977 | 1297 | } |
1298 | ||
1299 | //======================================================================= | |
1300 | //function : NextSelected | |
c3282ec1 | 1301 | //purpose : |
7fd59977 | 1302 | //======================================================================= |
7fd59977 | 1303 | void AIS_InteractiveContext::NextSelected() |
1304 | { | |
c3282ec1 | 1305 | if(HasOpenedContext()) |
1306 | { | |
1307 | return myLocalContexts (myCurLocalIndex)->NextSelected(); | |
c3282ec1 | 1308 | } |
1309 | ||
016e5959 | 1310 | mySelection->Next(); |
7fd59977 | 1311 | } |
1312 | ||
1313 | //======================================================================= | |
1314 | //function : HasSelectedShape | |
c3282ec1 | 1315 | //purpose : |
7fd59977 | 1316 | //======================================================================= |
c3282ec1 | 1317 | Standard_Boolean AIS_InteractiveContext::HasSelectedShape() const |
7fd59977 | 1318 | { |
c3282ec1 | 1319 | if(HasOpenedContext()) |
1320 | { | |
1321 | return myLocalContexts(myCurLocalIndex)->HasSelectedShape(); | |
7fd59977 | 1322 | } |
4aaadad7 SS |
1323 | if (!mySelection->More()) |
1324 | return Standard_False; | |
1325 | ||
1326 | const Handle(StdSelect_BRepOwner) anOwner = | |
1327 | Handle(StdSelect_BRepOwner)::DownCast (mySelection->Value()); | |
c3282ec1 | 1328 | |
4aaadad7 | 1329 | return !anOwner.IsNull() && anOwner->HasShape(); |
7fd59977 | 1330 | } |
1331 | ||
1332 | //======================================================================= | |
1333 | //function : SelectedShape | |
c3282ec1 | 1334 | //purpose : |
7fd59977 | 1335 | //======================================================================= |
c3282ec1 | 1336 | TopoDS_Shape AIS_InteractiveContext::SelectedShape() const |
7fd59977 | 1337 | { |
c3282ec1 | 1338 | if (HasOpenedContext()) |
0717ddc1 | 1339 | { |
1340 | return myLocalContexts (myCurLocalIndex)->SelectedShape(); | |
1341 | } | |
7fd59977 | 1342 | |
02974a19 | 1343 | if (!mySelection->More()) |
c3282ec1 | 1344 | return TopoDS_Shape(); |
7fd59977 | 1345 | |
c3282ec1 | 1346 | const Handle(StdSelect_BRepOwner) anOwner = |
016e5959 | 1347 | Handle(StdSelect_BRepOwner)::DownCast (mySelection->Value()); |
3475df12 | 1348 | if (anOwner.IsNull() || !anOwner->HasSelectable()) |
c3282ec1 | 1349 | return TopoDS_Shape(); |
1350 | ||
1351 | return anOwner->Shape().Located (anOwner->Location() * anOwner->Shape().Location()); | |
7fd59977 | 1352 | } |
1353 | ||
c3282ec1 | 1354 | //======================================================================= |
1355 | //function : SelectedInteractive | |
1356 | //purpose : | |
1357 | //======================================================================= | |
7fd59977 | 1358 | Handle(AIS_InteractiveObject) AIS_InteractiveContext::SelectedInteractive() const |
1359 | { | |
c3282ec1 | 1360 | if (HasOpenedContext()) |
1361 | { | |
1362 | return myLocalContexts(myCurLocalIndex)->SelectedInteractive(); | |
1363 | } | |
1364 | ||
02974a19 | 1365 | return !mySelection->More() |
1366 | ? Handle(AIS_InteractiveObject)() | |
1367 | : Handle(AIS_InteractiveObject)::DownCast (mySelection->Value()->Selectable()); | |
7fd59977 | 1368 | } |
1369 | //======================================================================= | |
c3282ec1 | 1370 | //function : SelectedOwner |
1371 | //purpose : | |
7fd59977 | 1372 | //======================================================================= |
c3282ec1 | 1373 | Handle(SelectMgr_EntityOwner) AIS_InteractiveContext::SelectedOwner() const |
7fd59977 | 1374 | { |
c3282ec1 | 1375 | if(HasOpenedContext()) |
1376 | { | |
1377 | return myLocalContexts(myCurLocalIndex)->SelectedOwner(); | |
7fd59977 | 1378 | } |
c3282ec1 | 1379 | |
02974a19 | 1380 | return !mySelection->More() |
1381 | ? Handle(SelectMgr_EntityOwner)() | |
1382 | : mySelection->Value(); | |
7fd59977 | 1383 | } |
1384 | ||
1385 | //======================================================================= | |
1386 | //function : EntityOwners | |
1387 | //purpose : | |
1388 | //======================================================================= | |
b586500b | 1389 | void AIS_InteractiveContext::EntityOwners(Handle(SelectMgr_IndexedMapOfOwner)& theOwners, |
7fd59977 | 1390 | const Handle(AIS_InteractiveObject)& theIObj, |
1391 | const Standard_Integer theMode) const | |
1392 | { | |
1393 | if ( theIObj.IsNull() ) | |
1394 | return; | |
1395 | ||
1396 | TColStd_ListOfInteger aModes; | |
1397 | if ( theMode == -1 ) | |
1398 | ActivatedModes( theIObj, aModes ); | |
1399 | else | |
1400 | aModes.Append( theMode ); | |
1401 | ||
b586500b | 1402 | if (theOwners.IsNull()) |
1403 | theOwners = new SelectMgr_IndexedMapOfOwner(); | |
1404 | ||
7fd59977 | 1405 | TColStd_ListIteratorOfListOfInteger anItr( aModes ); |
1406 | for (; anItr.More(); anItr.Next() ) | |
1407 | { | |
1408 | int aMode = anItr.Value(); | |
1409 | if ( !theIObj->HasSelection( aMode ) ) | |
1410 | continue; | |
1411 | ||
f751596e | 1412 | Handle(SelectMgr_Selection) aSel = theIObj->Selection(aMode); |
7fd59977 | 1413 | |
1414 | for ( aSel->Init(); aSel->More(); aSel->Next() ) | |
1415 | { | |
f751596e | 1416 | Handle(SelectBasics_SensitiveEntity) aEntity = aSel->Sensitive()->BaseSensitive(); |
7fd59977 | 1417 | if ( aEntity.IsNull() ) |
1418 | continue; | |
1419 | ||
1420 | Handle(SelectMgr_EntityOwner) aOwner = | |
1421 | Handle(SelectMgr_EntityOwner)::DownCast(aEntity->OwnerId()); | |
1422 | if ( !aOwner.IsNull() ) | |
b586500b | 1423 | theOwners->Add( aOwner ); |
7fd59977 | 1424 | } |
1425 | } | |
1426 | } | |
1427 | ||
c3282ec1 | 1428 | //======================================================================= |
1429 | //function : NbSelected | |
1430 | //purpose : | |
1431 | //======================================================================= | |
1432 | Standard_Integer AIS_InteractiveContext::NbSelected() | |
7fd59977 | 1433 | { |
c3282ec1 | 1434 | Standard_Integer aNbSelected = 0; |
1435 | for (InitSelected(); MoreSelected(); NextSelected()) | |
1436 | { | |
1437 | aNbSelected++; | |
1438 | } | |
1439 | ||
1440 | return aNbSelected; | |
7fd59977 | 1441 | } |
1442 | ||
1443 | //======================================================================= | |
1444 | //function : HasApplicative | |
c3282ec1 | 1445 | //purpose : |
7fd59977 | 1446 | //======================================================================= |
7fd59977 | 1447 | Standard_Boolean AIS_InteractiveContext::HasApplicative() const |
1448 | { | |
c3282ec1 | 1449 | return SelectedInteractive()->HasOwner(); |
7fd59977 | 1450 | } |
1451 | ||
1452 | //======================================================================= | |
1453 | //function : Applicative | |
c3282ec1 | 1454 | //purpose : |
7fd59977 | 1455 | //======================================================================= |
7fd59977 | 1456 | Handle(Standard_Transient) AIS_InteractiveContext::Applicative() const |
1457 | { | |
c3282ec1 | 1458 | return SelectedInteractive()->GetOwner(); |
7fd59977 | 1459 | } |
1460 | ||
7fd59977 | 1461 | //================================================== |
c3282ec1 | 1462 | // Function: HasDetected |
7fd59977 | 1463 | // Purpose : |
1464 | //================================================== | |
c3282ec1 | 1465 | Standard_Boolean AIS_InteractiveContext::HasDetected() const |
7fd59977 | 1466 | { |
1467 | if(HasOpenedContext()) | |
1468 | return myLocalContexts(myCurLocalIndex)->HasDetected(); | |
c3282ec1 | 1469 | |
1470 | return !myLastPicked.IsNull(); | |
7fd59977 | 1471 | } |
1472 | ||
1473 | //======================================================================= | |
1474 | //function : HasDetectedShape | |
1475 | //purpose : | |
1476 | //======================================================================= | |
1477 | ||
1478 | Standard_Boolean AIS_InteractiveContext::HasDetectedShape() const | |
1479 | { | |
1480 | if(HasOpenedContext()) | |
1481 | return myLocalContexts(myCurLocalIndex)->HasDetectedShape(); | |
1482 | return Standard_False; | |
1483 | } | |
1484 | ||
1485 | //======================================================================= | |
1486 | //function : DetectedShape | |
1487 | //purpose : | |
1488 | //======================================================================= | |
1489 | ||
1490 | const TopoDS_Shape& | |
1491 | AIS_InteractiveContext::DetectedShape() const | |
1492 | { | |
1493 | return myLocalContexts(myCurLocalIndex)->DetectedShape(); | |
1494 | } | |
1495 | ||
1496 | //======================================================================= | |
1497 | //function : DetectedInteractive | |
c3282ec1 | 1498 | //purpose : |
7fd59977 | 1499 | //======================================================================= |
c3282ec1 | 1500 | Handle(AIS_InteractiveObject) AIS_InteractiveContext::DetectedInteractive() const |
7fd59977 | 1501 | { |
c3282ec1 | 1502 | if (HasOpenedContext()) |
7fd59977 | 1503 | return myLocalContexts(myCurLocalIndex)->DetectedInteractive(); |
c3282ec1 | 1504 | |
1505 | return Handle(AIS_InteractiveObject)::DownCast (myLastPicked->Selectable()); | |
7fd59977 | 1506 | } |
1507 | ||
f0cddd16 | 1508 | //======================================================================= |
1509 | //function : HasNextDetected | |
1510 | //purpose : | |
1511 | //======================================================================= | |
7fd59977 | 1512 | Standard_Boolean AIS_InteractiveContext::HasNextDetected() const |
1513 | { | |
f0cddd16 | 1514 | if (HasOpenedContext()) |
1515 | { | |
7fd59977 | 1516 | return myLocalContexts(myCurLocalIndex)->HasNextDetected(); |
f0cddd16 | 1517 | } |
1518 | ||
1519 | return !myDetectedSeq.IsEmpty() && myCurHighlighted <= myDetectedSeq.Upper(); | |
7fd59977 | 1520 | } |
1521 | ||
1522 | ||
1523 | //======================================================================= | |
1524 | //function : DetectedOwner | |
1525 | //purpose : | |
1526 | //======================================================================= | |
1527 | Handle(SelectMgr_EntityOwner) AIS_InteractiveContext::DetectedOwner() const | |
1528 | { | |
c3282ec1 | 1529 | if (HasOpenedContext()) |
7fd59977 | 1530 | return myLocalContexts(myCurLocalIndex)->DetectedOwner(); |
7fd59977 | 1531 | |
c3282ec1 | 1532 | return myLastPicked; |
1533 | } | |
7fd59977 | 1534 | |
1535 | //======================================================================= | |
1536 | //function : HilightNextDetected | |
679ecdee | 1537 | //purpose : |
7fd59977 | 1538 | //======================================================================= |
679ecdee | 1539 | Standard_Integer AIS_InteractiveContext::HilightNextDetected (const Handle(V3d_View)& theView, |
1540 | const Standard_Boolean theToRedrawImmediate) | |
7fd59977 | 1541 | { |
f0cddd16 | 1542 | if (HasOpenedContext()) |
1543 | { | |
1544 | return myLocalContexts (myCurLocalIndex)->HilightNextDetected (theView, theToRedrawImmediate); | |
1545 | } | |
1546 | ||
1547 | myMainPM->ClearImmediateDraw(); | |
1548 | if (myDetectedSeq.IsEmpty()) | |
1549 | { | |
1550 | return 0; | |
1551 | } | |
1552 | ||
1553 | if (++myCurHighlighted > myDetectedSeq.Upper()) | |
1554 | { | |
1555 | myCurHighlighted = myDetectedSeq.Lower(); | |
1556 | } | |
1557 | const Handle(SelectMgr_EntityOwner)& anOwner = myMainSel->Picked (myDetectedSeq (myCurHighlighted)); | |
1558 | if (anOwner.IsNull()) | |
1559 | { | |
1560 | return 0; | |
1561 | } | |
1562 | ||
1563 | highlightWithColor (anOwner, theView->Viewer()); | |
1564 | myLastPicked = anOwner; | |
1565 | myLastinMain = myLastPicked; | |
1566 | ||
1567 | if (theToRedrawImmediate) | |
1568 | { | |
1569 | myMainPM->RedrawImmediate (theView->Viewer()); | |
1570 | myMainVwr->RedrawImmediate(); | |
1571 | } | |
1572 | ||
1573 | return myCurHighlighted; | |
7fd59977 | 1574 | } |
1575 | ||
1576 | //======================================================================= | |
f0cddd16 | 1577 | //function : HilightPreviousDetected |
679ecdee | 1578 | //purpose : |
7fd59977 | 1579 | //======================================================================= |
679ecdee | 1580 | Standard_Integer AIS_InteractiveContext::HilightPreviousDetected (const Handle(V3d_View)& theView, |
1581 | const Standard_Boolean theToRedrawImmediate) | |
7fd59977 | 1582 | { |
f0cddd16 | 1583 | if (HasOpenedContext()) |
1584 | { | |
1585 | return myLocalContexts (myCurLocalIndex)->HilightPreviousDetected (theView, theToRedrawImmediate); | |
1586 | } | |
1587 | ||
1588 | myMainPM->ClearImmediateDraw(); | |
1589 | if (myDetectedSeq.IsEmpty()) | |
1590 | { | |
1591 | return 0; | |
1592 | } | |
1593 | ||
1594 | if (--myCurHighlighted < myDetectedSeq.Lower()) | |
1595 | { | |
1596 | myCurHighlighted = myDetectedSeq.Upper(); | |
1597 | } | |
1598 | const Handle(SelectMgr_EntityOwner)& anOwner = myMainSel->Picked (myDetectedSeq (myCurHighlighted)); | |
1599 | if (anOwner.IsNull()) | |
1600 | { | |
1601 | return 0; | |
1602 | } | |
1603 | ||
1604 | highlightWithColor (anOwner, theView->Viewer()); | |
1605 | myLastPicked = anOwner; | |
1606 | myLastinMain = myLastPicked; | |
1607 | ||
1608 | if (theToRedrawImmediate) | |
1609 | { | |
1610 | myMainPM->RedrawImmediate (theView->Viewer()); | |
1611 | myMainVwr->RedrawImmediate(); | |
1612 | } | |
1613 | ||
1614 | return myCurHighlighted; | |
7fd59977 | 1615 | } |
1616 | ||
7fd59977 | 1617 | //======================================================================= |
1618 | //function : InitDetected | |
1619 | //purpose : | |
1620 | //======================================================================= | |
1621 | void AIS_InteractiveContext::InitDetected() | |
1622 | { | |
57ad5cbd | 1623 | if (HasOpenedContext()) |
7fd59977 | 1624 | { |
f0cddd16 | 1625 | myLocalContexts (myCurLocalIndex)->InitDetected(); |
7fd59977 | 1626 | return; |
1627 | } | |
1628 | ||
f0cddd16 | 1629 | if (!myDetectedSeq.IsEmpty()) |
57ad5cbd | 1630 | { |
f0cddd16 | 1631 | myCurDetected = myDetectedSeq.Lower(); |
57ad5cbd | 1632 | } |
7fd59977 | 1633 | } |
1634 | ||
1635 | //======================================================================= | |
1636 | //function : MoreDetected | |
1637 | //purpose : | |
1638 | //======================================================================= | |
1639 | Standard_Boolean AIS_InteractiveContext::MoreDetected() const | |
1640 | { | |
57ad5cbd | 1641 | if (HasOpenedContext()) |
1642 | { | |
f0cddd16 | 1643 | return myLocalContexts (myCurLocalIndex)->MoreDetected(); |
57ad5cbd | 1644 | } |
7fd59977 | 1645 | |
f0cddd16 | 1646 | return myCurDetected >= myDetectedSeq.Lower() && myCurDetected <= myDetectedSeq.Upper(); |
7fd59977 | 1647 | } |
1648 | ||
1649 | //======================================================================= | |
1650 | //function : NextDetected | |
1651 | //purpose : | |
1652 | //======================================================================= | |
1653 | void AIS_InteractiveContext::NextDetected() | |
1654 | { | |
f0cddd16 | 1655 | if (HasOpenedContext()) |
7fd59977 | 1656 | { |
f0cddd16 | 1657 | myLocalContexts (myCurLocalIndex)->NextDetected(); |
7fd59977 | 1658 | return; |
1659 | } | |
1660 | ||
f0cddd16 | 1661 | myCurDetected++; |
7fd59977 | 1662 | } |
1663 | ||
1664 | //======================================================================= | |
1665 | //function : DetectedCurrentShape | |
1666 | //purpose : | |
1667 | //======================================================================= | |
7fd59977 | 1668 | const TopoDS_Shape& AIS_InteractiveContext::DetectedCurrentShape() const |
1669 | { | |
57ad5cbd | 1670 | if (HasOpenedContext()) |
1671 | { | |
7fd59977 | 1672 | return myLocalContexts(myCurLocalIndex)->DetectedCurrentShape(); |
57ad5cbd | 1673 | } |
7fd59977 | 1674 | |
404c8936 | 1675 | Standard_DISABLE_DEPRECATION_WARNINGS |
57ad5cbd | 1676 | Handle(AIS_Shape) aCurrentShape = Handle(AIS_Shape)::DownCast (DetectedCurrentObject()); |
404c8936 | 1677 | Standard_ENABLE_DEPRECATION_WARNINGS |
57ad5cbd | 1678 | |
1679 | if (aCurrentShape.IsNull()) | |
1680 | { | |
896faa72 | 1681 | return AIS_InteractiveContext_myDummyShape; |
57ad5cbd | 1682 | } |
1683 | ||
1684 | return aCurrentShape->Shape(); | |
7fd59977 | 1685 | } |
1686 | ||
1687 | //======================================================================= | |
1688 | //function : DetectedCurrentObject | |
1689 | //purpose : | |
1690 | //======================================================================= | |
57ad5cbd | 1691 | Handle(AIS_InteractiveObject) AIS_InteractiveContext::DetectedCurrentObject() const |
1692 | { | |
1693 | if (HasOpenedContext()) | |
1694 | { | |
7fd59977 | 1695 | return myLocalContexts(myCurLocalIndex)->DetectedCurrentObject(); |
57ad5cbd | 1696 | } |
7fd59977 | 1697 | |
f0cddd16 | 1698 | return MoreDetected() |
1699 | ? Handle(AIS_InteractiveObject)::DownCast (myMainSel->Picked (myDetectedSeq (myCurDetected))->Selectable()) | |
1700 | : NULL; | |
7fd59977 | 1701 | } |
c3282ec1 | 1702 | |
1703 | //======================================================================= | |
1704 | //function : FirstSelectedObject | |
1705 | //purpose : | |
1706 | //======================================================================= | |
1707 | Handle(AIS_InteractiveObject) AIS_InteractiveContext::FirstSelectedObject() | |
1708 | { | |
1709 | Handle(AIS_InteractiveObject) anObject; | |
1710 | ||
1711 | if (HasOpenedContext()) | |
1712 | return anObject; | |
1713 | ||
1714 | InitSelected(); | |
1715 | if (MoreSelected()) | |
1716 | { | |
1717 | return SelectedInteractive(); | |
1718 | } | |
1719 | return anObject; | |
1720 | } | |
1721 | ||
1722 | //======================================================================= | |
1723 | //function : RedrawImmediate | |
1724 | //purpose : Redisplays immediate strucures of the viewer given according to their visibility | |
1725 | //======================================================================= | |
1726 | void AIS_InteractiveContext::RedrawImmediate (const Handle(V3d_Viewer)& theViewer) | |
1727 | { | |
1728 | myMainPM->RedrawImmediate (theViewer); | |
1729 | } |