1
0
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:
vpa
2016-10-27 14:29:27 +03:00
committed by apn
parent c9c7286e56
commit f0cddd16eb
6 changed files with 227 additions and 39 deletions

View File

@@ -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);
}
}

View File

@@ -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;

View File

@@ -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;
}
//=======================================================================

View File

@@ -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;
}