- picked or selected objects are now highlighted via owners instead of interactive objects;
- support methods for owners were added to AIS_InteractiveContext;
- selected owners are highlighted in immediate mode in AIS_InteractiveContext;
- selection without opening of local context is enabled by default;
- added "-local" key to vselmode command to enable selection in local context;
- selection filters are now completely supported in AIS_InteractiveContext;
- the idea of differencing of selected items onto current (in interactive context) and selected (local selection)
was eliminated;
- all calls to "current" were replaced by calls to "selected" in terms of future local context removal;
- AIS_InteractiveObject::mySelectionMode was removed;
- now each selectable object can define own selection mode for "global" selection of the whole object;
- whole object selection mode is 0 by default for all standard interactive objects.
- added support of drawing immediate structures in different layers;
- unused code for immediate mode was removed;
- vfeedback and vexport commands now produce correct output for raytrace mode;
- do not add TKD3DHost to projects list due to usage of c++11-specific structures that are not supported in vc11.
Handle_AIS_Shape aRect2 = new AIS_Shape(W2);
myAISContext->Display(aRect2);
myAISContext->SetColor(aRect2,Quantity_NOC_YELLOW);
- myAISContext->SetSelectionMode(aRect2,2);
+ myAISContext->Activate(aRect2,2);
FitAll2DViews(Standard_True); // Update Viewer
}
BRepPrimAPI_MakeCylinder S(R,H);
myShape = S.Shape();
SetHilightMode(0);
- SetSelectionMode(0);
myDrawer->SetShadingAspect(new Prs3d_ShadingAspect());
myPlanarFaceColor = Quantity_NOC_FIREBRICK3;
myCylindricalFaceColor = Quantity_NOC_GRAY;
BRepBuilderAPI_NurbsConvert aNurbsConvert(S.Shape());
myShape = aNurbsConvert.Shape();
SetHilightMode(0);
- SetSelectionMode(0);
myDrawer->SetShadingAspect(new Prs3d_ShadingAspect());
myPlanarFaceColor = Quantity_NOC_FIREBRICK3;
myCylindricalFaceColor = Quantity_NOC_KHAKI4;
-- - working on only a few objects,
-- - working on a single object.
-- 1. When you want ot work on one type of entity, you
- -- should open a local context with the option
+ -- may open a local context with the option
-- UseDisplayedObjects set to false. DisplayedObjects
-- allows you to recover the visualized Interactive
-- Objects which have a given Type and
-- of setting up the different contexts of
-- selection/presentation according to the operation
-- which you want to perform.
+ --
+ -- Selection of parts of the objects can also be done without opening a local context.
+ -- Interactive context itself supports decomposed object selection with selection filters
+ -- support. Note that each selectable object must specify the selection mode that is
+ -- responsible for selection of object as a whole (global selection mode). By default, global
+ -- selection mode is equal to 0, but it might be redefined if needed. Sub-part selection
+ -- of the objects without using local context provides a possibility to activate part
+ -- selection modes along with global selection mode.
uses
Address from Standard,
-- Standard_False, the presentation of the Interactive
-- Object returns to the default selection mode; the
-- object is displayed but no viewer will be updated.
- SetSelectionMode(me:mutable;
- aniobj:InteractiveObject from AIS;
- aMode :Integer from Standard);
----Purpose:
--- Sets the selection mode of Interactive Objects.
--- aMode provides the selection mode index of the entity aniobj.
- UnsetSelectionMode(me : mutable;
- aniobj : InteractiveObject from AIS);
----Purpose:
--- Removes selection mode from Interactive Objects.
--- aMode provides the selection mode index of the entity aniobj.
SetPixelTolerance(me:mutable;
aPrecision: Real from Standard = 2.0);
returns Boolean from Standard;
IsHilighted(me;
- anIobj : InteractiveObject from AIS;
- WithColor: out Boolean from Standard;
- theHiCol : out NameOfColor from Quantity)
+ anIobj : InteractiveObject from AIS;
+ WithColor: out Boolean from Standard;
+ theHiCol : out NameOfColor from Quantity)
returns Boolean from Standard;
---Purpose: if <anIObj> is hilighted with a specific color
-- <WithColor> will be returned TRUE
-- <theHiCol> gives the name of the hilightcolor
+ IsHilighted (me;
+ theOwner : EntityOwner from SelectMgr;
+ theIsCustomColor : out Boolean from Standard;
+ theCustomColorName : out NameOfColor from Quantity)
+ returns Boolean from Standard;
+ ---Purpose: if <theOwner> is hilighted with a specific color, than <theIsCustomColor> will be set
+ -- to true and <theCustomColorName> will have the name of the color stored
+
DisplayPriority(me;anIobj: InteractiveObject from AIS)
returns Integer from Standard;
---Purpose:
-- The Selected objects are objects picked
-- when a local context is opened
+ ---Category: Obsolete methods that are valid for local context only
SetCurrentObject(me:mutable;
- aniobj: InteractiveObject from AIS;
- updateviewer : Boolean from Standard = Standard_True);
---- Purpose:
--- Updates the view of the current object in open context.
--- Objects selected when there is no open local context
--- are called current objects; those selected in open
--- local context, selected objects.
--- If a local context is open and if updateviewer equals
--- Standard_False, the presentation of the Interactive
--- Object activates the selection mode; the object is
--- displayed but no viewer will be updated.
-
- AddOrRemoveCurrentObject(me:mutable;
- aniobj : InteractiveObject from AIS;
- updateviewer : Boolean from Standard = Standard_True);
----Purpose:
--- Allows you to add a current object to the list of current
--- objects or remove it from that list.
--- Objects selected when there is no open local context
--- are called current objects; those selected in open
--- local context, selected objects.
--- If a local context is open and if updateviewer equals
--- Standard_False, the presentation of the Interactive
--- Object activates the selection mode; the object is
--- displayed but no viewer will be updated.
+ aniobj: InteractiveObject from AIS;
+ updateviewer : Boolean from Standard = Standard_True);
+ --- Purpose:
+ -- Updates the view of the current object in open context.
+ -- Objects selected when there is no open local context
+ -- are called current objects; those selected in open
+ -- local context, selected objects.
+ -- If a local context is open and if updateviewer equals
+ -- Standard_False, the presentation of the Interactive
+ -- Object activates the selection mode; the object is
+ -- displayed but no viewer will be updated.
+
+ AddOrRemoveCurrentObject (me : mutable;
+ theObj : InteractiveObject from AIS;
+ theIsToUpdateViewer : Boolean from Standard = Standard_True);
+ ---Purpose:
+ -- Allows to add or remove the object given to the list of current and highlight/unhighlight it
+ -- correspondingly. Is valid for global context only; for local context use method AddOrRemoveSelected.
+ -- Since this method makes sence only for neutral point selection of a whole object, if 0 selection
+ -- of the object is empty this method simply does nothing.
+
UpdateCurrent (me:mutable);
---Purpose: Updates the list of current objects, i.e. hilights new
--- current objects, removes hilighting from former current objects.
--- Objects selected when there is no open local context
--- are called current objects; those selected in open
--- local context, selected objects.
- --
+ -- current objects, removes hilighting from former current objects.
+ -- Objects selected when there is no open local context
+ -- are called current objects; those selected in open
+ -- local context, selected objects.
WasCurrentTouched(me) returns Boolean from Standard;
- ---Purpose:
- -- Returns the current selection touched by the cursor.
- -- Objects selected when there is no open local context
- -- are called current objects; those selected in open
- -- local context, selected objects.
- ---C++: inline
+ ---Purpose:
+ -- Returns the current selection touched by the cursor.
+ -- Objects selected when there is no open local context
+ -- are called current objects; those selected in open
+ -- local context, selected objects.
+ ---C++: inline
SetOkCurrent(me:mutable);
---C++: inline
- IsCurrent(me;aniobj: InteractiveObject from AIS) returns Boolean from Standard;
---- Purpose:
--- Returns true if there is a non-null interactive object in Neutral Point.
--- Objects selected when there is no open local context
--- are called current objects; those selected in open
--- local context, selected objects.
-
+ IsCurrent (me;
+ theObject : InteractiveObject from AIS)
+ returns Boolean from Standard;
+ --- Purpose: Returns true if there is a non-null interactive object in Neutral Point.
+ -- Objects selected when there is no open local context are called current objects;
+ -- those selected in open local context, selected objects.
+
InitCurrent(me:mutable);
---- Purpose:
--- Initializes a scan of the current selected objects in
--- Neutral Point.
--- Objects selected when there is no open local context
--- are called current objects; those selected in open
--- local context, selected objects.
-
- MoreCurrent(me) returns Boolean from Standard;
---- Purpose:
--- Returns true if there is another object found by the
--- scan of the list of current objects.
--- Objects selected when there is no open local context
--- are called current objects; those selected in open
--- local context, selected objects.
-
- NextCurrent(me:mutable);
----Purpose:
--- Continues the scan to the next object in the list of
--- current objects.
--- Objects selected when there is no open local context
--- are called current objects; those selected in open
--- local context, selected objects.
-
- Current(me) returns InteractiveObject from AIS;
----Purpose:
--- Returns the current interactive object.
--- Objects selected when there is no open local context
--- are called current objects; those selected in open
--- local context, selected objects.
-
+ --- Purpose:
+ -- Initializes a scan of the current selected objects in
+ -- Neutral Point.
+ -- Objects selected when there is no open local context
+ -- are called current objects; those selected in open
+ -- local context, selected objects.
+
+ MoreCurrent(me) returns Boolean from Standard;
+ --- Purpose:
+ -- Returns true if there is another object found by the
+ -- scan of the list of current objects.
+ -- Objects selected when there is no open local context
+ -- are called current objects; those selected in open
+ -- local context, selected objects.
+
+ NextCurrent(me:mutable);
+ ---Purpose:
+ -- Continues the scan to the next object in the list of
+ -- current objects.
+ -- Objects selected when there is no open local context
+ -- are called current objects; those selected in open
+ -- local context, selected objects.
+
+ Current(me) returns InteractiveObject from AIS;
+ ---Purpose:
+ -- Returns the current interactive object.
+ -- Objects selected when there is no open local context
+ -- are called current objects; those selected in open
+ -- local context, selected objects.
+
NbCurrents(me:mutable) returns Integer from Standard;
-
- FirstCurrentObject(me:mutable) returns InteractiveObject from AIS;
----Purpose:
--- Returns the first current object in the list of current objects.
--- Objects selected when there is no open local context
--- are called current objects; those selected in open
--- local context, selected objects.
+
+ HilightCurrents (me : mutable;
+ theToUpdateViewer : Boolean from Standard = Standard_True);
+ ---Purpose:
+ --- Highlights current objects.
+ -- Objects selected when there is no open local context
+ -- are called current objects; those selected in open
+ -- local context, selected objects.
+ -- If a local context is open and if updateviewer equals
+ -- Standard_False, the presentation of the Interactive
+ -- Object activates the selection mode; the object is
+ -- displayed but no viewer will be updated.
- HilightCurrents(me : mutable;
- updateviewer : Boolean from Standard=Standard_True);
- ---Purpose:
---- Highlights current objects.
--- Objects selected when there is no open local context
--- are called current objects; those selected in open
--- local context, selected objects.
--- If a local context is open and if updateviewer equals
--- Standard_False, the presentation of the Interactive
--- Object activates the selection mode; the object is
--- displayed but no viewer will be updated.
-
UnhilightCurrents(me : mutable;
- updateviewer : Boolean from Standard=Standard_True);
----Purpose:
--- Removes highlighting from current objects.
--- Objects selected when there is no open local context
--- are called current objects; those selected in open
--- local context, selected objects.
--- If a local context is open and if updateviewer equals
--- Standard_False, the presentation of the Interactive
--- Object activates the selection mode; the object is
--- displayed but no viewer will be updated.
-
- ClearCurrents(me:mutable;
- updateviewer : Boolean from Standard=Standard_True);
----Purpose:
--- Empties previous current objects in order to get the
--- current objects detected by the selector using
--- UpdateCurrent.
--- Objects selected when there is no open local context
--- are called current objects; those selected in open
--- local context, selected objects.
--- If a local context is open and if updateviewer equals
--- Standard_False, the presentation of the Interactive
--- Object activates the selection mode; the object is
--- displayed but no viewer will be updated.
+ updateviewer : Boolean from Standard=Standard_True);
+ ---Purpose:
+ -- Removes highlighting from current objects.
+ -- Objects selected when there is no open local context
+ -- are called current objects; those selected in open
+ -- local context, selected objects.
+ -- If a local context is open and if updateviewer equals
+ -- Standard_False, the presentation of the Interactive
+ -- Object activates the selection mode; the object is
+ -- displayed but no viewer will be updated.
+
+ ClearCurrents (me : mutable;
+ theToUpdateViewer : Boolean from Standard = Standard_True);
+ ---Purpose:
+ -- Empties previous current objects in order to get the
+ -- current objects detected by the selector using
+ -- UpdateCurrent.
+ -- Objects selected when there is no open local context
+ -- are called current objects; those selected in open
+ -- local context, selected objects.
+ -- If a local context is open and if updateviewer equals
+ -- Standard_False, the presentation of the Interactive
+ -- Object activates the selection mode; the object is
+ -- displayed but no viewer will be updated.
+
+ DetectedCurrentShape(me) returns Shape from TopoDS;
+ ---C++: return const &
+ ---Purpose:
+ -- @return current mouse-detected shape or empty (null) shape, if current interactive object
+ -- is not a shape (AIS_Shape) or there is no current mouse-detected interactive object at all.
+ DetectedCurrentObject(me) returns InteractiveObject from AIS;
+ --Purpose:
+ -- @return current mouse-detected interactive object or null object if there is no current detected.
+
+ ---Category: Selection mehods valid for both local and interactive context
+
+ SetSelected (me : mutable;
+ theOwners : EntityOwner from SelectMgr;
+ theToUpdateViewer : Boolean from Standard = Standard_True);
+ ---Purpose: Unhighlights previously selected owners and marks them as not selected.
+ -- Marks owner given as selected and highlights it.
+
+ AddOrRemoveSelected (me : mutable;
+ theOwner : EntityOwner from SelectMgr;
+ theToUpdateViewer : Boolean from Standard = Standard_True);
+ ---Purpose: Allows to highlight or unhighlight the owner given depending on its selection status
+
+ IsSelected (me;
+ theOwner : EntityOwner from SelectMgr)
+ returns Boolean from Standard;
+ ---Purpose: Returns true is the owner given is selected
+
+ FirstSelectedObject(me:mutable) returns InteractiveObject from AIS;
+ ---Purpose:
+ -- Returns the first current object in the list of current objects.
+ -- Objects selected when there is no open local context
+ -- are called current objects; those selected in open
+ -- local context, selected objects.
SetSelected(me:mutable;aniObj: InteractiveObject from AIS;
updateviewer : Boolean from Standard=Standard_True);
-- Object activates the selection mode; the object is
-- displayed but no viewer will be updated.
- SetSelectedCurrent(me:mutable);
- ---Purpose: puts the selected list in the current objects List.
UpdateSelected(me:mutable;
updateviewer : Boolean from Standard=Standard_True);
---Purpose: updates the list of selected objects
aniobj : InteractiveObject from AIS;
updateviewer : Boolean from Standard=Standard_True);
---Purpose:Allows you to add a selected object to the list of
--- selected objects or remove it from that list. This entity
--- can be an Interactive Object aniobj or its owner
--- aShape as can be seen in the two syntaxes above.
--- Objects selected when there is no open local context
--- are called current objects; those selected in open
--- local context, selected objects.
--- If a local context is open and if updateviewer equals
--- Standard_False, the presentation of the Interactive
--- Object activates the selection mode; the object is
--- displayed but no viewer will be updated.
+ -- selected objects or remove it from that list. This entity
+ -- can be an Interactive Object aniobj or its owner
+ -- aShape as can be seen in the two syntaxes above.
+ -- Objects selected when there is no open local context
+ -- are called current objects; those selected in open
+ -- local context, selected objects.
+ -- If a local context is open and if updateviewer equals
+ -- Standard_False, the presentation of the Interactive
+ -- Object activates the selection mode; the object is
+ -- displayed but no viewer will be updated.
HilightSelected(me : mutable;
updateviewer : Boolean from Standard=Standard_True);
----Purpose:
--- Highlights selected objects.
--- Objects selected when there is no open local context
--- are called current objects; those selected in open
--- local context, selected objects.
--- If a local context is open and if updateviewer equals
--- Standard_False, the presentation of the Interactive
--- Object activates the selection mode; the object is
--- displayed but no viewer will be updated.
+ ---Purpose:
+ -- Highlights selected objects.
+ -- Objects selected when there is no open local context
+ -- are called current objects; those selected in open
+ -- local context, selected objects.
+ -- If a local context is open and if updateviewer equals
+ -- Standard_False, the presentation of the Interactive
+ -- Object activates the selection mode; the object is
+ -- displayed but no viewer will be updated.
UnhilightSelected(me : mutable;
updateviewer : Boolean from Standard=Standard_True);
----Purpose:
--- Removes highlighting from selected objects.
--- Objects selected when there is no open local context
--- are called current objects; those selected in open
--- local context, selected objects.
--- If a local context is open and if updateviewer equals
--- Standard_False, the presentation of the Interactive
--- Object activates the selection mode; the object is
--- displayed but no viewer will be updated.
+ ---Purpose:
+ -- Removes highlighting from selected objects.
+ -- Objects selected when there is no open local context
+ -- are called current objects; those selected in open
+ -- local context, selected objects.
+ -- If a local context is open and if updateviewer equals
+ -- Standard_False, the presentation of the Interactive
+ -- Object activates the selection mode; the object is
+ -- displayed but no viewer will be updated.
ClearSelected(me:mutable;
updateviewer : Boolean from Standard=Standard_True);
----Purpose:
--- Empties previous selected objects in order to get the
--- selected objects detected by the selector using
--- UpdateSelected.
--- Objects selected when there is no open local context
--- are called current objects; those selected in open
--- local context, selected objects.
--- If a local context is open and if updateviewer equals
--- Standard_False, the presentation of the Interactive
--- Object activates the selection mode; the object is
--- displayed but no viewer will be updated.
+ ---Purpose:
+ -- Empties previous selected objects in order to get the
+ -- selected objects detected by the selector using
+ -- UpdateSelected.
+ -- Objects selected when there is no open local context
+ -- are called current objects; those selected in open
+ -- local context, selected objects.
+ -- If a local context is open and if updateviewer equals
+ -- Standard_False, the presentation of the Interactive
+ -- Object activates the selection mode; the object is
+ -- displayed but no viewer will be updated.
AddOrRemoveSelected(me:mutable;aShape:Shape from TopoDS;
updateviewer : Boolean from Standard=Standard_True);
- ---Purpose: No right to Add a selected Shape (Internal Management
- -- of shape Selection).
- -- A Previous selected shape may only be removed.
-
-
- AddOrRemoveSelected(me:mutable;anOwner : EntityOwner from SelectMgr;
- updateviewer: Boolean from Standard=Standard_True);
- ---Purpose: allows to add/remove in the selected list the entities
- -- represented by <anOwner> in the selection process.
+ ---Purpose: No right to Add a selected Shape (Internal Management
+ -- of shape Selection).
+ -- A Previous selected shape may only be removed.
---Category: Selection Process
IsSelected(me;aniobj: InteractiveObject from AIS) returns Boolean from Standard;
- --- Purpose:
--- Finds the selected object aniobj in local context and
--- returns its name.
--- Objects selected when there is no open local context
--- are called current objects; those selected in open
--- local context, selected objects.
+ --- Purpose:
+ -- Finds the selected object aniobj in local context and
+ -- returns its name.
+ -- Objects selected when there is no open local context
+ -- are called current objects; those selected in open
+ -- local context, selected objects.
InitSelected(me:mutable);
----Purpose:
--- Initializes a scan of the selected objects in local context.
--- Objects selected when there is no open local context
--- are called current objects; those selected in open
--- local context, selected objects.
+ ---Purpose:
+ -- Initializes a scan of the selected objects in local context.
+ -- Objects selected when there is no open local context
+ -- are called current objects; those selected in open
+ -- local context, selected objects.
MoreSelected(me) returns Boolean from Standard;
----Purpose:
--- Returns true if there is another object found by the
--- scan of the list of selected objects.
--- Objects selected when there is no open local context
--- are called current objects; those selected in open
--- local context, selected objects.
+ ---Purpose:
+ -- Returns true if there is another object found by the
+ -- scan of the list of selected objects.
+ -- Objects selected when there is no open local context
+ -- are called current objects; those selected in open
+ -- local context, selected objects.
NextSelected(me:mutable);
----Purpose:
--- Continues the scan to the next object in the list of
--- selected objects.
--- Objects selected when there is no open local context
--- are called current objects; those selected in open
--- local context, selected objects.
+ ---Purpose:
+ -- Continues the scan to the next object in the list of
+ -- selected objects.
+ -- Objects selected when there is no open local context
+ -- are called current objects; those selected in open
+ -- local context, selected objects.
NbSelected(me:mutable) returns Integer from Standard;
HasSelectedShape(me) returns Boolean from Standard;
---- Purpose:
--- Returns true if the interactive context has a shape
--- selected in it which results from the decomposition of
--- another entity in local context.
--- If HasSelectedShape returns true, SelectedShape
--- returns the shape which has been shown to be
--- selected. Interactive returns the Interactive Object
--- from which the shape has been selected.
--- If HasSelectedShape returns false, Interactive
--- returns the interactive entity selected by the click of the mouse.
+ --- Purpose:
+ -- Returns true if the interactive context has a shape
+ -- selected in it which results from the decomposition of
+ -- another entity in local context.
+ -- If HasSelectedShape returns true, SelectedShape
+ -- returns the shape which has been shown to be
+ -- selected. Interactive returns the Interactive Object
+ -- from which the shape has been selected.
+ -- If HasSelectedShape returns false, Interactive
+ -- returns the interactive entity selected by the click of the mouse.
SelectedShape(me) returns Shape from TopoDS;
----Purpose:
--- Returns the selected shape in the open local context.
--- Objects selected when there is no open local context
--- are called current objects; those selected in open
--- local context, selected objects.
+ ---Purpose:
+ -- Returns the selected shape in the open local context.
+ -- Objects selected when there is no open local context
+ -- are called current objects; those selected in open
+ -- local context, selected objects.
SelectedOwner(me) returns EntityOwner from SelectMgr;
----Purpose:
--- Returns the owner of the selected entity resulting
--- from the decomposition of another entity in local context.
+ ---Purpose:
+ -- Returns the owner of the selected entity resulting
+ -- from the decomposition of another entity in local context.
EntityOwners(me; theOwners : out IndexedMapOfOwner from SelectMgr;
theIObj : InteractiveObject from AIS;
--- the selection mode theMode (in all active modes
--- if the Mode == -1)
- Interactive(me) returns InteractiveObject from AIS;
- ---Purpose: Returns the location of the selected Interactive Object.
SelectedInteractive(me) returns InteractiveObject from AIS;
HasApplicative(me) returns Boolean from Standard;
---Purpose:
-- Gets next current object during iteration through mouse-detected
-- interactive objects.
- DetectedCurrentShape(me) returns Shape from TopoDS;
- ---C++: return const &
- ---Purpose:
- -- @return current mouse-detected shape or empty (null) shape, if current interactive object
- -- is not a shape (AIS_Shape) or there is no current mouse-detected interactive object at all.
- DetectedCurrentObject(me) returns InteractiveObject from AIS;
- --Purpose:
- -- @return current mouse-detected interactive object or null object if there is no current detected.
---Category: SPECIFIC LOCAL CONTEXT ACTIONS.
theStatus : DisplayStatus from AIS = AIS_DS_None) is static;
---Purpose: Query objects visible or hidden in specified view due to affinity mask.
+ RedrawImmediate (me : mutable;
+ theViewer : Viewer from V3d)
+ is static;
+ ---Purpose: Redraws immediate structures in all views of the viewer given taking into
+ -- account their visibility.
+
InitAttributes(me:mutable) is static private;
theToUpdateViewer : Boolean from Standard = Standard_True) is static private;
---Purpose: UNKNOWN
+ unhighlightOwners (me : mutable;
+ theObject : InteractiveObject from AIS)
+ is static private;
+ ---Purpose: Helper function to unhighlight all entity owners currently highlighted with seleciton color.
+
+ highlightWithColor (me : mutable;
+ theOwner : EntityOwner from SelectMgr;
+ theColor : NameOfColor from Quantity;
+ theViewer : Viewer from V3d = NULL)
+ is static private;
+ ---Purpose: Helper function that highlights the owner given with <theColor> without
+ -- performing AutoHighlight checks, e.g. is used for dynamic highlight.
+ -- If the parameter <theViewer> is set and <theIsImmediate> is true, highlight will be synchronized
+ -- automatically in all views of the viewer.
+
+ highlightSelected (me : mutable;
+ theOwner : EntityOwner from SelectMgr;
+ theSelColor : NameOfColor from Quantity)
+ is static private;
+ ---Purpose: Helper function that highlights the owner given with <theColor> with check
+ -- for AutoHighlight, e.g. is used for selection.
+ -- If the parameter <theViewer> is set and <theIsImmediate> is true, selection color will be synchronized
+ -- automatically in all views of the viewer.
+
fields
myObjects : DataMapOfIOStatus from AIS;
mySelectionName : AsciiString from TCollection;
myCurrentName : AsciiString from TCollection;
- myLastPicked : InteractiveObject from AIS;
- myLastinMain : InteractiveObject from AIS;
+ myLastPicked : EntityOwner from SelectMgr;
+ myLastinMain : EntityOwner from SelectMgr;
myWasLastMain : Boolean from Standard;
{
Handle(AIS_InteractiveObject) anObj = anObjIter.Key();
anObj->SetContext (aNullContext);
+ for (anObj->Init(); anObj->More(); anObj->Next())
+ {
+ anObj->CurrentSelection()->UpdateBVHStatus (SelectMgr_TBU_Renew);
+ }
}
MMgt_TShared::Delete();
}
return Standard_False;
}
+//=======================================================================
+//function : IsHilighted
+//purpose : Returns true if the objects global status is set to highlighted.
+// theIsCustomColor flag defines if highlight color is not equal to OCCT's
+// default Quantity_NOC_WHITE color. If theIsCustomColor is true,
+// custom highlight color name will be stored to theCustomColorName
+//=======================================================================
+Standard_Boolean AIS_InteractiveContext::IsHilighted (const Handle(SelectMgr_EntityOwner)& theOwner,
+ Standard_Boolean& theIsCustomColor,
+ Quantity_NameOfColor& theCustomColorName) const
+{
+ if (theOwner.IsNull() || !theOwner->HasSelectable())
+ return Standard_False;
+
+ const Handle(AIS_InteractiveObject) anObj =
+ Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
+ if (!myObjects.IsBound (anObj))
+ return Standard_False;
+
+ const Handle(AIS_GlobalStatus)& anObjStatus = myObjects (anObj);
+ if (anObjStatus->IsHilighted())
+ {
+ if (anObjStatus->HilightColor() != Quantity_NOC_WHITE)
+ {
+ theIsCustomColor = Standard_True;
+ theCustomColorName = anObjStatus->HilightColor();
+ }
+ else
+ {
+ theIsCustomColor = Standard_False;
+ }
+
+ return Standard_True;
+ }
+
+ return Standard_False;
+}
//=======================================================================
//function : IsDisplayed
if (aStatus->GraphicStatus() == AIS_DS_Displayed)
{
myMainPM->Display (anObj, theMode);
+ if (!myLastPicked.IsNull() && myLastPicked->Selectable() == anObj)
+ {
+ myMainPM->BeginImmediateDraw();
+ myMainPM->Unhighlight (anObj, myDisplayMode);
+ myMainPM->EndImmediateDraw (myMainVwr);
+ }
if (aStatus->IsSubIntensityOn())
{
myMainPM->Color (anObj, mySubIntensity, theMode);
theIObj->SetWidth (theWidth);
redisplayPrsRecModes (theIObj, theToUpdateViewer);
+ if (!myLastinMain.IsNull() && myLastinMain->Selectable() == theIObj)
+ {
+ if (myLastinMain->IsAutoHilight())
+ {
+ const Standard_Integer aHiMode =
+ theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
+ myLastinMain->HilightWithColor (myMainPM, myLastinMain->IsSelected() ? mySelectionColor : myHilightColor, aHiMode);
+ }
+ else
+ {
+ theIObj->HilightOwnerWithColor (myMainPM, myLastinMain->IsSelected() ? mySelectionColor : myHilightColor, myLastinMain);
+ }
+ }
}
//=======================================================================
theStatus += TCollection_AsciiString (aDispModeIter.Value());
theStatus += "\n";
}
- if (IsCurrent (theIObj)) theStatus +="\t| Current\n";
if (IsSelected(theIObj)) theStatus +="\t| Selected\n";
theStatus += "\t| Active Selection Modes in the MainViewer :\n";
? myDisplayMode
: 0);
theHiMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : theDispMode;
- theSelMode = theIObj->HasSelectionMode() ? theIObj->SelectionMode() : -1;
+ theSelMode = theIObj->GlobalSelectionMode();
}
//=======================================================================
myMainPM->SetVisibility (theIObj, aDispModeIter.Value(), Standard_False);
}
- if (IsCurrent (theIObj)
+ if (IsSelected (theIObj)
&& !aStatus->IsDModeIn (aDispMode))
{
myMainPM->SetVisibility (theIObj, aDispMode, Standard_False);
{
mgrSelector->Deactivate (theIObj, aSelModeIter.Value(), myMainSel);
}
+ aStatus->ClearSelectionModes();
aStatus->SetGraphicStatus (AIS_DS_Erased);
if (theToUpdateviewer)
}
}
+//=======================================================================
+//function : unhighlightOwners
+//purpose :
+//=======================================================================
+void AIS_InteractiveContext::unhighlightOwners (const Handle(AIS_InteractiveObject)& theObject)
+{
+ Handle(AIS_Selection) aSel = AIS_Selection::Selection (myCurrentName.ToCString());
+ aSel->Init();
+ while (aSel->More())
+ {
+ const Handle(SelectMgr_EntityOwner) anOwner =
+ Handle(SelectMgr_EntityOwner)::DownCast (aSel->Value());
+ if (anOwner->Selectable() == theObject)
+ {
+ if (anOwner->IsSelected())
+ {
+ AddOrRemoveSelected (anOwner, Standard_False);
+ aSel->Init();
+ continue;
+ }
+ }
+ aSel->Next();
+ }
+}
+
//=======================================================================
//function : ClearGlobal
//purpose :
}
Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
+ unhighlightOwners (theIObj);
for (TColStd_ListIteratorOfListOfInteger aDispModeIter (aStatus->DisplayedModes()); aDispModeIter.More(); aDispModeIter.Next())
{
- if (aStatus->IsHilighted())
- {
- if (IsCurrent (theIObj))
- {
- AddOrRemoveCurrentObject (theIObj, theToUpdateviewer);
- }
- else if (myMainPM->IsHighlighted (theIObj, aDispModeIter.Value()))
- {
- myMainPM->Unhighlight (theIObj, aDispModeIter.Value());
- }
- }
myMainPM->Erase (theIObj, aDispModeIter.Value());
myMainPM->Clear (theIObj, aDispModeIter.Value());
- if (theIObj->HasHilightMode())
- {
- Standard_Integer im = theIObj->HilightMode();
- myMainPM->Unhighlight (theIObj, im);
- myMainPM->Erase (theIObj, im);
- }
}
// Object removes from Detected sequence
}
}
- if (myLastinMain == theIObj)
- {
- myLastinMain.Nullify();
- }
- if (myLastPicked == theIObj)
- {
- myLastPicked.Nullify();
- }
-
// remove IO from the selection manager to avoid memory leaks
mgrSelector->Remove (theIObj);
myMainVwr->DefinedView()->View()->ChangeHiddenObjects()->Remove (theIObj);
}
- if (theToUpdateviewer
- && aStatus->GraphicStatus() == AIS_DS_Displayed)
+ if (!myLastinMain.IsNull() && myLastinMain->Selectable() == theIObj)
+ myLastinMain.Nullify();
+ if (!myLastPicked.IsNull() && myLastPicked->Selectable() == theIObj)
+ myLastPicked.Nullify();
+ myMainPM->ClearImmediateDraw();
+
+ if (theToUpdateviewer && aStatus->GraphicStatus() == AIS_DS_Displayed)
{
myMainVwr->Update();
}
return myDefaultDrawer->IsoOnPlane();
}
-//=======================================================================
-//function : SetSelectionMode
-//purpose :
-//=======================================================================
-void AIS_InteractiveContext::SetSelectionMode (const Handle(AIS_InteractiveObject)& ,
- const Standard_Integer )
-{
- //
-}
-
-//=======================================================================
-//function : UnsetSelectionMode
-//purpose :
-//=======================================================================
-void AIS_InteractiveContext::UnsetSelectionMode (const Handle(AIS_InteractiveObject)& )
-{
- //
-}
-
//=======================================================================
//function : SetPixelTolerance
//purpose : Disables the mechanism of adaptive tolerance calculation in
// commercial license or contractual agreement.
#include <AIS_InteractiveContext.jxx>
+#include <StdSelect_BRepOwner.hxx>
#include <SelectMgr_EntityOwner.hxx>
#include <StdSelect_ViewerSelector3d.hxx>
#include <AIS_Selection.hxx>
#include <TColStd_ListIteratorOfListOfInteger.hxx>
#include <SelectMgr_Selection.hxx>
+#include <SelectMgr_SequenceOfOwner.hxx>
#include <SelectBasics_SensitiveEntity.hxx>
#include <Prs3d_Presentation.hxx>
#include <AIS_MapOfInteractive.hxx>
#include <AIS_MapIteratorOfMapOfInteractive.hxx>
+typedef NCollection_DataMap<Handle(AIS_InteractiveObject), NCollection_Handle<SelectMgr_SequenceOfOwner> > AIS_MapOfObjSelectedOwners;
+
+//=======================================================================
+//function : highlightWithColor
+//purpose :
+//=======================================================================
+void AIS_InteractiveContext::highlightWithColor (const Handle(SelectMgr_EntityOwner)& theOwner,
+ const Quantity_NameOfColor theColor,
+ const Handle(V3d_Viewer)& theViewer)
+{
+ const Handle(AIS_InteractiveObject) anObj =
+ Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
+ if (anObj.IsNull())
+ return;
+ const Standard_Integer aHiMode = anObj->HasHilightMode() ? anObj->HilightMode() : 0;
+
+ myMainPM->BeginImmediateDraw();
+ theOwner->HilightWithColor (myMainPM, theColor, aHiMode);
+ myMainPM->EndImmediateDraw (theViewer.IsNull() ? myMainVwr : theViewer);
+}
+
+//=======================================================================
+//function : highlightSelected
+//purpose :
+//=======================================================================
+void AIS_InteractiveContext::highlightSelected (const Handle(SelectMgr_EntityOwner)& theOwner,
+ const Quantity_NameOfColor theSelColor)
+{
+ const Handle(AIS_InteractiveObject) anObj =
+ Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
+ if (anObj.IsNull())
+ return;
+ const Standard_Integer aHiMode = anObj->HasHilightMode() ? anObj->HilightMode() : 0;
+
+ if (!theOwner->IsAutoHilight())
+ {
+ AIS_Selection::SetCurrentSelection (myCurrentName.ToCString());
+ const Handle(AIS_Selection)& aCurSel = AIS_Selection::CurrentSelection();
+ SelectMgr_SequenceOfOwner aSeq;
+ for (aCurSel->Init(); aCurSel->More(); aCurSel->Next())
+ {
+ const Handle(SelectMgr_EntityOwner) aSelOwnr =
+ Handle(SelectMgr_EntityOwner)::DownCast (aCurSel->Value());
+ if (aSelOwnr->Selectable() != anObj)
+ continue;
+ aSeq.Append (aSelOwnr);
+ }
+ anObj->HilightSelected (myMainPM, aSeq);
+ }
+ else
+ {
+ theOwner->HilightWithColor (myMainPM, theSelColor, aHiMode);
+ }
+}
+
//=======================================================================
//function : MoveTo
//purpose :
{
// does nothing if previously detected object is equal to the current one
Handle(SelectMgr_EntityOwner) aNewPickedOwner = myMainSel->Picked (aNewDetected);
- if (aNewPickedOwner->Selectable() == myLastPicked)
+ if (aNewPickedOwner == myLastPicked)
{
- return myLastPicked->State() == 1
+ return myLastPicked->IsSelected()
? AIS_SOD_Selected
: AIS_SOD_OnlyOneDetected;
}
// is needed only if myToHilightSelected flag is true. In this case previously detected
// object has been already highlighted with myHilightColor during previous MoveTo()
// method call. As result it is necessary to rehighligt it with mySelectionColor.
- if (!myLastPicked.IsNull())
+ if (!myLastPicked.IsNull() && myLastPicked->HasSelectable())
{
- const Standard_Integer aHiMod = myLastPicked->HasHilightMode() ? myLastPicked->HilightMode() : 0;
- if (myLastPicked->State() != 1)
+ myMainPM->ClearImmediateDraw();
+ const Handle(AIS_InteractiveObject) aLastPickedAIS = Handle(AIS_InteractiveObject)::DownCast (myLastPicked->Selectable());
+ const Standard_Integer aHiMod = aLastPickedAIS->HasHilightMode() ? aLastPickedAIS->HilightMode() : 0;
+ if (!myLastPicked->IsSelected())
{
- myMainPM->Unhighlight (myLastPicked, aHiMod);
+ myLastPicked->Unhilight (myMainPM, aHiMod);
toUpdateViewer = Standard_True;
}
else if (myToHilightSelected)
{
- myMainPM->Color (myLastPicked, mySelectionColor, aHiMod);
+ highlightWithColor (aNewPickedOwner, mySelectionColor, theView->Viewer());
toUpdateViewer = Standard_True;
}
}
// initialize myLastPicked field with currently detected object
- myLastPicked = Handle(AIS_InteractiveObject)::DownCast (aNewPickedOwner->Selectable());
+ myLastPicked = aNewPickedOwner;
myLastinMain = myLastPicked;
// highlight detected object if it is not selected or myToHilightSelected flag is true
- if (!myLastPicked.IsNull())
+ if (myLastPicked->HasSelectable())
{
- if (myLastPicked->State() != 1 || myToHilightSelected)
+ if (!myLastPicked->IsSelected() || myToHilightSelected)
{
- const Standard_Integer aHiMod = myLastPicked->HasHilightMode() ? myLastPicked->HilightMode() : 0;
- myMainPM->Color (myLastPicked, myHilightColor, aHiMod);
+ highlightWithColor (myLastPicked, myHilightColor, theView->Viewer());
toUpdateViewer = Standard_True;
}
- aStatus = myLastPicked->State() == 1
+ aStatus = myLastPicked->IsSelected()
? AIS_SOD_Selected
: AIS_SOD_OnlyOneDetected;
}
}
- else
+ else
{
// previously detected object is unhilighted if it is not selected or hilighted
// with selection color if it is selected
aStatus = AIS_SOD_Nothing;
- if (!myLastPicked.IsNull())
+ if (!myLastPicked.IsNull() && myLastPicked->HasSelectable())
{
- Standard_Integer aHiMod = myLastPicked->HasHilightMode() ? myLastPicked->HilightMode() : 0;
- if (myLastPicked->State() != 1)
+ myMainPM->ClearImmediateDraw();
+ const Handle(AIS_InteractiveObject) aLastPickedAIS = Handle(AIS_InteractiveObject)::DownCast (myLastPicked->Selectable());
+ Standard_Integer aHiMod = aLastPickedAIS->HasHilightMode() ? aLastPickedAIS->HilightMode() : 0;
+ if (!myLastPicked->IsSelected())
{
- myMainPM->Unhighlight (myLastPicked, aHiMod);
+ if (myLastPicked->IsAutoHilight())
+ {
+ myLastPicked->Unhilight (myMainPM, aHiMod);
+ }
toUpdateViewer = Standard_True;
}
else if (myToHilightSelected)
{
- myMainPM->Color (myLastPicked, mySelectionColor, aHiMod);
+ highlightSelected (myLastPicked, mySelectionColor);
toUpdateViewer = Standard_True;
}
}
theView, toUpdateViewer);
}
- ClearCurrents (Standard_False);
+ ClearSelected (Standard_False);
Handle(StdSelect_ViewerSelector3d) aSelector;
aSelector->Pick (theXPMin, theYPMin, theXPMax, theYPMax, theView);
AIS_Selection::SetCurrentSelection (myCurrentName.ToCString());
- AIS_MapOfInteractive anObjectsToSelect;
for (aSelector->Init(); aSelector->More(); aSelector->Next())
{
- Handle(AIS_InteractiveObject) anObj =
- Handle(AIS_InteractiveObject)::DownCast (aSelector->Picked()->Selectable());
- if (!anObj.IsNull())
- {
- anObjectsToSelect.Add (anObj);
- }
- }
+ const Handle(SelectMgr_EntityOwner)& aCurOwner = aSelector->Picked();
+ if (aCurOwner.IsNull() || !aCurOwner->HasSelectable() || !myFilters->IsOk (aCurOwner))
+ continue;
- AIS_MapIteratorOfMapOfInteractive anIt (anObjectsToSelect);
- for ( ; anIt.More(); anIt.Next())
- {
- AIS_Selection::Select (anIt.Key());
- anIt.Key()->State (1);
+ AIS_Selection::Select (aCurOwner);
+ aCurOwner->State (1);
}
- HilightCurrents (toUpdateViewer);
+ HilightSelected (toUpdateViewer);
- Standard_Integer aSelNum = NbCurrents();
+ Standard_Integer aSelNum = NbSelected();
return (aSelNum == 0) ? AIS_SOP_NothingSelected
: (aSelNum == 1) ? AIS_SOP_OneSelected
return myLocalContexts(myCurLocalIndex)->Select (thePolyline, theView, toUpdateViewer);
}
- ClearCurrents (Standard_False);
+ ClearSelected (Standard_False);
Handle(StdSelect_ViewerSelector3d) aSelector;
aSelector->Pick (thePolyline, theView);
AIS_Selection::SetCurrentSelection (myCurrentName.ToCString());
- AIS_MapOfInteractive anObjectsToSelect;
for (aSelector->Init(); aSelector->More(); aSelector->Next())
{
- Handle(AIS_InteractiveObject) anObj =
- Handle( AIS_InteractiveObject )::DownCast (aSelector->Picked()->Selectable());
- if (!anObj.IsNull())
- {
- anObjectsToSelect.Add (anObj);
- }
- }
+ const Handle(SelectMgr_EntityOwner) anOwner =
+ Handle(SelectMgr_EntityOwner)::DownCast (aSelector->Picked());
+ if (anOwner.IsNull() || !anOwner->HasSelectable() || !myFilters->IsOk (anOwner))
+ continue;
- AIS_MapIteratorOfMapOfInteractive anIt (anObjectsToSelect);
- for ( ; anIt.More(); anIt.Next())
- {
- AIS_Selection::Select (anIt.Key());
- anIt.Key()->State (1);
+ AIS_Selection::Select (anOwner);
+ anOwner->State (1);
}
- HilightCurrents (toUpdateViewer);
+ HilightSelected (toUpdateViewer);
- Standard_Integer aSelNum = NbCurrents();
+ Standard_Integer aSelNum = NbSelected();
return (aSelNum == 0) ? AIS_SOP_NothingSelected
: (aSelNum == 1) ? AIS_SOP_OneSelected
}
else
{
- myLocalContexts(myCurLocalIndex)->SetSelected (myLastPicked, toUpdateViewer);
+ myLocalContexts(myCurLocalIndex)->SetSelected (Handle(AIS_InteractiveObject)::DownCast (myLastPicked->Selectable()), toUpdateViewer);
return AIS_SOP_OneSelected;
}
}
+ myMainPM->ClearImmediateDraw();
if (myWasLastMain && !myLastinMain.IsNull())
{
- if(myLastinMain->State() != 1)
+ if(!myLastinMain->IsSelected())
{
- SetCurrentObject (myLastinMain,Standard_False);
+ SetSelected (myLastinMain, Standard_False);
if(toUpdateViewer)
{
UpdateCurrentViewer();
{
AIS_Selection::SetCurrentSelection (myCurrentName.ToCString());
Handle(AIS_Selection) aSelection = AIS_Selection::CurrentSelection();
- Handle(AIS_InteractiveObject) anObj;
+ NCollection_IndexedMap<Handle(AIS_InteractiveObject)> anObjToClear;
for (aSelection->Init(); aSelection->More(); aSelection->Next())
{
- anObj = Handle(AIS_InteractiveObject)::DownCast (aSelection->Value());
- anObj->State (0);
- Unhilight (anObj,Standard_False);
- if (myObjects.IsBound (anObj) && myObjects(anObj)->IsSubIntensityOn())
+ const Handle(SelectMgr_EntityOwner) anOwner
+ = Handle(SelectMgr_EntityOwner)::DownCast (aSelection->Value());
+
+ if (anOwner.IsNull() || !anOwner->HasSelectable() || !myFilters->IsOk (anOwner))
+ continue;
+
+ const Handle(AIS_InteractiveObject) anObject =
+ Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
+ anOwner->State (0);
+ if (anOwner == anObject->GlobalSelOwner())
+ {
+ Handle(AIS_GlobalStatus) aStatus = myObjects (anObject);
+ aStatus->SetHilightStatus (Standard_False);
+ aStatus->SetHilightColor (Quantity_NOC_WHITE);
+ anObject->State (0);
+ }
+ if (!anOwner->IsAutoHilight())
{
- HilightWithColor (anObj, mySubIntensity, Standard_False);
+ if (!anObjToClear.Contains (anObject))
+ anObjToClear.Add (anObject);
}
+ else
+ {
+ const Standard_Integer aHiMode = anObject->HasHilightMode() ? anObject->HilightMode() : 0;
+ anOwner->Unhilight (myMainPM, aHiMode);
+ if (myObjects.IsBound (anObject) && myObjects(anObject)->IsSubIntensityOn())
+ {
+ anOwner->HilightWithColor (myMainPM, mySubIntensity, aHiMode);
+ }
+ }
+ }
+ while (!anObjToClear.IsEmpty())
+ {
+ anObjToClear.FindKey (anObjToClear.Size())->ClearSelected();
+ anObjToClear.RemoveLast();
}
AIS_Selection::Select();
}
}
- Standard_Integer aSelNum = NbCurrents();
+ Standard_Integer aSelNum = NbSelected();
return (aSelNum == 0) ? AIS_SOP_NothingSelected
: (aSelNum == 1) ? AIS_SOP_OneSelected
}
}
+ myMainPM->ClearImmediateDraw();
if (myWasLastMain && !myLastinMain.IsNull())
{
- AddOrRemoveCurrentObject (myLastinMain, toUpdateViewer);
+ AddOrRemoveSelected (myLastinMain, toUpdateViewer);
}
- Standard_Integer aCurrentSelNum = NbCurrents();
+ Standard_Integer aSelNum = NbSelected();
- return (aCurrentSelNum == 0) ? AIS_SOP_NothingSelected
- : (aCurrentSelNum == 1) ? AIS_SOP_OneSelected
- : AIS_SOP_SeveralSelected;
+ return (aSelNum == 0) ? AIS_SOP_NothingSelected
+ : (aSelNum == 1) ? AIS_SOP_OneSelected
+ : AIS_SOP_SeveralSelected;
}
//=======================================================================
theView, toUpdateViewer);
}
- UnhilightCurrents (Standard_False);
+ UnhilightSelected (Standard_False);
Handle(StdSelect_ViewerSelector3d) aSelector;
if (theView->Viewer() == myMainVwr)
AIS_Selection::SetCurrentSelection (myCurrentName.ToCString());
for (aSelector->Init(); aSelector->More(); aSelector->Next())
{
- Handle(AIS_InteractiveObject) anObjToSelect = Handle(AIS_InteractiveObject)::DownCast (aSelector->Picked()->Selectable());
- if (!anObjToSelect.IsNull())
- {
- AIS_SelectStatus aSelStatus = AIS_Selection::Select (anObjToSelect);
- Standard_Integer aState = (aSelStatus == AIS_SS_Added) ? 1 : 0;
- anObjToSelect->State (aState);
- }
+ const Handle(SelectMgr_EntityOwner) anOwner = Handle(SelectMgr_EntityOwner)::DownCast (aSelector->Picked());
+ if (anOwner.IsNull() || !anOwner->HasSelectable() || !myFilters->IsOk (anOwner))
+ continue;
+
+ AIS_SelectStatus aSelStatus = AIS_Selection::Select (anOwner);
+ Standard_Integer aState = (aSelStatus == AIS_SS_Added) ? 1 : 0;
+ anOwner->State (aState);
}
- HilightCurrents (toUpdateViewer);
+ HilightSelected (toUpdateViewer);
- Standard_Integer aSelNum = NbCurrents();
+ Standard_Integer aSelNum = NbSelected();
return (aSelNum == 0) ? AIS_SOP_NothingSelected
: (aSelNum == 1) ? AIS_SOP_OneSelected
return myLocalContexts(myCurLocalIndex)->ShiftSelect (thePolyline, theView, toUpdateViewer);
}
- UnhilightCurrents (Standard_False);
+ UnhilightSelected (Standard_False);
Handle(StdSelect_ViewerSelector3d) aSelector;
AIS_Selection::SetCurrentSelection (myCurrentName.ToCString());
for (aSelector->Init(); aSelector->More(); aSelector->Next())
{
- Handle(AIS_InteractiveObject) anObjToSelect = Handle(AIS_InteractiveObject)::DownCast (aSelector->Picked()->Selectable());
- if (!anObjToSelect.IsNull())
- {
- AIS_SelectStatus aSelStatus = AIS_Selection::Select (anObjToSelect);
- Standard_Integer aState = (aSelStatus == AIS_SS_Added ) ? 1 : 0;
- anObjToSelect->State (aState);
- }
+ const Handle(SelectMgr_EntityOwner) anOwner = Handle(SelectMgr_EntityOwner)::DownCast (aSelector->Picked());
+ if (anOwner.IsNull() || !anOwner->HasSelectable() || !myFilters->IsOk (anOwner))
+ continue;
+
+ AIS_SelectStatus aSelStatus = AIS_Selection::Select (anOwner);
+ Standard_Integer aState = (aSelStatus == AIS_SS_Added) ? 1 : 0;
+ anOwner->State (aState);
}
- HilightCurrents (toUpdateViewer);
+ HilightSelected (toUpdateViewer);
- Standard_Integer aSelNum = NbCurrents();
+ Standard_Integer aSelNum = NbSelected();
return (aSelNum == 0) ? AIS_SOP_NothingSelected
: (aSelNum == 1) ? AIS_SOP_OneSelected
//=======================================================================
//function : SetCurrentObject
-//purpose :
+//purpose : OBSOLETE, please use SetSelected() instead
+//TODO : Remove in process of local context deletion
//=======================================================================
-void AIS_InteractiveContext::SetCurrentObject(const Handle(AIS_InteractiveObject)& anIObj,
- const Standard_Boolean updateviewer)
+void AIS_InteractiveContext::SetCurrentObject (const Handle(AIS_InteractiveObject)& theObject,
+ const Standard_Boolean theToUpdateViewer)
{
- // single case processing...
- if(NbCurrents()==1 && anIObj->State()==1){
- Quantity_NameOfColor HiCol;
- Standard_Boolean HasHiCol;
- if(IsHilighted(anIObj,HasHiCol,HiCol)){
- if(HasHiCol && HiCol!= mySelectionColor) {
- HilightWithColor(anIObj,mySelectionColor,updateviewer);
- }
- }
+ if (HasOpenedContext())
return;
- }
-
- //
- if(!HasOpenedContext()) {
- if(anIObj.IsNull()) return;
- if(!myObjects.IsBound(anIObj))
- Display(anIObj,Standard_False);
-
- AIS_Selection::SetCurrentSelection(myCurrentName.ToCString());
- Handle(AIS_Selection) sel = AIS_Selection::Selection(myCurrentName.ToCString());
- Handle(Standard_Transient) TR;
- Handle(AIS_InteractiveObject) IO;
- sel->Init();
- while (sel->More()) {
- TR = sel->Value();
- IO = *((Handle(AIS_InteractiveObject)*)&TR);
- Unhilight(IO,Standard_False);
- IO->State(0);
- sel->Next();
- }
-
- // added to avoid untimely viewer update...
- AIS_Selection::ClearAndSelect(anIObj);
- anIObj->State(1);
- Quantity_NameOfColor HiCol;
- Standard_Boolean HasHiCol;
- if(IsHilighted(anIObj,HasHiCol,HiCol)){
- if(HasHiCol && HiCol!= mySelectionColor) {
- HilightWithColor(anIObj,mySelectionColor,Standard_False);
- }
- }
- else{
- HilightWithColor(anIObj,mySelectionColor,Standard_False);
- }
- if (updateviewer)
- UpdateCurrentViewer();
- }
- else{
-#ifdef OCCT_DEBUG
- cout<<"Nothing Done : Opened Local Context"<<endl;
-#endif
- }
+ SetSelected (theObject, theToUpdateViewer);
}
//=======================================================================
//function : AddOrRemoveCurrentObject
-//purpose :
+//purpose : OBSOLETE, please use AddOrRemoveSelected() instead
+//TODO : Remove in process of local context deletion
//=======================================================================
-
-void AIS_InteractiveContext::
-AddOrRemoveCurrentObject(const Handle(AIS_InteractiveObject)& anIObj,
- const Standard_Boolean updateviewer)
+void AIS_InteractiveContext::AddOrRemoveCurrentObject (const Handle(AIS_InteractiveObject)& theObj,
+ const Standard_Boolean theIsToUpdateViewer)
{
- if(anIObj.IsNull()) return;
-//OCC5682 to remove an object from neutral point even if Local Context is opened (Remove method)
- if(!HasOpenedContext() /*OCC5682*/|| myObjects.IsBound(anIObj)) {
-
- AIS_Selection::SetCurrentSelection(myCurrentName.ToCString());
- Handle(AIS_Selection) sel = AIS_Selection::Selection(myCurrentName.ToCString());
+ if (HasOpenedContext())
+ return;
- AIS_SelectStatus SelStat = AIS_Selection::Select(anIObj);
-
- Standard_Integer mod = (SelStat==AIS_SS_Added) ? 1 : 0;
- anIObj->State(mod);
- if(mod==1)
- HilightWithColor(anIObj,mySelectionColor,Standard_False);
- else
- Unhilight(anIObj,Standard_False);
-
-
- if(updateviewer)
- UpdateCurrentViewer();
- }
- else{
-#ifdef OCCT_DEBUG
- cout<<"Nothing Done : Opened Local Context"<<endl;
-#endif
- }
+ AddOrRemoveSelected (theObj, theIsToUpdateViewer);
}
//=======================================================================
//function : UpdateCurrent
-//purpose :
+//purpose : OBSOLETE, please use UpdateSelected() instead
+//TODO : Remove in process of local context deletion
//=======================================================================
-
void AIS_InteractiveContext::UpdateCurrent()
{
- HilightCurrents();
+ UpdateSelected();
}
//=======================================================================
//function : IsCurrent
-//purpose :
+//purpose : OBSOLETE, please use IsSelected() instead
+//TODO : Remove in process of local context deletion
//=======================================================================
-
-Standard_Boolean AIS_InteractiveContext::IsCurrent(const Handle(AIS_InteractiveObject)& anIObj) const
+Standard_Boolean AIS_InteractiveContext::IsCurrent (const Handle(AIS_InteractiveObject)& theObject) const
{
-
- if (anIObj.IsNull()) return Standard_False;
- return (anIObj->State()==1);
-
- // Handle(AIS_Selection) sel = AIS_Selection::Selection(myCurrentName.ToCString());
- // sel->Init();
- // while (sel->More()) {
- // if (anIObj == sel->Value()) return Standard_True;
- // sel->Next();
- // }
- // return Standard_False;
-
+ return IsSelected (theObject);
}
//=======================================================================
//function : InitCurrent
-//purpose :
+//purpose : OBSOLETE, please use InitSelected() instead
+//TODO : Remove in process of local context deletion
//=======================================================================
-
void AIS_InteractiveContext::InitCurrent()
{
- AIS_Selection::Selection(myCurrentName.ToCString())->Init();
+ if (HasOpenedContext())
+ return;
+
+ InitSelected();
}
//=======================================================================
//function : MoreCurrent
-//purpose :
+//purpose : OBSOLETE, please use MoreSelected() instead
+//TODO : Remove in process of local context deletion
//=======================================================================
-
Standard_Boolean AIS_InteractiveContext::MoreCurrent() const
{
- return AIS_Selection::Selection(myCurrentName.ToCString())->More();
-
+ return !HasOpenedContext() && MoreSelected();
}
//=======================================================================
//function : NextCurrent
-//purpose :
+//purpose : OBSOLETE, please use NextSelected() instead
+//TODO : Remove in process of local context deletion
//=======================================================================
-
void AIS_InteractiveContext::NextCurrent()
{
- AIS_Selection::Selection(myCurrentName.ToCString())->Next();
+ if (HasOpenedContext())
+ return;
+
+ NextSelected();
}
//=======================================================================
//function : Current
-//purpose :
+//purpose : OBSOLETE, please use SelectedInteractive() instead
+//TODO : Remove in process of local context deletion
//=======================================================================
-
Handle(AIS_InteractiveObject) AIS_InteractiveContext::Current() const
{
- Handle(Standard_Transient) TR = AIS_Selection::Selection(myCurrentName.ToCString())->Value();
- Handle(AIS_InteractiveObject) IO = *((Handle(AIS_InteractiveObject)*)&TR);
- return IO;
-}
-
-//=======================================================================
-//function : FirstCurrentObject
-//purpose :
-//=======================================================================
-Handle(AIS_InteractiveObject) AIS_InteractiveContext::FirstCurrentObject()
-{
- Handle(AIS_InteractiveObject) IO ;
- InitCurrent();
- if(MoreCurrent()){
- return Current();
- }
- return IO;
+ return HasOpenedContext() ? NULL : SelectedInteractive();
}
//=======================================================================
//function : NbCurrents
-//purpose :
+//purpose : OBSOLETE, please use NbSelected() instead
+//TODO : Remove in process of local context deletion
//=======================================================================
Standard_Integer AIS_InteractiveContext::NbCurrents()
{
- Standard_Integer i(0);
- for(InitCurrent();MoreCurrent();NextCurrent())
- {i++;}
- return i;
+ return HasOpenedContext() ? -1 : NbSelected();
}
//=======================================================================
//function : HilightCurrents
-//purpose :
+//purpose : OBSOLETE, please use HilightSelected() instead
+//TODO : Remove in process of local context deletion
//=======================================================================
-void AIS_InteractiveContext::HilightCurrents(const Standard_Boolean updateviewer)
+void AIS_InteractiveContext::HilightCurrents (const Standard_Boolean theToUpdateViewer)
{
- AIS_Selection::SetCurrentSelection(myCurrentName.ToCString());
- Handle(AIS_Selection) sel = AIS_Selection::Selection(myCurrentName.ToCString());
- Handle(Standard_Transient) TR;
- Handle(AIS_InteractiveObject) IO;
- sel->Init();
- while (sel->More()) {
- TR = sel->Value();
- IO = *((Handle(AIS_InteractiveObject)*)&TR);
- HilightWithColor(IO,mySelectionColor,Standard_False);
- sel->Next();
- }
- if(updateviewer)
- UpdateCurrentViewer();
+ if (HasOpenedContext())
+ return;
+
+ HilightSelected (theToUpdateViewer);
}
//=======================================================================
//function : UnhilightCurrents
-//purpose :
+//purpose : OBSOLETE, please use UnhilightSelected() instead
+//TODO : Remove in process of local context deletion
//=======================================================================
-
-void AIS_InteractiveContext::UnhilightCurrents(const Standard_Boolean updateviewer)
+void AIS_InteractiveContext::UnhilightCurrents (const Standard_Boolean theToUpdateViewer)
{
- AIS_Selection::SetCurrentSelection(myCurrentName.ToCString());
- Handle(AIS_Selection) sel = AIS_Selection::Selection(myCurrentName.ToCString());
- Handle(Standard_Transient) TR;
- Handle(AIS_InteractiveObject) IO;
- sel->Init();
- while (sel->More()) {
- TR = sel->Value();
- IO = *((Handle(AIS_InteractiveObject)*)&TR);
- Unhilight(IO,Standard_False);
- sel->Next();
- }
- if(updateviewer)
- UpdateCurrentViewer();
+ if (HasOpenedContext())
+ return;
+
+ UnhilightSelected (theToUpdateViewer);
}
//=======================================================================
//function : ClearCurrents
-//purpose :
+//purpose : OBSOLETE, please use ClearCurrents() instead
+//TODO : Remove in process of local context deletion
//=======================================================================
-
-void AIS_InteractiveContext::ClearCurrents(const Standard_Boolean updateviewer)
+void AIS_InteractiveContext::ClearCurrents(const Standard_Boolean theToUpdateViewer)
{
- if(NbCurrents()==0) return;
- AIS_Selection::SetCurrentSelection(myCurrentName.ToCString());
- Handle(AIS_Selection) S = AIS_Selection::CurrentSelection();
- Handle(Standard_Transient) Tr;
- Handle(AIS_InteractiveObject) IO;
- for(S->Init();S->More();S->Next()){
- Tr = S->Value();
- IO = (*((Handle(AIS_InteractiveObject)*)&Tr));
- IO->State(0);
- Unhilight(IO,Standard_False);
- }
- AIS_Selection::Select();
- if(updateviewer)
- UpdateCurrentViewer();
+ if (HasOpenedContext())
+ return;
+
+ ClearSelected (theToUpdateViewer);
}
//=======================================================================
//function : HilightSelected
-//purpose :
+//purpose :
//=======================================================================
-
-void AIS_InteractiveContext::HilightSelected(const Standard_Boolean updateviewer)
+void AIS_InteractiveContext::HilightSelected (const Standard_Boolean theToUpdateViewer)
{
- if(!HasOpenedContext()){
- AIS_Selection::SetCurrentSelection(mySelectionName.ToCString());
- Handle(AIS_Selection) sel = AIS_Selection::Selection(myCurrentName.ToCString());
- Handle(Standard_Transient) TR;
- Handle(AIS_InteractiveObject) IO;
- sel->Init();
- while (sel->More()) {
- TR = sel->Value();
- IO = *((Handle(AIS_InteractiveObject)*)&TR);
- HilightWithColor(IO,mySelectionColor,Standard_False);
- sel->Next();
+ if (HasOpenedContext())
+ {
+ return myLocalContexts (myCurLocalIndex)->HilightPicked (theToUpdateViewer);
+ }
+
+ // In case of selection without using local context
+ myMainPM->ClearImmediateDraw();
+ AIS_Selection::SetCurrentSelection (myCurrentName.ToCString());
+ Handle(AIS_Selection) aSel = AIS_Selection::Selection (myCurrentName.ToCString());
+ AIS_MapOfObjSelectedOwners anObjOwnerMap;
+ for (aSel->Init(); aSel->More(); aSel->Next())
+ {
+ const Handle(SelectMgr_EntityOwner) anOwner =
+ Handle(SelectMgr_EntityOwner)::DownCast (aSel->Value());
+ if (!anOwner.IsNull() && anOwner->HasSelectable())
+ {
+ const Handle(AIS_InteractiveObject) anObj =
+ Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
+ if (anOwner == anObj->GlobalSelOwner())
+ {
+ anObj->State (1);
+ }
+ anOwner->State (1);
+ if (!anOwner->IsAutoHilight())
+ {
+ NCollection_Handle<SelectMgr_SequenceOfOwner> aSeq;
+ if (anObjOwnerMap.Find (anObj, aSeq))
+ {
+ aSeq->Append (anOwner);
+ }
+ else
+ {
+ aSeq = new SelectMgr_SequenceOfOwner();
+ aSeq->Append (anOwner);
+ anObjOwnerMap.Bind (anObj, aSeq);
+ }
+ }
+ else
+ {
+ const Standard_Integer aHiMode = anObj->HasHilightMode() ? anObj->HilightMode() : 0;
+ anOwner->HilightWithColor (myMainPM, mySelectionColor, aHiMode);
+ }
}
}
- else
+
+ if (!anObjOwnerMap.IsEmpty())
+ {
+ for (AIS_MapOfObjSelectedOwners::Iterator anIter (anObjOwnerMap); anIter.More(); anIter.Next())
{
- myLocalContexts(myCurLocalIndex)->HilightPicked(updateviewer);
+ anIter.Key()->HilightSelected (myMainPM, *anIter.Value());
}
- if(updateviewer)
+ anObjOwnerMap.Clear();
+ }
+
+ if (theToUpdateViewer)
UpdateCurrentViewer();
}
//=======================================================================
//function : UnhilightSelected
-//purpose :
+//purpose :
//=======================================================================
-
-void AIS_InteractiveContext::UnhilightSelected(const Standard_Boolean updateviewer)
+void AIS_InteractiveContext::UnhilightSelected (const Standard_Boolean theToUpdateViewer)
{
- if(!HasOpenedContext()){
- AIS_Selection::SetCurrentSelection(mySelectionName.ToCString());
- Handle(AIS_Selection) sel = AIS_Selection::Selection(myCurrentName.ToCString());
- Handle(Standard_Transient) TR;
- Handle(AIS_InteractiveObject) IO;
- sel->Init();
- while (sel->More()) {
- TR = sel->Value();
- IO = *((Handle(AIS_InteractiveObject)*)&TR);
- Unhilight(IO,Standard_False);
- sel->Next();
- }
- if(updateviewer)
- UpdateCurrentViewer();
+ if (HasOpenedContext())
+ {
+ return myLocalContexts (myCurLocalIndex)->UnhilightPicked (theToUpdateViewer);
}
- else
+
+ AIS_Selection::SetCurrentSelection (myCurrentName.ToCString());
+ Handle(AIS_Selection) aSel = AIS_Selection::Selection (myCurrentName.ToCString());
+ for (aSel->Init(); aSel->More(); aSel->Next())
+ {
+ const Handle(SelectMgr_EntityOwner) anOwner =
+ Handle(SelectMgr_EntityOwner)::DownCast (aSel->Value());
+ if (!anOwner.IsNull() && anOwner->HasSelectable())
{
- myLocalContexts(myCurLocalIndex)->UnhilightPicked(updateviewer);
+ const Handle(AIS_InteractiveObject) anObj =
+ Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
+ if (anOwner == anObj->GlobalSelOwner())
+ {
+ anObj->State (0);
+ }
+ anOwner->State (0);
+ const Standard_Integer aHiMode = anObj->HasHilightMode() ? anObj->HasHilightMode() : 0;
+ anOwner->Unhilight (myMainPM, aHiMode);
}
+ }
+
+ if (theToUpdateViewer)
+ UpdateCurrentViewer();
}
//=======================================================================
//function : ClearSelected
-//purpose :
+//purpose :
//=======================================================================
-
-void AIS_InteractiveContext::ClearSelected(const Standard_Boolean updateviewer)
+void AIS_InteractiveContext::ClearSelected (const Standard_Boolean theToUpdateViewer)
{
- if(!HasOpenedContext())
- ClearCurrents(updateviewer);
- else
- myLocalContexts(myCurLocalIndex)->ClearSelected(updateviewer);
-
-}
+ if (HasOpenedContext())
+ return myLocalContexts (myCurLocalIndex)->ClearSelected (theToUpdateViewer);
+ if (NbSelected() == 0)
+ return;
-//=======================================================================
-//function : SetSelectedCurrent
-//purpose :
-//=======================================================================
+ AIS_Selection::SetCurrentSelection (myCurrentName.ToCString());
+ Handle(AIS_Selection) aSel = AIS_Selection::CurrentSelection();
+ NCollection_IndexedMap<Handle(AIS_InteractiveObject)> anObjToClear;
+ for (aSel->Init(); aSel->More(); aSel->Next())
+ {
+ const Handle(SelectMgr_EntityOwner) anOwner =
+ Handle(SelectMgr_EntityOwner)::DownCast (aSel->Value());
+ if (!anOwner.IsNull() && anOwner->HasSelectable())
+ {
+ const Handle(AIS_InteractiveObject) anObj =
+ Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
+ if (anOwner == anObj->GlobalSelOwner())
+ {
+ anObj->State (0);
+ }
+ anOwner->State (0);
+ if (!anOwner->IsAutoHilight())
+ {
+ if (!anObjToClear.Contains (anObj))
+ anObjToClear.Add (anObj);
+ }
+ else
+ {
+ const Standard_Integer aHiMode = anObj->HasHilightMode() ? anObj->HilightMode() : 0;
+ anOwner->Unhilight (myMainPM, aHiMode);
+ }
+ }
+ }
-void AIS_InteractiveContext::SetSelectedCurrent()
-{
+ while (!anObjToClear.IsEmpty())
+ {
+ anObjToClear.FindKey (anObjToClear.Size())->ClearSelected();
+ anObjToClear.RemoveLast();
+ }
+ AIS_Selection::Select();
+ myMainPM->ClearImmediateDraw();
-#ifdef OCCT_DEBUG
- cout<<"Not Yet Implemented"<<endl;
-#endif
+ if (theToUpdateViewer)
+ UpdateCurrentViewer();
}
//=======================================================================
-//function : UpdateSelection
-//purpose :
+//function : UpdateSelected
+//purpose :
//=======================================================================
+void AIS_InteractiveContext::UpdateSelected (const Standard_Boolean theToUpdateViewer)
+{
+ if (HasOpenedContext())
+ {
+ return myLocalContexts(myCurLocalIndex)->UpdateSelected (theToUpdateViewer);
+ }
-void AIS_InteractiveContext::UpdateSelected(const Standard_Boolean updateviewer)
+ HilightSelected (theToUpdateViewer);
+}
+
+//=======================================================================
+//function : SetSelected
+//purpose : Sets the whole object as selected and highlights it with selection color
+//=======================================================================
+void AIS_InteractiveContext::SetSelected (const Handle(AIS_InteractiveObject)& theObject,
+ const Standard_Boolean theToUpdateViewer)
{
- if(!HasOpenedContext()) {
- HilightSelected();
-#ifndef BUG
+ if(HasOpenedContext())
+ {
+ return myLocalContexts (myCurLocalIndex)->SetSelected (theObject, theToUpdateViewer);
+ }
+
+ if (theObject.IsNull())
return;
-#endif
+ if(!myObjects.IsBound (theObject))
+ Display (theObject, Standard_False);
+ if (theObject->HasSelection (0))
+ return;
+
+ if (NbSelected() == 1 && theObject->State() == 1)
+ {
+ Quantity_NameOfColor aHiCol;
+ Standard_Boolean hasHiCol = Standard_False;
+ if (IsHilighted (theObject, hasHiCol, aHiCol))
+ {
+ if (hasHiCol && aHiCol!= mySelectionColor)
+ {
+ HilightWithColor (theObject, mySelectionColor, theToUpdateViewer);
+ }
+ }
+ return;
+ }
+
+ AIS_Selection::SetCurrentSelection (myCurrentName.ToCString());
+ Handle(AIS_Selection) aCurSel = AIS_Selection::Selection (myCurrentName.ToCString());
+ for (aCurSel->Init(); aCurSel->More(); aCurSel->Next())
+ {
+ const Handle(SelectMgr_EntityOwner) anOwner =
+ Handle(SelectMgr_EntityOwner)::DownCast (aCurSel->Value());
+ if (anOwner.IsNull() || !anOwner->HasSelectable())
+ continue;
+
+ Handle(AIS_InteractiveObject) aSelectable =
+ Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
+ Unhilight (aSelectable, Standard_False);
+ anOwner->State (0);
+ aSelectable->State (0);
+ }
+
+ // added to avoid untimely viewer update...
+ const Handle(SelectMgr_Selection)& aSel = theObject->Selection (0);
+ if (aSel->IsEmpty())
+ return;
+ aSel->Init();
+ Handle(SelectMgr_EntityOwner) anOwner =
+ Handle(SelectMgr_EntityOwner)::DownCast (aSel->Sensitive()->BaseSensitive()->OwnerId());
+ AIS_Selection::ClearAndSelect (anOwner);
+ theObject->State (1);
+ anOwner->State (1);
+ Quantity_NameOfColor aHiCol;
+ Standard_Boolean hasHiCol = Standard_False;
+ if (IsHilighted (theObject, hasHiCol, aHiCol))
+ {
+ if (hasHiCol && aHiCol!= mySelectionColor)
+ {
+ HilightWithColor (theObject, mySelectionColor, Standard_False);
+ }
}
- myLocalContexts(myCurLocalIndex)->UpdateSelected(updateviewer);
+ else
+ {
+ HilightWithColor (theObject, mySelectionColor, Standard_False);
+ }
+
+ if (theToUpdateViewer)
+ UpdateCurrentViewer();
}
//=======================================================================
-//function : SetCurrentObject
-//purpose :
+//function : SetSelected
+//purpose : Sets the whole object as selected and highlights it with selection color
//=======================================================================
-void AIS_InteractiveContext::SetSelected(const Handle(AIS_InteractiveObject)& anIObj,const Standard_Boolean updateviewer)
+void AIS_InteractiveContext::SetSelected (const Handle(SelectMgr_EntityOwner)& theOwner,
+ const Standard_Boolean theToUpdateViewer)
{
- if(!HasOpenedContext())
- SetCurrentObject(anIObj,updateviewer);
- else
- myLocalContexts(myCurLocalIndex)->SetSelected(anIObj,updateviewer);
+ if (theOwner.IsNull() || !theOwner->HasSelectable())
+ return;
+
+ const Handle(AIS_InteractiveObject) anObject =
+ Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
+
+ if (NbSelected() == 1 && theOwner->IsSelected())
+ {
+ Quantity_NameOfColor aCustomColor;
+ Standard_Boolean isCustomColorSet;
+ if (IsHilighted (theOwner, isCustomColorSet, aCustomColor))
+ {
+ if (isCustomColorSet && aCustomColor != mySelectionColor)
+ {
+ const Standard_Integer aHiMode = anObject->HasHilightMode() ? anObject->HilightMode() : 0;
+ theOwner->HilightWithColor (myMainPM, mySelectionColor, aHiMode);
+ }
+ }
+ return;
+ }
+
+ if (!myObjects.IsBound (anObject))
+ Display (anObject, Standard_False);
+
+ AIS_Selection::SetCurrentSelection (myCurrentName.ToCString());
+ Handle(AIS_Selection) aCurSel = AIS_Selection::Selection (myCurrentName.ToCString());
+ for (aCurSel->Init(); aCurSel->More(); aCurSel->Next())
+ {
+ const Handle(SelectMgr_EntityOwner) anOwner =
+ Handle(SelectMgr_EntityOwner)::DownCast (aCurSel->Value());
+ if (!anOwner->HasSelectable())
+ continue;
+ const Standard_Integer aHiMode = anObject->HasHilightMode() ? anObject->HilightMode() : 0;
+ anOwner->Unhilight (myMainPM, aHiMode);
+ anOwner->State (0);
+ }
+
+ AIS_Selection::ClearAndSelect (theOwner);
+ theOwner->State (1);
+ Quantity_NameOfColor aCustomColor;
+ Standard_Boolean isCustomColorSet;
+ if (!IsHilighted (theOwner, isCustomColorSet, aCustomColor) || (isCustomColorSet && aCustomColor!= mySelectionColor))
+ {
+ highlightSelected (theOwner, mySelectionColor);
+ }
+
+ if (theToUpdateViewer)
+ UpdateCurrentViewer();
}
//=======================================================================
//function : AddOrRemoveSelected
-//purpose :
+//purpose : Adds or removes current object from AIS selection and highlights/unhighlights it.
+// Since this method makes sence only for neutral point selection of a whole object,
+// if 0 selection of the object is empty this method simply does nothing.
//=======================================================================
-
-void AIS_InteractiveContext::AddOrRemoveSelected(const Handle(AIS_InteractiveObject)& anIObj,
- const Standard_Boolean updateviewer)
+void AIS_InteractiveContext::AddOrRemoveSelected (const Handle(AIS_InteractiveObject)& theObject,
+ const Standard_Boolean theToUpdateViewer)
{
- if(!anIObj->HasInteractiveContext()) anIObj->SetContext(this);
- if(!HasOpenedContext())
- AddOrRemoveCurrentObject(anIObj,updateviewer);
- else
- myLocalContexts(myCurLocalIndex)->AddOrRemoveSelected(anIObj,updateviewer);
-
+ if (!theObject->HasInteractiveContext())
+ theObject->SetContext (this);
+
+ if (HasOpenedContext())
+ return myLocalContexts (myCurLocalIndex)->AddOrRemoveSelected (theObject, theToUpdateViewer);
+
+ if (theObject.IsNull() || !myObjects.IsBound (theObject) || !theObject->HasSelection (0))
+ return;
+
+ const Handle(SelectMgr_Selection)& aSel = theObject->Selection (0);
+
+ if (aSel->IsEmpty())
+ return;
+
+ aSel->Init();
+ const Handle(SelectMgr_EntityOwner) anOwner =
+ Handle(SelectMgr_EntityOwner)::DownCast (aSel->Sensitive()->BaseSensitive()->OwnerId());
+
+ if (anOwner.IsNull() || !anOwner->HasSelectable())
+ return;
+
+ AddOrRemoveSelected (anOwner, theToUpdateViewer);
}
//=======================================================================
//function : AddOrRemoveSelected
//purpose :
//=======================================================================
-void AIS_InteractiveContext::AddOrRemoveSelected(const TopoDS_Shape& aShap,
+void AIS_InteractiveContext::AddOrRemoveSelected (const TopoDS_Shape& aShap,
const Standard_Boolean updateviewer)
{
if(!HasOpenedContext()) {
if(updateviewer) UpdateCurrentViewer();
}
+
//=======================================================================
//function : AddOrRemoveSelected
-//purpose :
+//purpose : Allows to highlight or unhighlight the owner given depending on
+// its selection status
//=======================================================================
+void AIS_InteractiveContext::AddOrRemoveSelected (const Handle(SelectMgr_EntityOwner)& theOwner,
+ const Standard_Boolean theToUpdateViewer)
+{
+ if (HasOpenedContext())
+ return myLocalContexts(myCurLocalIndex)->AddOrRemoveSelected (theOwner, theToUpdateViewer);
-void AIS_InteractiveContext::AddOrRemoveSelected(const Handle(SelectMgr_EntityOwner)& Own,
- const Standard_Boolean updateviewer)
-{
- if(!HasOpenedContext()) {
-#ifdef OCCT_DEBUG
- cout<<" Attempt to remove a selected ownr with no opened local context"<<endl;
-#endif
+ if (theOwner.IsNull() || !theOwner->HasSelectable())
return;
+
+ AIS_Selection::SetCurrentSelection (myCurrentName.ToCString());
+ Handle(AIS_Selection) aCurSel = AIS_Selection::Selection (myCurrentName.ToCString());
+
+ AIS_SelectStatus aSelStat = AIS_Selection::Select (theOwner);
+
+ Standard_Integer aState = aSelStat == AIS_SS_Added ? 1 : 0;
+ theOwner->State (aState);
+ const Handle(AIS_InteractiveObject) anObj =
+ Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
+ const Standard_Boolean isGlobal = anObj->GlobalSelOwner() == theOwner;
+ if (isGlobal)
+ anObj->State (aState);
+ const Handle(AIS_GlobalStatus)& aStatus = myObjects (anObj);
+ const Standard_Integer aHiMode = anObj->HasHilightMode() ? anObj->HilightMode() : 0;
+ if (aState == 1)
+ {
+ highlightSelected (theOwner, mySelectionColor);
+ if (isGlobal)
+ {
+ aStatus->SetHilightStatus (Standard_True);
+ aStatus->SetHilightColor (mySelectionColor);
+ }
+ }
+ else
+ {
+ if (theOwner->IsAutoHilight())
+ theOwner->Unhilight (myMainPM, aHiMode);
+ else
+ anObj->ClearSelected();
+ aStatus->SetHilightStatus (Standard_False);
+ aStatus->SetHilightColor (Quantity_NOC_WHITE);
}
-
- myLocalContexts(myCurLocalIndex)->AddOrRemoveSelected(Own,Standard_False);
- if(updateviewer) UpdateCurrentViewer();
-
-}
+ if (theToUpdateViewer)
+ UpdateCurrentViewer();
+}
//=======================================================================
//function : IsSelected
-//purpose :
+//purpose :
//=======================================================================
-
-Standard_Boolean AIS_InteractiveContext::
-IsSelected(const Handle(AIS_InteractiveObject)& anIObj) const
+Standard_Boolean AIS_InteractiveContext::IsSelected (const Handle(AIS_InteractiveObject)& theObj) const
{
- if (anIObj.IsNull()) return Standard_False;
-
- if(!HasOpenedContext())
- return (anIObj->State()==1);
- else
- return myLocalContexts(myCurLocalIndex)->IsSelected(anIObj);
+ if(HasOpenedContext())
+ return myLocalContexts(myCurLocalIndex)->IsSelected (theObj);
+
+ if (theObj.IsNull() || !myObjects.IsBound (theObj))
+ return Standard_False;
+
+ const Standard_Integer aGlobalSelMode = theObj->GlobalSelectionMode();
+ const TColStd_ListOfInteger& anActivatedModes = myObjects (theObj)->SelectionModes();
+ Standard_Boolean isGlobalModeActivated = Standard_False;
+ for (TColStd_ListIteratorOfListOfInteger aModeIter (anActivatedModes); aModeIter.More(); aModeIter.Next())
+ {
+ if (aModeIter.Value() == aGlobalSelMode)
+ {
+ isGlobalModeActivated = Standard_True;
+ break;
+ }
+ }
+ if (!theObj->HasSelection (aGlobalSelMode) || !isGlobalModeActivated)
+ return Standard_False;
+
+ return theObj->State() == 1;
}
+//=======================================================================
+//function : IsSelected
+//purpose : Returns true is the owner given is selected
+//=======================================================================
+Standard_Boolean AIS_InteractiveContext::IsSelected (const Handle(SelectMgr_EntityOwner)& theOwner) const
+{
+ if (HasOpenedContext())
+ return myLocalContexts(myCurLocalIndex)->IsSelected (theOwner);
+
+ if (theOwner.IsNull())
+ return Standard_False;
+
+ return theOwner->IsSelected();
+}
//=======================================================================
//function : InitSelected
-//purpose :
+//purpose :
//=======================================================================
-
void AIS_InteractiveContext::InitSelected()
{
- if(!HasOpenedContext())
- AIS_Selection::Selection(myCurrentName.ToCString())->Init();
- else
- myLocalContexts(myCurLocalIndex)->InitSelected();
+ if (HasOpenedContext())
+ {
+ myLocalContexts (myCurLocalIndex)->InitSelected();
+ return;
+ }
+
+ AIS_Selection::Selection (myCurrentName.ToCString())->Init();
}
//=======================================================================
//function : MoreSelected
-//purpose :
+//purpose :
//=======================================================================
-
-Standard_Boolean AIS_InteractiveContext::MoreSelected() const
+Standard_Boolean AIS_InteractiveContext::MoreSelected() const
{
- if(!HasOpenedContext())
- return AIS_Selection::Selection(myCurrentName.ToCString())->More();
- return myLocalContexts(myCurLocalIndex)->MoreSelected();
+ if (HasOpenedContext())
+ return myLocalContexts (myCurLocalIndex)->MoreSelected();
+
+ return AIS_Selection::Selection (myCurrentName.ToCString())->More();
}
//=======================================================================
//function : NextSelected
-//purpose :
+//purpose :
//=======================================================================
-
void AIS_InteractiveContext::NextSelected()
{
- if(!HasOpenedContext())
- AIS_Selection::Selection(myCurrentName.ToCString())->Next();
- else
- myLocalContexts(myCurLocalIndex)->NextSelected();
+ if(HasOpenedContext())
+ {
+ return myLocalContexts (myCurLocalIndex)->NextSelected();
+ return;
+ }
+
+ AIS_Selection::Selection (myCurrentName.ToCString())->Next();
}
//=======================================================================
//function : HasSelectedShape
-//purpose :
+//purpose :
//=======================================================================
-
-Standard_Boolean AIS_InteractiveContext::HasSelectedShape() const
+Standard_Boolean AIS_InteractiveContext::HasSelectedShape() const
{
- if(!HasOpenedContext()) {
- Handle(AIS_Shape) shape =
- Handle(AIS_Shape)::DownCast(SelectedInteractive());
- if( !shape.IsNull() ) return Standard_True;
- return Standard_False;
+ if(HasOpenedContext())
+ {
+ return myLocalContexts(myCurLocalIndex)->HasSelectedShape();
}
- return myLocalContexts(myCurLocalIndex)->HasSelectedShape();
+
+ Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (SelectedInteractive());
+ return !aShape.IsNull();
}
//=======================================================================
//function : SelectedShape
-//purpose :
+//purpose :
//=======================================================================
-
-TopoDS_Shape AIS_InteractiveContext::SelectedShape() const
+TopoDS_Shape AIS_InteractiveContext::SelectedShape() const
{
- if (!HasOpenedContext())
- {
- TopoDS_Shape aResShape;
- Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (SelectedInteractive());
- if (!aShape.IsNull())
- {
- TopLoc_Location aLocTrsf = SelectedInteractive()->Transformation().Form() == gp_Identity ?
- TopLoc_Location() : TopLoc_Location (SelectedInteractive()->Transformation());
- aResShape = aShape->Shape().Located (aLocTrsf * aShape->Shape().Location());
- }
-
- return aResShape;
- }
- else
+ if (HasOpenedContext())
{
return myLocalContexts (myCurLocalIndex)->SelectedShape();
}
-}
-//=======================================================================
-//function : Interactive
-//purpose :
-//=======================================================================
+ if (AIS_Selection::Selection (myCurrentName.ToCString())->Extent() == 0)
+ return TopoDS_Shape();
-Handle(AIS_InteractiveObject) AIS_InteractiveContext::Interactive() const
-{
- return SelectedInteractive();
+ const Handle(StdSelect_BRepOwner) anOwner =
+ Handle(StdSelect_BRepOwner)::DownCast (AIS_Selection::Selection (myCurrentName.ToCString())->Value());
+ if (!anOwner->HasSelectable())
+ return TopoDS_Shape();
+
+ return anOwner->Shape().Located (anOwner->Location() * anOwner->Shape().Location());
}
+//=======================================================================
+//function : SelectedInteractive
+//purpose :
+//=======================================================================
Handle(AIS_InteractiveObject) AIS_InteractiveContext::SelectedInteractive() const
{
- if(!HasOpenedContext()){
- if (AIS_Selection::Selection(myCurrentName.ToCString())->Extent() == 0)
- return NULL;
- Handle(Standard_Transient) TR =AIS_Selection::Selection(myCurrentName.ToCString())->Value();
- Handle(AIS_InteractiveObject) IO = *((Handle(AIS_InteractiveObject)*)&TR);
- return IO;}
-
- return myLocalContexts(myCurLocalIndex)->SelectedInteractive();
-
+ if (HasOpenedContext())
+ {
+ return myLocalContexts(myCurLocalIndex)->SelectedInteractive();
+ }
+
+ const Handle(SelectMgr_EntityOwner) anOwner =
+ Handle(SelectMgr_EntityOwner)::DownCast (AIS_Selection::Selection (myCurrentName.ToCString())->Value());
+ if (anOwner.IsNull() || !anOwner->HasSelectable())
+ return NULL;
+
+ return Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
}
//=======================================================================
-//function : Interactive
-//purpose :
+//function : SelectedOwner
+//purpose :
//=======================================================================
-
-Handle(SelectMgr_EntityOwner) AIS_InteractiveContext::SelectedOwner() const
+Handle(SelectMgr_EntityOwner) AIS_InteractiveContext::SelectedOwner() const
{
- if(!HasOpenedContext()){
- Handle(SelectMgr_EntityOwner) Ownr;
- return Ownr;
+ if(HasOpenedContext())
+ {
+ return myLocalContexts(myCurLocalIndex)->SelectedOwner();
}
- return myLocalContexts(myCurLocalIndex)->SelectedOwner();
-
+
+ Handle(AIS_Selection) aCurSel = AIS_Selection::Selection (myCurrentName.ToCString());
+
+ return aCurSel->Extent() > 0 ?
+ Handle(SelectMgr_EntityOwner)::DownCast (aCurSel->Value()) : NULL;
}
//=======================================================================
}
}
-Standard_Integer AIS_InteractiveContext::NbSelected()
+//=======================================================================
+//function : NbSelected
+//purpose :
+//=======================================================================
+Standard_Integer AIS_InteractiveContext::NbSelected()
{
- Standard_Integer i(0);
- for(InitSelected();MoreSelected();NextSelected())
- {i++;}
- return i;
+ Standard_Integer aNbSelected = 0;
+ for (InitSelected(); MoreSelected(); NextSelected())
+ {
+ aNbSelected++;
+ }
+
+ return aNbSelected;
}
//=======================================================================
//function : HasApplicative
-//purpose :
+//purpose :
//=======================================================================
-
Standard_Boolean AIS_InteractiveContext::HasApplicative() const
{
- return Interactive()->HasOwner();
+ return SelectedInteractive()->HasOwner();
}
//=======================================================================
//function : Applicative
-//purpose :
+//purpose :
//=======================================================================
-
Handle(Standard_Transient) AIS_InteractiveContext::Applicative() const
{
- return Interactive()->GetOwner();
+ return SelectedInteractive()->GetOwner();
}
-
-
//==================================================
-// Function:
+// Function: HasDetected
// Purpose :
//==================================================
-Standard_Boolean AIS_InteractiveContext::HasDetected() const
+Standard_Boolean AIS_InteractiveContext::HasDetected() const
{
if(HasOpenedContext())
return myLocalContexts(myCurLocalIndex)->HasDetected();
- else
- return !myLastPicked.IsNull();
+
+ return !myLastPicked.IsNull();
}
//=======================================================================
//=======================================================================
//function : DetectedInteractive
-//purpose :
+//purpose :
//=======================================================================
-
-Handle(AIS_InteractiveObject)
-AIS_InteractiveContext::DetectedInteractive() const
+Handle(AIS_InteractiveObject) AIS_InteractiveContext::DetectedInteractive() const
{
- if(HasOpenedContext())
+ if (HasOpenedContext())
return myLocalContexts(myCurLocalIndex)->DetectedInteractive();
- return myLastPicked;
+
+ return Handle(AIS_InteractiveObject)::DownCast (myLastPicked->Selectable());
}
//=======================================================================
Handle(SelectMgr_EntityOwner) AIS_InteractiveContext::DetectedOwner() const
{
- if(HasOpenedContext())
+ if (HasOpenedContext())
return myLocalContexts(myCurLocalIndex)->DetectedOwner();
- Handle(SelectMgr_EntityOwner) Ownr;
- return Ownr;
-}
+ return myLastPicked;
+}
//=======================================================================
//function : HilightNextDetected
return MoreDetected() ? myAISDetectedSeq(myAISCurDetected) : NULL;
}
+
+//=======================================================================
+//function : FirstSelectedObject
+//purpose :
+//=======================================================================
+Handle(AIS_InteractiveObject) AIS_InteractiveContext::FirstSelectedObject()
+{
+ Handle(AIS_InteractiveObject) anObject;
+
+ if (HasOpenedContext())
+ return anObject;
+
+ InitSelected();
+ if (MoreSelected())
+ {
+ return SelectedInteractive();
+ }
+ return anObject;
+}
+
+//=======================================================================
+//function : RedrawImmediate
+//purpose : Redisplays immediate strucures of the viewer given according to their visibility
+//=======================================================================
+void AIS_InteractiveContext::RedrawImmediate (const Handle(V3d_Viewer)& theViewer)
+{
+ myMainPM->RedrawImmediate (theViewer);
+}
{
// the entities eventually detected just before the context was opened are unhighlighted...
- if(!IsCurrent(myLastPicked)){
+ if(!IsSelected(myLastPicked)){
if(!myLastPicked.IsNull()){
- Standard_Integer HiMod = myLastPicked->HasHilightMode()?myLastPicked->HilightMode():0;
- myMainPM->Unhighlight(myLastPicked,HiMod);
+ const Handle(AIS_InteractiveObject) aLastPickedAIS =
+ Handle(AIS_InteractiveObject)::DownCast (myLastPicked->Selectable());
+ Standard_Integer HiMod = aLastPickedAIS->HasHilightMode()?aLastPickedAIS->HilightMode():0;
+ myMainPM->Unhighlight (aLastPickedAIS, HiMod);
}}
if(!mylastmoveview.IsNull()){
Standard_Boolean AIS_InteractiveContext::EndImmediateDraw (const Handle(V3d_View)& theView)
{
return HasOpenedContext()
- && myLocalContexts (myCurLocalIndex)->EndImmediateDraw (theView);
+ && myLocalContexts (myCurLocalIndex)->EndImmediateDraw (theView->Viewer());
}
//=======================================================================
}
Handle(V3d_View) aView = myMainVwr->ActiveView();
- return myLocalContexts (myCurLocalIndex)->EndImmediateDraw (aView);
+ return myLocalContexts (myCurLocalIndex)->EndImmediateDraw (aView->Viewer());
}
-- - AIS_Shaded
-- This range can, however, be extended through the
-- creation of new display modes.
-
-
- HasSelectionMode(me) returns Boolean from Standard;
- ---Purpose: Allows you to change the selection mode of an
- -- Interactive Object.
- -- The default selection mode setting is 0.
- -- For shapes, for example, the selection modes are as follows:
- -- - mode 0 - selection of the shape itself
- -- - mode 1 - selection of vertices
- -- - mode 2 - selection of edges
- -- - mode 3 - selection of wires
- -- - mode 4 - selection of faces
- -- - mode 5 - selection of shells
- -- - mode 6 - selection of solids
- -- - mode 7 - selection of compounds
- -- For trihedra, on the other hand, the selection modes are the following four:
- -- - mode 0 - selection of a trihedron
- -- - mode 1 - selection of its origin
- -- - mode 2 - selection of its axes
- -- - mode 3 - selection of its planes
-
- SelectionMode(me) returns Integer from Standard;
- ---Purpose: Returns the selection mode of the interactive object.
-
- SetSelectionMode(me:mutable; aMode: Integer from Standard);
- ---Purpose: You can change the default selection mode index
- -- aMode of an Interactive Object.
- -- This is only of interest if you decide that mode 0
- -- adopted by convention will not do.
-
- UnsetSelectionMode(me:mutable);
- ---Purpose: You can change the default selection mode index of
- -- an Interactive Object.
- -- This is only of interest if you decide that the 0 mode
- -- adopted by convention will not do.
- ---C++: inline
-
SelectionPriority(me) returns Integer from Standard;
---C++: inline
---myOwnMaterial : NameOfPhysicalMaterial from Graphic3d is protected;
mySelPriority : Integer from Standard;
myDisplayMode : Integer from Standard ;
- mySelectionMode : Integer from Standard;
myHilightMode : Integer from Standard is protected;
myOwnWidth : Real from Standard is protected;
myInfiniteState : Boolean from Standard is protected;
myCTXPtr(NULL),
mySelPriority(-1),
myDisplayMode (-1),
-mySelectionMode(0),
mystate(0)
{
Handle (AIS_InteractiveContext) Bid;
if( AcceptDisplayMode(aMode) )
myDisplayMode = aMode;
}
-
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-void AIS_InteractiveObject::SetSelectionMode(const Standard_Integer aMode)
-{
- mySelectionMode = aMode;
-}
-
-
//=======================================================================
//function :
inline Standard_Integer AIS_InteractiveObject::DisplayMode() const
{return myDisplayMode;}
-inline Standard_Boolean AIS_InteractiveObject::HasSelectionMode() const
-{return mySelectionMode!=-1;}
-
-inline void AIS_InteractiveObject::UnsetSelectionMode()
-{mySelectionMode =-1;}
-
-inline Standard_Integer AIS_InteractiveObject::SelectionMode() const
-{return mySelectionMode;}
-
-
-
inline Quantity_NameOfColor AIS_InteractiveObject::Color() const
{
return myOwnColor.Name();
ShapeEnum from TopAbs,
Shape from TopoDS,
View from V3d,
+ Viewer from V3d,
PresentationManager3d from PrsMgr,
IndexedMapOfOwner from SelectMgr,
EntityOwner from SelectMgr,
---Purpose: Stores presentation theMode of object theObj in the transient list of presentations to be displayed in immediate mode.
-- Will be taken in account in EndImmediateDraw method.
- EndImmediateDraw (me : mutable;
- theView : View from V3d)
+ EndImmediateDraw (me : mutable;
+ theViewer : Viewer from V3d)
returns Boolean from Standard;
- ---Purpose: Allows rapid drawing of the view theView by avoiding an update of the whole background.
+ ---Purpose: Allows rapid drawing of the each view in theViewer by avoiding an update of the whole background.
IsImmediateModeOn (me) returns Boolean from Standard;
---Purpose: Returns true if Presentation Manager is accumulating transient list of presentations to be displayed in immediate mode.
// Deactivate selectable entities of interactive object
if (mySM->Contains (anInteractive))
{
- TColStd_ListIteratorOfListOfInteger aModeIter (STAT->SelectionModes());
- for (; aModeIter.More(); aModeIter.Next())
+ while (!STAT->SelectionModes().IsEmpty())
{
- mySM->Deactivate (anInteractive, aModeIter.Value(), myMainVS);
+ mySM->Deactivate (anInteractive, STAT->SelectionModes().Last(), myMainVS);
+ STAT->RemoveSelectionMode (STAT->SelectionModes().Last());
}
}
AIS_Selection::Select();
AIS_Selection::Remove(mySelName.ToCString());
- Handle(V3d_Viewer) aViewer = myCTX->CurrentViewer();
- for (aViewer->InitActiveViews(); aViewer->MoreActiveViews(); aViewer->NextActiveViews())
- {
- Handle(V3d_View) aView = aViewer->ActiveView();
- aView->View()->ClearImmediate();
- }
-
Handle(V3d_View) aDummyView;
myMainVS->ClearSensitive (aDummyView);
//function : EndImmediateDraw
//purpose :
//=======================================================================
-Standard_Boolean AIS_LocalContext::EndImmediateDraw (const Handle(V3d_View)& theView)
+Standard_Boolean AIS_LocalContext::EndImmediateDraw (const Handle(V3d_Viewer)& theViewer)
{
if (!myMainPM->IsImmediateModeOn())
{
return Standard_False;
}
- myMainPM->EndImmediateDraw (theView);
+ myMainPM->EndImmediateDraw (theViewer);
return Standard_True;
}
const Standard_Integer aHilightMode = GetHiMod (Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable()));
myMainPM->BeginImmediateDraw();
theOwner->HilightWithColor (myMainPM, myCTX->HilightColor(), aHilightMode);
- myMainPM->EndImmediateDraw (theView);
+ myMainPM->EndImmediateDraw (theView->Viewer());
}
//==================================================
: 0;
myMapOfOwner (mylastindex)->Unhilight (myMainPM, aHilightMode);
- myMainPM->EndImmediateDraw (theView);
+ myMainPM->EndImmediateDraw (theView->Viewer());
mylastindex = 0;
return Standard_True;
}
Projector from Prs3d,
Transformation from Geom,
Integer from Standard,
+ EntityOwner from SelectMgr,
Selection from SelectMgr,
Trsf from gp,
Pnt from gp,
---Purpose: Informs the graphic context that the interactive Object
-- may be decomposed into sub-shapes for dynamic selection.
+ GlobalSelOwner(me)
+ returns EntityOwner from SelectMgr
+ is redefined virtual;
+ ---Purpose: Returns the owner of mode for selection of object as a whole.
ComputeSelection(me:mutable; aSelection : Selection from SelectMgr;
aMode : Integer from Standard)
}
}
}
+
+//=======================================================================
+//function : GlobalSelOwner
+//purpose :
+//=======================================================================
+Handle(SelectMgr_EntityOwner) AIS_MultipleConnectedInteractive::GlobalSelOwner() const
+{
+ return myAssemblyOwner;
+}
-- But it works in any case and is especially useful for view dump because the dump image is read from the back buffer.
-- @return previous mode.
- DisplayImmediateStructure ( me : mutable;
- theCView : CView from Graphic3d;
- theStructure : Structure from Graphic3d )
- is deferred;
- ---Purpose: Display structure in immediate mode on top of general presentation
-
- ---C++: alias "
- //! Erases immediate structure
- Standard_EXPORT virtual void EraseImmediateStructure (const Graphic3d_CView& theCView, const Graphic3d_CStructure& theCStructure) = 0;"
-
-------------------------------
-- Category: Layer mode methods
-------------------------------
//! Empty constructor.
Graphic3d_ViewAffinity()
{
- ::memset (&myMask, 0xFF, sizeof(myMask));
+ SetVisible (Standard_True);
}
//! Return visibility flag.
return (myMask & aBit) != 0;
}
+ //! Setup visibility flag for all views.
+ void SetVisible (const Standard_Boolean theIsVisible)
+ {
+ ::memset (&myMask, theIsVisible ? 0xFF : 0x00, sizeof(myMask));
+ }
+
//! Setup visibility flag.
void SetVisible (const Standard_Integer theViewId,
const bool theIsVisible)
IsNeedToRedisplay = Standard_True;
+ aSelectionPrs->SetZLayer (Graphic3d_ZLayerId_Top);
+
if ( IsNeedToRedisplay )
{
aSelectionPrs->SetDisplayPriority(9);
}
}
+ aHilightPrs->SetZLayer (Graphic3d_ZLayerId_Topmost);
+
if (PM->IsImmediateModeOn())
{
PM->AddToImmediateList (aHilightPrs);
if { "$::tcl_platform(platform)" == "windows" } {
if { [info exists ::env(HAVE_D3D)] && "$::env(HAVE_D3D)" == "true" } {
lappend aResult "TKD3DHost"
- } elseif { [info exists ::env(VCVER)] && "$::env(VCVER)" != "vc8" && "$::env(VCVER)" != "vc9" && "$::env(VCVER)" != "vc10" } {
+ } elseif { [info exists ::env(VCVER)] && "$::env(VCVER)" != "vc8" && "$::env(VCVER)" != "vc9" && "$::env(VCVER)" != "vc10" && "$::env(VCVER)" != "vc11" } {
lappend aResult "TKD3DHost"
}
}
keepArrayData (Standard_False),
#if !defined(GL_ES_VERSION_2_0)
ffpEnable (Standard_True),
+ useSystemBuffer (Standard_False),
#else
ffpEnable (Standard_False),
+ useSystemBuffer (Standard_True),
#endif
buffersNoSwap (Standard_False),
contextStereo (Standard_False),
pntSpritesDisable = theCopy.pntSpritesDisable;
keepArrayData = theCopy.keepArrayData;
ffpEnable = theCopy.ffpEnable;
+ useSystemBuffer = theCopy.useSystemBuffer;
buffersNoSwap = theCopy.buffersNoSwap;
contextStereo = theCopy.contextStereo;
contextDebug = theCopy.contextDebug;
Standard_Boolean pntSpritesDisable; //!< flag permits Point Sprites usage, will significantly affect performance (OFF by default)
Standard_Boolean keepArrayData; //!< Disables freeing CPU memory after building VBOs (OFF by default)
Standard_Boolean ffpEnable; //!< Enables FFP (fixed-function pipeline), do not use built-in GLSL programs (ON by default on desktop OpenGL and OFF on OpenGL ES)
+ Standard_Boolean useSystemBuffer; //!< Enables usage of system backbuffer for blitting (OFF by default on desktop OpenGL and ON on OpenGL ES for testing)
public: //! @name context creation parameters
return Standard_False;
}
-// =======================================================================
-// function : DisplayImmediateStructure
-// purpose :
-// =======================================================================
-void OpenGl_GraphicDriver::DisplayImmediateStructure (const Graphic3d_CView& theCView,
- const Handle(Graphic3d_Structure)& theStructure)
-{
- OpenGl_CView* aCView = (OpenGl_CView* )theCView.ptrView;
- if (aCView == NULL)
- {
- return;
- }
-
- aCView->View->DisplayImmediateStructure (theStructure);
-}
-
-// =======================================================================
-// function : EraseImmediateStructure
-// purpose :
-// =======================================================================
-void OpenGl_GraphicDriver::EraseImmediateStructure (const Graphic3d_CView& theCView,
- const Graphic3d_CStructure& theCStructure)
-{
- OpenGl_CView* aCView = (OpenGl_CView* )theCView.ptrView;
- OpenGl_Structure* aStructure = (OpenGl_Structure* )&theCStructure;
- if (aCView == NULL)
- {
- return;
- }
-
- aCView->View->EraseImmediateStructure (aStructure);
-}
-
-
// =======================================================================
// function : Print
// purpose :
Standard_EXPORT Standard_Boolean SetImmediateModeDrawToFront (const Graphic3d_CView& theCView,
const Standard_Boolean theDrawToFrontBuffer);
- Standard_EXPORT void DisplayImmediateStructure (const Graphic3d_CView& theCView,
- const Handle(Graphic3d_Structure)& theStructure);
- Standard_EXPORT void EraseImmediateStructure (const Graphic3d_CView& theCView,
- const Graphic3d_CStructure& theCStructure);
public:
}
}
+ UpdateTransformation();
+ myInstancedStructure = const_cast<OpenGl_Structure*> (myParent->InstancedStructure());
TransformPersistence.IsSet = myParent->TransformPersistence.IsSet;
TransformPersistence.Flag = myParent->TransformPersistence.Flag;
TransformPersistence.Point = myParent->TransformPersistence.Point;
//! Erase structure from display list.
void EraseStructure (const Handle(Graphic3d_Structure)& theStructure);
- //! Add structure to the list of immediate structures.
- void DisplayImmediateStructure (const Handle(Graphic3d_Structure)& theStructure);
-
- //! Erase structure from display list.
- void EraseImmediateStructure (const OpenGl_Structure* theStructure);
-
//! Insert a new top-level z layer with ID <theLayerId>
void AddZLayer (const Graphic3d_ZLayerId theLayerId);
//! marks primitive set for rebuild.
void InvalidateBVHData (const Standard_Integer theLayerId);
- //! Returns list of immediate structures rendered on top of main presentation
- const OpenGl_SequenceOfStructure& ImmediateStructures() const
- {
- return myImmediateList;
- }
-
//! Returns true if there are immediate structures to display
bool HasImmediateStructures() const
{
- return !myImmediateList.IsEmpty()
- || myZLayers.NbImmediateStructures() != 0;
+ return myZLayers.NbImmediateStructures() != 0;
}
protected:
//View_LABDepthCueing - fixed index used
- OpenGl_LayerList myZLayers; //!< main list of displayed structure, sorted by layers
- OpenGl_SequenceOfStructure myImmediateList; //!< list of immediate structures rendered on top of main presentation
+ OpenGl_LayerList myZLayers; //!< main list of displayed structure, sorted by layers
const TEL_TRANSFORM_PERSISTENCE *myTransPers;
Standard_Boolean myIsTransPers;
}
Standard_Boolean toRenderGL = theToDrawImmediate ||
- theCView.RenderParams.Method != Graphic3d_RM_RAYTRACING || myRaytraceInitStatus == OpenGl_RT_FAIL;
+ theCView.RenderParams.Method != Graphic3d_RM_RAYTRACING ||
+ myRaytraceInitStatus == OpenGl_RT_FAIL ||
+ aCtx->IsFeedback();
if (!toRenderGL)
{
myZLayers.AddStructure (aStruct, aZLayer, thePriority);
}
-//=======================================================================
-//function : DisplayImmediateStructure
-//purpose :
-//=======================================================================
-
-void OpenGl_View::DisplayImmediateStructure (const Handle(Graphic3d_Structure)& theStructure)
-{
- const OpenGl_Structure* aStruct = reinterpret_cast<const OpenGl_Structure*> (theStructure->CStructure().operator->());
- for (OpenGl_SequenceOfStructure::Iterator anIter (myImmediateList);
- anIter.More(); anIter.Next())
- {
- if (anIter.Value() == aStruct)
- {
- return;
- }
- }
-
- myImmediateList.Append (aStruct);
-}
-
//=======================================================================
//function : EraseStructure
//purpose :
myZLayers.RemoveStructure (theStructure);
}
-//=======================================================================
-//function : EraseImmediateStructure
-//purpose :
-//=======================================================================
-
-void OpenGl_View::EraseImmediateStructure (const OpenGl_Structure* theStructure)
-{
- for (OpenGl_SequenceOfStructure::Iterator anIter (myImmediateList);
- anIter.More(); anIter.Next())
- {
- if (anIter.Value() == theStructure)
- {
- myImmediateList.Remove (anIter);
- return;
- }
- }
-}
-
//=======================================================================
//function : ChangeZLayer
//purpose :
OpenGl_FrameBuffer* theDrawFbo,
const Standard_Boolean theToFlip)
{
- if (theReadFbo == NULL)
+ if (theReadFbo == NULL || myGlContext->IsFeedback())
{
return false;
}
{
myMainSceneFbos[0]->Init (myGlContext, aSizeX, aSizeY);
}
- if (myToFlipOutput
- && myMainSceneFbos[0]->IsValid())
+ if (!myGlContext->caps->useSystemBuffer && myMainSceneFbos[0]->IsValid())
{
myImmediateSceneFbos[0]->InitLazy (myGlContext, aSizeX, aSizeY);
}
{
OpenGl_FrameBuffer* aMainFbo = myMainSceneFbos[0]->IsValid() ? myMainSceneFbos[0].operator->() : NULL;
OpenGl_FrameBuffer* anImmFbo = aFrameBuffer;
- if (myToFlipOutput
- && myImmediateSceneFbos[0]->IsValid())
+ if (!myGlContext->caps->useSystemBuffer && myImmediateSceneFbos[0]->IsValid())
{
anImmFbo = myImmediateSceneFbos[0].operator->();
}
{
OpenGl_FrameBuffer* aMainFbo = myMainSceneFbos[0]->IsValid() ? myMainSceneFbos[0].operator->() : NULL;
OpenGl_FrameBuffer* anImmFbo = aFrameBuffer;
- if (myToFlipOutput
- && myImmediateSceneFbos[0]->IsValid())
+ if (!myGlContext->caps->useSystemBuffer && myImmediateSceneFbos[0]->IsValid())
{
anImmFbo = myImmediateSceneFbos[0].operator->();
}
myView->Render (myPrintContext, aWS, theDrawFbo, theProjection,
theCView, theCUnderLayer, theCOverLayer, Standard_True);
- if (!myView->ImmediateStructures().IsEmpty())
- {
- glDisable (GL_DEPTH_TEST);
- }
- for (OpenGl_SequenceOfStructure::Iterator anIter (myView->ImmediateStructures());
- anIter.More(); anIter.Next())
- {
- const OpenGl_Structure* aStructure = anIter.Value();
- if (!aStructure->IsVisible())
- {
- continue;
- }
-
- aStructure->Render (aWS);
- }
return !toCopyBackToFront;
}
//=======================================================================
Prs3d_PresentationShadow::Prs3d_PresentationShadow (const Handle(Graphic3d_StructureManager)& theViewer,
const Handle(Prs3d_Presentation)& thePrs)
-: Prs3d_Presentation (theViewer, thePrs)
+: Prs3d_Presentation (theViewer, thePrs),
+ myParentStructId (thePrs->Identification()),
+ myParentAffinity (thePrs->CStructure()->ViewAffinity)
{
//
}
Standard_EXPORT Prs3d_PresentationShadow (const Handle(Graphic3d_StructureManager)& theViewer,
const Handle(Prs3d_Presentation)& thePrs);
+ //! Returns the id of the parent presentation
+ Standard_EXPORT inline Standard_Integer ParentId() const { return myParentStructId; }
+
+ //! Returns view affinity of the parent presentation
+ Standard_EXPORT inline const Handle(Graphic3d_ViewAffinity)& ParentAffinity() const { return myParentAffinity; }
+
private:
DEFINE_STANDARD_RTTI(Prs3d_PresentationShadow)
+private:
+ Standard_Integer myParentStructId;
+ Handle(Graphic3d_ViewAffinity) myParentAffinity;
+
};
DEFINE_STANDARD_HANDLE(Prs3d_PresentationShadow, Prs3d_Presentation)
uses
StructureManager from Graphic3d,
+ ZLayerId from Graphic3d,
PresentableObject from PrsMgr,
ListOfPresentations from PrsMgr,
Length,NameOfColor from Quantity,
Transformation from Geom,
NameOfMaterial from Graphic3d,
Presentation from PrsMgr,
- View from V3d,
+ Viewer from V3d,
ViewManager from Visual3d,
ShadingAspect from Prs3d,
Presentation from Prs3d
---Purpose: Resets the transient list of presentations previously displayed in immediate mode
-- and begins accumulation of new list by following AddToImmediateList()/Color()/Highlight() calls.
- ClearImmediateDraw (me : mutable);
+ ClearImmediateDraw (me : mutable)
+ is static;
---Purpose: Resets the transient list of presentations previously displayed in immediate mode.
AddToImmediateList (me : mutable;
- thePrs : Presentation from Prs3d);
+ thePrs : Presentation from Prs3d)
+ is static;
---Purpose: Stores thePrs in the transient list of presentations to be displayed in immediate mode.
-- Will be taken in account in EndImmediateDraw method.
- EndImmediateDraw (me : mutable;
- theView : View from V3d);
- ---Purpose: Allows rapid drawing of the view theView by avoiding an update of the whole background.
+ EndImmediateDraw (me : mutable;
+ theViewer : Viewer from V3d)
+ is static;
+ ---Purpose: Allows rapid drawing of the each view in theViewer by avoiding an update of the whole background.
- IsImmediateModeOn (me) returns Boolean from Standard;
+ RedrawImmediate (me : mutable;
+ theViewer : Viewer from V3d)
+ is static;
+ ---Purpose: Clears and redisplays immediate structures of the viewer taking into account its affinity
+
+ IsImmediateModeOn (me) returns Boolean from Standard
+ is static;
---C++: inline
---Purpose: Returns true if Presentation Manager is accumulating transient list of presentations to be displayed in immediate mode.
---Category: Hilighting methods.
- Color (me : mutable;
- thePrsObject : PresentableObject from PrsMgr;
- theColor : NameOfColor from Quantity = Quantity_NOC_YELLOW;
- theMode : Integer from Standard = 0;
- theSelObj : PresentableObject from PrsMgr = NULL)
+ Color (me : mutable;
+ thePrsObject : PresentableObject from PrsMgr;
+ theColor : NameOfColor from Quantity = Quantity_NOC_YELLOW;
+ theMode : Integer from Standard = 0;
+ theSelObj : PresentableObject from PrsMgr = NULL;
+ theImmediateStructLayerId : ZLayerId from Graphic3d = Graphic3d_ZLayerId_Topmost)
---Purpose: Highlights the graphic object thePrsObject in the color theColor.
-- thePrsObject has the display mode theMode;
-- this has the default value of 0, that is, the wireframe display mode.
---Purpose: Removes a presentation of the presentable object thePrsObject to this framework. thePrsObject has the display mode theMode.
is protected;
+ displayImmediate (me : mutable;
+ theViewer : Viewer from V3d);
+ ---Purpose: Handles the structures from <myImmediateList> and displays it separating view-dependent structures and taking into account
+ -- structure visibility by setting proper affinity.
+
fields
- myStructureManager : ViewManager from Visual3d is protected;
- myImmediateModeOn : Integer from Standard is protected;
- myImmediateList : ListOfPresentations from PrsMgr is protected;
- myImmediateView : View from V3d is protected;
- mySelectionColor : Color from Quantity is protected;
+ myStructureManager : ViewManager from Visual3d is protected;
+ myImmediateModeOn : Integer from Standard is protected;
+ myImmediateList : ListOfPresentations from PrsMgr is protected;
+ myViewDependentImmediateList : ListOfPresentations from PrsMgr is protected;
+ mySelectionColor : Color from Quantity is protected;
end PresentationManager from PrsMgr;
// =======================================================================
void PrsMgr_PresentationManager::ClearImmediateDraw()
{
- if (myImmediateView.IsNull())
+ for (PrsMgr_ListOfPresentations::Iterator anIter (myImmediateList); anIter.More(); anIter.Next())
{
- myImmediateList.Clear();
- return;
+ anIter.Value()->Erase();
}
- for (PrsMgr_ListOfPresentations::Iterator anIter (myImmediateList); anIter.More(); anIter.Next())
+ for (PrsMgr_ListOfPresentations::Iterator anIter (myViewDependentImmediateList); anIter.More(); anIter.Next())
{
- myImmediateView->View()->EraseImmediate (anIter.Value());
+ anIter.Value()->Erase();
}
myImmediateList.Clear();
- myImmediateView.Nullify();
+ myViewDependentImmediateList.Clear();
+}
+
+// =======================================================================
+// function : displayImmediate
+// purpose : Handles the structures from myImmediateList and its visibility
+// in all views of the viewer given by setting proper affinity
+// =======================================================================
+void PrsMgr_PresentationManager::displayImmediate (const Handle(V3d_Viewer)& theViewer)
+{
+ for (theViewer->InitActiveViews(); theViewer->MoreActiveViews(); theViewer->NextActiveViews())
+ {
+ const Handle(Visual3d_View)& aView = theViewer->ActiveView()->View();
+ for (PrsMgr_ListOfPresentations::Iterator anIter (myImmediateList); anIter.More(); anIter.Next())
+ {
+ const Handle(Prs3d_Presentation)& aPrs = anIter.Value();
+ if (aPrs.IsNull())
+ continue;
+
+ Handle(Prs3d_Presentation) aViewDepPrs;
+ Handle(Prs3d_PresentationShadow) aShadowPrs = Handle(Prs3d_PresentationShadow)::DownCast (aPrs);
+ if (!aShadowPrs.IsNull() && aView->IsComputed (aShadowPrs->ParentId(), aViewDepPrs))
+ {
+ aShadowPrs.Nullify();
+ aShadowPrs = new Prs3d_PresentationShadow (myStructureManager, aViewDepPrs);
+ aShadowPrs->SetZLayer (aViewDepPrs->CStructure()->ZLayer());
+ aShadowPrs->SetClipPlanes (aViewDepPrs->GetClipPlanes());
+ aShadowPrs->CStructure()->IsForHighlight = 1;
+ aShadowPrs->Highlight (Aspect_TOHM_COLOR, aPrs->HighlightColor());
+ myViewDependentImmediateList.Append (aShadowPrs);
+ }
+ // handles custom highlight presentations which were defined in overriden
+ // HilightOwnerWithColor method of a custom AIS objects and maintain its
+ // visibility in different views on their own
+ else if (aShadowPrs.IsNull())
+ {
+ aPrs->Display();
+ continue;
+ }
+
+ if (!aShadowPrs->IsDisplayed())
+ {
+ aShadowPrs->CStructure()->ViewAffinity = new Graphic3d_ViewAffinity();
+ aShadowPrs->CStructure()->ViewAffinity->SetVisible (Standard_False);
+ aShadowPrs->Display();
+ }
+
+ Standard_Integer aViewId = aView->Identification();
+ bool isParentVisible = aShadowPrs->ParentAffinity().IsNull() ?
+ Standard_True : aShadowPrs->ParentAffinity()->IsVisible (aViewId);
+ aShadowPrs->CStructure()->ViewAffinity->SetVisible (aViewId, isParentVisible);
+ }
+ }
}
// =======================================================================
// function : EndImmediateDraw
// purpose :
// =======================================================================
-void PrsMgr_PresentationManager::EndImmediateDraw (const Handle(V3d_View)& theView)
+void PrsMgr_PresentationManager::EndImmediateDraw (const Handle(V3d_Viewer)& theViewer)
{
if (--myImmediateModeOn > 0)
{
return;
}
+ displayImmediate (theViewer);
+}
+
+// =======================================================================
+// function : RedrawImmediate
+// purpose : Clears all immediate structures and redisplays with proper
+// affinity
+//=======================================================================
+void PrsMgr_PresentationManager::RedrawImmediate (const Handle(V3d_Viewer)& theViewer)
+{
+ if (myImmediateList.IsEmpty())
+ return;
+
+ // Clear previously displayed structures
for (PrsMgr_ListOfPresentations::Iterator anIter (myImmediateList); anIter.More(); anIter.Next())
{
- theView->View()->DisplayImmediate (anIter.Value(), Standard_True);
+ anIter.Value()->Erase();
}
- if (!myImmediateList.IsEmpty())
+ for (PrsMgr_ListOfPresentations::Iterator anIter (myViewDependentImmediateList); anIter.More(); anIter.Next())
{
- myImmediateView = theView;
+ anIter.Value()->Erase();
}
+ myViewDependentImmediateList.Clear();
+
+ displayImmediate (theViewer);
}
// =======================================================================
void PrsMgr_PresentationManager::Color (const Handle(PrsMgr_PresentableObject)& thePrsObj,
const Quantity_NameOfColor theColor,
const Standard_Integer theMode,
- const Handle(PrsMgr_PresentableObject)& theSelObj)
+ const Handle(PrsMgr_PresentableObject)& theSelObj,
+ const Standard_Integer theImmediateStructLayerId)
{
for (PrsMgr_ListOfPresentableObjectsIter anIter (thePrsObj->Children()); anIter.More(); anIter.Next())
{
- Color (anIter.Value(), theColor, theMode);
+ Color (anIter.Value(), theColor, theMode, NULL, theImmediateStructLayerId);
}
if (!thePrsObj->HasOwnPresentations())
{
if (myImmediateModeOn > 0)
{
Handle(Prs3d_PresentationShadow) aShadow = new Prs3d_PresentationShadow (myStructureManager, aPrs->Presentation());
+ aShadow->SetZLayer (theImmediateStructLayerId);
+ aShadow->SetClipPlanes (aPrs->Presentation()->GetClipPlanes());
+ aShadow->CStructure()->IsForHighlight = 1;
aShadow->Highlight (Aspect_TOHM_COLOR, theColor);
AddToImmediateList (aShadow);
}
di << argv[1] << " : No interactive object" << "\n";
return 1;
}
- AISObj->SetSelectionMode(SelectMode);
if (!aContext->HasOpenedContext()) {
aContext->OpenLocalContext();
}
aContext->Erase(AISObj, updateviewer);
aContext->UpdateCurrentViewer();
+ aContext->SetAutoActivateSelection (Standard_False);
aContext->Display(AISObj, updateviewer);
+ aContext->Activate (AISObj, SelectMode);
aContext->UpdateCurrentViewer();
}
return 0;
di << argv[1] << " : No interactive object" << "\n";
return 1;
}
- Standard_Integer SelectMode = AISObj->SelectionMode();
- di << SelectMode << "\n";
+ TColStd_ListOfInteger anActivatedModes;
+ aContext->ActivatedModes (AISObj, anActivatedModes);
+ Standard_Integer aMode = anActivatedModes.IsEmpty() ? -1 : anActivatedModes.Last();
+ di << aMode << "\n";
}
return 0;
anAISCtx->Display(aSh4);
//set selected
- anAISCtx->InitCurrent();
- anAISCtx->AddOrRemoveCurrentObject(aSh1);
- anAISCtx->AddOrRemoveCurrentObject(aSh2);
- anAISCtx->AddOrRemoveCurrentObject(aSh3);
- anAISCtx->AddOrRemoveCurrentObject(aSh4);
+ anAISCtx->InitSelected();
+ anAISCtx->AddOrRemoveSelected(aSh1);
+ anAISCtx->AddOrRemoveSelected(aSh2);
+ anAISCtx->AddOrRemoveSelected(aSh3);
+ anAISCtx->AddOrRemoveSelected(aSh4);
//remove all this objects from context
anAISCtx->Remove (aSh1, Standard_False);
BRepPrimAPI_MakeBox aBox(gp_Pnt(0, 0, 0), 100, 100, 100);
Handle(AIS_Shape) anAISBox = new AIS_Shape(aBox.Shape());
+ myAISContext->SetAutoActivateSelection (Standard_False);
myAISContext->Display(anAISBox, 1);
- anAISBox->SetSelectionMode(-1);
Standard_Integer myLocContInd = myAISContext->OpenLocalContext();
myAISContext->CloseLocalContext(myLocContInd);
- Standard_Integer aSelMode = ((Handle(AIS_InteractiveObject)) anAISBox)->SelectionMode();
- if(aSelMode != -1)
+ TColStd_ListOfInteger anActivatedModes;
+ myAISContext->ActivatedModes (anAISBox, anActivatedModes);
+ if(anActivatedModes.Extent() != 1 || anActivatedModes.First() != -1 )
return 1;
return 0;
Handle(Geom_Axis2Placement) trihedronAxis = new Geom_Axis2Placement(gp::XOY());
Handle(AIS_Trihedron) trihedron = new AIS_Trihedron(trihedronAxis);
if (aMode)
- trihedron->UnsetSelectionMode(); // this line causes an exception on OpenLocalContext
+ aisContext->SetAutoActivateSelection (Standard_False); // if selection must not be activated
trihedron->SetSize(20);
trihedron->SetColor(Quantity_NOC_GRAY30);
trihedron->SetArrowColor(Quantity_NOC_GRAY30);
aContext->Display(ais2);
aContext->Display(ais3);
- aContext->AddOrRemoveCurrentObject(ais1);
- aContext->AddOrRemoveCurrentObject(ais2);
- aContext->AddOrRemoveCurrentObject(ais3);
+ aContext->AddOrRemoveSelected(ais1);
+ aContext->AddOrRemoveSelected(ais2);
+ aContext->AddOrRemoveSelected(ais3);
- di << "\n No of currents = " << aContext->NbCurrents();
+ di << "\n No of currents = " << aContext->NbSelected();
- aContext->InitCurrent();
+ aContext->InitSelected();
int count = 1;
- while(aContext->MoreCurrent())
+ while(aContext->MoreSelected())
{
di << "\n count is = " << count++;
- Handle(AIS_InteractiveObject) ais = aContext->Current();
- aContext->AddOrRemoveCurrentObject(ais);
- aContext->InitCurrent();
+ Handle(AIS_InteractiveObject) ais = aContext->SelectedInteractive();
+ aContext->AddOrRemoveSelected(ais);
+ aContext->InitSelected();
}
return 0;
aContext2->Display(ais2);
aContext2->Display(ais3);
- aContext1->AddOrRemoveCurrentObject(ais1);
- aContext1->AddOrRemoveCurrentObject(ais2);
- aContext1->AddOrRemoveCurrentObject(ais3);
+ aContext1->AddOrRemoveSelected(ais1);
+ aContext1->AddOrRemoveSelected(ais2);
+ aContext1->AddOrRemoveSelected(ais3);
di << "\n Stage : 1";
- di << "\n \t No of currents on aContext1 = " << aContext1->NbCurrents();
- di << "\n \t No of currents on aContext2 = " << aContext2->NbCurrents() << "\n\n";
+ di << "\n \t No of currents on aContext1 = " << aContext1->NbSelected();
+ di << "\n \t No of currents on aContext2 = " << aContext2->NbSelected() << "\n\n";
- di << "\n aContext1->IsCurrent = " << (Standard_Integer) aContext1->IsCurrent(ais1) << ", aContext2->IsCurrent = " << (Standard_Integer) aContext2->IsCurrent(ais1) << " ";
+ di << "\n aContext1->IsSelected = " << (Standard_Integer) aContext1->IsCurrent(ais1) << ", aContext2->IsCurrent = " << (Standard_Integer) aContext2->IsCurrent(ais1) << " ";
- aContext2->AddOrRemoveCurrentObject(ais1);
- aContext2->AddOrRemoveCurrentObject(ais2);
- aContext2->AddOrRemoveCurrentObject(ais3);
+ aContext2->AddOrRemoveSelected(ais1);
+ aContext2->AddOrRemoveSelected(ais2);
+ aContext2->AddOrRemoveSelected(ais3);
di << "\n Stage : 2";
- di << "\n \t No of currents on aContext1 = " << aContext1->NbCurrents();
- di << "\n \t No of currents on aContext2 = " << aContext2->NbCurrents() << "\n\n";
+ di << "\n \t No of currents on aContext1 = " << aContext1->NbSelected();
+ di << "\n \t No of currents on aContext2 = " << aContext2->NbSelected() << "\n\n";
- aContext1->InitCurrent();
+ aContext1->InitSelected();
int count1 = 1;
- while(aContext1->MoreCurrent())
+ while(aContext1->MoreSelected())
{
di << "\n count1 is = " << count1++;
- Handle(AIS_InteractiveObject) ais = aContext1->Current();
- aContext1->AddOrRemoveCurrentObject(ais);
- aContext1->InitCurrent();
+ Handle(AIS_InteractiveObject) ais = aContext1->SelectedInteractive();
+ aContext1->AddOrRemoveSelected(ais);
+ aContext1->InitSelected();
}
di << "\n Stage : 3";
- di << "\n \t No of currents on aContext1 = " << aContext1->NbCurrents();
- di << "\n \t No of currents on aContext2 = " << aContext2->NbCurrents() << "\n\n";
+ di << "\n \t No of currents on aContext1 = " << aContext1->NbSelected();
+ di << "\n \t No of currents on aContext2 = " << aContext2->NbSelected() << "\n\n";
- aContext2->InitCurrent();
+ aContext2->InitSelected();
int count2 = 1;
- while(aContext2->MoreCurrent())
+ while(aContext2->MoreSelected())
{
di << "\n count2 is = " << count2++;
- Handle(AIS_InteractiveObject) ais = aContext2->Current();
- aContext2->AddOrRemoveCurrentObject(ais);
- aContext2->InitCurrent();
+ Handle(AIS_InteractiveObject) ais = aContext2->SelectedInteractive();
+ aContext2->AddOrRemoveSelected(ais);
+ aContext2->InitSelected();
}
di << "\n\n Stage : 4";
- di << "\n \t No of currents on aContext1 = " << aContext1->NbCurrents();
- di << "\n \t No of currents on aContext2 = " << aContext2->NbCurrents();
+ di << "\n \t No of currents on aContext1 = " << aContext1->NbSelected();
+ di << "\n \t No of currents on aContext2 = " << aContext2->NbSelected();
return 0;
}
AIS_ListIteratorOfListOfInteractive It;
for (It.Initialize(aListOfIO);It.More();It.Next())
{
- aContext->AddOrRemoveCurrentObject(It.Value());
+ aContext->AddOrRemoveSelected(It.Value());
}
return 0;
aContext->Display(ais2);
aContext->Display(ais3);
- aContext->AddOrRemoveCurrentObject(ais1);
- aContext->AddOrRemoveCurrentObject(ais2);
- aContext->AddOrRemoveCurrentObject(ais3);
+ aContext->AddOrRemoveSelected(ais1);
+ aContext->AddOrRemoveSelected(ais2);
+ aContext->AddOrRemoveSelected(ais3);
//printf("\n No of currents = %d", aContext->NbCurrents());
- aContext->InitCurrent();
+ aContext->InitSelected();
//int count = 1;
- while(aContext->MoreCurrent())
+ while(aContext->MoreSelected())
{
//printf("\n count is = %d", count++);
- Handle(AIS_InteractiveObject) ais = aContext->Current();
+ Handle(AIS_InteractiveObject) ais = aContext->SelectedInteractive();
aContext->Remove(ais, UpdateViewer);
- aContext->InitCurrent();
+ aContext->InitSelected();
}
return 0;
{
if( HasSelectable() ) {
if( IsAutoHilight() )
- PM->Color(mySelectable,aColor,aMode);
+ {
+ const Graphic3d_ZLayerId aLayerId = mySelectable->GlobalSelOwner().Access() == this ?
+ Graphic3d_ZLayerId_Top : Graphic3d_ZLayerId_Topmost;
+ PM->Color(mySelectable,aColor,aMode, NULL, aLayerId);
+ }
else
mySelectable->HilightOwnerWithColor( PM, aColor, this );
}
---C++: return const&
---Purpose: Returns common entity owner if the object is an assembly
+ GlobalSelectionMode (me)
+ returns Integer from Standard;
+ ---C++: inline
+ ---Purpose: Returns the mode for selection of object as a whole
+
+ GlobalSelOwner (me)
+ returns EntityOwner from SelectMgr
+ is virtual;
+ ---Purpose: Returns the owner of mode for selection of object as a whole
+
+ setGlobalSelMode (me : mutable;
+ theMode : Integer from Standard)
+ is static protected;
+ ---Purpose: Allows derived classes to redefine global selection mode.
+ ---C++: inline
+
fields
myselections : SequenceOfSelection is protected;
mySelectionPrs : Presentation from Prs3d;
myHilightPrs : Presentation from Prs3d;
+ myGlobalSelMode : Integer from Standard;
friends
class SelectionManager from SelectMgr
// Purpose :
//==================================================
-SelectMgr_SelectableObject::SelectMgr_SelectableObject( const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d):
- PrsMgr_PresentableObject (aTypeOfPresentation3d),
+SelectMgr_SelectableObject::SelectMgr_SelectableObject (const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d)
+: PrsMgr_PresentableObject (aTypeOfPresentation3d),
myDrawer (new Prs3d_Drawer()),
myHilightDrawer (new Prs3d_Drawer()),
myAssemblyOwner (NULL),
- myAutoHilight (Standard_True)
+ myAutoHilight (Standard_True),
+ myGlobalSelMode (0)
{
InitDefaultHilightAttributes (myHilightDrawer);
myHilightDrawer->Link (myDrawer);
{
return myAssemblyOwner;
}
+
+//=======================================================================
+//function : GlobalSelOwner
+//purpose : Returns entity owner corresponding to selection of the object as a whole
+//=======================================================================
+Handle(SelectMgr_EntityOwner) SelectMgr_SelectableObject::GlobalSelOwner() const
+{
+ Handle(SelectMgr_EntityOwner) anOwner;
+
+ if (!HasSelection (myGlobalSelMode))
+ return anOwner;
+
+ const Handle(SelectMgr_Selection)& aGlobalSel = Selection (myGlobalSelMode);
+ if (aGlobalSel->IsEmpty())
+ return anOwner;
+
+ aGlobalSel->Init();
+ anOwner =
+ Handle(SelectMgr_EntityOwner)::DownCast (aGlobalSel->Sensitive()->BaseSensitive()->OwnerId());
+
+ return anOwner;
+}
inline const Handle(Prs3d_Drawer)& SelectMgr_SelectableObject::
HilightAttributes() const
{return myHilightDrawer;}
+
+//=======================================================================
+//function : GlobalSelectionMode
+//purpose :
+//=======================================================================
+inline Standard_Integer SelectMgr_SelectableObject::GlobalSelectionMode() const
+{
+ return myGlobalSelMode;
+}
+
+//=======================================================================
+//function : setGlobalSelMode
+//purpose :
+//=======================================================================
+inline void SelectMgr_SelectableObject::setGlobalSelMode (const Standard_Integer theMode)
+{
+ myGlobalSelMode = theMode > 0 ? theMode : 0;
+}
const Standard_Integer aMode)
{
Standard_Integer M = (aMode < 0) ? myCurMode : aMode;
+ Graphic3d_ZLayerId aHiLayer = this == Selectable()->GlobalSelOwner().Access() ?
+ Graphic3d_ZLayerId_Top : Graphic3d_ZLayerId_Topmost;
Handle(SelectMgr_SelectableObject) aSel = Selectable();
if (myFromDecomposition)
{
}
// highlight with color and set layer
- PM->Color (myPrsSh, aCol, M, aSel);
+ PM->Color (myPrsSh, aCol, M, aSel, aHiLayer);
}
else
{
if (!myPrsSh.IsNull())
{
- PM->Color (myPrsSh, aCol, M, aSel);
+ PM->Color (myPrsSh, aCol, M, aSel, aHiLayer);
}
else
{
- PM->Color (aSel, aCol, M);
+ PM->Color (aSel, aCol, M, NULL, aHiLayer);
}
}
}
#include <TDF_DeltaOnAddition.hxx>
#include <TDF_Tool.hxx>
#include <TCollection_ExtendedString.hxx>
+#include <TColStd_ListOfInteger.hxx>
+#include <TColStd_ListIteratorOfListOfInteger.hxx>
#include <TPrsStd_AISViewer.hxx>
#include <AIS_InteractiveContext.hxx>
#include <AIS_InteractiveObject.hxx>
{
// OCC2932 correction
if(hasOwnSelectionMode && mySelectionMode == theSelectionMode && !myAIS.IsNull())
- if(myAIS->SelectionMode() == theSelectionMode )
return;
Backup();
mySelectionMode = theSelectionMode;
hasOwnSelectionMode = Standard_True;
if( myAIS.IsNull() ) AISUpdate();
- if( !myAIS.IsNull() ) {
- if( myAIS->SelectionMode() == theSelectionMode ) return;
- myAIS->SetSelectionMode(theSelectionMode);
- }
}
//=======================================================================
void TPrsStd_AISPresentation::UnsetSelectionMode()
{
if(!hasOwnSelectionMode && !myAIS.IsNull())
- if(!myAIS->HasSelectionMode())
return;
Backup();
hasOwnSelectionMode = Standard_False;
if( myAIS.IsNull() ) AISUpdate();
- if( !myAIS.IsNull() && myAIS->HasSelectionMode() ) {
- myAIS->UnsetSelectionMode();
- }
+ mySelectionMode = myAIS->GlobalSelectionMode();
}
//=======================================================================
}
- if (hasOwnSelectionMode) {
- if (myAIS->SelectionMode() != mySelectionMode ) {
- myAIS->SetSelectionMode(mySelectionMode);
+ if (hasOwnSelectionMode) {
+ const Handle(AIS_InteractiveContext) aContext =
+ ctx.IsNull() ? myAIS->GetContext() : ctx;
+ if (!aContext.IsNull())
+ {
+ TColStd_ListOfInteger anActivatedModes;
+ aContext->ActivatedModes (myAIS, anActivatedModes);
+ Standard_Boolean isActivated = Standard_False;
+ for (TColStd_ListIteratorOfListOfInteger aModeIter (anActivatedModes); aModeIter.More(); aModeIter.Next())
+ {
+ if (aModeIter.Value() == mySelectionMode)
+ {
+ isActivated = Standard_True;
+ break;
+ }
+ }
+
+ if (!isActivated)
+ aContext->Activate (myAIS, mySelectionMode, Standard_False);
}
}
if (myGridEcho
&& !myGridEchoStructure.IsNull())
{
- ActiveView()->View()->EraseImmediate (myGridEchoStructure);
+ myGridEchoStructure->Erase();
}
}
Update();
return;
}
- for (InitActiveViews(); MoreActiveViews(); NextActiveViews())
- {
- ActiveView()->View()->EraseImmediate (myGridEchoStructure);
- }
+ myGridEchoStructure->Erase();
}
// =======================================================================
anArrayOfPoints->AddVertex (theVertex.X(), theVertex.Y(), theVertex.Z());
myGridEchoGroup->AddPrimitiveArray (anArrayOfPoints);
- theView->View()->DisplayImmediate (myGridEchoStructure, Standard_True);
+ myGridEchoStructure->SetZLayer (Graphic3d_ZLayerId_Topmost);
+ myGridEchoStructure->SetInfiniteState (Standard_True);
+ myGridEchoStructure->CStructure()->ViewAffinity = new Graphic3d_ViewAffinity();
+ myGridEchoStructure->CStructure()->ViewAffinity->SetVisible (Standard_False);
+ myGridEchoStructure->CStructure()->ViewAffinity->SetVisible (theView->View()->Identification(), true);
+ myGridEchoStructure->Display();
}
// =======================================================================
}
myGridEchoLastVert.SetCoord (ShortRealLast(), ShortRealLast(), ShortRealLast());
- theView->View()->EraseImmediate (myGridEchoStructure);
+ const Handle(Graphic3d_ViewAffinity)& anAffinity = myGridEchoStructure->CStructure()->ViewAffinity;
+ if (!anAffinity.IsNull() && anAffinity->IsVisible (theView->View()->Identification()))
+ myGridEchoStructure->Erase();
}
if(!aContext->HasOpenedContext()) {
// To unhilight the preselected object
- aContext->UnhilightCurrents(Standard_False);
+ aContext->UnhilightSelected(Standard_False);
// Open a local Context in order to be able to select subshape from
// the selected shape if any or for all if there is no selection
- if (!aContext->FirstCurrentObject().IsNull()){
+ if (!aContext->FirstSelectedObject().IsNull()){
aContext->OpenLocalContext(Standard_False);
- for(aContext->InitCurrent();aContext->MoreCurrent();aContext->NextCurrent()){
- aContext->Load( aContext->Current(),-1,Standard_True);
+ for(aContext->InitSelected();aContext->MoreSelected();aContext->NextSelected()){
+ aContext->Load( aContext->SelectedInteractive(),-1,Standard_True);
}
}
else
//unset displaymode.. comportement particulier...
if(TypeOfOperation==4){
if(argc==1){
- if(Ctx->NbCurrents()==0 ||
- Ctx->NbSelected()==0){
+ if(Ctx->NbSelected()==0){
Handle(AIS_InteractiveObject) IO;
VwrTst_DispErase(IO,-1,4,Standard_False);
}
- else if(!Ctx->HasOpenedContext()){
- for(Ctx->InitCurrent();Ctx->MoreCurrent();Ctx->NextCurrent())
- VwrTst_DispErase(Ctx->Current(),-1,4,Standard_False);
- }
else{
for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected())
- VwrTst_DispErase(Ctx->Interactive(),-1,4,Standard_False);}
+ VwrTst_DispErase(Ctx->SelectedInteractive(),-1,4,Standard_False);}
Ctx->UpdateCurrentViewer();
}
else{
}
else if(argc==2){
Standard_Integer Dmode = Draw::Atoi(argv[1]);
- if(Ctx->NbCurrents()==0 && TypeOfOperation==3){
+ if(Ctx->NbSelected()==0 && TypeOfOperation==3){
Handle(AIS_InteractiveObject) IO;
VwrTst_DispErase(IO,Dmode,TypeOfOperation,Standard_True);
}
if(!Ctx->HasOpenedContext()){
// set/unset display mode sur le Contexte...
- for(Ctx->InitCurrent();Ctx->MoreCurrent();Ctx->NextCurrent()){
- VwrTst_DispErase(Ctx->Current(),Dmode,TypeOfOperation,Standard_False);
+ for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected()){
+ VwrTst_DispErase(Ctx->SelectedInteractive(),Dmode,TypeOfOperation,Standard_False);
}
Ctx->UpdateCurrentViewer();
}
else{
for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected())
- Ctx->Display(Ctx->Interactive(),Dmode);
+ Ctx->Display(Ctx->SelectedInteractive(),Dmode);
}
}
else{
Standard_Integer On = Draw::Atoi(argv[1]);
const Handle(AIS_InteractiveContext)& Ctx = ViewerTest::GetAISContext();
- if(argc==2){
-
- if(!Ctx->HasOpenedContext()){
- di<<"sub intensite ";
- if(On==1) di<<"On";
- else di<<"Off";
- di<<" pour "<<Ctx->NbCurrents()<<" objets"<<"\n";
- for(Ctx->InitCurrent();Ctx->MoreCurrent();Ctx->NextCurrent()){
- if(On==1){
- Ctx->SubIntensityOn(Ctx->Current(),Standard_False);}
- else{
- di <<"passage dans off"<<"\n";
- Ctx->SubIntensityOff(Ctx->Current(),Standard_False);
- }
+ if(argc==2)
+ {
+ TCollection_AsciiString isOnOff = On == 1 ? "on" : "off";
+ di << "Sub intensite is turned " << isOnOff << " for " << Ctx->NbSelected() << "objects\n";
+ for (Ctx->InitSelected(); Ctx->MoreSelected(); Ctx->NextSelected())
+ {
+ if(On==1)
+ {
+ Ctx->SubIntensityOn (Ctx->SelectedInteractive(), Standard_False);
}
- }
- else{
- for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected()){
- if(On==1){
- Ctx->SubIntensityOn(Ctx->Interactive(),Standard_False);}
- else{
- Ctx->SubIntensityOff(Ctx->Interactive(),Standard_False);}
+ else
+ {
+ Ctx->SubIntensityOff (Ctx->SelectedInteractive(), Standard_False);
}
}
+
Ctx->UpdateCurrentViewer();
}
else {
mySource = IterSource_List;
mySeqIter = NCollection_Sequence<TCollection_AsciiString>::Iterator (mySeq);
}
- else if (aCtx->NbCurrents() > 0)
+ else if (aCtx->NbSelected() > 0)
{
mySource = IterSource_Selected;
mySelIter = aCtx;
- mySelIter->InitCurrent();
+ mySelIter->InitSelected();
}
else
{
{
case IterSource_All: return myMapIter.More();
case IterSource_List: return mySeqIter.More();
- case IterSource_Selected: return mySelIter->MoreCurrent();
+ case IterSource_Selected: return mySelIter->MoreSelected();
}
return Standard_False;
}
}
case IterSource_Selected:
{
- mySelIter->NextCurrent();
+ mySelIter->NextSelected();
break;
}
}
}
case IterSource_Selected:
{
- if (mySelIter->MoreCurrent())
+ if (mySelIter->MoreSelected())
{
- myCurrentName = GetMapOfAIS().Find1 (mySelIter->Current());
- myCurrent = mySelIter->Current();
+ myCurrentName = GetMapOfAIS().Find1 (mySelIter->SelectedInteractive());
+ myCurrent = mySelIter->SelectedInteractive();
}
break;
}
if (anArgIter >= theArgNb)
{
// display only selected objects
- if (aCtx->NbCurrents() < 1)
+ if (aCtx->NbSelected() < 1)
{
return 0;
}
- for (aCtx->InitCurrent(); aCtx->MoreCurrent(); aCtx->NextCurrent())
+ for (aCtx->InitSelected(); aCtx->MoreSelected(); aCtx->NextSelected())
{
- aDispSet.Add (aCtx->Current());
+ aDispSet.Add (aCtx->SelectedInteractive());
}
}
else
}
}
}
- else if (!toEraseAll && aCtx->NbCurrents() > 0)
+ else if (!toEraseAll && aCtx->NbSelected() > 0)
{
// Erase selected objects
for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
{
const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
if (!anIO.IsNull()
- && aCtx->IsCurrent (anIO))
+ && aCtx->IsSelected (anIO))
{
theDI << anIter.Key2().ToCString() << " ";
if (toEraseInView)
bndPresentation (theDI, aPrs, aName, anAction);
}
}
- else if (aCtx->NbCurrents() > 0)
+ else if (aCtx->NbSelected() > 0)
{
// remove all currently selected objects
- for (aCtx->InitCurrent(); aCtx->MoreCurrent(); aCtx->NextCurrent())
+ for (aCtx->InitSelected(); aCtx->MoreSelected(); aCtx->NextSelected())
{
- Handle(AIS_InteractiveObject) anIO = aCtx->Current();
+ Handle(AIS_InteractiveObject) anIO = aCtx->SelectedInteractive();
Handle(PrsMgr_Presentation) aPrs = findPresentation (aCtx, anIO, aMode);
if (!aPrs.IsNull())
{
&& aCtx->GetAutoActivateSelection()
&& aShape->GetTransformPersistenceMode() == 0))
{
- aSelMode = aShape->HasSelectionMode() ? aShape->SelectionMode() : -1;
+ aSelMode = aShape->GlobalSelectionMode();
}
aCtx->Display (aShape, aDispMode, aSelMode,
&& aCtx->GetAutoActivateSelection()
&& aShape->GetTransformPersistenceMode() == 0))
{
- aSelMode = aShape->HasSelectionMode() ? aShape->SelectionMode() : -1;
+ aSelMode = aShape->GlobalSelectionMode();
}
if (aShape->Type() == AIS_KOI_Datum)
// on load tous les objets displayees et on Activate les objets de la liste
AIS_ListOfInteractive ListOfIO;
// on sauve dans une AISListOfInteractive tous les objets currents
- if (TheAISContext()->NbCurrents()>0 ){
- TheAISContext()->UnhilightCurrents(Standard_False);
+ if (TheAISContext()->NbSelected()>0 ){
+ TheAISContext()->UnhilightSelected(Standard_False);
- for (TheAISContext()->InitCurrent(); TheAISContext()->MoreCurrent(); TheAISContext()->NextCurrent() ){
- ListOfIO.Append(TheAISContext()->Current() );
+ for (TheAISContext()->InitSelected(); TheAISContext()->MoreSelected(); TheAISContext()->NextSelected() ){
+ ListOfIO.Append(TheAISContext()->SelectedInteractive() );
}
}
TheAISContext()->UnhilightSelected(Standard_False);
// il y a des objets selected,on les parcourt
for (TheAISContext()->InitSelected(); TheAISContext()->MoreSelected(); TheAISContext()->NextSelected() ){
- Handle(AIS_InteractiveObject) aIO=TheAISContext()->Interactive();
+ Handle(AIS_InteractiveObject) aIO=TheAISContext()->SelectedInteractive();
if (HaveMode(aIO,aMode) ) {
return 0;
}
- if (aCtx->NbCurrents() > 0
+ if (aCtx->NbSelected() > 0
&& !toShowAll)
{
- for (aCtx->InitCurrent(); aCtx->MoreCurrent(); aCtx->NextCurrent())
+ for (aCtx->InitSelected(); aCtx->MoreSelected(); aCtx->NextSelected())
{
- Handle(AIS_InteractiveObject) anObj = aCtx->Current();
+ Handle(AIS_InteractiveObject) anObj = aCtx->SelectedInteractive();
TCollection_AsciiString aName = GetMapOfAIS().Find1 (anObj);
aName.LeftJustify (20, ' ');
theDI << aName << " ";
}
aCtx->Load (aShape, -1, Standard_False);
- aCtx->Activate (aShape, aShape->SelectionMode(), Standard_True);
+ aCtx->Activate (aShape, aShape->GlobalSelectionMode(), Standard_True);
}
}
TheAISContext()->CloseLocalContext();
// On set le booleen ThereIsCurrent
- if (TheAISContext() -> NbCurrents() > 0) {ThereIsCurrent=Standard_True;}
+ if (TheAISContext() -> NbSelected() > 0) {ThereIsCurrent=Standard_True;}
else {ThereIsCurrent=Standard_False;}
Handle(AIS_InteractiveObject) aShape=
Handle(AIS_InteractiveObject)::DownCast(it.Key1());
- if (!aShape.IsNull() && TheAISContext()->IsCurrent(aShape) )
+ if (!aShape.IsNull() && TheAISContext()->IsSelected(aShape) )
{
// On verifie que l'AIS InteraciveObject selectionne est bien
Handle(AIS_InteractiveObject) theIOB;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
- theIOB = TheAISContext()->Interactive();
+ theIOB = TheAISContext()->SelectedInteractive();
}
// on le downcast
Handle(AIS_Plane) PlaneB =((*(Handle(AIS_Plane)*)&theIOB));
}
// Check the arguments
- if (theArgc != 3 && theArgc != 4)
+ if (theArgc < 3 && theArgc > 5)
{
std::cerr << "vselmode error : expects at least 2 arguments.\n"
<< "Type help "<< theArgv[0] <<" for more information." << std::endl;
return 1;
}
+ TCollection_AsciiString aLastArg (theArgv[theArgc - 1]);
+ aLastArg.LowerCase();
+ Standard_Boolean isToOpenLocalCtx = aLastArg == "-local";
+
// get objects to change selection mode
AIS_ListOfInteractive aTargetIOs;
- if (theArgc == 3)
+ Standard_Integer anArgNb = isToOpenLocalCtx ? theArgc - 1 : theArgc;
+ if (anArgNb == 3)
{
anAISContext->DisplayedObjects (aTargetIOs);
}
}
}
- const Standard_Integer aSelectionMode = Draw::Atoi (theArgc == 3 ? theArgv[1] : theArgv[2]);
- const Standard_Boolean toTurnOn = Draw::Atoi (theArgc == 3 ? theArgv[2] : theArgv[3]);
+ const Standard_Integer aSelectionMode = Draw::Atoi (anArgNb == 3 ? theArgv[1] : theArgv[2]);
+ const Standard_Boolean toTurnOn = Draw::Atoi (anArgNb == 3 ? theArgv[2] : theArgv[3]);
if (aSelectionMode == 0 && anAISContext->HasOpenedContext())
{
anAISContext->CloseLocalContext();
for (AIS_ListIteratorOfListOfInteractive aTargetIt (aTargetIOs); aTargetIt.More(); aTargetIt.Next())
{
const Handle(AIS_InteractiveObject)& anIO = aTargetIt.Value();
+ TColStd_ListOfInteger anActiveModes;
+ anAISContext->ActivatedModes (anIO, anActiveModes);
+ if (!anActiveModes.IsEmpty())
+ {
+ anAISContext->Deactivate (anIO);
+ }
if (!InList (anAISContext, anIO, aSelectionMode))
{
anAISContext->Activate (anIO);
if (aSelectionMode != 0 && toTurnOn) // Turn on specified mode
{
- if (!anAISContext->HasOpenedContext())
+ if (!anAISContext->HasOpenedContext() && isToOpenLocalCtx)
{
anAISContext->OpenLocalContext (Standard_False);
}
for (AIS_ListIteratorOfListOfInteractive aTargetIt (aTargetIOs); aTargetIt.More(); aTargetIt.Next())
{
const Handle(AIS_InteractiveObject)& anIO = aTargetIt.Value();
+ if (InList (anAISContext, anIO, 0))
+ {
+ anAISContext->Deactivate (anIO, 0);
+ }
if (!InList (anAISContext, anIO, aSelectionMode))
{
anAISContext->Load (anIO, -1, Standard_True);
if (aSelectionMode != 0 && !toTurnOn) // Turn off specified mode
{
- if (!anAISContext->HasOpenedContext())
- {
- return 0;
- }
-
for (AIS_ListIteratorOfListOfInteractive aTargetIt (aTargetIOs); aTargetIt.More(); aTargetIt.Next())
{
const Handle(AIS_InteractiveObject)& anIO = aTargetIt.Value();
// NIS setup
Handle(NIS_View) aView = new NIS_View (a3DViewer, VT_GetWindow());
+ ViewerTest::GetAISContext()->RedrawImmediate (a3DViewer);
ViewerTest::CurrentView(aView);
ViewerTest_myViews.Bind (aViewNames.GetViewName(), aView);
aContext->DefaultDrawer()->SetTypeOfHLR(Prs3d_TOH_PolyAlgo);
else
aContext->DefaultDrawer()->SetTypeOfHLR(Prs3d_TOH_Algo);
- if (aContext->NbCurrents()==0 || aContext->NbSelected() == 0)
+ if (aContext->NbSelected()==0)
{
AIS_ListOfInteractive aListOfShapes;
aContext->DisplayedObjects(aListOfShapes);
}
else
{
- for (aContext->InitCurrent();aContext->MoreCurrent();aContext->NextCurrent())
+ for (aContext->InitSelected();aContext->MoreSelected();aContext->NextSelected())
{
- Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(aContext->Current());
+ Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(aContext->SelectedInteractive());
if (aShape.IsNull())
continue;
if(aShape->TypeOfHLR() == Prs3d_TOH_PolyAlgo)
std::cout << "setup Shaded display mode" << std::endl;
Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext();
- if(Ctx->NbCurrents()==0 ||
- Ctx->NbSelected()==0)
+ if(Ctx->NbSelected()==0)
Ctx->SetDisplayMode(AIS_Shaded);
else{
- if(Ctx->HasOpenedContext()){
- for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected())
- Ctx->SetDisplayMode(Ctx->Interactive(),1,Standard_False);
- }
- else{
- for(Ctx->InitCurrent();Ctx->MoreCurrent();Ctx->NextCurrent())
- Ctx->SetDisplayMode(Ctx->Current(),1,Standard_False);
- }
+ for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected())
+ Ctx->SetDisplayMode(Ctx->SelectedInteractive(),1,Standard_False);
Ctx->UpdateCurrentViewer();
}
}
std::cout << "reset display mode to defaults" << std::endl;
Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext();
- if(Ctx->NbCurrents()==0 ||
- Ctx->NbSelected()==0)
+ if(Ctx->NbSelected()==0)
Ctx->SetDisplayMode(AIS_WireFrame);
else{
- if(Ctx->HasOpenedContext()){
- for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected())
- Ctx->UnsetDisplayMode(Ctx->Interactive(),Standard_False);
- }
- else{
- for(Ctx->InitCurrent();Ctx->MoreCurrent();Ctx->NextCurrent())
- Ctx->UnsetDisplayMode(Ctx->Current(),Standard_False);
- }
+ for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected())
+ Ctx->UnsetDisplayMode(Ctx->SelectedInteractive(),Standard_False);
Ctx->UpdateCurrentViewer();
}
{
std::cout << "setup WireFrame display mode" << std::endl;
Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext();
- if(Ctx->NbCurrents()==0 ||
- Ctx->NbSelected()==0)
+ if(Ctx->NbSelected()==0)
Ctx->SetDisplayMode(AIS_WireFrame);
else{
- if(Ctx->HasOpenedContext()){
- for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected())
- Ctx->SetDisplayMode(Ctx->Interactive(),0,Standard_False);
- }
- else{
- for(Ctx->InitCurrent();Ctx->MoreCurrent();Ctx->NextCurrent())
- Ctx->SetDisplayMode(Ctx->Current(),0,Standard_False);
- }
+ for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected())
+ Ctx->SetDisplayMode(Ctx->SelectedInteractive(),0,Standard_False);
Ctx->UpdateCurrentViewer();
}
}
{
Handle(AIS_InteractiveContext) aCtx = ViewerTest::GetAISContext();
if (!aCtx.IsNull()
- && aCtx->NbCurrents() > 0
&& aCtx->NbSelected() > 0)
{
Draw_Interprete ("verase");
{
if (aFileName.Value (aLen - 2) == '.')
{
- aFormatStr = aFileName.SubString (aLen - 1, aLen);
+ aFormatStr = aFileName.ToCString() + aLen - 2;
}
else if (aFileName.Value (aLen - 3) == '.')
{
- aFormatStr = aFileName.SubString (aLen - 2, aLen);
+ aFormatStr = aFileName.ToCString() + aLen - 3;
}
else
{
return 1;
}
- if(aContext->HasOpenedContext())
- {
- aContext->AddOrRemoveSelected(anAISObject);
- }
- else
- {
- aContext->AddOrRemoveCurrentObject(anAISObject);
- }
+ aContext->AddOrRemoveSelected(anAISObject);
}
return 0;
}
---Level: Advanced
---Purpose: Returns the view manager handle which manage this view
+ IsComputed (me;
+ theStructId : Integer from Standard;
+ theComputedStruct : out Structure from Graphic3d)
+ returns Boolean from Standard
+ is static;
+ ---Purpose: Returns Standard_True in case if the structure with the given <theStructId> is
+ -- in list of structures to be computed and stores computed struct to <theComputedStruct>.
+
----------------------------
-- Category: Private methods
----------------------------
---Purpose: Display the structure <AStructure> to the view <me>.
---Category: Private methods
- DisplayImmediate ( me : mutable;
- theStructure : Structure from Graphic3d;
- theIsSingleView : Boolean from Standard = Standard_True)
- returns Boolean from Standard
- is static;
- ---Level: Internal
- ---Purpose: Add structure to the list of immediate presentations.
- -- @return true if structure has not been registered in this view
-
- EraseImmediate ( me : mutable;
- theStructure : Structure from Graphic3d )
- returns Boolean from Standard
- is static;
- ---Level: Internal
- ---Purpose: Removes the structure from the list of immediate presentations.
- -- @return true if structure has been registered in view
-
- ClearImmediate ( me : mutable )
- returns Boolean from Standard
- is static;
- ---Level: Internal
- ---Purpose: Clears list of immediate presentations.
- -- @return true if list was not empty
-
Erase ( me : mutable;
AStructure : Structure from Graphic3d )
is static private;
-- the displayed structures in the view
myStructsDisplayed : MapOfStructure from Graphic3d;
- myImmediateStructures : MapOfStructure from Graphic3d;
myGTrihedron : GraduatedTrihedron from Graphic3d;
if (myGraphicDriver->IsDeviceLost())
{
myViewManager->RecomputeStructures();
- myViewManager->RecomputeStructures (myImmediateStructures);
myGraphicDriver->ResetDeviceLostFlag();
}
}
}
-// ========================================================================
-// function : DisplayImmediate
-// purpose :
-// ========================================================================
-Standard_Boolean Visual3d_View::DisplayImmediate (const Handle(Graphic3d_Structure)& theStructure,
- const Standard_Boolean theIsSingleView)
-{
- if (!myImmediateStructures.Add (theStructure))
- {
- return Standard_False;
- }
-
- if (theIsSingleView)
- {
- const Visual3d_SequenceOfView& aViews = myViewManager->DefinedViews();
- for (Standard_Integer aViewIter = 1; aViewIter <= aViews.Length(); ++aViewIter)
- {
- const Handle(Visual3d_View)& aView = aViews.Value (aViewIter);
- if (aView.Access() != this)
- {
- aView->EraseImmediate (theStructure);
- }
- }
- }
-
- myGraphicDriver->DisplayImmediateStructure (MyCView, theStructure);
- return Standard_True;
-}
-
-// ========================================================================
-// function : EraseImmediate
-// purpose :
-// ========================================================================
-Standard_Boolean Visual3d_View::EraseImmediate (const Handle(Graphic3d_Structure)& theStructure)
-{
- const Standard_Boolean isErased = myImmediateStructures.Remove (theStructure);
- if (isErased)
- {
- myGraphicDriver->EraseImmediateStructure (MyCView, *theStructure->CStructure());
- }
-
- return isErased;
-}
-
-// ========================================================================
-// function : ClearImmediate
-// purpose :
-// ========================================================================
-Standard_Boolean Visual3d_View::ClearImmediate()
-{
- if (myImmediateStructures.IsEmpty())
- {
- return Standard_False;
- }
-
- for (Graphic3d_MapOfStructure::Iterator aStructIter (myImmediateStructures); aStructIter.More(); aStructIter.Next())
- {
- myGraphicDriver->EraseImmediateStructure (MyCView, *aStructIter.Key()->CStructure());
- }
- myImmediateStructures.Clear();
- return Standard_True;
-}
-
// ========================================================================
// function : Display
// purpose :
const Aspect_TypeOfUpdate theUpdateMode)
{
if ( IsDeleted()
- || EraseImmediate (theStruct)
|| !IsDisplayed (theStruct))
{
return;
const Standard_Integer anIndex = IsComputed (theStruct);
if (anIndex != 0)
{
- const Handle(Graphic3d_Structure)& aCompStruct = myStructsComputed.ChangeValue (anIndex);
+ const Handle(Graphic3d_Structure)& aCompStruct = myStructsComputed.Value (anIndex);
aCompStruct->Highlight (theMethod, theStruct->HighlightColor(), Standard_False);
}
}
+// ========================================================================
+// function : IsComputed
+// purpose :
+// ========================================================================
+Standard_Boolean Visual3d_View::IsComputed (const Standard_Integer theStructId,
+ Handle(Graphic3d_Structure)& theComputedStruct) const
+{
+ theComputedStruct.Nullify();
+ if (!ComputedMode())
+ return Standard_False;
+
+ const Standard_Integer aNbStructs = myStructsToCompute.Length();
+ for (Standard_Integer aStructIter = 1; aStructIter <= aNbStructs; ++aStructIter)
+ {
+ if (myStructsToCompute.Value (aStructIter)->Identification() == theStructId)
+ {
+ theComputedStruct = myStructsComputed (aStructIter);
+ return Standard_True;
+ }
+ }
+ return Standard_False;
+}
+
// ========================================================================
// function : SetTransform
// purpose :
Bnd_Box Visual3d_View::MinMaxValues (const Standard_Boolean theToIgnoreInfiniteFlag) const
{
Bnd_Box aResult = MinMaxValues (myStructsDisplayed, theToIgnoreInfiniteFlag);
- Bnd_Box anImmediate = MinMaxValues (myImmediateStructures, theToIgnoreInfiniteFlag);
- aResult.Add (anImmediate);
return aResult;
}
-puts "TODO OCC11111 ALL: Error : Colors are not equal in default coordinate and in the near coordinates too"
-
puts "================"
puts "OCC1629"
puts "OCC2707"
set Selection_B 0.8
#QASetChoiceMode EDGE ON
-vselmode 2 1
+vselmode 2 1 -local
set BeforeNbSelected [vnbselected]
set CloseNbSelected [vnbselected]
-checkcolor ${x1} ${y1} ${Selection_R} ${Selection_G} ${Selection_B}
-checkcolor ${x2} ${y2} ${Selection_R} ${Selection_G} ${Selection_B}
-checkcolor ${x3} ${y3} ${Selection_R} ${Selection_G} ${Selection_B}
-checkcolor ${x4} ${y4} ${Selection_R} ${Selection_G} ${Selection_B}
-checkcolor ${x5} ${y5} ${Selection_R} ${Selection_G} ${Selection_B}
+checkcolor ${x1} ${y1} 1 1 0
+checkcolor ${x2} ${y2} 1 1 0
+checkcolor ${x3} ${y3} 1 1 0
+checkcolor ${x4} ${y4} 1 1 0
+checkcolor ${x5} ${y5} 1 1 0
if {${CloseNbSelected} == 0} {
puts "OCC1629: OK (case 13: after close local context)"
edge e1 p1 p2
vdisplay e1
-vselmode e1 2 1
-vselmode e1 1 1
+vselmode e1 2 1 -local
+vselmode e1 1 1 -local
vselect 0 0 2500 2500
verase -local
vfit
# opening a local context for local selection
-vselmode b 4 1
+vselmode b 4 1 -local
# Select a face just to simulate the scenario used in a real application
vselect 200 200
# This line should not lead to exception