- picked or selected objects are now highlighted via owners instead of interactive objects;
- support methods for owners were added to AIS_InteractiveContext;
- dynamically highlighted owners are now displayed in immediate mode;
- 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;
- immediate structures are now added to topmost and top layer lists;
- 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.
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;
{
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
const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
mgrSelector->Remove (anObj);
myMainVwr->DefinedView()->View()->ChangeHiddenObjects()->Remove (theIObj.get());
}
- 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
//! - 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.
class AIS_InteractiveContext : public MMgt_TShared
{
//! Object returns to the default selection mode; the
//! object is displayed but no viewer will be updated.
Standard_EXPORT void UnsetDisplayMode (const Handle(AIS_InteractiveObject)& aniobj, const Standard_Boolean updateviewer = Standard_True);
-
-
- //! Sets the selection mode of Interactive Objects.
- //! aMode provides the selection mode index of the entity aniobj.
- Standard_EXPORT void SetSelectionMode (const Handle(AIS_InteractiveObject)& aniobj, const Standard_Integer aMode);
-
- //! Removes selection mode from Interactive Objects.
- //! aMode provides the selection mode index of the entity aniobj.
- Standard_EXPORT void UnsetSelectionMode (const Handle(AIS_InteractiveObject)& aniobj);
-
//! Disables the mechanism of adaptive tolerance calculation in SelectMgr_ViewerSelector and
//! sets the given tolerance for ALL sensitive entities activated. For more information, see
//! SelectMgr_ViewerSelector documentation
//! <WithColor> will be returned TRUE
//! <theHiCol> gives the name of the hilightcolor
Standard_EXPORT Standard_Boolean IsHilighted (const Handle(AIS_InteractiveObject)& anIobj, Standard_Boolean& WithColor, Quantity_NameOfColor& theHiCol) const;
-
+
+ //! 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
+ Standard_EXPORT Standard_Boolean IsHilighted (const Handle(SelectMgr_EntityOwner)& theOwner,
+ Standard_Boolean& theIsCustomColor,
+ Quantity_NameOfColor& theCustomColorName) const;
//! Returns the display priority of the entity anIobj. This
//! will be display mode of anIobj if it is in the main
//! Return value specified whether selected object must be hilighted
//! when mouse cursor is moved above it
Standard_Boolean ToHilightSelected() const;
-
+
+
+ //! @name OBSOLETE METHODS THAT ARE VALID FOR LOCAL CONTEXT ONLY
//! Updates the view of the current object in open context.
//! Objects selected when there is no open local context
Standard_EXPORT void SetCurrentObject (const Handle(AIS_InteractiveObject)& aniobj, const Standard_Boolean updateviewer = Standard_True);
- //! 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.
- Standard_EXPORT void AddOrRemoveCurrentObject (const Handle(AIS_InteractiveObject)& aniobj, const Standard_Boolean updateviewer = Standard_True);
+ //! 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.
+ Standard_EXPORT void AddOrRemoveCurrentObject (const Handle(AIS_InteractiveObject)& theObj,
+ const Standard_Boolean theIsToUpdateViewer = Standard_True);
//! Updates the list of current objects, i.e. hilights new
//! current objects, removes hilighting from former current objects.
//! 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.
- Standard_EXPORT Standard_Boolean IsCurrent (const Handle(AIS_InteractiveObject)& aniobj) const;
+ //! Objects selected when there is no open local context are called current objects;
+ //! those selected in open local context, selected objects.
+ Standard_EXPORT Standard_Boolean IsCurrent (const Handle(AIS_InteractiveObject)& theObject) const;
//! Initializes a scan of the current selected objects in
Standard_EXPORT Handle(AIS_InteractiveObject) Current() const;
Standard_EXPORT Standard_Integer NbCurrents();
-
-
- //! 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.
- Standard_EXPORT Handle(AIS_InteractiveObject) FirstCurrentObject();
-
//! Highlights current objects.
//! Objects selected when there is no open local context
//! Standard_False, the presentation of the Interactive
//! Object activates the selection mode; the object is
//! displayed but no viewer will be updated.
- Standard_EXPORT void HilightCurrents (const Standard_Boolean updateviewer = Standard_True);
-
+ Standard_EXPORT void HilightCurrents (const Standard_Boolean theToUpdateViewer = Standard_True);
//! Removes highlighting from current objects.
//! Objects selected when there is no open local context
//! Object activates the selection mode; the object is
//! displayed but no viewer will be updated.
Standard_EXPORT void UnhilightCurrents (const Standard_Boolean updateviewer = Standard_True);
-
//! Empties previous current objects in order to get the
//! current objects detected by the selector using
//! Standard_False, the presentation of the Interactive
//! Object activates the selection mode; the object is
//! displayed but no viewer will be updated.
- Standard_EXPORT void ClearCurrents (const Standard_Boolean updateviewer = Standard_True);
+ Standard_EXPORT void ClearCurrents (const Standard_Boolean theToUpdateViewer = Standard_True);
+
+ //! @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.
+ Standard_EXPORT const TopoDS_Shape& DetectedCurrentShape() const;
+ //! @return current mouse-detected interactive object or null object, if there is no
+ //! currently detected interactives
+ Standard_EXPORT Handle(AIS_InteractiveObject) DetectedCurrentObject() const;
+
+ //! @name COMMON SELECTION METHODS VALID FOR BOTH GLOBAL AND LOCAL CONTEXT
+
+ //! Unhighlights previously selected owners and marks them as not selected.
+ //! Marks owner given as selected and highlights it.
+ Standard_EXPORT void SetSelected (const Handle(SelectMgr_EntityOwner)& theOwners,
+ const Standard_Boolean theToUpdateViewer = Standard_True);
+
//! Puts the interactive object aniObj in the list of
//! 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.
- Standard_EXPORT void SetSelected (const Handle(AIS_InteractiveObject)& aniObj, const Standard_Boolean updateviewer = Standard_True);
-
- //! puts the selected list in the current objects List.
- Standard_EXPORT void SetSelectedCurrent();
-
- //! updates the list of selected objects
- //! i.e. hilights the new selected
- //! unhilights old selected objects
- Standard_EXPORT void UpdateSelected (const Standard_Boolean updateviewer = Standard_True);
-
- //! 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.
- Standard_EXPORT void AddOrRemoveSelected (const Handle(AIS_InteractiveObject)& aniobj, const Standard_Boolean updateviewer = Standard_True);
+ Standard_EXPORT void SetSelected (const Handle(AIS_InteractiveObject)& theObject,
+ const Standard_Boolean theToUpdateViewer = Standard_True);
+
+ //! Updates the list of selected objects:
+ //! i.e. highlights the newely selected ones and unhighlights previously selected objects.
+ Standard_EXPORT void UpdateSelected (const Standard_Boolean theToUpdateViewer = Standard_True);
+ //! Allows to highlight or unhighlight the owner given depending on its selection status
+ Standard_EXPORT void AddOrRemoveSelected (const Handle(AIS_InteractiveObject)& theObject,
+ const Standard_Boolean theToUpdateViewer = Standard_True);
//! 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.
- Standard_EXPORT void HilightSelected (const Standard_Boolean updateviewer = Standard_True);
-
+ Standard_EXPORT void HilightSelected (const Standard_Boolean theToUpdateViewer = Standard_True);
//! 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.
- Standard_EXPORT void UnhilightSelected (const Standard_Boolean updateviewer = Standard_True);
-
+ Standard_EXPORT void UnhilightSelected (const Standard_Boolean theToUpdateViewer = Standard_True);
//! 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.
- Standard_EXPORT void ClearSelected (const Standard_Boolean updateviewer = Standard_True);
+ Standard_EXPORT void ClearSelected (const Standard_Boolean theToUpdateViewer = Standard_True);
//! No right to Add a selected Shape (Internal Management
//! of shape Selection).
//! A Previous selected shape may only be removed.
Standard_EXPORT void AddOrRemoveSelected (const TopoDS_Shape& aShape, const Standard_Boolean updateviewer = Standard_True);
-
- //! allows to add/remove in the selected list the entities
- //! represented by <anOwner> in the selection process.
- Standard_EXPORT void AddOrRemoveSelected (const Handle(SelectMgr_EntityOwner)& anOwner, const Standard_Boolean updateviewer = Standard_True);
-
- //! 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.
- Standard_EXPORT Standard_Boolean IsSelected (const Handle(AIS_InteractiveObject)& aniobj) const;
-
+ //! Allows to highlight or unhighlight the owner given depending on its selection status
+ Standard_EXPORT void AddOrRemoveSelected (const Handle(SelectMgr_EntityOwner)& theOwner,
+ const Standard_Boolean theToUpdateViewer = Standard_True);
- //! 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.
+ //! Returns true is the owner given is selected
+ Standard_EXPORT Standard_Boolean IsSelected (const Handle(SelectMgr_EntityOwner)& theOwner) const;
+
+ //! Returns true is the object given is selected
+ Standard_EXPORT Standard_Boolean IsSelected (const Handle(AIS_InteractiveObject)& theObj) const;
+
+ //! Returns the first selected object in the list of current selected.
+ Standard_EXPORT Handle(AIS_InteractiveObject) FirstSelectedObject();
+
+ //! Initializes a scan of the selected objects.
Standard_EXPORT void InitSelected();
-
//! 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.
Standard_EXPORT Standard_Boolean MoreSelected() const;
-
//! 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.
Standard_EXPORT void NextSelected();
-
+
Standard_EXPORT Standard_Integer NbSelected();
-
//! Returns true if the interactive context has a shape
//! selected in it which results from the decomposition of
- //! another entity in local context.
+ //! another entity.
//! If HasSelectedShape returns true, SelectedShape
//! returns the shape which has been shown to be
//! selected. Interactive returns the Interactive Object
//! If HasSelectedShape returns false, Interactive
//! returns the interactive entity selected by the click of the mouse.
Standard_EXPORT Standard_Boolean HasSelectedShape() const;
-
- //! 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.
+ //! Returns the selected shape.
Standard_EXPORT TopoDS_Shape SelectedShape() const;
-
//! Returns the owner of the selected entity resulting
- //! from the decomposition of another entity in local context.
+ //! from the decomposition of another entity.
Standard_EXPORT Handle(SelectMgr_EntityOwner) SelectedOwner() const;
-
+
//! Returns a collection containing all entity owners
//! created for the interactive object <theIObj> in
//! the selection mode theMode (in all active modes
//! if the Mode == -1)
- Standard_EXPORT void EntityOwners (Handle(SelectMgr_IndexedMapOfOwner)& theOwners, const Handle(AIS_InteractiveObject)& theIObj, const Standard_Integer theMode = -1) const;
-
- //! Returns the location of the selected Interactive Object.
- Standard_EXPORT Handle(AIS_InteractiveObject) Interactive() const;
-
+ Standard_EXPORT void EntityOwners (Handle(SelectMgr_IndexedMapOfOwner)& theOwners,
+ const Handle(AIS_InteractiveObject)& theIObj,
+ const Standard_Integer theMode = -1) const;
+
Standard_EXPORT Handle(AIS_InteractiveObject) SelectedInteractive() const;
-
//! Returns true if the applicative object has an owner
//! from Interactive attributed to it.
//! Gets next current object during iteration through mouse-detected
//! interactive objects.
Standard_EXPORT void NextDetected();
-
-
- //! @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.
- Standard_EXPORT const TopoDS_Shape& DetectedCurrentShape() const;
-
- Standard_EXPORT Handle(AIS_InteractiveObject) DetectedCurrentObject() const;
-
//! Opens local contexts and specifies how this is to be
//! done. The options listed above function in the following manner:
Standard_EXPORT void NotUseDisplayedObjects();
//! initializes the list of presentations to be displayed
- //! returns False if No Local COnte
+ //! returns False if no local context is opened.
Standard_EXPORT Standard_Boolean BeginImmediateDraw();
//! returns True if <anIObj> has been stored in the list.
//! Query objects visible or hidden in specified view due to affinity mask.
Standard_EXPORT void ObjectsForView (AIS_ListOfInteractive& theListOfIO, const Handle(V3d_View)& theView, const Standard_Boolean theIsVisibleInView, const AIS_DisplayStatus theStatus = AIS_DS_None) const;
+ //! Redraws immediate structures in all views of the viewer given taking into account its visibility.
+ Standard_EXPORT void RedrawImmediate (const Handle(V3d_Viewer)& theViewer);
+
friend class AIS_LocalContext;
//! UNKNOWN
Standard_EXPORT void redisplayPrsRecModes (const Handle(AIS_InteractiveObject)& theIObj, const Standard_Boolean theToUpdateViewer = Standard_True);
+ //! Helper function to unhighlight all entity owners currently highlighted with seleciton color.
+ void unhighlightOwners (const Handle(AIS_InteractiveObject)& theObject);
+
+ //! 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.
+ void highlightWithColor (const Handle(SelectMgr_EntityOwner)& theOwner,
+ const Quantity_NameOfColor theColor,
+ const Handle(V3d_Viewer)& theViewer = NULL);
+
+ //! 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.
+ void highlightSelected (const Handle(SelectMgr_EntityOwner)& theOwner,
+ const Quantity_NameOfColor theSelColor);
+
AIS_DataMapOfIOStatus myObjects;
Handle(SelectMgr_SelectionManager) mgrSelector;
Handle(PrsMgr_PresentationManager3d) myMainPM;
Handle(StdSelect_ViewerSelector3d) myMainSel;
TCollection_AsciiString mySelectionName;
TCollection_AsciiString myCurrentName;
- Handle(AIS_InteractiveObject) myLastPicked;
- Handle(AIS_InteractiveObject) myLastinMain;
+ Handle(SelectMgr_EntityOwner) myLastPicked;
+ Handle(SelectMgr_EntityOwner) myLastinMain;
Standard_Boolean myWasLastMain;
Standard_Boolean myCurrentTouched;
Standard_Boolean mySelectedTouched;
#include <SelectMgr_Selection.hxx>
#include <SelectMgr_SelectionManager.hxx>
#include <Standard_Transient.hxx>
+#include <StdSelect_BRepOwner.hxx>
#include <StdSelect_ViewerSelector3d.hxx>
#include <TCollection_AsciiString.hxx>
#include <TCollection_ExtendedString.hxx>
#include <V3d_Viewer.hxx>
#include <Visual3d_View.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)::DownCast (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)::DownCast (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)::DownCast (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)::DownCast (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)::DownCast (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)::DownCast (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)::DownCast (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)::DownCast (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());
}
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 :
//! This range can, however, be extended through the
//! creation of new display modes.
Standard_Integer DisplayMode() const;
-
- //! 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
- Standard_EXPORT Standard_Boolean HasSelectionMode() const;
-
- //! Returns the selection mode of the interactive object.
- Standard_EXPORT Standard_Integer SelectionMode() const;
-
- //! 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.
- Standard_EXPORT void SetSelectionMode (const Standard_Integer aMode);
-
- //! 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.
- void UnsetSelectionMode();
-
+
//! Returns the selection priority setting. -1 indicates that there is none.
//! You can modify the selection priority of an owner to
//! make one entity more selectionable than another one.
//! The TypeOfPresention3d means that the interactive object
- //! may have a presentation dependant of the view of Display
+ //! may have a presentation dependant of the view of Display.
Standard_EXPORT AIS_InteractiveObject(const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d = PrsMgr_TOP_AllView);
Standard_Real myTransparency;
TColStd_ListOfTransient myUsers;
Standard_Integer mySelPriority;
Standard_Integer myDisplayMode;
- Standard_Integer mySelectionMode;
Standard_Integer mystate;
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();
const Handle(SelectMgr_SelectableObject)& anObj = anInteractive; // to avoid ambiguity
if (mySM->Contains (anObj))
{
- 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;
}
class TCollection_AsciiString;
class AIS_InteractiveObject;
class V3d_View;
+class V3d_Viewer;
class TopoDS_Shape;
class SelectMgr_EntityOwner;
class Standard_Transient;
Standard_EXPORT Standard_Boolean ImmediateAdd (const Handle(AIS_InteractiveObject)& theObj, const Standard_Integer theMode = 0);
//! Allows rapid drawing of the view theView by avoiding an update of the whole background.
- Standard_EXPORT Standard_Boolean EndImmediateDraw (const Handle(V3d_View)& theView);
+ Standard_EXPORT Standard_Boolean EndImmediateDraw (const Handle(V3d_Viewer)& theViewer);
//! Returns true if Presentation Manager is accumulating transient list of presentations to be displayed in immediate mode.
Standard_EXPORT Standard_Boolean IsImmediateModeOn() const;
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->FindKey (mylastindex)->Unhilight (myMainPM, aHilightMode);
- myMainPM->EndImmediateDraw (theView);
+ myMainPM->EndImmediateDraw (theView->Viewer());
mylastindex = 0;
return Standard_True;
}
}
}
}
+
+//=======================================================================
+//function : GlobalSelOwner
+//purpose :
+//=======================================================================
+Handle(SelectMgr_EntityOwner) AIS_MultipleConnectedInteractive::GlobalSelOwner() const
+{
+ return myAssemblyOwner;
+}
//! may be decomposed into sub-shapes for dynamic selection.
Standard_EXPORT virtual Standard_Boolean AcceptShapeDecomposition() const Standard_OVERRIDE;
-
+ //! Returns the owner of mode for selection of object as a whole
+ Standard_EXPORT virtual Handle(SelectMgr_EntityOwner) GlobalSelOwner() const Standard_OVERRIDE;
DEFINE_STANDARD_RTTI(AIS_MultipleConnectedInteractive,AIS_InteractiveObject)
//! 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.
Standard_EXPORT virtual Standard_Boolean SetImmediateModeDrawToFront (const Graphic3d_CView& theCView, const Standard_Boolean theDrawToFrontBuffer) = 0;
-
- //! Display structure in immediate mode on top of general presentation
- Standard_EXPORT virtual void DisplayImmediateStructure (const Graphic3d_CView& theCView, const Handle(Graphic3d_Structure)& theStructure) = 0;
- //! Erases immediate structure
- Standard_EXPORT virtual void EraseImmediateStructure (const Graphic3d_CView& theCView, const Graphic3d_CStructure& theCStructure) = 0;
-
//! call_togl_layer2d
Standard_EXPORT virtual void Layer (Aspect_CLayer2d& ACLayer) = 0;
//! 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);
keepArrayData (Standard_False),
#if !defined(GL_ES_VERSION_2_0)
ffpEnable (Standard_True),
+ useSystemBuffer (Standard_False),
#else
ffpEnable (Standard_False),
+ useSystemBuffer (Standard_True),
#endif
swapInterval (1),
buffersNoSwap (Standard_False),
pntSpritesDisable = theCopy.pntSpritesDisable;
keepArrayData = theCopy.keepArrayData;
ffpEnable = theCopy.ffpEnable;
+ useSystemBuffer = theCopy.useSystemBuffer;
swapInterval = theCopy.swapInterval;
buffersNoSwap = theCopy.buffersNoSwap;
contextStereo = theCopy.contextStereo;
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)
Standard_Integer swapInterval; //!< controls swap interval - 0 for VSync off and 1 for VSync on, 1 by default
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 = myParent->TransformPersistence;
}
//! 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_IndexedMapOfStructure& 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_IndexedMapOfStructure myImmediateList; //!< list of immediate structures rendered on top of main presentation
//! Modification state
Graphic3d_WorldViewProjState myWorldViewProjState;
}
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->());
- myImmediateList.Add (aStruct);
-}
-
//=======================================================================
//function : EraseStructure
//purpose :
myZLayers.RemoveStructure (theStructure);
}
-//=======================================================================
-//function : EraseImmediateStructure
-//purpose :
-//=======================================================================
-
-void OpenGl_View::EraseImmediateStructure (const OpenGl_Structure* theStructure)
-{
- const Standard_Integer anIndex = myImmediateList.FindIndex (theStructure);
-
- if (anIndex != 0)
- {
- myImmediateList.Swap (myImmediateList.Size(), anIndex);
- myImmediateList.RemoveLast();
- }
-}
-
//=======================================================================
//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())
- {
- myUseZBuffer = Standard_False;
- glDisable (GL_DEPTH_TEST);
- }
- for (OpenGl_IndexedMapOfStructure::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, Prs3d_Presentation)
+private:
+ Standard_Integer myParentStructId;
+ Handle(Graphic3d_ViewAffinity) myParentAffinity;
+
};
DEFINE_STANDARD_HANDLE(Prs3d_PresentationShadow, Prs3d_Presentation)
// =======================================================================
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);
}
#include <Standard_Boolean.hxx>
#include <Quantity_NameOfColor.hxx>
#include <Graphic3d_NameOfMaterial.hxx>
+#include <Graphic3d_ZLayerId.hxx>
class Visual3d_ViewManager;
-class V3d_View;
+class V3d_Viewer;
class Standard_NoSuchObject;
class PrsMgr_PresentableObject;
class Prs3d_Presentation;
//! Stores thePrs in the transient list of presentations to be displayed in immediate mode.
//! Will be taken in account in EndImmediateDraw method.
Standard_EXPORT void AddToImmediateList (const Handle(Prs3d_Presentation)& thePrs);
-
- //! Allows rapid drawing of the view theView by avoiding an update of the whole background.
- Standard_EXPORT void EndImmediateDraw (const Handle(V3d_View)& theView);
-
+
+ //! Allows rapid drawing of the each view in theViewer by avoiding an update of the whole background.
+ Standard_EXPORT void EndImmediateDraw (const Handle(V3d_Viewer)& theViewer);
+
+ //! Clears and redisplays immediate structures of the viewer taking into account its affinity.
+ Standard_EXPORT void RedrawImmediate (const Handle(V3d_Viewer)& theViewer);
+
//! Returns true if Presentation Manager is accumulating transient list of presentations to be displayed in immediate mode.
- Standard_Boolean IsImmediateModeOn() const;
-
+ Standard_EXPORT Standard_Boolean IsImmediateModeOn() const;
+
//! 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.
- Standard_EXPORT void Color (const Handle(PrsMgr_PresentableObject)& thePrsObject, const Quantity_NameOfColor theColor = Quantity_NOC_YELLOW, const Standard_Integer theMode = 0, const Handle(PrsMgr_PresentableObject)& theSelObj = NULL);
-
+ Standard_EXPORT void Color (const Handle(PrsMgr_PresentableObject)& thePrsObject,
+ const Quantity_NameOfColor theColor = Quantity_NOC_YELLOW,
+ const Standard_Integer theMode = 0,
+ const Handle(PrsMgr_PresentableObject)& theSelObj = NULL,
+ const Graphic3d_ZLayerId theImmediateStructLayerId = Graphic3d_ZLayerId_Topmost);
+
//! highlights the boundbox of the presentation
Standard_EXPORT void BoundBox (const Handle(PrsMgr_PresentableObject)& thePrsObject, const Standard_Integer theMode = 0);
Handle(Visual3d_ViewManager) myStructureManager;
Standard_Integer myImmediateModeOn;
PrsMgr_ListOfPresentations myImmediateList;
- Handle(V3d_View) myImmediateView;
+ PrsMgr_ListOfPresentations myViewDependentImmediateList;
Quantity_Color mySelectionColor;
private:
-
-
-
+ //! Handles the structures from <myImmediateList> and displays it separating view-dependent structures and taking into account
+ //! structure visibility by setting proper affinity.
+ void displayImmediate (const Handle(V3d_Viewer)& theViewer);
};
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->EraseAll();
//load primitives to context
- Handle(AIS_Shape) aSh1 = new AIS_Shape(aBox);
+ Handle(AIS_InteractiveObject) aSh1 = new AIS_Shape(aBox);
anAISCtx->Display(aSh1);
- Handle(AIS_Shape) aSh2 = new AIS_Shape(aSphere);
+ Handle(AIS_InteractiveObject) aSh2 = new AIS_Shape(aSphere);
anAISCtx->Display(aSh2);
- Handle(AIS_Shape) aSh3 = new AIS_Shape(aCone);
+ Handle(AIS_InteractiveObject) aSh3 = new AIS_Shape(aCone);
anAISCtx->Display(aSh3);
- Handle(AIS_Shape) aSh4 = new AIS_Shape(aCyl);
+ Handle(AIS_InteractiveObject) aSh4 = new AIS_Shape(aCyl);
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);
BRepPrimAPI_MakeBox box2(gp_Pnt(120, 120, 120), gp_Pnt(300, 300,300));
BRepPrimAPI_MakeBox box3(gp_Pnt(320, 320, 320), gp_Pnt(500, 500,500));
- Handle(AIS_Shape) ais1 = new AIS_Shape(box1.Shape());
- Handle(AIS_Shape) ais2 = new AIS_Shape(box2.Shape());
- Handle(AIS_Shape) ais3 = new AIS_Shape(box3.Shape());
+ Handle(AIS_InteractiveObject) ais1 = new AIS_Shape(box1.Shape());
+ Handle(AIS_InteractiveObject) ais2 = new AIS_Shape(box2.Shape());
+ Handle(AIS_InteractiveObject) ais3 = new AIS_Shape(box3.Shape());
aContext->Display(ais1);
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;
BRepPrimAPI_MakeBox box2(gp_Pnt(120, 120, 120), gp_Pnt(300, 300, 300));
BRepPrimAPI_MakeBox box3(gp_Pnt(320, 320, 320), gp_Pnt(500, 500, 500));
- Handle(AIS_Shape) ais1 = new AIS_Shape(box1.Shape());
- Handle(AIS_Shape) ais2 = new AIS_Shape(box2.Shape());
- Handle(AIS_Shape) ais3 = new AIS_Shape(box3.Shape());
+ Handle(AIS_InteractiveObject) ais1 = new AIS_Shape(box1.Shape());
+ Handle(AIS_InteractiveObject) ais2 = new AIS_Shape(box2.Shape());
+ Handle(AIS_InteractiveObject) ais3 = new AIS_Shape(box3.Shape());
aContext1->Display(ais1);
aContext1->Display(ais2);
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;
BRepPrimAPI_MakeBox box2(gp_Pnt(120, 120 + deltaY, 120), gp_Pnt(300, 300 + deltaY,300));
BRepPrimAPI_MakeBox box3(gp_Pnt(320, 320 + deltaY, 320), gp_Pnt(500, 500 + deltaY,500));
- Handle(AIS_Shape) ais1 = new AIS_Shape(box1.Shape());
- Handle(AIS_Shape) ais2 = new AIS_Shape(box2.Shape());
- Handle(AIS_Shape) ais3 = new AIS_Shape(box3.Shape());
+ Handle(AIS_InteractiveObject) ais1 = new AIS_Shape(box1.Shape());
+ Handle(AIS_InteractiveObject) ais2 = new AIS_Shape(box2.Shape());
+ Handle(AIS_InteractiveObject) ais3 = new AIS_Shape(box3.Shape());
aContext->Display(ais1);
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().get() == this ?
+ Graphic3d_ZLayerId_Top : Graphic3d_ZLayerId_Topmost;
+ PM->Color(mySelectable,aColor,aMode, NULL, aLayerId);
+ }
else
mySelectable->HilightOwnerWithColor( PM, aColor, this );
}
// 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 aBnd;
}
+
+//=======================================================================
+//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;
+}
//! if they are a part of activated selection
Standard_EXPORT Bnd_Box BndBoxOfSelected (Handle(SelectMgr_IndexedMapOfOwner)& theOwners);
+ //! Returns the mode for selection of object as a whole
+ inline Standard_Integer GlobalSelectionMode() const;
+
+ //! Returns the owner of mode for selection of object as a whole
+ Standard_EXPORT virtual Handle(SelectMgr_EntityOwner) GlobalSelOwner() const;
+
friend class SelectMgr_SelectionManager;
Standard_EXPORT SelectMgr_SelectableObject(const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d = PrsMgr_TOP_AllView);
+ inline void setGlobalSelMode (const Standard_Integer theMode);
+
SelectMgr_SequenceOfSelection myselections;
Handle(Prs3d_Drawer) myDrawer;
Handle(Prs3d_Drawer) myHilightDrawer;
Standard_Boolean myAutoHilight;
Handle(Prs3d_Presentation) mySelectionPrs;
Handle(Prs3d_Presentation) myHilightPrs;
+ Standard_Integer myGlobalSelMode;
};
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().get() ?
+ 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_RelocationTable.hxx>
#include <TDF_Tool.hxx>
#include <TPrsStd_AISPresentation.hxx>
+#include <TColStd_ListOfInteger.hxx>
+#include <TColStd_ListIteratorOfListOfInteger.hxx>
#include <TPrsStd_AISViewer.hxx>
#include <TPrsStd_Driver.hxx>
#include <TPrsStd_DriverTable.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
continue;
}
}
- else if (aCtx->NbCurrents() > 0)
+ else if (aCtx->NbSelected() > 0)
{
for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
anIter.More(); anIter.Next())
{
const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
- if (!aCtx->IsCurrent (anIO))
+ if (!aCtx->IsSelected (anIO))
{
continue;
}
}
}
}
- 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())
{
Standard_Integer aSelMode = -1;
if (isSelectable == 1 || (isSelectable == -1 && aCtx->GetAutoActivateSelection()))
{
- aSelMode = aShape->HasSelectionMode() ? aShape->SelectionMode() : -1;
+ aSelMode = aShape->GlobalSelectionMode();
}
aCtx->Display (aShape, aDispMode, aSelMode,
Standard_Integer aSelMode = -1;
if (isSelectable == 1 || (isSelectable == -1 && aCtx->GetAutoActivateSelection()))
{
- 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)::DownCast (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();
// View setup
Handle(V3d_View) aView = a3DViewer->CreateView();
aView->SetWindow (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;
}
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 != 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;
}
//! structure <AStructure> displayed in <me>
//! with the type Graphic3d_TOS_COMPUTED.
Standard_EXPORT void ReCompute (const Handle(Graphic3d_Structure)& AStructure);
-
- //! Add structure to the list of immediate presentations.
- //! @return true if structure has not been registered in this view
- Standard_EXPORT Standard_Boolean DisplayImmediate (const Handle(Graphic3d_Structure)& theStructure, const Standard_Boolean theIsSingleView = Standard_True);
-
- //! Removes the structure from the list of immediate presentations.
- //! @return true if structure has been registered in view
- Standard_EXPORT Standard_Boolean EraseImmediate (const Handle(Graphic3d_Structure)& theStructure);
-
- //! Clears list of immediate presentations.
- //! @return true if list was not empty
- Standard_EXPORT Standard_Boolean ClearImmediate();
-
+
//! Returns the identification number of the view <me>.
Standard_EXPORT Standard_Integer Identification() const;
//! Returns map of objects hidden within this specific view (not viewer-wise).
Standard_EXPORT Handle(Graphic3d_NMapOfTransient)& ChangeHiddenObjects();
+ //! 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>.
+ Standard_EXPORT Standard_Boolean IsComputed (const Standard_Integer theStructId,
+ Handle(Graphic3d_Structure)& theComputedStruct) const;
+
friend class Visual3d_ViewManager;
Aspect_Background MyBackground;
Aspect_GradientBackground MyGradientBackground;
Graphic3d_MapOfStructure myStructsDisplayed;
- Graphic3d_MapOfStructure myImmediateStructures;
Graphic3d_GraduatedTrihedron myGTrihedron;
Handle(Graphic3d_Camera) myDefaultCamera;
Standard_Boolean myAutoZFitIsOn;
-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