mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-09 13:22:24 +03:00
0027530: Visualization - AIS_InteractiveContext::HilightNextDetected() doesn't work in Neutral Point
- added implementation of mentioned methods for neutral point; - sequence of detected objects was replaced by sequence of detected owner's indexes in AIS_InteractiveContext; - commands vselnext and vselprev were corrected to update viewer properly; - test case for issue #27530.
This commit is contained in:
@@ -92,7 +92,8 @@ myPreselectionColor(Quantity_NOC_GREEN),
|
||||
mySubintStyle(new Graphic3d_HighlightStyle (Aspect_TOHM_COLOR, Quantity_NOC_GRAY40)),
|
||||
myDisplayMode(0),
|
||||
myCurLocalIndex(0),
|
||||
myAISCurDetected(0),
|
||||
myCurDetected(0),
|
||||
myCurHighlighted(0),
|
||||
myZDetectionFlag(0),
|
||||
myIsAutoActivateSelMode(Standard_True)
|
||||
{
|
||||
@@ -2354,13 +2355,13 @@ void AIS_InteractiveContext::ClearGlobal (const Handle(AIS_InteractiveObject)& t
|
||||
myMainPM->Erase (theIObj, -1);
|
||||
|
||||
// Object removes from Detected sequence
|
||||
for(Standard_Integer aDetIter = 1; aDetIter < myAISDetectedSeq.Length(); ++aDetIter)
|
||||
for (Standard_Integer aDetIter = myDetectedSeq.Lower(); aDetIter <= myDetectedSeq.Upper(); ++aDetIter)
|
||||
{
|
||||
Handle(AIS_InteractiveObject) anObj = DetectedCurrentObject();
|
||||
if (!anObj.IsNull()
|
||||
&& anObj != theIObj)
|
||||
{
|
||||
myAISDetectedSeq.Remove (aDetIter);
|
||||
myDetectedSeq.Remove (aDetIter);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -29,7 +29,6 @@
|
||||
#include <Quantity_NameOfColor.hxx>
|
||||
#include <Standard_Integer.hxx>
|
||||
#include <AIS_DataMapOfILC.hxx>
|
||||
#include <AIS_SequenceOfInteractive.hxx>
|
||||
#include <AIS_DisplayStatus.hxx>
|
||||
#include <AIS_KindOfInteractive.hxx>
|
||||
#include <Standard_Real.hxx>
|
||||
@@ -1716,8 +1715,9 @@ protected:
|
||||
AIS_DataMapOfILC myLocalContexts;
|
||||
Standard_Integer myCurLocalIndex;
|
||||
Handle(V3d_View) mylastmoveview;
|
||||
AIS_SequenceOfInteractive myAISDetectedSeq;
|
||||
Standard_Integer myAISCurDetected;
|
||||
TColStd_SequenceOfInteger myDetectedSeq;
|
||||
Standard_Integer myCurDetected;
|
||||
Standard_Integer myCurHighlighted;
|
||||
Standard_Boolean myZDetectionFlag;
|
||||
Standard_Boolean myIsAutoActivateSelMode;
|
||||
|
||||
|
@@ -307,8 +307,9 @@ AIS_StatusOfDetection AIS_InteractiveContext::MoveTo (const Standard_Integer th
|
||||
return myLocalContexts (myCurLocalIndex)->MoveTo (theXPix, theYPix, theView, theToRedrawOnUpdate);
|
||||
}
|
||||
|
||||
myAISCurDetected = 0;
|
||||
myAISDetectedSeq.Clear();
|
||||
myCurDetected = 0;
|
||||
myCurHighlighted = 0;
|
||||
myDetectedSeq.Clear();
|
||||
|
||||
if (theView->Viewer() != myMainVwr)
|
||||
{
|
||||
@@ -341,15 +342,14 @@ AIS_StatusOfDetection AIS_InteractiveContext::MoveTo (const Standard_Integer th
|
||||
{
|
||||
aNewDetected = aDetIter;
|
||||
}
|
||||
Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
|
||||
if (!anObj.IsNull())
|
||||
{
|
||||
myAISDetectedSeq.Append (anObj);
|
||||
}
|
||||
|
||||
myDetectedSeq.Append (aDetIter);
|
||||
}
|
||||
|
||||
if (aNewDetected >= 1)
|
||||
{
|
||||
myCurHighlighted = myDetectedSeq.Lower();
|
||||
|
||||
// Does nothing if previously detected object is equal to the current one.
|
||||
// However in advanced selection modes the owners comparison
|
||||
// is not effective because in that case only one owner manage the
|
||||
@@ -1518,14 +1518,18 @@ Handle(AIS_InteractiveObject) AIS_InteractiveContext::DetectedInteractive() cons
|
||||
return Handle(AIS_InteractiveObject)::DownCast (myLastPicked->Selectable());
|
||||
}
|
||||
|
||||
|
||||
//=======================================================================
|
||||
//function : HasNextDetected
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Standard_Boolean AIS_InteractiveContext::HasNextDetected() const
|
||||
{
|
||||
if(!HasOpenedContext())
|
||||
return Standard_False; // temporaire
|
||||
else
|
||||
if (HasOpenedContext())
|
||||
{
|
||||
return myLocalContexts(myCurLocalIndex)->HasNextDetected();
|
||||
|
||||
}
|
||||
|
||||
return !myDetectedSeq.IsEmpty() && myCurHighlighted <= myDetectedSeq.Upper();
|
||||
}
|
||||
|
||||
|
||||
@@ -1548,23 +1552,79 @@ Handle(SelectMgr_EntityOwner) AIS_InteractiveContext::DetectedOwner() const
|
||||
Standard_Integer AIS_InteractiveContext::HilightNextDetected (const Handle(V3d_View)& theView,
|
||||
const Standard_Boolean theToRedrawImmediate)
|
||||
{
|
||||
return HasOpenedContext()
|
||||
? myLocalContexts (myCurLocalIndex)->HilightNextDetected (theView, theToRedrawImmediate)
|
||||
: 0;
|
||||
|
||||
if (HasOpenedContext())
|
||||
{
|
||||
return myLocalContexts (myCurLocalIndex)->HilightNextDetected (theView, theToRedrawImmediate);
|
||||
}
|
||||
|
||||
myMainPM->ClearImmediateDraw();
|
||||
if (myDetectedSeq.IsEmpty())
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (++myCurHighlighted > myDetectedSeq.Upper())
|
||||
{
|
||||
myCurHighlighted = myDetectedSeq.Lower();
|
||||
}
|
||||
const Handle(SelectMgr_EntityOwner)& anOwner = myMainSel->Picked (myDetectedSeq (myCurHighlighted));
|
||||
if (anOwner.IsNull())
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
highlightWithColor (anOwner, theView->Viewer());
|
||||
myLastPicked = anOwner;
|
||||
myLastinMain = myLastPicked;
|
||||
|
||||
if (theToRedrawImmediate)
|
||||
{
|
||||
myMainPM->RedrawImmediate (theView->Viewer());
|
||||
myMainVwr->RedrawImmediate();
|
||||
}
|
||||
|
||||
return myCurHighlighted;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : HilightNextDetected
|
||||
//function : HilightPreviousDetected
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Standard_Integer AIS_InteractiveContext::HilightPreviousDetected (const Handle(V3d_View)& theView,
|
||||
const Standard_Boolean theToRedrawImmediate)
|
||||
{
|
||||
return HasOpenedContext()
|
||||
? myLocalContexts (myCurLocalIndex)->HilightPreviousDetected (theView, theToRedrawImmediate)
|
||||
: 0;
|
||||
|
||||
if (HasOpenedContext())
|
||||
{
|
||||
return myLocalContexts (myCurLocalIndex)->HilightPreviousDetected (theView, theToRedrawImmediate);
|
||||
}
|
||||
|
||||
myMainPM->ClearImmediateDraw();
|
||||
if (myDetectedSeq.IsEmpty())
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (--myCurHighlighted < myDetectedSeq.Lower())
|
||||
{
|
||||
myCurHighlighted = myDetectedSeq.Upper();
|
||||
}
|
||||
const Handle(SelectMgr_EntityOwner)& anOwner = myMainSel->Picked (myDetectedSeq (myCurHighlighted));
|
||||
if (anOwner.IsNull())
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
highlightWithColor (anOwner, theView->Viewer());
|
||||
myLastPicked = anOwner;
|
||||
myLastinMain = myLastPicked;
|
||||
|
||||
if (theToRedrawImmediate)
|
||||
{
|
||||
myMainPM->RedrawImmediate (theView->Viewer());
|
||||
myMainVwr->RedrawImmediate();
|
||||
}
|
||||
|
||||
return myCurHighlighted;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
@@ -1575,13 +1635,13 @@ void AIS_InteractiveContext::InitDetected()
|
||||
{
|
||||
if (HasOpenedContext())
|
||||
{
|
||||
myLocalContexts(myCurLocalIndex)->InitDetected();
|
||||
myLocalContexts (myCurLocalIndex)->InitDetected();
|
||||
return;
|
||||
}
|
||||
|
||||
if(myAISDetectedSeq.Length() != 0)
|
||||
if (!myDetectedSeq.IsEmpty())
|
||||
{
|
||||
myAISCurDetected = 1;
|
||||
myCurDetected = myDetectedSeq.Lower();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1593,11 +1653,10 @@ Standard_Boolean AIS_InteractiveContext::MoreDetected() const
|
||||
{
|
||||
if (HasOpenedContext())
|
||||
{
|
||||
return myLocalContexts(myCurLocalIndex)->MoreDetected();
|
||||
return myLocalContexts (myCurLocalIndex)->MoreDetected();
|
||||
}
|
||||
|
||||
return (myAISCurDetected > 0 && myAISCurDetected <= myAISDetectedSeq.Length()) ?
|
||||
Standard_True : Standard_False;
|
||||
return myCurDetected >= myDetectedSeq.Lower() && myCurDetected <= myDetectedSeq.Upper();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
@@ -1606,13 +1665,13 @@ Standard_Boolean AIS_InteractiveContext::MoreDetected() const
|
||||
//=======================================================================
|
||||
void AIS_InteractiveContext::NextDetected()
|
||||
{
|
||||
if(HasOpenedContext())
|
||||
if (HasOpenedContext())
|
||||
{
|
||||
myLocalContexts(myCurLocalIndex)->NextDetected();
|
||||
myLocalContexts (myCurLocalIndex)->NextDetected();
|
||||
return;
|
||||
}
|
||||
|
||||
myAISCurDetected++;
|
||||
myCurDetected++;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
@@ -1647,7 +1706,9 @@ Handle(AIS_InteractiveObject) AIS_InteractiveContext::DetectedCurrentObject() co
|
||||
return myLocalContexts(myCurLocalIndex)->DetectedCurrentObject();
|
||||
}
|
||||
|
||||
return MoreDetected() ? myAISDetectedSeq(myAISCurDetected) : NULL;
|
||||
return MoreDetected()
|
||||
? Handle(AIS_InteractiveObject)::DownCast (myMainSel->Picked (myDetectedSeq (myCurDetected))->Selectable())
|
||||
: NULL;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
|
@@ -4688,7 +4688,7 @@ static Standard_Integer VSelectionNext(Draw_Interpretor& /*theDI*/,
|
||||
return 1;
|
||||
}
|
||||
|
||||
anAISContext->HilightNextDetected(aView);
|
||||
anAISContext->HilightNextDetected (aView);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -4710,7 +4710,7 @@ static Standard_Integer VSelectionPrevious(Draw_Interpretor& /*theDI*/,
|
||||
return 1;
|
||||
}
|
||||
|
||||
anAISContext->HilightPreviousDetected(aView);
|
||||
anAISContext->HilightPreviousDetected (aView);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user