From c3282ec17059ca78d3a85a74db5bfce2125566e2 Mon Sep 17 00:00:00 2001 From: vpa Date: Fri, 31 Jul 2015 14:38:19 +0300 Subject: [PATCH] 0026272: Visualization - provide a possibility to activate selection modes without opening local context - 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. --- .../standard/03_Viewer2d/src/Viewer2dDoc.cpp | 2 +- samples/mfc/standard/Common/User_Cylinder.cxx | 2 - src/AIS/AIS_InteractiveContext.cxx | 146 +- src/AIS/AIS_InteractiveContext.hxx | 229 ++-- src/AIS/AIS_InteractiveContext_1.cxx | 1183 ++++++++++------- src/AIS/AIS_InteractiveContext_2.cxx | 12 +- src/AIS/AIS_InteractiveObject.cxx | 13 - src/AIS/AIS_InteractiveObject.hxx | 39 +- src/AIS/AIS_InteractiveObject.lxx | 11 - src/AIS/AIS_LocalContext.cxx | 17 +- src/AIS/AIS_LocalContext.hxx | 3 +- src/AIS/AIS_LocalContext_1.cxx | 4 +- src/AIS/AIS_MultipleConnectedInteractive.cxx | 9 + src/AIS/AIS_MultipleConnectedInteractive.hxx | 3 +- src/Graphic3d/Graphic3d_GraphicDriver.hxx | 6 - src/Graphic3d/Graphic3d_ViewAffinity.hxx | 8 +- src/MeshVS/MeshVS_Mesh.cxx | 4 + src/OpenGl/OpenGl_Caps.cxx | 3 + src/OpenGl/OpenGl_Caps.hxx | 1 + src/OpenGl/OpenGl_GraphicDriver.cxx | 34 - src/OpenGl/OpenGl_GraphicDriver.hxx | 4 - src/OpenGl/OpenGl_StructureShadow.cxx | 2 + src/OpenGl/OpenGl_View.hxx | 16 +- src/OpenGl/OpenGl_View_2.cxx | 31 +- src/OpenGl/OpenGl_Workspace.cxx | 26 +- src/Prs3d/Prs3d_PresentationShadow.cxx | 4 +- src/Prs3d/Prs3d_PresentationShadow.hxx | 10 + src/PrsMgr/PrsMgr_PresentationManager.cxx | 96 +- src/PrsMgr/PrsMgr_PresentationManager.hxx | 34 +- src/QABugs/QABugs_1.cxx | 9 +- src/QABugs/QABugs_11.cxx | 27 +- src/QABugs/QABugs_17.cxx | 80 +- src/QABugs/QABugs_8.cxx | 22 +- src/SelectMgr/SelectMgr_EntityOwner.cxx | 6 +- src/SelectMgr/SelectMgr_SelectableObject.cxx | 29 +- src/SelectMgr/SelectMgr_SelectableObject.hxx | 9 + src/SelectMgr/SelectMgr_SelectableObject.lxx | 18 + src/StdSelect/StdSelect_BRepOwner.cxx | 8 +- src/TPrsStd/TPrsStd_AISPresentation.cxx | 34 +- src/V3d/V3d_Viewer_4.cxx | 18 +- src/ViewerTest/ViewerTest.cxx | 115 +- src/ViewerTest/ViewerTest_ObjectCommands.cxx | 36 +- src/ViewerTest/ViewerTest_ViewerCommands.cxx | 60 +- src/Visual3d/Visual3d_View.cxx | 92 +- src/Visual3d/Visual3d_View.hxx | 20 +- tests/bugs/vis/bug1629 | 14 +- tests/bugs/vis/bug24966 | 4 +- tests/bugs/vis/bug25528 | 2 +- 48 files changed, 1381 insertions(+), 1174 deletions(-) diff --git a/samples/mfc/standard/03_Viewer2d/src/Viewer2dDoc.cpp b/samples/mfc/standard/03_Viewer2d/src/Viewer2dDoc.cpp index d567d6e8ae..6a72e7f757 100755 --- a/samples/mfc/standard/03_Viewer2d/src/Viewer2dDoc.cpp +++ b/samples/mfc/standard/03_Viewer2d/src/Viewer2dDoc.cpp @@ -293,7 +293,7 @@ void CViewer2dDoc::OnBUTTONTestRect() 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 } diff --git a/samples/mfc/standard/Common/User_Cylinder.cxx b/samples/mfc/standard/Common/User_Cylinder.cxx index cac51bb93e..314da9a092 100755 --- a/samples/mfc/standard/Common/User_Cylinder.cxx +++ b/samples/mfc/standard/Common/User_Cylinder.cxx @@ -34,7 +34,6 @@ AIS_InteractiveObject(PrsMgr_TOP_ProjectorDependant) 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; @@ -48,7 +47,6 @@ AIS_InteractiveObject(PrsMgr_TOP_ProjectorDependant) 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; diff --git a/src/AIS/AIS_InteractiveContext.cxx b/src/AIS/AIS_InteractiveContext.cxx index f4f8977354..ffedd38c4c 100644 --- a/src/AIS/AIS_InteractiveContext.cxx +++ b/src/AIS/AIS_InteractiveContext.cxx @@ -143,6 +143,10 @@ void AIS_InteractiveContext::Delete() const { 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(); } @@ -1069,7 +1073,44 @@ Standard_Boolean AIS_InteractiveContext::IsHilighted(const Handle(AIS_Interactiv 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 @@ -1541,6 +1582,12 @@ void AIS_InteractiveContext::SetDisplayMode (const AIS_DisplayMode theMode, 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); @@ -2074,6 +2121,19 @@ void AIS_InteractiveContext::SetWidth (const Handle(AIS_InteractiveObject)& theI 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); + } + } } //======================================================================= @@ -2290,7 +2350,6 @@ void AIS_InteractiveContext::Status (const Handle(AIS_InteractiveObject)& theIOb 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"; @@ -2323,7 +2382,7 @@ void AIS_InteractiveContext::GetDefModes (const Handle(AIS_InteractiveObject)& t ? myDisplayMode : 0); theHiMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : theDispMode; - theSelMode = theIObj->HasSelectionMode() ? theIObj->SelectionMode() : -1; + theSelMode = theIObj->GlobalSelectionMode(); } //======================================================================= @@ -2365,7 +2424,7 @@ void AIS_InteractiveContext::EraseGlobal (const Handle(AIS_InteractiveObject)& t myMainPM->SetVisibility (theIObj, aDispModeIter.Value(), Standard_False); } - if (IsCurrent (theIObj) + if (IsSelected (theIObj) && !aStatus->IsDModeIn (aDispMode)) { myMainPM->SetVisibility (theIObj, aDispMode, Standard_False); @@ -2375,6 +2434,7 @@ void AIS_InteractiveContext::EraseGlobal (const Handle(AIS_InteractiveObject)& t { mgrSelector->Deactivate (theIObj, aSelModeIter.Value(), myMainSel); } + aStatus->ClearSelectionModes(); aStatus->SetGraphicStatus (AIS_DS_Erased); if (theToUpdateviewer) @@ -2383,6 +2443,31 @@ void AIS_InteractiveContext::EraseGlobal (const Handle(AIS_InteractiveObject)& t } } +//======================================================================= +//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 : @@ -2401,27 +2486,11 @@ void AIS_InteractiveContext::ClearGlobal (const Handle(AIS_InteractiveObject)& t } 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 @@ -2435,15 +2504,6 @@ void AIS_InteractiveContext::ClearGlobal (const Handle(AIS_InteractiveObject)& t } } - 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); @@ -2455,8 +2515,13 @@ void AIS_InteractiveContext::ClearGlobal (const Handle(AIS_InteractiveObject)& t 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(); } @@ -2599,25 +2664,6 @@ Standard_Boolean AIS_InteractiveContext::IsoOnPlane() const 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 diff --git a/src/AIS/AIS_InteractiveContext.hxx b/src/AIS/AIS_InteractiveContext.hxx index 28847b1e3c..f8ba7b3d41 100644 --- a/src/AIS/AIS_InteractiveContext.hxx +++ b/src/AIS/AIS_InteractiveContext.hxx @@ -94,7 +94,7 @@ DEFINE_STANDARD_HANDLE(AIS_InteractiveContext, MMgt_TShared) //! - 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 @@ -124,6 +124,14 @@ DEFINE_STANDARD_HANDLE(AIS_InteractiveContext, MMgt_TShared) //! 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 { @@ -353,17 +361,7 @@ public: //! 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 @@ -564,7 +562,12 @@ public: //! will be returned TRUE //! gives the name of the hilightcolor Standard_EXPORT Standard_Boolean IsHilighted (const Handle(AIS_InteractiveObject)& anIobj, Standard_Boolean& WithColor, Quantity_NameOfColor& theHiCol) const; - + + //! if is hilighted with a specific color, than will be set + //! to true and 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 @@ -894,7 +897,9 @@ public: //! 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 @@ -907,16 +912,12 @@ public: 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. @@ -936,10 +937,9 @@ public: //! 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 @@ -973,14 +973,6 @@ public: 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 @@ -990,8 +982,7 @@ public: //! 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 @@ -1002,7 +993,6 @@ public: //! 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 @@ -1014,118 +1004,97 @@ public: //! 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 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 @@ -1133,30 +1102,23 @@ public: //! 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 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. @@ -1222,14 +1184,6 @@ public: //! 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: @@ -1303,7 +1257,7 @@ public: 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 has been stored in the list. @@ -1582,6 +1536,9 @@ public: //! 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; @@ -1614,6 +1571,24 @@ private: //! 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 without + //! performing AutoHighlight checks, e.g. is used for dynamic highlight. + //! If the parameter is set and 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 with check + //! for AutoHighlight, e.g. is used for selection. + //! If the parameter is set and 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; @@ -1621,8 +1596,8 @@ private: 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; diff --git a/src/AIS/AIS_InteractiveContext_1.cxx b/src/AIS/AIS_InteractiveContext_1.cxx index 99928e8dea..47cc984bce 100644 --- a/src/AIS/AIS_InteractiveContext_1.cxx +++ b/src/AIS/AIS_InteractiveContext_1.cxx @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -53,6 +54,61 @@ #include #include +typedef NCollection_DataMap > 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 : @@ -113,9 +169,9 @@ AIS_StatusOfDetection AIS_InteractiveContext::MoveTo (const Standard_Integer th { // 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; } @@ -125,56 +181,62 @@ AIS_StatusOfDetection AIS_InteractiveContext::MoveTo (const Standard_Integer th // 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; } } @@ -220,7 +282,7 @@ AIS_StatusOfPick AIS_InteractiveContext::Select (const Standard_Integer theXPMi theView, toUpdateViewer); } - ClearCurrents (Standard_False); + ClearSelected (Standard_False); Handle(StdSelect_ViewerSelector3d) aSelector; @@ -233,27 +295,19 @@ AIS_StatusOfPick AIS_InteractiveContext::Select (const Standard_Integer theXPMi 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 @@ -277,7 +331,7 @@ AIS_StatusOfPick AIS_InteractiveContext::Select (const TColgp_Array1OfPnt2d& the return myLocalContexts(myCurLocalIndex)->Select (thePolyline, theView, toUpdateViewer); } - ClearCurrents (Standard_False); + ClearSelected (Standard_False); Handle(StdSelect_ViewerSelector3d) aSelector; @@ -290,27 +344,20 @@ AIS_StatusOfPick AIS_InteractiveContext::Select (const TColgp_Array1OfPnt2d& the 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 @@ -332,16 +379,17 @@ AIS_StatusOfPick AIS_InteractiveContext::Select (const Standard_Boolean toUpdate } 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(); @@ -352,16 +400,44 @@ AIS_StatusOfPick AIS_InteractiveContext::Select (const Standard_Boolean toUpdate { AIS_Selection::SetCurrentSelection (myCurrentName.ToCString()); Handle(AIS_Selection) aSelection = AIS_Selection::CurrentSelection(); - Handle(AIS_InteractiveObject) anObj; + NCollection_IndexedMap 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(); @@ -371,7 +447,7 @@ AIS_StatusOfPick AIS_InteractiveContext::Select (const Standard_Boolean toUpdate } } - Standard_Integer aSelNum = NbCurrents(); + Standard_Integer aSelNum = NbSelected(); return (aSelNum == 0) ? AIS_SOP_NothingSelected : (aSelNum == 1) ? AIS_SOP_OneSelected @@ -401,16 +477,17 @@ AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const Standard_Boolean toU } } + 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; } //======================================================================= @@ -430,7 +507,7 @@ AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const Standard_Integer the theView, toUpdateViewer); } - UnhilightCurrents (Standard_False); + UnhilightSelected (Standard_False); Handle(StdSelect_ViewerSelector3d) aSelector; if (theView->Viewer() == myMainVwr) @@ -447,18 +524,18 @@ AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const Standard_Integer the 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 @@ -479,7 +556,7 @@ AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const TColgp_Array1OfPnt2d return myLocalContexts(myCurLocalIndex)->ShiftSelect (thePolyline, theView, toUpdateViewer); } - UnhilightCurrents (Standard_False); + UnhilightSelected (Standard_False); Handle(StdSelect_ViewerSelector3d) aSelector; @@ -498,18 +575,18 @@ AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const TColgp_Array1OfPnt2d 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 @@ -518,403 +595,487 @@ AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const TColgp_Array1OfPnt2d //======================================================================= //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"<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"<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 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 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"<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()) { @@ -928,160 +1089,215 @@ void AIS_InteractiveContext::AddOrRemoveSelected(const TopoDS_Shape& aShap, 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"<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; } //======================================================================= @@ -1127,46 +1343,49 @@ void AIS_InteractiveContext::EntityOwners(Handle(SelectMgr_IndexedMapOfOwner)& t } } -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(); } //======================================================================= @@ -1194,15 +1413,14 @@ AIS_InteractiveContext::DetectedShape() const //======================================================================= //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()); } @@ -1222,12 +1440,11 @@ Standard_Boolean AIS_InteractiveContext::HasNextDetected() const //======================================================================= 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 @@ -1339,3 +1556,31 @@ Handle(AIS_InteractiveObject) AIS_InteractiveContext::DetectedCurrentObject() co 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); +} diff --git a/src/AIS/AIS_InteractiveContext_2.cxx b/src/AIS/AIS_InteractiveContext_2.cxx index 4c92373211..9b92c5feff 100644 --- a/src/AIS/AIS_InteractiveContext_2.cxx +++ b/src/AIS/AIS_InteractiveContext_2.cxx @@ -55,10 +55,12 @@ OpenLocalContext(const Standard_Boolean UseDisplayedObjects, { // 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()){ @@ -750,7 +752,7 @@ Standard_Boolean AIS_InteractiveContext::ImmediateAdd (const Handle(AIS_Interact Standard_Boolean AIS_InteractiveContext::EndImmediateDraw (const Handle(V3d_View)& theView) { return HasOpenedContext() - && myLocalContexts (myCurLocalIndex)->EndImmediateDraw (theView); + && myLocalContexts (myCurLocalIndex)->EndImmediateDraw (theView->Viewer()); } //======================================================================= @@ -772,7 +774,7 @@ Standard_Boolean AIS_InteractiveContext::EndImmediateDraw() } Handle(V3d_View) aView = myMainVwr->ActiveView(); - return myLocalContexts (myCurLocalIndex)->EndImmediateDraw (aView); + return myLocalContexts (myCurLocalIndex)->EndImmediateDraw (aView->Viewer()); } diff --git a/src/AIS/AIS_InteractiveObject.cxx b/src/AIS/AIS_InteractiveObject.cxx index 2eeea8a430..f0813107d0 100644 --- a/src/AIS/AIS_InteractiveObject.cxx +++ b/src/AIS/AIS_InteractiveObject.cxx @@ -64,7 +64,6 @@ myRecomputeEveryPrs(Standard_True), myCTXPtr(NULL), mySelPriority(-1), myDisplayMode (-1), -mySelectionMode(0), mystate(0) { Handle (AIS_InteractiveContext) Bid; @@ -197,18 +196,6 @@ void AIS_InteractiveObject::SetDisplayMode(const Standard_Integer aMode) if( AcceptDisplayMode(aMode) ) myDisplayMode = aMode; } - - -//======================================================================= -//function : -//purpose : -//======================================================================= -void AIS_InteractiveObject::SetSelectionMode(const Standard_Integer aMode) -{ - mySelectionMode = aMode; -} - - //======================================================================= //function : diff --git a/src/AIS/AIS_InteractiveObject.hxx b/src/AIS/AIS_InteractiveObject.hxx index 91af12d38f..3719cd0474 100644 --- a/src/AIS/AIS_InteractiveObject.hxx +++ b/src/AIS/AIS_InteractiveObject.hxx @@ -263,41 +263,7 @@ public: //! 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. @@ -498,7 +464,7 @@ protected: //! 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; @@ -530,7 +496,6 @@ private: TColStd_ListOfTransient myUsers; Standard_Integer mySelPriority; Standard_Integer myDisplayMode; - Standard_Integer mySelectionMode; Standard_Integer mystate; diff --git a/src/AIS/AIS_InteractiveObject.lxx b/src/AIS/AIS_InteractiveObject.lxx index 0f91cefdb4..cadc41bc0c 100644 --- a/src/AIS/AIS_InteractiveObject.lxx +++ b/src/AIS/AIS_InteractiveObject.lxx @@ -44,17 +44,6 @@ inline void AIS_InteractiveObject::UnsetDisplayMode() 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(); diff --git a/src/AIS/AIS_LocalContext.cxx b/src/AIS/AIS_LocalContext.cxx index fd34c9f7a1..a2960107b8 100644 --- a/src/AIS/AIS_LocalContext.cxx +++ b/src/AIS/AIS_LocalContext.cxx @@ -319,10 +319,10 @@ Erase(const Handle(AIS_InteractiveObject)& anInteractive) 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()); } } @@ -637,13 +637,6 @@ void AIS_LocalContext::Terminate (const Standard_Boolean theToUpdate) 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); @@ -1122,14 +1115,14 @@ Standard_Boolean AIS_LocalContext::ImmediateAdd (const Handle(AIS_InteractiveObj //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; } diff --git a/src/AIS/AIS_LocalContext.hxx b/src/AIS/AIS_LocalContext.hxx index 73c7eb5d2f..9632734eb7 100644 --- a/src/AIS/AIS_LocalContext.hxx +++ b/src/AIS/AIS_LocalContext.hxx @@ -47,6 +47,7 @@ class SelectMgr_Filter; class TCollection_AsciiString; class AIS_InteractiveObject; class V3d_View; +class V3d_Viewer; class TopoDS_Shape; class SelectMgr_EntityOwner; class Standard_Transient; @@ -329,7 +330,7 @@ public: 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; diff --git a/src/AIS/AIS_LocalContext_1.cxx b/src/AIS/AIS_LocalContext_1.cxx index 8262ddfbdb..a52a2e403b 100644 --- a/src/AIS/AIS_LocalContext_1.cxx +++ b/src/AIS/AIS_LocalContext_1.cxx @@ -482,7 +482,7 @@ void AIS_LocalContext::Hilight (const Handle(SelectMgr_EntityOwner)& theOwner, 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()); } //================================================== @@ -1397,7 +1397,7 @@ Standard_Boolean AIS_LocalContext::UnhilightLastDetected (const Handle(V3d_View) : 0; myMapOfOwner->FindKey (mylastindex)->Unhilight (myMainPM, aHilightMode); - myMainPM->EndImmediateDraw (theView); + myMainPM->EndImmediateDraw (theView->Viewer()); mylastindex = 0; return Standard_True; } diff --git a/src/AIS/AIS_MultipleConnectedInteractive.cxx b/src/AIS/AIS_MultipleConnectedInteractive.cxx index 75aad63e95..07cacceaaa 100644 --- a/src/AIS/AIS_MultipleConnectedInteractive.cxx +++ b/src/AIS/AIS_MultipleConnectedInteractive.cxx @@ -391,3 +391,12 @@ void AIS_MultipleConnectedInteractive::ComputeSelection (const Handle(SelectMgr_ } } } + +//======================================================================= +//function : GlobalSelOwner +//purpose : +//======================================================================= +Handle(SelectMgr_EntityOwner) AIS_MultipleConnectedInteractive::GlobalSelOwner() const +{ + return myAssemblyOwner; +} diff --git a/src/AIS/AIS_MultipleConnectedInteractive.hxx b/src/AIS/AIS_MultipleConnectedInteractive.hxx index 43b7cf7409..da91330ecb 100644 --- a/src/AIS/AIS_MultipleConnectedInteractive.hxx +++ b/src/AIS/AIS_MultipleConnectedInteractive.hxx @@ -96,7 +96,8 @@ public: //! 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) diff --git a/src/Graphic3d/Graphic3d_GraphicDriver.hxx b/src/Graphic3d/Graphic3d_GraphicDriver.hxx index d73b8198a7..0c47c28249 100644 --- a/src/Graphic3d/Graphic3d_GraphicDriver.hxx +++ b/src/Graphic3d/Graphic3d_GraphicDriver.hxx @@ -194,13 +194,7 @@ public: //! 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; diff --git a/src/Graphic3d/Graphic3d_ViewAffinity.hxx b/src/Graphic3d/Graphic3d_ViewAffinity.hxx index 3d0168e7d3..9de09532bd 100644 --- a/src/Graphic3d/Graphic3d_ViewAffinity.hxx +++ b/src/Graphic3d/Graphic3d_ViewAffinity.hxx @@ -28,7 +28,7 @@ public: //! Empty constructor. Graphic3d_ViewAffinity() { - ::memset (&myMask, 0xFF, sizeof(myMask)); + SetVisible (Standard_True); } //! Return visibility flag. @@ -38,6 +38,12 @@ public: 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) diff --git a/src/MeshVS/MeshVS_Mesh.cxx b/src/MeshVS/MeshVS_Mesh.cxx index c3fb1eeabc..9dd92641db 100644 --- a/src/MeshVS/MeshVS_Mesh.cxx +++ b/src/MeshVS/MeshVS_Mesh.cxx @@ -986,6 +986,8 @@ void MeshVS_Mesh::HilightSelected ( const Handle(PrsMgr_PresentationManager3d)& IsNeedToRedisplay = Standard_True; + aSelectionPrs->SetZLayer (Graphic3d_ZLayerId_Top); + if ( IsNeedToRedisplay ) { aSelectionPrs->SetDisplayPriority(9); @@ -1100,6 +1102,8 @@ void MeshVS_Mesh::HilightOwnerWithColor ( const Handle(PrsMgr_PresentationManage } } + aHilightPrs->SetZLayer (Graphic3d_ZLayerId_Topmost); + if (PM->IsImmediateModeOn()) { PM->AddToImmediateList (aHilightPrs); diff --git a/src/OpenGl/OpenGl_Caps.cxx b/src/OpenGl/OpenGl_Caps.cxx index 5e63257cf0..01a950ec77 100755 --- a/src/OpenGl/OpenGl_Caps.cxx +++ b/src/OpenGl/OpenGl_Caps.cxx @@ -28,8 +28,10 @@ OpenGl_Caps::OpenGl_Caps() 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), @@ -63,6 +65,7 @@ OpenGl_Caps& OpenGl_Caps::operator= (const OpenGl_Caps& theCopy) pntSpritesDisable = theCopy.pntSpritesDisable; keepArrayData = theCopy.keepArrayData; ffpEnable = theCopy.ffpEnable; + useSystemBuffer = theCopy.useSystemBuffer; swapInterval = theCopy.swapInterval; buffersNoSwap = theCopy.buffersNoSwap; contextStereo = theCopy.contextStereo; diff --git a/src/OpenGl/OpenGl_Caps.hxx b/src/OpenGl/OpenGl_Caps.hxx index f4ba9649c6..dc7c5bf26a 100755 --- a/src/OpenGl/OpenGl_Caps.hxx +++ b/src/OpenGl/OpenGl_Caps.hxx @@ -30,6 +30,7 @@ public: //! @name flags to disable particular functionality, should be used only 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 diff --git a/src/OpenGl/OpenGl_GraphicDriver.cxx b/src/OpenGl/OpenGl_GraphicDriver.cxx index 2321561689..f994d6b6ce 100644 --- a/src/OpenGl/OpenGl_GraphicDriver.cxx +++ b/src/OpenGl/OpenGl_GraphicDriver.cxx @@ -413,40 +413,6 @@ Standard_Boolean OpenGl_GraphicDriver::SetImmediateModeDrawToFront (const Graphi 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 : diff --git a/src/OpenGl/OpenGl_GraphicDriver.hxx b/src/OpenGl/OpenGl_GraphicDriver.hxx index 1269a39e96..c9944afe15 100644 --- a/src/OpenGl/OpenGl_GraphicDriver.hxx +++ b/src/OpenGl/OpenGl_GraphicDriver.hxx @@ -131,10 +131,6 @@ public: // Methods for graphical structures 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: diff --git a/src/OpenGl/OpenGl_StructureShadow.cxx b/src/OpenGl/OpenGl_StructureShadow.cxx index 3b56b0ac8f..5e5ed8f3d7 100644 --- a/src/OpenGl/OpenGl_StructureShadow.cxx +++ b/src/OpenGl/OpenGl_StructureShadow.cxx @@ -40,5 +40,7 @@ OpenGl_StructureShadow::OpenGl_StructureShadow (const Handle(Graphic3d_Structure } } + UpdateTransformation(); + myInstancedStructure = const_cast (myParent->InstancedStructure()); TransformPersistence = myParent->TransformPersistence; } diff --git a/src/OpenGl/OpenGl_View.hxx b/src/OpenGl/OpenGl_View.hxx index af8c704c8b..ceb9cc56ac 100644 --- a/src/OpenGl/OpenGl_View.hxx +++ b/src/OpenGl/OpenGl_View.hxx @@ -128,12 +128,6 @@ class OpenGl_View : public MMgt_TShared //! 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 void AddZLayer (const Graphic3d_ZLayerId theLayerId); @@ -192,17 +186,10 @@ class OpenGl_View : public MMgt_TShared //! 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: @@ -260,7 +247,6 @@ 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; diff --git a/src/OpenGl/OpenGl_View_2.cxx b/src/OpenGl/OpenGl_View_2.cxx index 088b928e64..0fedacbe49 100644 --- a/src/OpenGl/OpenGl_View_2.cxx +++ b/src/OpenGl/OpenGl_View_2.cxx @@ -552,7 +552,9 @@ void OpenGl_View::RenderStructs (const Handle(OpenGl_Workspace)& theWorkspace, } 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) { @@ -895,17 +897,6 @@ void OpenGl_View::DisplayStructure (const Handle(Graphic3d_Structure)& theStruct myZLayers.AddStructure (aStruct, aZLayer, thePriority); } -//======================================================================= -//function : DisplayImmediateStructure -//purpose : -//======================================================================= - -void OpenGl_View::DisplayImmediateStructure (const Handle(Graphic3d_Structure)& theStructure) -{ - const OpenGl_Structure* aStruct = reinterpret_cast (theStructure->CStructure().operator->()); - myImmediateList.Add (aStruct); -} - //======================================================================= //function : EraseStructure //purpose : @@ -916,22 +907,6 @@ void OpenGl_View::EraseStructure (const Handle(Graphic3d_Structure)& theStructur 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 : diff --git a/src/OpenGl/OpenGl_Workspace.cxx b/src/OpenGl/OpenGl_Workspace.cxx index b26a554254..9a89cf98a8 100644 --- a/src/OpenGl/OpenGl_Workspace.cxx +++ b/src/OpenGl/OpenGl_Workspace.cxx @@ -761,7 +761,7 @@ bool OpenGl_Workspace::blitBuffers (OpenGl_FrameBuffer* theReadFbo, OpenGl_FrameBuffer* theDrawFbo, const Standard_Boolean theToFlip) { - if (theReadFbo == NULL) + if (theReadFbo == NULL || myGlContext->IsFeedback()) { return false; } @@ -1056,8 +1056,7 @@ void OpenGl_Workspace::Redraw (const Graphic3d_CView& theCView, { myMainSceneFbos[0]->Init (myGlContext, aSizeX, aSizeY); } - if (myToFlipOutput - && myMainSceneFbos[0]->IsValid()) + if (!myGlContext->caps->useSystemBuffer && myMainSceneFbos[0]->IsValid()) { myImmediateSceneFbos[0]->InitLazy (myGlContext, aSizeX, aSizeY); } @@ -1168,8 +1167,7 @@ void OpenGl_Workspace::Redraw (const Graphic3d_CView& theCView, { 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->(); } @@ -1482,8 +1480,7 @@ void OpenGl_Workspace::RedrawImmediate (const Graphic3d_CView& theCView, { 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->(); } @@ -1586,21 +1583,6 @@ bool OpenGl_Workspace::redrawImmediate (const Graphic3d_CView& theCView, 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; } diff --git a/src/Prs3d/Prs3d_PresentationShadow.cxx b/src/Prs3d/Prs3d_PresentationShadow.cxx index 926d1c9d65..51c8c51cd0 100644 --- a/src/Prs3d/Prs3d_PresentationShadow.cxx +++ b/src/Prs3d/Prs3d_PresentationShadow.cxx @@ -22,7 +22,9 @@ //======================================================================= 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) { // } diff --git a/src/Prs3d/Prs3d_PresentationShadow.hxx b/src/Prs3d/Prs3d_PresentationShadow.hxx index dd060f78e0..6bbb7f9d2e 100644 --- a/src/Prs3d/Prs3d_PresentationShadow.hxx +++ b/src/Prs3d/Prs3d_PresentationShadow.hxx @@ -28,10 +28,20 @@ public: 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) diff --git a/src/PrsMgr/PrsMgr_PresentationManager.cxx b/src/PrsMgr/PrsMgr_PresentationManager.cxx index b80340975a..0dfe946978 100644 --- a/src/PrsMgr/PrsMgr_PresentationManager.cxx +++ b/src/PrsMgr/PrsMgr_PresentationManager.cxx @@ -324,40 +324,108 @@ void PrsMgr_PresentationManager::BeginImmediateDraw() // ======================================================================= 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); } // ======================================================================= @@ -526,11 +594,12 @@ void PrsMgr_PresentationManager::Transform (const Handle(PrsMgr_PresentableObjec 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()) { @@ -546,6 +615,9 @@ void PrsMgr_PresentationManager::Color (const Handle(PrsMgr_PresentableObject)& 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); } diff --git a/src/PrsMgr/PrsMgr_PresentationManager.hxx b/src/PrsMgr/PrsMgr_PresentationManager.hxx index cd498af1ec..92937405b7 100644 --- a/src/PrsMgr/PrsMgr_PresentationManager.hxx +++ b/src/PrsMgr/PrsMgr_PresentationManager.hxx @@ -27,8 +27,9 @@ #include #include #include +#include class Visual3d_ViewManager; -class V3d_View; +class V3d_Viewer; class Standard_NoSuchObject; class PrsMgr_PresentableObject; class Prs3d_Presentation; @@ -116,18 +117,25 @@ public: //! 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); @@ -170,15 +178,15 @@ protected: 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 and displays it separating view-dependent structures and taking into account + //! structure visibility by setting proper affinity. + void displayImmediate (const Handle(V3d_Viewer)& theViewer); }; diff --git a/src/QABugs/QABugs_1.cxx b/src/QABugs/QABugs_1.cxx index c5644ca91a..edc7cd4ee5 100644 --- a/src/QABugs/QABugs_1.cxx +++ b/src/QABugs/QABugs_1.cxx @@ -417,13 +417,14 @@ static Standard_Integer OCC74bug_set (Draw_Interpretor& di, Standard_Integer arg 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; @@ -456,8 +457,10 @@ static Standard_Integer OCC74bug_get (Draw_Interpretor& di, Standard_Integer arg 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; diff --git a/src/QABugs/QABugs_11.cxx b/src/QABugs/QABugs_11.cxx index 6d0d620fc5..043c57c369 100644 --- a/src/QABugs/QABugs_11.cxx +++ b/src/QABugs/QABugs_11.cxx @@ -218,24 +218,24 @@ static Standard_Integer OCC136 (Draw_Interpretor& di, Standard_Integer argc, con 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); @@ -739,12 +739,13 @@ static Standard_Integer OCC166 (Draw_Interpretor& di, Standard_Integer /*argc*/, 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; @@ -5258,7 +5259,7 @@ Standard_Integer CR23234 (Draw_Interpretor& di, Standard_Integer argc, const cha 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); diff --git a/src/QABugs/QABugs_17.cxx b/src/QABugs/QABugs_17.cxx index 44dd476a33..ceae557362 100644 --- a/src/QABugs/QABugs_17.cxx +++ b/src/QABugs/QABugs_17.cxx @@ -391,29 +391,29 @@ static Standard_Integer OCC138 (Draw_Interpretor& di, Standard_Integer /*argc*/ 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; @@ -683,9 +683,9 @@ static Standard_Integer OCC189 (Draw_Interpretor& di, Standard_Integer /*argc*/ 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); @@ -695,51 +695,51 @@ static Standard_Integer OCC189 (Draw_Interpretor& di, Standard_Integer /*argc*/ 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; } diff --git a/src/QABugs/QABugs_8.cxx b/src/QABugs/QABugs_8.cxx index bdc82ef8bc..f3dfa55551 100644 --- a/src/QABugs/QABugs_8.cxx +++ b/src/QABugs/QABugs_8.cxx @@ -67,7 +67,7 @@ static Standard_Integer OCC172 (Draw_Interpretor& di, Standard_Integer /*argc*/ AIS_ListIteratorOfListOfInteractive It; for (It.Initialize(aListOfIO);It.More();It.Next()) { - aContext->AddOrRemoveCurrentObject(It.Value()); + aContext->AddOrRemoveSelected(It.Value()); } return 0; @@ -96,29 +96,29 @@ static Standard_Integer OCC204 (Draw_Interpretor& di, Standard_Integer argc, co 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; diff --git a/src/SelectMgr/SelectMgr_EntityOwner.cxx b/src/SelectMgr/SelectMgr_EntityOwner.cxx index e05575e6fa..e5eb50882d 100644 --- a/src/SelectMgr/SelectMgr_EntityOwner.cxx +++ b/src/SelectMgr/SelectMgr_EntityOwner.cxx @@ -90,7 +90,11 @@ void SelectMgr_EntityOwner::HilightWithColor(const Handle(PrsMgr_PresentationMan { 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 ); } diff --git a/src/SelectMgr/SelectMgr_SelectableObject.cxx b/src/SelectMgr/SelectMgr_SelectableObject.cxx index 7a64cbb362..9c3fe8c770 100644 --- a/src/SelectMgr/SelectMgr_SelectableObject.cxx +++ b/src/SelectMgr/SelectMgr_SelectableObject.cxx @@ -55,12 +55,13 @@ static Standard_Integer Search (const SelectMgr_SequenceOfSelection& seq, // 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); @@ -634,3 +635,25 @@ Bnd_Box SelectMgr_SelectableObject::BndBoxOfSelected (Handle(SelectMgr_IndexedMa 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; +} diff --git a/src/SelectMgr/SelectMgr_SelectableObject.hxx b/src/SelectMgr/SelectMgr_SelectableObject.hxx index 2db987ab0d..dcaa90cf81 100644 --- a/src/SelectMgr/SelectMgr_SelectableObject.hxx +++ b/src/SelectMgr/SelectMgr_SelectableObject.hxx @@ -189,6 +189,12 @@ public: //! 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; @@ -200,6 +206,8 @@ protected: 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; @@ -213,6 +221,7 @@ private: Standard_Boolean myAutoHilight; Handle(Prs3d_Presentation) mySelectionPrs; Handle(Prs3d_Presentation) myHilightPrs; + Standard_Integer myGlobalSelMode; }; diff --git a/src/SelectMgr/SelectMgr_SelectableObject.lxx b/src/SelectMgr/SelectMgr_SelectableObject.lxx index 31ddd4a8ea..214dbbe7ff 100644 --- a/src/SelectMgr/SelectMgr_SelectableObject.lxx +++ b/src/SelectMgr/SelectMgr_SelectableObject.lxx @@ -32,3 +32,21 @@ Attributes() const 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; +} diff --git a/src/StdSelect/StdSelect_BRepOwner.cxx b/src/StdSelect/StdSelect_BRepOwner.cxx index 102eeba170..b3f9398294 100644 --- a/src/StdSelect/StdSelect_BRepOwner.cxx +++ b/src/StdSelect/StdSelect_BRepOwner.cxx @@ -134,6 +134,8 @@ void StdSelect_BRepOwner::HilightWithColor(const Handle(PrsMgr_PresentationManag 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) { @@ -175,17 +177,17 @@ void StdSelect_BRepOwner::HilightWithColor(const Handle(PrsMgr_PresentationManag } // 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); } } } diff --git a/src/TPrsStd/TPrsStd_AISPresentation.cxx b/src/TPrsStd/TPrsStd_AISPresentation.cxx index fbe0d09601..fd52b85011 100644 --- a/src/TPrsStd/TPrsStd_AISPresentation.cxx +++ b/src/TPrsStd/TPrsStd_AISPresentation.cxx @@ -33,6 +33,8 @@ #include #include #include +#include +#include #include #include #include @@ -576,17 +578,12 @@ void TPrsStd_AISPresentation::SetSelectionMode(const Standard_Integer theSelecti { // 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); - } } //======================================================================= @@ -596,15 +593,12 @@ void TPrsStd_AISPresentation::SetSelectionMode(const Standard_Integer theSelecti 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(); } //======================================================================= @@ -921,9 +915,25 @@ void TPrsStd_AISPresentation::AISUpdate () } - 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); } } diff --git a/src/V3d/V3d_Viewer_4.cxx b/src/V3d/V3d_Viewer_4.cxx index ebf9d41a7f..2bbafa3ef2 100644 --- a/src/V3d/V3d_Viewer_4.cxx +++ b/src/V3d/V3d_Viewer_4.cxx @@ -100,7 +100,7 @@ void V3d_Viewer::DeactivateGrid() if (myGridEcho && !myGridEchoStructure.IsNull()) { - ActiveView()->View()->EraseImmediate (myGridEchoStructure); + myGridEchoStructure->Erase(); } } Update(); @@ -256,10 +256,7 @@ void V3d_Viewer::SetGridEcho (const Standard_Boolean theToShowGrid) return; } - for (InitActiveViews(); MoreActiveViews(); NextActiveViews()) - { - ActiveView()->View()->EraseImmediate (myGridEchoStructure); - } + myGridEchoStructure->Erase(); } // ======================================================================= @@ -323,7 +320,12 @@ void V3d_Viewer::ShowGridEcho (const Handle(V3d_View)& theView, 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(); } // ======================================================================= @@ -338,5 +340,7 @@ void V3d_Viewer::HideGridEcho (const Handle(V3d_View)& theView) } 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(); } diff --git a/src/ViewerTest/ViewerTest.cxx b/src/ViewerTest/ViewerTest.cxx index 1607d0c75e..51325abcb9 100644 --- a/src/ViewerTest/ViewerTest.cxx +++ b/src/ViewerTest/ViewerTest.cxx @@ -496,14 +496,14 @@ void ViewerTest::StandardModeActivation(const Standard_Integer mode ) 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 @@ -1078,18 +1078,13 @@ static int VDispMode (Draw_Interpretor& , Standard_Integer argc, const char** ar //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{ @@ -1104,20 +1099,20 @@ static int VDispMode (Draw_Interpretor& , Standard_Integer argc, const char** ar } 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{ @@ -1142,30 +1137,22 @@ static int VSubInt(Draw_Interpretor& di, Standard_Integer argc, const char** arg 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 "<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 { @@ -1220,11 +1207,11 @@ public: mySource = IterSource_List; mySeqIter = NCollection_Sequence::Iterator (mySeq); } - else if (aCtx->NbCurrents() > 0) + else if (aCtx->NbSelected() > 0) { mySource = IterSource_Selected; mySelIter = aCtx; - mySelIter->InitCurrent(); + mySelIter->InitSelected(); } else { @@ -1256,7 +1243,7 @@ public: { 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; } @@ -1281,7 +1268,7 @@ public: } case IterSource_Selected: { - mySelIter->NextCurrent(); + mySelIter->NextSelected(); break; } } @@ -1321,10 +1308,10 @@ private: } 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; } @@ -2363,14 +2350,14 @@ static int VDonly2 (Draw_Interpretor& , 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 @@ -2512,13 +2499,13 @@ int VRemove (Draw_Interpretor& theDI, 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; } @@ -2645,7 +2632,7 @@ int VErase (Draw_Interpretor& theDI, } } } - else if (!toEraseAll && aCtx->NbCurrents() > 0) + else if (!toEraseAll && aCtx->NbSelected() > 0) { // Erase selected objects for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS()); @@ -2653,7 +2640,7 @@ int VErase (Draw_Interpretor& theDI, { 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) @@ -2903,12 +2890,12 @@ int VBounding (Draw_Interpretor& theDI, 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()) { @@ -3537,7 +3524,7 @@ static int VDisplay2 (Draw_Interpretor& theDI, 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, @@ -3588,7 +3575,7 @@ static int VDisplay2 (Draw_Interpretor& theDI, 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) @@ -3990,11 +3977,11 @@ static int VActivatedMode (Draw_Interpretor& di, Standard_Integer argc, const ch // 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() ); } } @@ -4042,7 +4029,7 @@ static int VActivatedMode (Draw_Interpretor& di, Standard_Integer argc, const ch 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) ) { @@ -4373,12 +4360,12 @@ static Standard_Integer VState (Draw_Interpretor& theDI, 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 << " "; @@ -5275,7 +5262,7 @@ static Standard_Integer VLoadSelection (Draw_Interpretor& /*theDi*/, } aCtx->Load (aShape, -1, Standard_False); - aCtx->Activate (aShape, aShape->SelectionMode(), Standard_True); + aCtx->Activate (aShape, aShape->GlobalSelectionMode(), Standard_True); } } diff --git a/src/ViewerTest/ViewerTest_ObjectCommands.cxx b/src/ViewerTest/ViewerTest_ObjectCommands.cxx index 62edac76cc..55b7d0cce2 100644 --- a/src/ViewerTest/ViewerTest_ObjectCommands.cxx +++ b/src/ViewerTest/ViewerTest_ObjectCommands.cxx @@ -318,7 +318,7 @@ static int VSize (Draw_Interpretor& di, Standard_Integer argc, const char** argv 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;} @@ -337,7 +337,7 @@ static int VSize (Draw_Interpretor& di, Standard_Integer argc, const char** argv 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 @@ -493,7 +493,7 @@ static int VPlaneTrihedron (Draw_Interpretor& di, Standard_Integer argc, const c 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)); @@ -4177,16 +4177,21 @@ static Standard_Integer VSetSelectionMode (Draw_Interpretor& /*di*/, } // 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); } @@ -4206,8 +4211,8 @@ static Standard_Integer VSetSelectionMode (Draw_Interpretor& /*di*/, } } - 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(); @@ -4220,6 +4225,12 @@ static Standard_Integer VSetSelectionMode (Draw_Interpretor& /*di*/, 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); @@ -4241,7 +4252,7 @@ static Standard_Integer VSetSelectionMode (Draw_Interpretor& /*di*/, if (aSelectionMode != 0 && toTurnOn) // Turn on specified mode { - if (!anAISContext->HasOpenedContext()) + if (!anAISContext->HasOpenedContext() && isToOpenLocalCtx) { anAISContext->OpenLocalContext (Standard_False); } @@ -4249,6 +4260,10 @@ static Standard_Integer VSetSelectionMode (Draw_Interpretor& /*di*/, 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); @@ -4259,11 +4274,6 @@ static Standard_Integer VSetSelectionMode (Draw_Interpretor& /*di*/, 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(); diff --git a/src/ViewerTest/ViewerTest_ViewerCommands.cxx b/src/ViewerTest/ViewerTest_ViewerCommands.cxx index a3ebb4b983..d59a5e53ec 100644 --- a/src/ViewerTest/ViewerTest_ViewerCommands.cxx +++ b/src/ViewerTest/ViewerTest_ViewerCommands.cxx @@ -688,6 +688,7 @@ TCollection_AsciiString ViewerTest::ViewerInit (const Standard_Integer thePxLeft // 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); @@ -1378,7 +1379,7 @@ void VT_ProcessKeyPress (const char* buf_ret) 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); @@ -1397,9 +1398,9 @@ void VT_ProcessKeyPress (const char* buf_ret) } 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) @@ -1418,18 +1419,11 @@ void VT_ProcessKeyPress (const char* buf_ret) 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(); } } @@ -1439,18 +1433,11 @@ void VT_ProcessKeyPress (const char* buf_ret) 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(); } @@ -1479,18 +1466,11 @@ void VT_ProcessKeyPress (const char* buf_ret) { 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(); } } @@ -1542,7 +1522,6 @@ void VT_ProcessKeyPress (const char* buf_ret) { Handle(AIS_InteractiveContext) aCtx = ViewerTest::GetAISContext(); if (!aCtx.IsNull() - && aCtx->NbCurrents() > 0 && aCtx->NbSelected() > 0) { Draw_Interprete ("verase"); @@ -3395,11 +3374,11 @@ static int VExport(Draw_Interpretor& di, Standard_Integer argc, const char** arg { 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 { @@ -6242,14 +6221,7 @@ static Standard_Integer VChangeSelected (Draw_Interpretor& di, return 1; } - if(aContext->HasOpenedContext()) - { - aContext->AddOrRemoveSelected(anAISObject); - } - else - { - aContext->AddOrRemoveCurrentObject(anAISObject); - } + aContext->AddOrRemoveSelected(anAISObject); } return 0; } diff --git a/src/Visual3d/Visual3d_View.cxx b/src/Visual3d/Visual3d_View.cxx index f2f4a568c1..d3366dc5bc 100644 --- a/src/Visual3d/Visual3d_View.cxx +++ b/src/Visual3d/Visual3d_View.cxx @@ -973,7 +973,6 @@ void Visual3d_View::Redraw (const Handle(Visual3d_Layer)& theUnderLayer, if (myGraphicDriver->IsDeviceLost()) { myViewManager->RecomputeStructures(); - myViewManager->RecomputeStructures (myImmediateStructures); myGraphicDriver->ResetDeviceLostFlag(); } @@ -1239,69 +1238,6 @@ void Visual3d_View::Disconnect (const Handle(Graphic3d_Structure)& theMother, } } -// ======================================================================== -// 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 : @@ -1517,7 +1453,6 @@ void Visual3d_View::Erase (const Handle(Graphic3d_Structure)& theStruct, const Aspect_TypeOfUpdate theUpdateMode) { if ( IsDeleted() - || EraseImmediate (theStruct) || !IsDisplayed (theStruct)) { return; @@ -1557,11 +1492,34 @@ void Visual3d_View::Highlight (const Handle(Graphic3d_Structure)& theStruct, 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 : @@ -1681,8 +1639,6 @@ Standard_Boolean Visual3d_View::ContainsFacet (const Graphic3d_MapOfStructure& t 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; } diff --git a/src/Visual3d/Visual3d_View.hxx b/src/Visual3d/Visual3d_View.hxx index f1f356ea00..aa50d5ab8c 100644 --- a/src/Visual3d/Visual3d_View.hxx +++ b/src/Visual3d/Visual3d_View.hxx @@ -433,19 +433,7 @@ public: //! structure displayed in //! 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 . Standard_EXPORT Standard_Integer Identification() const; @@ -530,6 +518,11 @@ public: //! 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 is + //! in list of structures to be computed and stores computed struct to . + Standard_EXPORT Standard_Boolean IsComputed (const Standard_Integer theStructId, + Handle(Graphic3d_Structure)& theComputedStruct) const; + friend class Visual3d_ViewManager; @@ -642,7 +635,6 @@ private: Aspect_Background MyBackground; Aspect_GradientBackground MyGradientBackground; Graphic3d_MapOfStructure myStructsDisplayed; - Graphic3d_MapOfStructure myImmediateStructures; Graphic3d_GraduatedTrihedron myGTrihedron; Handle(Graphic3d_Camera) myDefaultCamera; Standard_Boolean myAutoZFitIsOn; diff --git a/tests/bugs/vis/bug1629 b/tests/bugs/vis/bug1629 index 34e85fd695..95520b7df8 100755 --- a/tests/bugs/vis/bug1629 +++ b/tests/bugs/vis/bug1629 @@ -1,5 +1,3 @@ -puts "TODO OCC11111 ALL: Error : Colors are not equal in default coordinate and in the near coordinates too" - puts "================" puts "OCC1629" puts "OCC2707" @@ -37,7 +35,7 @@ set Selection_G 0.8 set Selection_B 0.8 #QASetChoiceMode EDGE ON -vselmode 2 1 +vselmode 2 1 -local set BeforeNbSelected [vnbselected] @@ -84,11 +82,11 @@ puts "" 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)" diff --git a/tests/bugs/vis/bug24966 b/tests/bugs/vis/bug24966 index ead507db0d..786db06438 100644 --- a/tests/bugs/vis/bug24966 +++ b/tests/bugs/vis/bug24966 @@ -18,8 +18,8 @@ vertex p2 150 300 0 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 diff --git a/tests/bugs/vis/bug25528 b/tests/bugs/vis/bug25528 index d02560bb71..e27e07f820 100644 --- a/tests/bugs/vis/bug25528 +++ b/tests/bugs/vis/bug25528 @@ -15,7 +15,7 @@ vdisplay b 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 -- 2.20.1