0024530: TKMesh - remove unused package IntPoly
[occt.git] / src / NIS / NIS_InteractiveContext.hxx
CommitLineData
b311480e 1// Created on: 2007-07-06
2// Created by: Alexander GRIGORIEV
973c2be1 3// Copyright (c) 2007-2014 OPEN CASCADE SAS
b311480e 4//
973c2be1 5// This file is part of Open CASCADE Technology software library.
b311480e 6//
973c2be1 7// This library is free software; you can redistribute it and / or modify it
8// under the terms of the GNU Lesser General Public version 2.1 as published
9// by the Free Software Foundation, with special exception defined in the file
10// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11// distribution for complete text of the license and disclaimer of any warranty.
b311480e 12//
973c2be1 13// Alternatively, this file may be used under the terms of Open CASCADE
14// commercial license or contractual agreement.
7fd59977 15
16#ifndef NIS_InteractiveContext_HeaderFile
17#define NIS_InteractiveContext_HeaderFile
18
19#include <Handle_NIS_InteractiveObject.hxx>
20#include <Handle_NIS_View.hxx>
7fd59977 21#include <NCollection_Map.hxx>
0f524ba0 22#include <NCollection_SparseArray.hxx>
ffe2bea7 23#include <NIS_Allocator.hxx>
7fd59977 24#include <NIS_Drawer.hxx>
25#include <NIS_SelectFilter.hxx>
26
27#ifdef WNT
28#ifdef GetObject
29#undef GetObject
30#endif
31#endif
32
33class NIS_View;
34class Bnd_B3f;
ffe2bea7 35class Bnd_B2f;
7fd59977 36
37/**
38 * InteractiveContext is the central NIS structure that stores and manages
ffe2bea7 39 * all NIS_InteractiveObject instances as well as the Drawers for their
7fd59977 40 * visualisation.
41 * There may be one or more Views referred by an InteractiveContext instance.
42 * Also there may be one or more InteractiveContext instances referring the same
43 * View. However the latter case is not typical (see NIS_View description).<br>
44 * To add or remove a View in a Context, use methods AttachView() and
45 * DetachView().
ffe2bea7
A
46 *
47 * @section nis_interactivecontext_mgtobjects Management of objects
48 * The main purpose of class NIS_InteractiveContext is allocation and
7fd59977 49 * management of NIS_InteractiveObject instances.
50 * <p>An InteractiveObject should be added to the Context by a call to method
ffe2bea7 51 * Display() or DisplayOnTop(). After that (not before) it becomes possible to:
7fd59977 52 * <ul>
53 * <li>change the presentation of the InteractiveObject (e.g., modify the color)
54 * </li>
ffe2bea7
A
55 * <li>make the InteractiveObject visible or invisible, selectable or
56 * unselectable;</li>
7fd59977 57 * <li>set Transparency;</li>
58 * <li>select InteractiveObject interactively, including the hilighting and
59 * the dynamic hilighting.</li>
60 * </ul>
ffe2bea7
A
61 * Methods that add/remove/display/hide NIS_InteractiveObject instances have
62 * the optional parameter 'isUpdateViews'. When it is set to True (default),
63 * the modification of the object brings about an immediate update of its
64 * presentation (the corresponding Drawer flagged to recompute presentations).
65 * Normally you do not have to worry about this parameter leaving it assigned to
66 * the default value; use the alternative value 'Standard_False' only for
67 * very special purposes, like animation -- when many updates should be
68 * synchronized in time. For other methods like changing the transparency or
69 * color definition there is no parameter 'isUpdateViews', all changes mark
70 * the corresponding drawers immediately.
7fd59977 71 * <p>Typical scheme of usage:
72 * @code
73 * const Handle(NIS_InteractiveContext) aContext = new NIS_InteractiveContext;
74 * const Handle(NIS_View) aView = new NIS_View(...);
75 * aContext->AttachView (aView);
76 * ....
77 * for (; ;) {
ffe2bea7
A
78 * const Handle(MyIOClass) anObject = new MyIOClass();
79 * aContext->Display (anObject);
80 * anObject->SetColor(...); // method of class MyIOClass
7fd59977 81 * ...
82 * }
7fd59977 83 * @endcode
ffe2bea7
A
84 * @section nis_interactivecontext_display Method Display()
85 * This method performs three important tasks, when called the first time for
86 * an object:
7fd59977 87 * <ul>
ffe2bea7
A
88 * <li>Copy its argument to the memory pool that is managed by the internal
89 * Allocator of NIS_InteractiveContext. Then <b>the new instance of
90 * object</b> is returned back in the same argument (in-out parameter);</li>
91 * <li>Store the copied instance in the internal vector of objects, so that
92 * the displayed object receives its ID (sequential address in the vector);
93 * </li>
94 * <li>Create a Drawer instance if necessary; attach the displayed interactive
95 * object to this instance (or to a relevant and already existing Drawer)
96 * </li>
7fd59977 97 * </ul>
ffe2bea7
A
98 * Thus any methods dealing with Drawer-related properties like color, line
99 * width, polygon offset, etc. can only be called following the necessary call
100 * of method Display().
101 * <p>
102 * Subsequent calls to Display() just revert previous calls of Erase() without
103 * any re-initialization of interactive object or its drawer.
104 *
105 * @section nis_interactivecontext_memory Using the memory
106 * As described in the sections above, all interactive objects should completely
107 * reside in the special memory pool managed by the InteractiveContext instance.
108 * This is a fast memory (NCollection_IncAllocator is used) but it has the
109 * drawback: when you destroy an object using method Remove() it is detached
110 * from NIS_InteractiveContext and its presentation is removed from all Views.
111 * But the memory allocated for that removed object is not released and it
112 * cannot be reused by new interactive objects. In time there may appear too
113 * many "dead" objects to hinder or even crash the application.
114 * <p>
115 * This problem is resolved by automatic keeping the record of the total size
116 * of both used and unused memory, in the instance of NIS_Allocator. When the
117 * amount of unused memory becomes too big then the method compactObjects()
118 * creates a new NIS_Allocator instance and copies there all interactive
119 * objects that are 'alive' then releasing the previous memory pool. All
120 * object IDs and their drawers remain intact, so nothing is changed except
121 * the greater amount of available memory in the system.
122 * <p>
123 * This mechanism works when either UpdateViews() or RebuildViews() is called
124 * from time to time, only these two methods can call compactObjects().
7fd59977 125 */
126
127class NIS_InteractiveContext : public Standard_Transient
128{
129 public:
130 typedef enum {
131 Mode_NoSelection = 0, ///< Seelction is totally disabled
132 Mode_Normal, ///< Selected are added to or removed from list
133 Mode_Additive, ///< Selected are added to the list of selected
134 Mode_Exclusive ///< Selected are removed from the list
135 } SelectionMode;
136
137 public:
138 // ---------- PUBLIC METHODS ----------
139
140
141 /**
142 * Empty constructor.
143 */
144 Standard_EXPORT NIS_InteractiveContext ();
145
146 /**
147 * Destructor.
148 */
149 Standard_EXPORT virtual ~NIS_InteractiveContext ();
150
151 ///@name Management of Views
152 //@{
153 /**
154 * Associate this Context with the given View.
155 */
156 Standard_EXPORT void AttachView (const Handle_NIS_View& theView);
157
158 /**
159 * Stop the association of the Context with the given View.
160 */
161 Standard_EXPORT void DetachView (const Handle_NIS_View& theView);
162 //@}
163
164 /**
165 * Query the InteractiveObject instance by its ID.
166 */
0f524ba0 167 Standard_EXPORT const Handle_NIS_InteractiveObject&
168 GetObject (const Standard_Integer theID) const;
7fd59977 169
170 /**
171 * Query the total number of InteractiveObject instances. This number can be
172 * smaller than the greatest object ID, therefore you should not iterate till
173 * this number using GetObject; use class NIS_ObjectsIterator instead.
174 */
175 inline Standard_Integer
176 NbObjects ()
177// { return myObjects.Length()-1; }
178 { return (myMapObjects[0].Extent() + myMapObjects[1].Extent() +
ffe2bea7 179 myMapObjects[2].Extent()) + myMapObjects[3].Extent(); }
7fd59977 180
181 /**
182 * Query the total number of Drawers instances.
183 */
184 inline Standard_Integer
185 NbDrawers ()
186 { return myDrawers.Size(); }
187
188 /**
ffe2bea7
A
189 * Access to Drawers, can be used for specific operations where it is not
190 * desirale to iterate InteractiveObjects.
191 */
192 inline NCollection_Map<Handle_NIS_Drawer>::Iterator
193 GetDrawers () const
194 { return NCollection_Map<Handle_NIS_Drawer>::Iterator(myDrawers); }
7fd59977 195
196 // ================ BEGIN Mangement of Objects ================
197 ///@name Management of Objects
198 //@{
199
200 /**
201 * Make the given interactive object visible in the current context.
202 * If the object is not yet added to this context, it is added. Therefore
203 * this method should follow the creation of an InteractiveObject instance
204 * before it can be displayed.
205 * @param theObj
ffe2bea7
A
206 * <tt>[in/out]</tt>Interactive object instance. If the object is displayed
207 * for the first time then the output value will be a new (cloned) object.
7fd59977 208 * @param theDrawer
209 * If this parameter is NULL, the default drawer is used for theObj, defined
210 * by the object type. Otherwise the given Drawer (must be present in this
211 * context) is used for theObj. Use the parameter to change the presentation
212 * of theObj.
213 * @param isUpdateViews
214 * If True, the drawer receives isUpdate flag, then it will recompute
215 * the presentations when Redraw event happens. You can leave the parameter
216 * to False if you have to make a number of similar calls, then you would
217 * call UpdateViews() in the end.
218 */
ffe2bea7 219 Standard_EXPORT void Display (Handle_NIS_InteractiveObject& theObj,
7fd59977 220 const Handle_NIS_Drawer& theDrawer = NULL,
221 const Standard_Boolean isUpdateViews
222 = Standard_True);
223
ffe2bea7
A
224 /**
225 * Make the given interactive object visible on top of other objects in
226 * the current context.
227 * If the object is not yet added to this context, it is added. Therefore
228 * this method should follow the creation of an InteractiveObject instance
229 * before it can be displayed.
230 * @param theObj
231 * Interactive object instance.
232 * @param theDrawer
233 * If this parameter is NULL, the default drawer is used for theObj, defined
234 * by the object type. Otherwise the given Drawer (must be present in this
235 * context) is used for theObj. Use the parameter to change the presentation
236 * of theObj.
237 * @param isUpdateViews
238 * If True, the drawer receives isUpdate flag, then it will recompute
239 * the presentations when Redraw event happens. You can leave the parameter
240 * to False if you have to make a number of similar calls, then you would
241 * call UpdateViews() in the end.
242 */
243 Standard_EXPORT void DisplayOnTop (Handle_NIS_InteractiveObject& theObj,
244 const Handle_NIS_Drawer& theDrawer = NULL,
245 const Standard_Boolean isUpdateViews
246 = Standard_True);
247
7fd59977 248 /**
249 * Make the given object invisible in the current InteractiveContext.
250 * @param theObj
251 * Interactive object instance. Must be already added to this context.
252 * @param isUpdateViews
253 * If True, the drawer receives isUpdate flag, then it will recompute
254 * the presentations when Redraw event happens. You can leave the parameter
255 * to False if you have to make a number of similar calls, then you would
256 * call UpdateViews() in the end.
257 */
258 Standard_EXPORT void Erase (const Handle_NIS_InteractiveObject& theObj,
259 const Standard_Boolean isUpdateViews
260 = Standard_True);
261
262 /**
263 * Remove the given object from its Interactive context.
264 * @param theObj
265 * Interactive object instance. Must be already added to this context.
266 * @param isUpdateViews
267 * If True, the drawer receives isUpdate flag, then it will recompute
268 * the presentations when Redraw event happens. You can leave the parameter
269 * to False if you have to make a number of similar calls, then you would
270 * call UpdateViews() in the end.
271 */
272 Standard_EXPORT void Remove (const Handle_NIS_InteractiveObject& theObj,
273 const Standard_Boolean isUpdateViews
274 = Standard_True);
275
276 /**
277 * Make all stored InteractiveObject instances visible, equivalent to
278 * calling method Display() for all contained objects.
7fd59977 279 */
ffe2bea7 280 Standard_EXPORT void DisplayAll ();
7fd59977 281
282 /**
283 * Make all stored InteractiveObject instances invisible, equivalent to
284 * calling method Erase() for all contained objects.
7fd59977 285 */
ffe2bea7 286 Standard_EXPORT void EraseAll ();
7fd59977 287
288 /**
ffe2bea7
A
289 * Clean the context of its contained objects. Drawers are destroyed
290 * and all presentations become empty.
7fd59977 291 */
ffe2bea7 292 Standard_EXPORT void RemoveAll ();
7fd59977 293
294 /**
ffe2bea7
A
295 * This method signals that the presenation should be refreshed in all updated
296 * Drawers and in all Views. Calls Redraw() of each view from inside.
7fd59977 297 */
298 Standard_EXPORT void UpdateViews ();
299
ffe2bea7
A
300 /**
301 * Similar to UpdateViews but forces all presentations to be rebuilt whether
302 * the drawers are marked as updated or not.
303 */
304 Standard_EXPORT void RebuildViews();
305
7fd59977 306 /**
307 * Find the bounding box of all Objects displayed (visible) in the given View.
308 * @param theBox
309 * <tt>[out]</tt> Bounding box, updated (not reinitialized!) by the object
310 * boxes.
311 * @param theView
312 * View instance where the objects are displayed.
313 */
314 Standard_EXPORT void GetBox (Bnd_B3f& theBox,
315 const NIS_View * theView) const;
316
317 //@}
318 // ================ END Mangement of Objects ================
319
320 // ================ BEGIN Selection API ================
321 ///@name Selection API
322 //@{
323
324 /**
325 * Query the current selection filter. Use the method SetFilter to install it.
326 * By default returns a NULL handle.
327 */
328 inline const Handle_NIS_SelectFilter&
329 GetFilter () const
330 { return mySelectFilter; }
331
332 /**
333 * Install a selection filter.
334 */
335 inline void SetFilter (const Handle_NIS_SelectFilter& theFilter)
336 { mySelectFilter = theFilter; }
337
338 /**
339 * Query the current selection mode.
340 */
341 inline SelectionMode GetSelectionMode () const
342 { return mySelectionMode; }
343
344 /**
345 * Set the selection mode.
346 */
347 inline void SetSelectionMode (const SelectionMode theMode)
348 { mySelectionMode = theMode; }
349
350 /**
351 * Set or unset the selected state of the object, also changing its
352 * hilight status.<br>
353 * If mySelectionMode == Mode_NoSelection this method does nothing (returns
354 * False always).<br>
355 * If the given object is NULL (e.g., if the mouse was clicked on empty area),
356 * then the current selection is cleared (modes Normal and Additive only).<br>
357 * The selection algorithm with respect to the given object is defined by
358 * the current selection mode :
359 * <ul>
360 * <li>Mode_Normal - the selection state is toggled</li>
361 * <li>Mode_Additive - the object is always added to the selection</li>
362 * <li>Mode_Exclusive - the object is always removed from the selection</li>
363 * </ul>
364 * This method does not update the views.
365 * @param O
366 * Object to be selected or deselected
367 * @param isMultiple
368 * If True, then the objects are not automatically deselected.
369 * @return
370 * True if the selection status has been changed, False if nothing changed
371 */
372 Standard_EXPORT Standard_Boolean
373 ProcessSelection(const Handle_NIS_InteractiveObject& O,
374 const Standard_Boolean isMultiple
375 = Standard_False);
376
377 /**
378 * Process the selection of multiple objects. Equivalent to the other
379 * ProcessSelection method, on a set of objects. Particularly, the current
380 * selection mode is respected.
381 * @param map
382 * Container of IDs of objects to be processed
383 * @param isMultiple
384 * If True, then the objects are not automatically deselected.
385 */
386 Standard_EXPORT void ProcessSelection(const TColStd_PackedMapOfInteger& map,
387 const Standard_Boolean isMultiple
388 = Standard_False);
389
390 /**
391 * Set or unset the selected state of the object, also changing its
392 * hilight status.<br>
393 * This method does not update the views.
394 * @param theObj
395 * Object to be selected or deselected
396 * @param isSelected
397 * true if the object should be selected, False - if deselected.
398 * @return
399 * True if the selection status has been changed, False if noithing changed
400 */
401 Standard_EXPORT Standard_Boolean
402 SetSelected (const Handle_NIS_InteractiveObject& theObj,
403 const Standard_Boolean isSelected
404 = Standard_True);
405
406 /**
407 * Set the selection. Previously selected objects are deselected if they
408 * are not included in the given map.
409 * @param map
410 * Container of IDs of objects to be selected
411 * @param isAdded
412 * If True, the given IDs are added to the current selection (nothing is
413 * deselected). If False (default) - the previous selection is forgotten.
414 */
415 Standard_EXPORT void SetSelected (const TColStd_PackedMapOfInteger& map,
416 const Standard_Boolean isAdded
417 = Standard_False);
418
419 /**
420 * Query if the given object is selected.
421 */
422 Standard_EXPORT Standard_Boolean
423 IsSelected (const Handle_NIS_InteractiveObject& theOb);
424
425 /**
426 * Reset all previous selection.
427 */
428 Standard_EXPORT void ClearSelected ();
429
430 /**
431 * Query the set of selected objects.
432 * @return
433 * Map of integer IDs of objects.
434 */
435 inline const TColStd_PackedMapOfInteger&
436 GetSelected ()
437 { return myMapObjects[NIS_Drawer::Draw_Hilighted]; }
438
439 /**
440 * Define objects that can be selected by no means (isSelectable = false),
441 * or make the objects selectable (isSelectable = true).
442 * @param IDs
443 * Container of IDs of objects to be set as selectable or not selectable
444 * @param isSelectable
445 * If False, the given IDs are made non-selectable by SetSelected methods,
446 * If True, the given IDs are made selectable.
447 */
448 Standard_EXPORT void SetSelectable (const TColStd_PackedMapOfInteger& IDs,
449 const Standard_Boolean isSelectable);
450
451 /**
452 * Return True if the object can be selected (processing by SetSelected
453 * methods), or False if can not be.
454 * @return
455 * Selectable state of the object.
456 */
457 inline Standard_Boolean IsSelectable (const Standard_Integer objID) const
458 { return (myMapNonSelectableObjects.Contains( objID ) == Standard_False); }
459
ffe2bea7
A
460 /**
461 * Set or reset the flag that tells to NIS_Drawer to create shared DrawList.
462 * The default mode (in Constructor) is True.
463 */
464 inline void SetShareDrawList (Standard_Boolean isShare)
465 { myIsShareDrawList = isShare; }
7fd59977 466
467 //@}
468 // ====== END Selection API ================
469
470 protected:
ffe2bea7
A
471 //! Structure referencing one detected (picked) interactive entity.
472 struct DetectedEnt
473 {
474 Standard_Real Dist; //!< Distance on the view direction
475 NIS_InteractiveObject* PObj; //!< Pointer to interactive object
476 };
477
7fd59977 478 // ---------- PROTECTED METHODS ----------
479
480 Standard_EXPORT void redraw (const Handle_NIS_View& theView,
481 const NIS_Drawer::DrawType theType);
482
7fd59977 483 /**
484 * Detect the object selected by the given ray.
485 * @param theSel
486 * <tt>[out]</tt> The selected object that has the lowest ray distance.
ffe2bea7
A
487 * @param theDet
488 * <tt>[out]</tt> Sorted list of all detected objects with ray distances
7fd59977 489 * @param theAxis
490 * Selection ray
491 * @param theOver
492 * Thickness of the selecting ray
493 * @param isOnlySelectable
494 * If False, any displayed object can be picked, otherwise only selectable
495 * ones.
496 * @return
497 * The ray distance of the intersection point between the ray and theSel.
498 */
499 Standard_EXPORT Standard_Real
500 selectObject (Handle_NIS_InteractiveObject& theSel,
ffe2bea7 501 NCollection_List<DetectedEnt>& theDet,
7fd59977 502 const gp_Ax1& theAxis,
503 const Standard_Real theOver,
504 const Standard_Boolean isOnlySelectable
505 = Standard_True) const;
506
507 /**
508 * Build a list of objects that are inside or touched by an oriented box.
509 * @param mapObj
510 * <tt>[out]</tt> Container of object IDs, updated by detected objects.
511 * @param theBox
512 * 3D box of selection
513 * @param theTrf
514 * Position/Orientation of the box (for box-box intersections)
515 * @param theTrfInv
516 * Inverted Position/Orientation of the box (for box-object intersections)
517 * @param isFullyIn
518 * True if only those objects are processed that are fully inside the
519 * selection rectangle. False if objects fully or partially included in
520 * the rectangle are processed.
521 * @return
522 * True if at least one object was selected.
523 */
524 Standard_EXPORT Standard_Boolean
525 selectObjects (TColStd_PackedMapOfInteger& mapObj,
526 const Bnd_B3f& theBox,
527 const gp_Trsf& theTrf,
528 const gp_Trsf& theTrfInv,
529 const Standard_Boolean isFullyIn)const;
530
ffe2bea7
A
531 /**
532 * Build a list of objects that are inside or touched by a polygon.
533 * @param mapObj
534 * <tt>[out]</tt> Container of object IDs, updated by detected objects.
535 * @param thePolygon
536 * the list of vertices of a free-form closed polygon without
537 * self-intersections. The last point should not coincide with the first
538 * point of the list. Any two neighbor points should not be confused.
539 * @param thePolygonBox
540 * 2D box of selection polygon
541 * @param theTrfInv
542 * Inverted Position/Orientation of the plane where thePolygon is defined
543 * (for polygon-object intersections)
544 * @param isFullyIn
545 * True if only those objects are processed that are fully inside the
546 * selection polygon. False if objects fully or partially included in
547 * the polygon are processed.
548 * @return
549 * True if at least one object was selected.
550 */
551 Standard_EXPORT Standard_Boolean
552 selectObjects (TColStd_PackedMapOfInteger &mapObj,
553 const NCollection_List<gp_XY> &thePolygon,
554 const Bnd_B2f &thePolygonBox,
555 const gp_Trsf &theTrfInv,
556 const Standard_Boolean isFullyIn) const;
557
558private:
559 void deselectObj (const Handle_NIS_InteractiveObject&,
560 const Standard_Integer);
561
562 void selectObj (const Handle_NIS_InteractiveObject&,
563 const Standard_Integer);
564
565 const Handle_NIS_Drawer&
566 drawerForDisplay (const Handle_NIS_InteractiveObject&,
567 const Handle_NIS_Drawer&);
568
569 void objectForDisplay (Handle_NIS_InteractiveObject&,
570 const NIS_Drawer::DrawType);
571
572 Handle_NIS_Allocator
573 compactObjects ();
574
7fd59977 575 private:
576 // ---------- PRIVATE FIELDS ----------
577
ffe2bea7
A
578 /**
579 * Allocator for all data associated with objects.
580 */
581 Handle_NIS_Allocator myAllocator;
582
0f524ba0 583 /**
584 * The last added object ID.
585 */
586 Standard_Integer myLastObjectId;
7fd59977 587 /**
588 * Container of InteractiveObject instances.
589 */
0f524ba0 590 NCollection_SparseArray <Handle_NIS_InteractiveObject>
591 myObjects;
7fd59977 592
593 /**
594 * List of Views.
595 */
596 NCollection_List <Handle_NIS_View> myViews;
597
598 /**
599 * Container of Drawers. There should be one or more Drawers for each type of
600 * contained InteractiveObject.
601 */
602 NCollection_Map <Handle_NIS_Drawer> myDrawers;
603
604 /**
605 * Three maps indicating the state of contained objects:
606 * - #0 - normally presented objects
ffe2bea7
A
607 * - #1 - top objects
608 * - #2 - hilighted objects (i.e., selected)
609 * - #3 - transparent objects
7fd59977 610 * <br>Each object can have only one entry in these maps.
611 */
ffe2bea7 612 TColStd_PackedMapOfInteger myMapObjects[4];
7fd59977 613
614 /**
615 * Objects contained in this map are ignored by SetSelected methods,
616 * these objects are not selectable.
617 */
618 TColStd_PackedMapOfInteger myMapNonSelectableObjects;
619
620 /**
621 * Instance of selection filter used for interactive selections.
622 */
623 Handle_NIS_SelectFilter mySelectFilter;
624
7fd59977 625 /**
626 * Current mode of selection.
627 */
628 SelectionMode mySelectionMode;
629
630 /**
ffe2bea7 631 * Flag that allows to use single draw list for all views.
7fd59977 632 */
ffe2bea7 633 Standard_Boolean myIsShareDrawList;
7fd59977 634
635 friend class NIS_View;
636 friend class NIS_Drawer;
637 friend class NIS_InteractiveObject;
638 friend class NIS_ObjectsIterator;
639
640 public:
641// Declaration of CASCADE RTTI
642DEFINE_STANDARD_RTTI (NIS_InteractiveContext)
643};
644
645// Definition of HANDLE object using Standard_DefineHandle.hxx
646DEFINE_STANDARD_HANDLE (NIS_InteractiveContext, Standard_Transient)
647
648
649#endif