Open CASCADE Technology 6.6.0
|
#include <NIS_InteractiveObject.hxx>
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_Drawer * | DefaultDrawer (NIS_Drawer *theDrv) const =0 |
const Bnd_B3f & | GetBox () |
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 |
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 |
Abstract base type for presentable and selectable object in NIS architecture.
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.
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 is made in class NIS_InteractiveContext, methods selectObjects(). These methods call the virtual API of interactive object, that consists of 3 methods:
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); ... }
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.
NIS_InteractiveObject::NIS_InteractiveObject | ( | ) | [inline] |
Empty constructor. Creates an object that is not attached to drawer.
virtual NIS_InteractiveObject::~NIS_InteractiveObject | ( | ) | [virtual] |
Destructor.
virtual void NIS_InteractiveObject::Clone | ( | const Handle_NCollection_BaseAllocator & | theAll, |
Handle_NIS_InteractiveObject & | theDest | ||
) | const [virtual] |
Create a copy of theObject except its ID.
theAll | Allocator where the Dest should store its private data. |
theDest | [in-out] The target object where the data are copied. |
Reimplemented in NIS_Surface, and NIS_Triangulated.
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 | ( | ) | [protected, pure virtual] |
Create a 3D bounding box of the object.
Implemented in NIS_Surface, and NIS_Triangulated.
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.
Implemented in NIS_Surface, and NIS_Triangulated.
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.
theAxis | The line or ray in 3D space. |
theOver | Half-thickness of the selecting line. |
Implemented in NIS_Surface, and NIS_Triangulated.
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;
theBox | 3D box of selection |
theTrf | Position/Orientation of the box. It coincides with theTrfInv that is passed to NIS_InteractiveObject::selectObjects(). |
isFull | True if full inclusion is required (full inside the tested box) for the positive result, False - if only partial inclusion give a result. |
Reimplemented in NIS_Surface, and NIS_Triangulated.
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.
thePolygon | the 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. |
theTrf | Position/Orientation of the polygon. It coincides with theTrfInv that is passed to NIS_InteractiveContext::selectObjects(). |
isFull | True if full inclusion is required (full inside the tested box) for the positive result, False - if only partial inclusion give a result. |
Reimplemented in NIS_Surface, and NIS_Triangulated.
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 [inline, protected] |
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.
void NIS_InteractiveObject::setDrawerUpdate | ( | ) | const [inline, protected] |
void NIS_InteractiveObject::setIsUpdateBox | ( | const Standard_Boolean | isUpdate | ) | [inline, protected] |
virtual void NIS_InteractiveObject::SetSelectable | ( | const Standard_Boolean | isSel = Standard_True | ) | const [virtual] |
Set or change the selectable state of the Object.
isSel | True (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).
void* NIS_InteractiveObject::myAttributePtr [protected] |
Bnd_B3f NIS_InteractiveObject::myBox [protected] |