1 // Created on: 1996-09-04
2 // Created by: Robert COUBLANC
3 // Copyright (c) 1996-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
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
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.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 #ifndef _AIS_LocalContext_HeaderFile
18 #define _AIS_LocalContext_HeaderFile
20 #include <Standard.hxx>
21 #include <Standard_Type.hxx>
23 #include <Standard_Boolean.hxx>
24 #include <StdSelect_ViewerSelector3d.hxx>
25 #include <PrsMgr_PresentationManager3d.hxx>
26 #include <TCollection_AsciiString.hxx>
27 #include <AIS_DataMapOfSelStat.hxx>
28 #include <TColStd_ListOfInteger.hxx>
29 #include <SelectMgr_IndexedMapOfOwner.hxx>
30 #include <Standard_Integer.hxx>
31 #include <TColStd_SequenceOfInteger.hxx>
32 #include <AIS_SequenceOfInteractive.hxx>
33 #include <AIS_SelectionModesConcurrency.hxx>
34 #include <Standard_Transient.hxx>
35 #include <AIS_ClearMode.hxx>
36 #include <TopAbs_ShapeEnum.hxx>
37 #include <SelectMgr_ListOfFilter.hxx>
38 #include <AIS_StatusOfDetection.hxx>
39 #include <AIS_StatusOfPick.hxx>
40 #include <TColgp_Array1OfPnt2d.hxx>
41 #include <TColStd_MapOfTransient.hxx>
42 #include <Quantity_NameOfColor.hxx>
43 #include <Standard_Real.hxx>
44 #include <AIS_Selection.hxx>
45 class AIS_InteractiveContext;
46 class SelectMgr_SelectionManager;
47 class SelectMgr_OrFilter;
48 class SelectMgr_Filter;
49 class TCollection_AsciiString;
50 class AIS_InteractiveObject;
54 class SelectMgr_EntityOwner;
55 class Standard_Transient;
56 class AIS_LocalStatus;
57 class SelectMgr_SelectableObject;
60 class AIS_LocalContext;
61 DEFINE_STANDARD_HANDLE(AIS_LocalContext, Standard_Transient)
63 //! Defines a specific context for selection.
64 //! It becomes possible to:
65 //! + Load InteractiveObjects with a mode to be
66 //! activated + associate InteractiveObjects with a
67 //! set of temporary selectable Objects.... + +
68 //! activate StandardMode of selection for Entities
69 //! inheriting BasicShape from AIS (Selection Of
70 //! vertices, edges, wires,faces... + Add Filters
71 //! acting on detected owners of sensitive primitives
73 //! - automatically highlight shapes and
74 //! InteractiveObjects (highlight of detected shape +
75 //! highlight of detected selectable...
76 class AIS_LocalContext : public Standard_Transient
82 Standard_EXPORT AIS_LocalContext();
84 //! Constructor By Default, the displayed objects are
85 //! automatically loaded.
86 Standard_EXPORT AIS_LocalContext(const Handle(AIS_InteractiveContext)& aCtx, const Standard_Integer anIndex, const Standard_Boolean LoadDisplayed = Standard_True, const Standard_Boolean AcceptStandardModes = Standard_True, const Standard_Boolean AcceptErase = Standard_False, const Standard_Boolean UseBothViewers = Standard_False);
88 //! authorize or not others contexts to erase
89 //! temporary displayed objects here;
90 void AcceptErase (const Standard_Boolean aStatus);
92 Standard_Boolean AcceptErase() const;
94 Standard_EXPORT void SetContext (const Handle(AIS_InteractiveContext)& aCtx);
96 const Handle(AIS_Selection)& Selection() const { return mySelection; }
98 Standard_EXPORT void Terminate (const Standard_Boolean updateviewer = Standard_True);
100 //! returns true if done...
101 Standard_EXPORT Standard_Boolean Display (const Handle(AIS_InteractiveObject)& anInteractive, const Standard_Integer DisplayMode = 0, const Standard_Boolean AllowShapeDecomposition = Standard_True, const Standard_Integer ActivationMode = 0);
103 //! loads <anInteractive> with nodisplay...
104 //! returns true if done
105 Standard_EXPORT Standard_Boolean Load (const Handle(AIS_InteractiveObject)& anInteractive, const Standard_Boolean AllowShapeDecomposition = Standard_True, const Standard_Integer ActivationMode = 0);
107 //! returns true if done...
108 Standard_EXPORT Standard_Boolean Erase (const Handle(AIS_InteractiveObject)& anInteractive);
110 Standard_EXPORT Standard_Boolean Remove (const Handle(AIS_InteractiveObject)& aSelectable);
112 Standard_EXPORT Standard_Boolean ClearPrs (const Handle(AIS_InteractiveObject)& anInteractive, const Standard_Integer aMode);
114 //! allows or forbids the shape decomposition into
115 //! Activated Standard Mode for <aStoredObject>
116 //! does nothing if the object doesn't inherits
117 //! BasicShape from AIS
118 Standard_EXPORT void SetShapeDecomposition (const Handle(AIS_InteractiveObject)& aStoredObject, const Standard_Boolean aStatus);
120 //! according to <atype> , clears the different parts of
121 //! the selector (filters, modeof activation, objects...)
122 Standard_EXPORT void Clear (const AIS_ClearMode atype = AIS_CM_All);
124 Standard_EXPORT void SetSelectionModeActive (const Handle(AIS_InteractiveObject)& theObj,
125 const Standard_Integer theMode,
126 const Standard_Boolean theIsActive,
127 const AIS_SelectionModesConcurrency theActiveFilter);
129 //! optional : activation of a mode which is not 0 for a selectable...
130 void ActivateMode (const Handle(AIS_InteractiveObject)& theObj, const Standard_Integer theMode)
132 SetSelectionModeActive (theObj, theMode, Standard_True, AIS_SelectionModesConcurrency_GlobalOrLocal);
135 void DeactivateMode (const Handle(AIS_InteractiveObject)& theObj, const Standard_Integer theMode)
137 SetSelectionModeActive (theObj, theMode, Standard_False, AIS_SelectionModesConcurrency_GlobalOrLocal);
140 void Deactivate (const Handle(AIS_InteractiveObject)& theObj)
142 SetSelectionModeActive (theObj, -1, Standard_False, AIS_SelectionModesConcurrency_Single);
145 //! decomposition of shapes into <aType>
146 Standard_EXPORT void ActivateStandardMode (const TopAbs_ShapeEnum aType);
148 Standard_EXPORT void DeactivateStandardMode (const TopAbs_ShapeEnum aType);
150 const TColStd_ListOfInteger& StandardModes() const;
152 Standard_EXPORT void AddFilter (const Handle(SelectMgr_Filter)& aFilter);
154 Standard_EXPORT void RemoveFilter (const Handle(SelectMgr_Filter)& aFilter);
156 const SelectMgr_ListOfFilter& ListOfFilter() const;
158 const Handle(SelectMgr_OrFilter)& Filter() const;
160 //! if <aStatus> = True , the shapes or subshapes detected
161 //! by the selector will be automatically hilighted in the
163 //! Else the user has to manage the detected shape outside the
164 //! Shape Selector....
165 void SetAutomaticHilight (const Standard_Boolean aStatus);
167 Standard_Boolean AutomaticHilight() const;
169 Standard_EXPORT AIS_StatusOfDetection MoveTo (const Standard_Integer theXpix, const Standard_Integer theYpix, const Handle(V3d_View)& theView, const Standard_Boolean theToRedrawImmediate);
171 //! returns True if more than one entity
172 //! was detected at the last Mouse position.
173 Standard_Boolean HasNextDetected() const;
175 //! returns True if last detected. the next detected will
176 //! be first one (endless loop)
177 Standard_EXPORT Standard_Integer HilightNextDetected (const Handle(V3d_View)& theView, const Standard_Boolean theToRedrawImmediate);
179 Standard_EXPORT Standard_Integer HilightPreviousDetected (const Handle(V3d_View)& theView, const Standard_Boolean theToRedrawImmediate);
181 //! returns True if something was done...
182 Standard_EXPORT Standard_Boolean UnhilightLastDetected (const Handle(V3d_Viewer)& theViewer);
184 //! returns True if something was done...
185 Standard_EXPORT Standard_Boolean UnhilightLastDetected (const Handle(V3d_View)& theView);
187 //! returns the number of selected
188 Standard_EXPORT AIS_StatusOfPick AddSelect (const Handle(SelectMgr_EntityOwner)& theObject);
190 Standard_EXPORT AIS_StatusOfPick Select (const Standard_Boolean updateviewer = Standard_True);
192 Standard_EXPORT AIS_StatusOfPick ShiftSelect (const Standard_Boolean updateviewer = Standard_True);
194 Standard_EXPORT AIS_StatusOfPick Select (const Standard_Integer XPMin, const Standard_Integer YPMin, const Standard_Integer XPMax, const Standard_Integer YPMax, const Handle(V3d_View)& aView, const Standard_Boolean updateviewer = Standard_True);
196 Standard_EXPORT AIS_StatusOfPick ShiftSelect (const Standard_Integer XPMin, const Standard_Integer YPMin, const Standard_Integer XPMax, const Standard_Integer YPMax, const Handle(V3d_View)& aView, const Standard_Boolean updateviewer = Standard_True);
198 Standard_EXPORT AIS_StatusOfPick Select (const TColgp_Array1OfPnt2d& Polyline, const Handle(V3d_View)& aView, const Standard_Boolean updateviewer = Standard_True);
200 Standard_EXPORT AIS_StatusOfPick ShiftSelect (const TColgp_Array1OfPnt2d& Polyline, const Handle(V3d_View)& aView, const Standard_Boolean updateviewer = Standard_True);
202 Standard_EXPORT void HilightPicked (const Standard_Boolean updateviewer = Standard_True);
204 Standard_EXPORT void UnhilightPicked (const Standard_Boolean updateviewer = Standard_True);
206 Standard_EXPORT void UpdateSelected (const Standard_Boolean updateviewer = Standard_True);
208 //! Part of advanced selection highlighting mechanism.
209 //! If no owners belonging to anobj are selected, calls anobj->ClearSelected(),
210 //! otherwise calls anobj->HilightSelected(). This method can be used to avoid
211 //! redrawing the whole selection belonging to several Selectable Objects.
212 Standard_EXPORT void UpdateSelected (const Handle(AIS_InteractiveObject)& anobj, const Standard_Boolean updateviewer = Standard_True);
214 //! useful to update selection with objects coming from
215 //! Collector or stack
216 Standard_EXPORT void SetSelected (const Handle(AIS_InteractiveObject)& anobj, const Standard_Boolean updateviewer = Standard_True);
218 //! useful to update selection with objects coming from
219 //! Collector or stack
220 Standard_EXPORT void AddOrRemoveSelected (const Handle(AIS_InteractiveObject)& anobj, const Standard_Boolean updateviewer = Standard_True);
222 Standard_EXPORT void AddOrRemoveSelected (const TopoDS_Shape& aShape, const Standard_Boolean updateviewer = Standard_True);
224 Standard_EXPORT void AddOrRemoveSelected (const Handle(SelectMgr_EntityOwner)& theOwner, const Standard_Boolean toUpdateViewer = Standard_True);
226 //! Clears local context selection.
227 //! @param toUpdateViewer [in] if TRUE the viewer will be updated.
228 Standard_EXPORT void ClearSelected (const Standard_Boolean toUpdateViewer = Standard_True);
230 //! Clears outdated selection and detection of owners for the
231 //! interactive object. Use this method if selection structures
232 //! of the interactive object have changed. The method unhilights
233 //! and removes outdated entity owners from lists of selected
234 //! and detected owners.
235 //! @param theIO [in] the interactive object.
236 //! @param toClearDeactivated [in] pass TRUE to treat deactivated
237 //! entity owners as 'outdated' when clearing the selection.
238 Standard_EXPORT void ClearOutdatedSelection (const Handle(AIS_InteractiveObject)& theIO, const Standard_Boolean toClearDeactivated);
240 Standard_Boolean HasDetected() const;
243 //! Initialization for iteration through mouse-detected objects in local context.
244 Standard_EXPORT void InitDetected();
247 //! @return true if there is more mouse-detected objects after the current one
248 //! during iteration through mouse-detected interactive objects.
249 Standard_EXPORT Standard_Boolean MoreDetected() const;
252 //! Gets next current object during iteration through mouse-detected
253 //! interactive objects.
254 Standard_EXPORT void NextDetected();
256 //! @return current mouse-detected Owner or null object if there is no current detected.
257 Standard_EXPORT Handle(SelectMgr_EntityOwner) DetectedCurrentOwner() const;
259 //! @return current mouse-detected shape or empty (null) shape, if current interactive object
260 //! is not a shape (AIS_Shape) or there is no current mouse-detected interactive object at all.
261 Standard_EXPORT const TopoDS_Shape& DetectedCurrentShape() const;
263 //! @return current mouse-detected interactive object or null object if there is no current detected.
264 Standard_EXPORT Handle(AIS_InteractiveObject) DetectedCurrentObject() const;
266 Standard_EXPORT Standard_Boolean HasDetectedShape() const;
268 Standard_EXPORT const TopoDS_Shape& DetectedShape() const;
270 Standard_EXPORT Handle(AIS_InteractiveObject) DetectedInteractive() const;
272 Standard_EXPORT Handle(SelectMgr_EntityOwner) DetectedOwner() const;
274 Standard_EXPORT void InitSelected();
276 Standard_EXPORT Standard_Boolean MoreSelected() const;
278 Standard_EXPORT void NextSelected();
280 //! returns TRUE if the detected entity is a shape
281 //! coming from a Decomposition of an element.
282 Standard_EXPORT Standard_Boolean HasShape() const;
284 //! returns true if current selection is not empty
285 //! and the owner of selected object contains a shape.
286 //! This method does not take into account decomposition
287 //! status of detected shape.
288 Standard_EXPORT Standard_Boolean HasSelectedShape() const;
290 Standard_EXPORT TopoDS_Shape SelectedShape() const;
292 Standard_EXPORT Handle(SelectMgr_EntityOwner) SelectedOwner() const;
294 Standard_EXPORT Standard_Boolean IsSelected (const Handle(AIS_InteractiveObject)& aniobj) const;
296 Standard_EXPORT Standard_Boolean IsSelected (const Handle(SelectMgr_EntityOwner)& anOwner) const;
298 Standard_EXPORT Handle(AIS_InteractiveObject) SelectedInteractive() const;
300 //! returns TRUE if an interactive element
301 //! was associated with the current picked entity.
302 Standard_EXPORT Standard_Boolean HasApplicative() const;
304 Standard_EXPORT const Handle(Standard_Transient)& SelectedApplicative() const;
306 Standard_EXPORT void SetDisplayPriority (const Handle(AIS_InteractiveObject)& anObject, const Standard_Integer Prior);
308 Standard_EXPORT Standard_Integer DisplayedObjects (TColStd_MapOfTransient& theMapToFill) const;
310 Standard_EXPORT Standard_Boolean IsIn (const Handle(AIS_InteractiveObject)& anObject) const;
312 Standard_EXPORT Standard_Boolean IsDisplayed (const Handle(AIS_InteractiveObject)& anObject) const;
314 Standard_EXPORT Standard_Boolean IsDisplayed (const Handle(AIS_InteractiveObject)& anObject, const Standard_Integer aMode) const;
316 Standard_EXPORT const TColStd_ListOfInteger& SelectionModes (const Handle(AIS_InteractiveObject)& anObject) const;
318 Standard_EXPORT void SubIntensityOn (const Handle(AIS_InteractiveObject)& anObject);
320 Standard_EXPORT void SubIntensityOff (const Handle(AIS_InteractiveObject)& anObject);
322 Standard_EXPORT void Hilight (const Handle(AIS_InteractiveObject)& anObject);
324 Standard_EXPORT void Hilight (const Handle(AIS_InteractiveObject)& theObj,
325 const Handle(Prs3d_Drawer)& theStyle);
327 Standard_EXPORT void Unhilight (const Handle(AIS_InteractiveObject)& anObject);
329 Standard_EXPORT Standard_Boolean IsHilighted (const Handle(AIS_InteractiveObject)& anObject) const;
331 Standard_EXPORT Standard_Boolean HighlightStyle (const Handle(AIS_InteractiveObject)& theObject,
332 Handle(Prs3d_Drawer)& theStyle) const;
334 //! Define the current selection sensitivity for
335 //! this local context according to the view size.
336 Standard_EXPORT void SetPixelTolerance (const Standard_Integer aPrecision = 2);
338 //! Returns the pixel tolerance.
339 Standard_EXPORT Standard_Integer PixelTolerance() const;
341 //! Allows to manage sensitivity of a particular selection of interactive object theObject
342 //! and changes previous sensitivity value of all sensitive entities in selection with theMode
343 //! to the given theNewSensitivity.
344 Standard_EXPORT void SetSelectionSensitivity (const Handle(AIS_InteractiveObject)& theObject,
345 const Standard_Integer theMode,
346 const Standard_Integer theNewSensitivity);
348 //! Resets the transient list of presentations previously displayed in immediate mode
349 //! and begins accumulation of new list by following AddToImmediateList()/Color()/Highlight() calls.
350 Standard_EXPORT Standard_Boolean BeginImmediateDraw();
352 //! Resets the transient list of presentations previously displayed in immediate mode.
353 Standard_EXPORT virtual void ClearImmediateDraw();
355 //! Stores presentation theMode of object theObj in the transient list of presentations to be displayed in immediate mode.
356 //! Will be taken in account in EndImmediateDraw method.
357 Standard_EXPORT Standard_Boolean ImmediateAdd (const Handle(AIS_InteractiveObject)& theObj, const Standard_Integer theMode = 0);
359 //! Allows rapid drawing of the view theView by avoiding an update of the whole background.
360 Standard_EXPORT Standard_Boolean EndImmediateDraw (const Handle(V3d_Viewer)& theViewer);
362 //! Returns true if Presentation Manager is accumulating transient list of presentations to be displayed in immediate mode.
363 Standard_EXPORT Standard_Boolean IsImmediateModeOn() const;
365 Standard_EXPORT TCollection_AsciiString Status() const;
367 Standard_EXPORT const Handle(AIS_LocalStatus)& Status (const Handle(AIS_InteractiveObject)& anObject) const;
369 Standard_EXPORT void LoadContextObjects();
371 Standard_EXPORT void UnloadContextObjects();
373 Standard_EXPORT void DisplaySensitive (const Handle(V3d_View)& aView);
375 Standard_EXPORT void ClearSensitive (const Handle(V3d_View)& aView);
377 const Handle(StdSelect_ViewerSelector3d)& MainSelector() const;
379 Standard_EXPORT Handle(SelectMgr_EntityOwner) FindSelectedOwnerFromIO (const Handle(AIS_InteractiveObject)& anIObj) const;
381 Standard_EXPORT Handle(SelectMgr_EntityOwner) FindSelectedOwnerFromShape (const TopoDS_Shape& aShape) const;
383 //! Iterates through all interactive objects of local context and activates selection modes
384 //! stored in local status
385 Standard_EXPORT void RestoreActivatedModes() const;
387 DEFINE_STANDARD_RTTIEXT(AIS_LocalContext,Standard_Transient)
392 Standard_EXPORT void Process (const Handle(SelectMgr_SelectableObject)& anObject);
394 Standard_EXPORT void Process();
396 Standard_EXPORT void ActivateStandardModes (const Handle(SelectMgr_SelectableObject)& anObject);
398 Standard_EXPORT void manageDetected (const Handle(SelectMgr_EntityOwner)& thePickOwner, const Handle(V3d_View)& theView, const Standard_Boolean theToRedrawImmediate);
400 //! returns 0 if the detected entity was Not FilterOK...
401 Standard_Integer DetectedIndex();
403 Standard_EXPORT void Hilight (const Handle(SelectMgr_EntityOwner)& Own, const Handle(V3d_View)& aview);
405 Standard_EXPORT void Unhilight (const Handle(SelectMgr_EntityOwner)& Ownr, const Handle(V3d_View)& aview);
407 Standard_EXPORT void ClearObjects();
409 Standard_EXPORT void ClearDetected();
411 Standard_EXPORT Standard_Boolean IsDecompositionOn() const;
413 Standard_EXPORT Standard_Boolean IsShape (const Standard_Integer anIndex) const;
415 Standard_EXPORT Standard_Boolean IsValidForSelection (const Handle(AIS_InteractiveObject)& anIObj) const;
417 Standard_Boolean IsValidIndex (const Standard_Integer anIndex) const;
419 Standard_EXPORT Standard_Boolean ComesFromDecomposition (const Standard_Integer aPickedIndex) const;
421 Standard_EXPORT Standard_Boolean HasFilters (const TopAbs_ShapeEnum aType) const;
423 Handle(AIS_InteractiveContext) myCTX;
424 Standard_Boolean myLoadDisplayed;
425 Standard_Boolean myAcceptStdMode;
426 Standard_Boolean myAcceptErase;
427 Handle(SelectMgr_SelectionManager) mySM;
428 Handle(StdSelect_ViewerSelector3d) myMainVS;
429 Handle(PrsMgr_PresentationManager3d) myMainPM;
430 Handle(StdSelect_ViewerSelector3d) myCollVS;
431 AIS_DataMapOfSelStat myActiveObjects;
432 Handle(SelectMgr_OrFilter) myFilters;
433 TColStd_ListOfInteger myListOfStandardMode;
434 Handle(SelectMgr_Filter) myStdFilters[9];
435 Standard_Boolean myAutoHilight;
436 Handle(SelectMgr_IndexedMapOfOwner) myMapOfOwner;
437 Handle(AIS_Selection) mySelection;
438 Standard_Integer mylastindex;
439 Standard_Integer mylastgood;
440 Standard_Integer myCurrentOwner;
441 TColStd_SequenceOfInteger myDetectedSeq;
442 Standard_Integer myCurDetected;
443 Standard_Integer myAISCurDetected;
444 Handle(Prs3d_Drawer) mySubintStyle;
449 #include <AIS_LocalContext.lxx>
455 #endif // _AIS_LocalContext_HeaderFile