return myLocalContexts (myCurLocalIndex)->MoveTo (theXPix, theYPix, theView, theToRedrawOnUpdate);
}
- myAISCurDetected = 0;
- myAISDetectedSeq.Clear();
+ myCurDetected = 0;
+ myCurHighlighted = 0;
+ myDetectedSeq.Clear();
if (theView->Viewer() != myMainVwr)
{
{
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
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();
}
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;
}
//=======================================================================
{
if (HasOpenedContext())
{
- myLocalContexts(myCurLocalIndex)->InitDetected();
+ myLocalContexts (myCurLocalIndex)->InitDetected();
return;
}
- if(myAISDetectedSeq.Length() != 0)
+ if (!myDetectedSeq.IsEmpty())
{
- myAISCurDetected = 1;
+ myCurDetected = myDetectedSeq.Lower();
}
}
{
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();
}
//=======================================================================
//=======================================================================
void AIS_InteractiveContext::NextDetected()
{
- if(HasOpenedContext())
+ if (HasOpenedContext())
{
- myLocalContexts(myCurLocalIndex)->NextDetected();
+ myLocalContexts (myCurLocalIndex)->NextDetected();
return;
}
- myAISCurDetected++;
+ myCurDetected++;
}
//=======================================================================
return myLocalContexts(myCurLocalIndex)->DetectedCurrentObject();
}
- return MoreDetected() ? myAISDetectedSeq(myAISCurDetected) : NULL;
+ return MoreDetected()
+ ? Handle(AIS_InteractiveObject)::DownCast (myMainSel->Picked (myDetectedSeq (myCurDetected))->Selectable())
+ : NULL;
}
//=======================================================================
--- /dev/null
+puts "==========="
+puts "OCC27530"
+puts "==========="
+puts ""
+##########################################################################
+# Visualization - AIS_InteractiveContext::HilightNextDetected() doesn't work in Neutral Point
+##########################################################################
+
+proc check_highlighting { theHiBoxIdx theCoords } {
+ set aNext [expr ($theHiBoxIdx + 1) % 3]
+ set aNextNext [expr ($theHiBoxIdx + 2) % 3]
+ set hiColor [vreadpixel [lindex $theCoords [expr $theHiBoxIdx * 2] ] [lindex $theCoords [expr $theHiBoxIdx * 2 + 1] ] name]
+ set nextColor [vreadpixel [lindex $theCoords [expr $aNext * 2] ] [lindex $theCoords [expr $aNext * 2 + 1] ] name]
+ set nextNextColor [vreadpixel [lindex $theCoords [expr $aNextNext * 2] ] [lindex $theCoords [expr $aNextNext * 2 + 1] ] name]
+
+ if {$hiColor == "CYAN1 1" && $nextColor == "YELLOW 1" && $nextNextColor == "YELLOW 1"} {
+ return true
+ } else {
+ return false
+ }
+}
+
+pload VISUALIZATION MODELING
+
+box b0 3 3 3
+box b1 1 1 1 3 2 1
+box b2 1.5 1.5 1.5 4 4 4
+
+set coords { }
+# b0_x, b0_y
+lappend coords 355
+lappend coords 186
+# b1_x, b1_y
+lappend coords 266
+lappend coords 333
+# b2_x, b2_y
+lappend coords 177
+lappend coords 2
+
+vinit
+vclear
+vdisplay b0 b1 b2
+vleft
+vfit
+
+# MoveTo in area that is common for all boxes
+vmoveto 210 280
+
+if { ![check_highlighting 0 $coords] } {
+ puts "ERROR: incorrect highlighting of box b0"
+}
+
+# check vselnext
+vselnext
+if { ![check_highlighting 1 $coords] } {
+ puts "ERROR: incorrect highlighting of box b1 after vselnext call"
+}
+vselnext
+if { ![check_highlighting 2 $coords] } {
+ puts "ERROR: incorrect highlighting of box b2 after vselnext call"
+}
+vselnext
+if { ![check_highlighting 0 $coords] } {
+ puts "ERROR: incorrect highlighting of box b0 after vselnext call"
+}
+
+# check vselprev
+vselprev
+if { ![check_highlighting 2 $coords] } {
+ puts "ERROR: incorrect highlighting of box b2 after vselprev call"
+}
+vselprev
+if { ![check_highlighting 1 $coords] } {
+ puts "ERROR: incorrect highlighting of box b1 after vselprev call"
+}
+vselprev
+if { ![check_highlighting 0 $coords] } {
+ puts "ERROR: incorrect highlighting of box b0 after vselprev call"
+}
puts "============"
puts ""
+proc check_highlighting { theEdgeIdx theCoords } {
+ set aNext [expr ($theEdgeIdx + 1) % 3]
+ set aNextNext [expr ($theEdgeIdx + 2) % 3]
+ set hiColor [vreadpixel [lindex $theCoords [expr $theEdgeIdx * 2] ] [lindex $theCoords [expr $theEdgeIdx * 2 + 1] ] name]
+ set nextColor [vreadpixel [lindex $theCoords [expr $aNext * 2] ] [lindex $theCoords [expr $aNext * 2 + 1] ] name]
+ set nextNextColor [vreadpixel [lindex $theCoords [expr $aNextNext * 2] ] [lindex $theCoords [expr $aNextNext * 2 + 1] ] name]
+
+ if {$hiColor == "CYAN1 1" && $nextColor == "YELLOW 1" && $nextNextColor == "YELLOW 1"} {
+ return true
+ } else {
+ return false
+ }
+}
+
+set coords { }
+# e10_x, e10_y
+lappend coords 94
+lappend coords 140
+# e2_x, e2_y
+lappend coords 103
+lappend coords 60
+# e1_x, e1_y
+lappend coords 29
+lappend coords 208
+
box b 10 10 10
vdisplay b
vfit
vselmode 2 1
vmoveto 30 101
+if { ![check_highlighting 0 $coords] } {
+ puts "ERROR: incorrect highlighting of edge 10"
+}
+
vselnext
+if { ![check_highlighting 1 $coords] } {
+ puts "ERROR: incorrect highlighting of edge 2 after vselnext call"
+}
vselnext
+if { ![check_highlighting 2 $coords] } {
+ puts "ERROR: incorrect highlighting of edge 1 after vselnext call"
+}
vselnext
+if { ![check_highlighting 0 $coords] } {
+ puts "ERROR: incorrect highlighting of edge 10 after vselnext call"
+}
vselprev
+if { ![check_highlighting 2 $coords] } {
+ puts "ERROR: incorrect highlighting of edge 1 after vselprev call"
+}
vselprev
+if { ![check_highlighting 1 $coords] } {
+ puts "ERROR: incorrect highlighting of edge 2 after vselprev call"
+}
vselprev
+if { ![check_highlighting 0 $coords] } {
+ puts "ERROR: incorrect highlighting of edge 10 after vselprev call"
+}