Open CASCADE Technology  6.9.0
Public Member Functions | Protected Member Functions | Protected Attributes

NIS_InteractiveObject Class Referenceabstract

#include <NIS_InteractiveObject.hxx>

Inheritance diagram for NIS_InteractiveObject:
Inheritance graph
[legend]

Public Member Functions

 NIS_InteractiveObject ()
 
virtual ~NIS_InteractiveObject ()
 
Standard_Integer ID () const
 
NIS_Drawer::DrawType DrawType () const
 
const Handle< NIS_Drawer > & SetDrawer (const Handle< NIS_Drawer > &theDrawer, const Standard_Boolean setUpdated=Standard_True)
 
const Handle< NIS_Drawer > & GetDrawer () const
 
virtual NIS_DrawerDefaultDrawer (NIS_Drawer *theDrv) const =0
 
const Bnd_B3fGetBox ()
 
Standard_Boolean IsTransparent () const
 
Standard_Boolean IsHidden () const
 
Standard_Boolean IsDisplayed () const
 
Standard_Boolean IsDynHilighted () const
 
virtual Standard_Boolean IsSelectable () const
 
virtual void SetSelectable (const Standard_Boolean isSel=Standard_True) const
 
Standard_ShortReal Transparency () const
 
void SetTransparency (const Standard_Real theValue=0.6)
 
void UnsetTransparency ()
 
virtual void Clone (const Handle< NCollection_BaseAllocator > &theAll, Handle< NIS_InteractiveObject > &theDest) const
 
void CloneWithID (const Handle< NCollection_BaseAllocator > &, Handle< NIS_InteractiveObject > &)
 
virtual Standard_Real Intersect (const gp_Ax1 &theAxis, const Standard_Real theOver) const =0
 
virtual Standard_Boolean Intersect (const Bnd_B3f &theBox, const gp_Trsf &theTrf, const Standard_Boolean isFull) const
 
virtual Standard_Boolean Intersect (const NCollection_List< gp_XY > &thePolygon, const gp_Trsf &theTrf, const Standard_Boolean isFull) const
 
void SetAttribute (void *theAttributePtr)
 
void * GetAttribute () const
 
- Public Member Functions inherited from Standard_Transient
 Standard_Transient ()
 Empty constructor. More...
 
 Standard_Transient (const Standard_Transient &)
 Copy constructor – does nothing. More...
 
Standard_Transientoperator= (const Standard_Transient &)
 Assignment operator, needed to avoid copying reference counter. More...
 
virtual ~Standard_Transient ()
 Destructor must be virtual. More...
 
virtual void Delete () const
 Memory deallocator for transient classes. More...
 
virtual const
Handle_Standard_Type & 
DynamicType () const
 Returns a type information object about this object. More...
 
Standard_Boolean IsInstance (const Handle_Standard_Type &theType) const
 Returns a true value if this is an instance of Type. More...
 
Standard_Boolean IsInstance (const Standard_CString theTypeName) const
 Returns a true value if this is an instance of TypeName. More...
 
Standard_Boolean IsKind (const Handle_Standard_Type &theType) const
 Returns true if this is an instance of Type or an instance of any class that inherits from Type. Note that multiple inheritance is not supported by OCCT RTTI mechanism. More...
 
Standard_Boolean IsKind (const Standard_CString theTypeName) const
 Returns true if this is an instance of TypeName or an instance of any class that inherits from TypeName. Note that multiple inheritance is not supported by OCCT RTTI mechanism. More...
 
virtual Handle_Standard_Transient This () const
 Returns a Handle which references this object. Must never be called to objects created in stack. More...
 
Standard_Integer GetRefCount () const
 Get the reference counter of this object. More...
 

Protected Member Functions

void setDrawerUpdate () const
 
virtual void computeBox ()=0
 
Standard_Boolean isUpdateBox () const
 
void setIsUpdateBox (const Standard_Boolean isUpdate)
 

Protected Attributes

Bnd_B3f myBox
 
void * myAttributePtr
 

Detailed Description

Abstract base type for presentable and selectable object in NIS architecture.

<> InteractiveObject_class

An InteractiveObject has the attributes:

Because the class is abstract, it does not define any color, material and other visual aspect - all relevant aspects should be defined in derived classes and their Drawers.

<> Drawers for NIS_InteractiveObject

Every InteractiveObject type should have an associated NIS_Drawer type; a new instance of this associated drawer must be returned by the virtual method DefaultDrawer(). The drawer is responsible for the correct calculation of the presentation in every possible state (normal, hilighted, etc.); usually the associated drawer instance contains all relevant visual aspects.

Association with a Drawer instance is performed by method SetDrawer(). This method should not be called by any custom code, it is used internally by NIS algorithms (in NIS_InteractiveContext::Display() for instance). If you develop your own InteractiveObject type, you will need to call SetDrawer whenever you change the visual aspect, for example:

* void MyIOClass::SetColor (const Quantity_Color& theColor);
* {
* const Handle(MyIOClassDrawer) aDrawer =
* static_cast<MyIOClassDrawer*>(DefaultDrawer(0L));
* // copy the current visual aspects and other attributes to the new Drawer
* aDrawer->Assign (GetDrawer());
* // replace the Drawer
* aDrawer->myColor = theColor;
* SetDrawer (aDrawer);
* }
*

Please keep in mind that with this scheme you should not store the color in MyIOClass type, because it is already stored in its Drawer.

<> Interactive selection

Interactive selection is made in class NIS_InteractiveContext, methods selectObjects(). These methods call the virtual API of interactive object, that consists of 3 methods:

<> Memory management

All data used in the scope of NIS_InteractiveObject subtype should be either its explicit fields or pointers to memory managed by a special NIS_Allocator instance that belongs to NIS_InteractiveContext. This is strictly required because NIS_InteractiveContext should completely manage all its objects, meaning that it destroys/reallocates them automatically. To support that, the virtual method Clone() should be correctly defined for every interactive object subtype. Supposing that MyIOClass inherits MyBaseIOBase :

* void MyIOCalss::Clone (const Handle(NCollection_BaseAllocator)& theAlloc,
* Handle(NIS_InteractiveObject)& theDest) const
* {
* Handle(MyIOClass) aNewObj;
* if (theDest.IsNull()) {
* aNewObj = new MyIOClass();
* theDest = aNewObj;
* } else {
* aNewObj = reinterpret_cast<MyIOClass*> (theDest.operator->());
* aNewObj->myAlloc = theAlloc;
* }
* MyIOBase::Clone(theAlloc, theDest);
* aNewObj->myDataField = myDataField;
* memcpy(myNewObj->myDataArray, myDataArray, nBytes);
* ...
* }
*
<> Attribute

An instance of this class can have an associated value (Attribute) that is stored as a pointer. It can accommodate an integer/float/boolean value or a pointer to some structure. This attribute is NOT automatically destroyed with the InteractiveObject.

Constructor & Destructor Documentation

NIS_InteractiveObject::NIS_InteractiveObject ( )
inline

Empty constructor. Creates an object that is not attached to drawer.

virtual NIS_InteractiveObject::~NIS_InteractiveObject ( )
virtual

Destructor.

Member Function Documentation

virtual void NIS_InteractiveObject::Clone ( const Handle< NCollection_BaseAllocator > &  theAll,
Handle< NIS_InteractiveObject > &  theDest 
) const
virtual

Create a copy of theObject except its ID.

Parameters
theAllAllocator where the Dest should store its private data.
theDest[in-out] The target object where the data are copied.

Reimplemented in NIS_Triangulated, and NIS_Surface.

void NIS_InteractiveObject::CloneWithID ( const Handle< NCollection_BaseAllocator > &  ,
Handle< NIS_InteractiveObject > &   
)

The same as Clone() but also copies the ID.

virtual void NIS_InteractiveObject::computeBox ( )
protectedpure virtual

Create a 3D bounding box of the object.

Implemented in NIS_Triangulated, and NIS_Surface.

virtual NIS_Drawer* NIS_InteractiveObject::DefaultDrawer ( NIS_Drawer theDrv) const
pure virtual

Create a default drawer instance. In the upper-level call (in subclass) it is always called with NULL parameter. Then it should call the same method of the superclass (except for NIS_InteractiveObject superclass type) with the created Drawer instance as parameter.

See Also
NIS_Triangulated as example.

Implemented in NIS_Triangulated, and NIS_Surface.

NIS_Drawer::DrawType NIS_InteractiveObject::DrawType ( ) const
inline

Query the type of presentation.

void* NIS_InteractiveObject::GetAttribute ( ) const
inline

Query the associated custom (arbitrary) attribute pointer.

const Bnd_B3f& NIS_InteractiveObject::GetBox ( )

Query a 3D bounding box of the object.

const Handle< NIS_Drawer >& NIS_InteractiveObject::GetDrawer ( ) const
inline

Query the current drawer.

Standard_Integer NIS_InteractiveObject::ID ( ) const
inline

Query the ID of the Object in its Context.

virtual Standard_Real NIS_InteractiveObject::Intersect ( const gp_Ax1 theAxis,
const Standard_Real  theOver 
) const
pure virtual

Intersect the InteractiveObject geometry with a line/ray.

Parameters
theAxisThe line or ray in 3D space.
theOverHalf-thickness of the selecting line.
Returns
If the return value is more than 0.1*RealLast() then no intersection is detected. Otherwise returns the coordinate of thePnt on the ray. May be negative.

Implemented in NIS_Triangulated, and NIS_Surface.

virtual Standard_Boolean NIS_InteractiveObject::Intersect ( const Bnd_B3f theBox,
const gp_Trsf theTrf,
const Standard_Boolean  isFull 
) const
virtual

Intersect the InteractiveObject geometry with an oriented box. The default implementation (in this abstract class) always returns True, signalling that every object pre-selected by its bounding box is automatically selected. The specializations should define a more correct behaviour. The algorithm should transform the InteractiveObject geometry using the parameter theTrf and then reject it with box theBox, like:

* gp_Pnt aPnt = ..... // aPnt is part of our geometry.
* if (!theBox.IsOut (aPnt.Transformed(theTrf)))
* return Standard_True;
*
Parameters
theBox3D box of selection
theTrfPosition/Orientation of the box. It coincides with theTrfInv that is passed to NIS_InteractiveObject::selectObjects().
isFullTrue if full inclusion is required (full inside the tested box) for the positive result, False - if only partial inclusion give a result.
Returns
True if the InteractiveObject geometry intersects the box or is inside it

Reimplemented in NIS_Triangulated, and NIS_Surface.

virtual Standard_Boolean NIS_InteractiveObject::Intersect ( const NCollection_List< gp_XY > &  thePolygon,
const gp_Trsf theTrf,
const Standard_Boolean  isFull 
) const
virtual

Intersect the InteractiveObject geometry with a selection polygon. The default implementation (in this abstract class) always returns True, signalling that every object pre-selected by its bounding box is automatically selected. The specializations should define a more correct behaviour. The algorithm should transform the InteractiveObject geometry using the parameter theTrf and then reject it with polygon.

Parameters
thePolygonthe list of vertices of a free-form closed polygon without self-intersections. The last point should not coincide with the first point of the list. Any two neighbor points should not be confused.
theTrfPosition/Orientation of the polygon. It coincides with theTrfInv that is passed to NIS_InteractiveContext::selectObjects().
isFullTrue if full inclusion is required (full inside the tested box) for the positive result, False - if only partial inclusion give a result.
Returns
True if the InteractiveObject geometry intersects the polygon or is inside it

Reimplemented in NIS_Triangulated, and NIS_Surface.

Standard_Boolean NIS_InteractiveObject::IsDisplayed ( ) const
inline

Query the Displayed state - opposite to IsHidden().

Standard_Boolean NIS_InteractiveObject::IsDynHilighted ( ) const
inline

Query the Dynamic Hilight state

Standard_Boolean NIS_InteractiveObject::IsHidden ( ) const
inline

Query the Hidden state

virtual Standard_Boolean NIS_InteractiveObject::IsSelectable ( ) const
virtual

Query if the Object is selectable.

Standard_Boolean NIS_InteractiveObject::IsTransparent ( ) const
inline

Query the Transparent state.

Standard_Boolean NIS_InteractiveObject::isUpdateBox ( ) const
inlineprotected
void NIS_InteractiveObject::SetAttribute ( void *  theAttributePtr)
inline

Set the pointer to custom (arbitrary) data associated with the Object.

const Handle< NIS_Drawer >& NIS_InteractiveObject::SetDrawer ( const Handle< NIS_Drawer > &  theDrawer,
const Standard_Boolean  setUpdated = Standard_True 
)

Replace the drawer. This method must not be called for Object that has not yet been added to a Context (thus has empty drawer). It is possible to have unassigned myDrawer or a DefaultDrawer as the parameter value (but not both). The Context where we work is taken from theDrawer first, then (if NULL) – from myDrawer. This method matches theDrawer with the available Drawers in the Context and adds if no match is found.

Returns
Reference to the finally stored or found Drawer instance inside the Context.
void NIS_InteractiveObject::setDrawerUpdate ( ) const
inlineprotected
void NIS_InteractiveObject::setIsUpdateBox ( const Standard_Boolean  isUpdate)
inlineprotected
virtual void NIS_InteractiveObject::SetSelectable ( const Standard_Boolean  isSel = Standard_True) const
virtual

Set or change the selectable state of the Object.

Parameters
isSelTrue (default) - the Object will be selectable, False - it will be ignored by selection/hilighting algorithms.
void NIS_InteractiveObject::SetTransparency ( const Standard_Real  theValue = 0.6)

Set the Transparency factor.

Standard_ShortReal NIS_InteractiveObject::Transparency ( ) const
inline

Query the Transparency factor.

void NIS_InteractiveObject::UnsetTransparency ( )
inline

Present the Object as opaque (Normal draw type).

Field Documentation

void* NIS_InteractiveObject::myAttributePtr
protected
Bnd_B3f NIS_InteractiveObject::myBox
protected

The documentation for this class was generated from the following file: