0029367: Visualization - simplify interface of V3d_View and V3d_Viewer
[occt.git] / src / SelectMgr / SelectMgr_SelectableObject.hxx
index f7b8e7e..1d3566b 100644 (file)
 #ifndef _SelectMgr_SelectableObject_HeaderFile
 #define _SelectMgr_SelectableObject_HeaderFile
 
-#include <Standard.hxx>
-#include <Standard_Type.hxx>
-
-#include <SelectMgr_SequenceOfSelection.hxx>
-#include <Prs3d_Drawer.hxx>
-#include <Standard_Integer.hxx>
-#include <Standard_Boolean.hxx>
 #include <PrsMgr_PresentableObject.hxx>
-#include <PrsMgr_TypeOfPresentation3d.hxx>
+#include <SelectMgr_IndexedMapOfOwner.hxx>
+#include <SelectMgr_SequenceOfSelection.hxx>
 #include <SelectMgr_Selection.hxx>
-#include <PrsMgr_PresentationManager3d.hxx>
 #include <SelectMgr_SequenceOfOwner.hxx>
-#include <Quantity_NameOfColor.hxx>
-#include <Graphic3d_ZLayerId.hxx>
-#include <SelectMgr_IndexedMapOfOwner.hxx>
+
 class SelectMgr_EntityOwner;
-class Prs3d_Presentation;
 class Standard_NotImplemented;
 class SelectMgr_SelectionManager;
-class Bnd_Box;
 
-
-class SelectMgr_SelectableObject;
-DEFINE_STANDARD_HANDLE(SelectMgr_SelectableObject, PrsMgr_PresentableObject)
-
-//! A framework to supply the structure of the object to be
-//! selected. At the first pick, this structure is created by
-//! calling the appropriate algorithm and retaining this
-//! framework for further picking.
-//! This abstract framework is inherited in Application
-//! Interactive Services (AIS), notably in AIS_InteractiveObject.
-//! Consequently, 3D selection should be handled by the
-//! relevant daughter classes and their member functions
-//! in AIS. This is particularly true in the creation of new interactive objects.
+//! A framework to supply the structure of the object to be selected.
+//! At the first pick, this structure is created by calling the appropriate algorithm and retaining this framework for further picking.
+//! This abstract framework is inherited in Application Interactive Services (AIS), notably in AIS_InteractiveObject.
+//! Consequently, 3D selection should be handled by the relevant daughter classes and their member functions in AIS.
+//! This is particularly true in the creation of new interactive objects.
+//!
+//! Key interface methods to be implemented by every Selectable Object:
+//! * Presentable Object (PrsMgr_PresentableObject)
+//!   Consider defining an enumeration of supported Display Mode indexes for particular Interactive Object or class of Interactive Objects.
+//!   - AcceptDisplayMode() accepting display modes implemented by this object;
+//!   - Compute() computing presentation for the given display mode index;
+//! * Selectable Object (SelectMgr_SelectableObject)
+//!   Consider defining an enumeration of supported Selection Mode indexes for particular Interactive Object or class of Interactive Objects.
+//!   - ComputeSelection() computing selectable entities for the given selection mode index.
 class SelectMgr_SelectableObject : public PrsMgr_PresentableObject
 {
-
+  DEFINE_STANDARD_RTTIEXT(SelectMgr_SelectableObject, PrsMgr_PresentableObject)
+  friend class SelectMgr_SelectionManager;
 public:
 
-  
-  //! Recovers and calculates any sensitive primitive,
-  //! aSelection, available in Shape mode, specified by
-  //! aMode. As a rule, these are sensitive faces.
-  //! This method is defined as virtual. This enables you to
-  //! implement it in the creation of a new class of AIS
-  //! Interactive Object. You need to do this and in so
-  //! doing, redefine this method, if you create a class
-  //! which enriches the list of signatures and types.
-  Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) = 0;
-  
+  //! Clears all selections of the object
+  Standard_EXPORT virtual ~SelectMgr_SelectableObject();
+
+  //! Computes sensitive primitives for the given selection mode - key interface method of Selectable Object.
+  //! @param theSelection selection to fill
+  //! @param theMode selection mode to create sensitive primitives
+  virtual void ComputeSelection (const Handle(SelectMgr_Selection)& theSelection,
+                                 const Standard_Integer theMode) = 0;
+
+  //! Informs the graphic context that the interactive Object may be decomposed into sub-shapes for dynamic selection.
+  //! The most used Interactive Object is AIS_Shape.
+  virtual Standard_Boolean AcceptShapeDecomposition() const { return Standard_False; }
+
   //! Re-computes the sensitive primitives for all modes. IMPORTANT: Do not use
   //! this method to update selection primitives except implementing custom selection manager!
   //! This method does not take into account necessary BVH updates, but may invalidate the pointers
@@ -91,25 +84,15 @@ public:
   //! completely) when some selection mode is activated not for the first time.
   Standard_EXPORT void ClearSelections (const Standard_Boolean update = Standard_False);
   
-  //! Returns the selection Selection having the selection mode aMode.
-  Standard_EXPORT const Handle(SelectMgr_Selection)& Selection (const Standard_Integer aMode) const;
-  
-  //! Returns true if a selection corresponding to the
-  //! selection mode theMode was computed for this object.
-  Standard_EXPORT virtual Standard_Boolean HasSelection (const Standard_Integer theMode) const;
-  
-  //! Begins the iteration scanning for sensitive primitives.
-    void Init();
-  
-  //! Continues the iteration scanning for sensitive primitives.
-    Standard_Boolean More() const;
-  
-  //! Continues the iteration scanning for sensitive primitives.
-    void Next();
-  
-  //! Returns the current selection in this framework.
-    const Handle(SelectMgr_Selection)& CurrentSelection() const;
-  
+  //! Returns the selection having specified selection mode or NULL.
+  Standard_EXPORT const Handle(SelectMgr_Selection)& Selection (const Standard_Integer theMode) const;
+
+  //! Returns true if a selection corresponding to the selection mode theMode was computed for this object.
+  Standard_Boolean HasSelection (const Standard_Integer theMode) const { return !Selection (theMode).IsNull(); }
+
+  //! Return the sequence of selections.
+  const SelectMgr_SequenceOfSelection& Selections() const { return myselections; }
+
   Standard_EXPORT void ResetTransformation() Standard_OVERRIDE;
   
   //! Recomputes the location of the selection aSelection.
@@ -120,117 +103,103 @@ public:
   Standard_EXPORT virtual void UpdateTransformations (const Handle(SelectMgr_Selection)& aSelection);
   
   //! Method which draws selected owners ( for fast presentation draw )
-  Standard_EXPORT virtual void HilightSelected (const Handle(PrsMgr_PresentationManager3d)& PM, const SelectMgr_SequenceOfOwner& Seq);
+  Standard_EXPORT virtual void HilightSelected (const Handle(PrsMgr_PresentationManager)& thePrsMgr,
+                                                const SelectMgr_SequenceOfOwner& theSeq);
   
   //! Method which clear all selected owners belonging
   //! to this selectable object ( for fast presentation draw )
   Standard_EXPORT virtual void ClearSelected();
-  
+
+  //! Method that needs to be implemented when the object
+  //! manages selection and dynamic highlighting on its own.
+  //! Clears or invalidates dynamic highlight presentation.
+  //! By default it clears immediate draw of given presentation
+  //! manager.
+  Standard_EXPORT virtual void ClearDynamicHighlight (const Handle(PrsMgr_PresentationManager)& theMgr);
+
   //! Method which hilight an owner belonging to
   //! this selectable object  ( for fast presentation draw )
-  Standard_EXPORT virtual void HilightOwnerWithColor (const Handle(PrsMgr_PresentationManager3d)& thePM, const Quantity_NameOfColor theColor, const Handle(SelectMgr_EntityOwner)& theOwner);
+  Standard_EXPORT virtual void HilightOwnerWithColor (const Handle(PrsMgr_PresentationManager)& thePM,
+                                                      const Handle(Prs3d_Drawer)& theStyle,
+                                                      const Handle(SelectMgr_EntityOwner)& theOwner);
   
-  //! If returns True, the old mechanism for highlighting
-  //! selected objects is used (HilightSelected Method may be empty).
-  //! If returns False, the HilightSelected method will be
-  //! fully responsible for highlighting selected entity
-  //! owners belonging to this selectable object.
-  Standard_EXPORT virtual Standard_Boolean IsAutoHilight() const;
+  //! If returns True, the old mechanism for highlighting selected objects is used (HilightSelected Method may be empty).
+  //! If returns False, the HilightSelected method will be fully responsible for highlighting selected entity owners belonging to this selectable object.
+  virtual Standard_Boolean IsAutoHilight() const { return myAutoHilight; }
   
-  //! Set AutoHilight property to true or false
-  //! Sets  up  Transform  Persistence Mode  for  this  object
-  Standard_EXPORT virtual void SetAutoHilight (const Standard_Boolean newAutoHilight);
-  
-  Standard_EXPORT Handle(Prs3d_Presentation) GetHilightPresentation (const Handle(PrsMgr_PresentationManager3d)& TheMgr);
-  
-  Standard_EXPORT Handle(Prs3d_Presentation) GetSelectPresentation (const Handle(PrsMgr_PresentationManager3d)& TheMgr);
+  //! Set AutoHilight property to true or false.
+  virtual void SetAutoHilight (const Standard_Boolean theAutoHilight) { myAutoHilight = theAutoHilight; }
   
+  //! Creates or returns existing presentation for highlighting detected object.
+  //! @param thePrsMgr presentation manager to create new presentation
+  //! @return existing or newly created presentation (when thePrsMgr is not NULL)
+  Standard_EXPORT Handle(Prs3d_Presentation) GetHilightPresentation (const Handle(PrsMgr_PresentationManager)& thePrsMgr);
+
+  //! Creates or returns existing presentation for highlighting selected object.
+  //! @param thePrsMgr presentation manager to create new presentation
+  //! @return existing or newly created presentation (when thePrsMgr is not NULL)
+  Standard_EXPORT Handle(Prs3d_Presentation) GetSelectPresentation (const Handle(PrsMgr_PresentationManager)& thePrsMgr);
+
+  //! Removes presentations returned by GetHilightPresentation() and GetSelectPresentation().
+  Standard_EXPORT virtual void ErasePresentations (Standard_Boolean theToRemove);
+
   //! Set Z layer ID and update all presentations of the selectable object.
   //! The layers mechanism allows drawing objects in higher layers in overlay of objects in lower layers.
   Standard_EXPORT virtual void SetZLayer (const Graphic3d_ZLayerId theLayerId) Standard_OVERRIDE;
   
   //! Sets update status FULL to selections of the object. Must be used as the only method of UpdateSelection
   //! from outer classes to prevent BVH structures from being outdated.
-  Standard_EXPORT void UpdateSelection (const Standard_Integer theMode = -1);
-  
-  //! Returns bounding box of selectable object
-  //! by storing its minimum and maximum 3d coordinates
-  //! to output parameters
-  Standard_EXPORT virtual void BoundingBox (Bnd_Box& theBndBox) = 0;
-  
-  //! Initializes the drawing tool theDrawer.
-  Standard_EXPORT virtual void SetAttributes (const Handle(Prs3d_Drawer)& theDrawer);
-  
-  //! Returns the attributes settings.
-    const Handle(Prs3d_Drawer)& Attributes() const;
-  
-  //! Clears settings provided by the drawing tool theDrawer.
-  Standard_EXPORT virtual void UnsetAttributes();
-  
-  //! Initializes the hilight drawing tool theDrawer.
-  Standard_EXPORT virtual void SetHilightAttributes (const Handle(Prs3d_Drawer)& theDrawer);
-  
-  //! Returns the hilight attributes settings.
-    const Handle(Prs3d_Drawer)& HilightAttributes() const;
-  
-  //! Clears settings provided by the hilight drawing tool theDrawer.
-  Standard_EXPORT virtual void UnsetHilightAttributes();
-  
-  //! Initializes theDrawer by default hilight settings.
-  Standard_EXPORT static void InitDefaultHilightAttributes (const Handle(Prs3d_Drawer)& theDrawer);
-  
+  void UpdateSelection (const Standard_Integer theMode = -1)
+  {
+    updateSelection (theMode);
+  }
+
   //! Sets common entity owner for assembly sensitive object entities
   Standard_EXPORT void SetAssemblyOwner (const Handle(SelectMgr_EntityOwner)& theOwner, const Standard_Integer theMode = -1);
-  
-  //! Returns common entity owner if the object is an assembly
-  Standard_EXPORT const Handle(SelectMgr_EntityOwner)& GetAssemblyOwner() const;
-  
-  //! Returns a bounding box of sensitive entities with the owners given
-  //! if they are a part of activated selection
-  Standard_EXPORT Bnd_Box BndBoxOfSelected (Handle(SelectMgr_IndexedMapOfOwner)& theOwners);
 
-  //! Returns the mode for selection of object as a whole
-  inline Standard_Integer GlobalSelectionMode() const;
+  //! Returns a bounding box of sensitive entities with the owners given if they are a part of activated selection
+  Standard_EXPORT Bnd_Box BndBoxOfSelected (const Handle(SelectMgr_IndexedMapOfOwner)& theOwners);
+
+  //! Returns the mode for selection of object as a whole; 0 by default.
+  Standard_Integer GlobalSelectionMode() const { return myGlobalSelMode; }
 
   //! Returns the owner of mode for selection of object as a whole
   Standard_EXPORT virtual Handle(SelectMgr_EntityOwner) GlobalSelOwner() const;
 
+  //! Returns common entity owner if the object is an assembly
+  Standard_EXPORT virtual const Handle(SelectMgr_EntityOwner)& GetAssemblyOwner() const;
 
-friend class SelectMgr_SelectionManager;
-
-
-  DEFINE_STANDARD_RTTIEXT(SelectMgr_SelectableObject,PrsMgr_PresentableObject)
+  //! Dumps the content of me into the stream
+  Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const Standard_OVERRIDE;
 
 protected:
 
-  
+  //! Protected empty constructor.
   Standard_EXPORT SelectMgr_SelectableObject(const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d = PrsMgr_TOP_AllView);
 
-  inline void setGlobalSelMode (const Standard_Integer theMode);
-
-  SelectMgr_SequenceOfSelection myselections;
-  Handle(Prs3d_Drawer) myDrawer;
-  Handle(Prs3d_Drawer) myHilightDrawer;
-  Handle(SelectMgr_EntityOwner) myAssemblyOwner;
-
+  //! Override global selection mode.
+  void setGlobalSelMode (const Standard_Integer theMode)
+  {
+    myGlobalSelMode = theMode > 0 ? theMode : 0;
+  }
 
-private:
+  //! Update clipping planes state.
+  Standard_EXPORT virtual void UpdateClipping() Standard_OVERRIDE;
 
+  //! Sets update status FULL to selections of the object.
+  //! Must be used as the only method of UpdateSelection from outer classes to prevent BVH structures from being outdated.
+  Standard_EXPORT virtual void updateSelection (const Standard_Integer theMode);
 
-  Standard_Integer mycurrent;
-  Standard_Boolean myAutoHilight;
-  Handle(Prs3d_Presentation) mySelectionPrs;
-  Handle(Prs3d_Presentation) myHilightPrs;
-  Standard_Integer myGlobalSelMode;
+protected:
 
+  SelectMgr_SequenceOfSelection myselections;    //!< list of selections
+  Handle(Prs3d_Presentation)    mySelectionPrs;  //!< optional presentation for highlighting selected object
+  Handle(Prs3d_Presentation)    myHilightPrs;    //!< optional presentation for highlighting detected object
+  Standard_Integer              myGlobalSelMode; //!< global selection mode
+  Standard_Boolean              myAutoHilight;   //!< auto-highlighting flag defining
 
 };
 
-
-#include <SelectMgr_SelectableObject.lxx>
-
-
-
-
+DEFINE_STANDARD_HANDLE(SelectMgr_SelectableObject, PrsMgr_PresentableObject)
 
 #endif // _SelectMgr_SelectableObject_HeaderFile