0024569: AIS_InteractiveContext::Update(...) does not updates selection when changing...
authorapl <apl@opencascade.com>
Thu, 30 Jan 2014 09:03:48 +0000 (13:03 +0400)
committerbugmaster <bugmaster@opencascade.com>
Thu, 30 Jan 2014 09:04:26 +0000 (13:04 +0400)
1) Allow AIS_InteractiveContext::Update to check, re-project and recompute selection structures even if presentations are not "to be updated".
2) Test case bugs vis bug24569.

Small correction of test case for issue CR24569

src/AIS/AIS_InteractiveContext.cdl
src/AIS/AIS_InteractiveContext.cxx
src/ViewerTest/ViewerTest.cxx
src/ViewerTest/ViewerTest_ObjectCommands.cxx
tests/bugs/vis/bug24569 [new file with mode: 0644]

index 3eb225e..92c3f27 100644 (file)
@@ -407,16 +407,14 @@ is
     ---Purpose: Recomputes the active selections, flags the others
     --          Doesn't update presentations
 
-    Update(me       : mutable;
-          anIobj   : InteractiveObject from AIS;
-          updateviewer : Boolean from Standard = Standard_True);
-    ---Purpose: Checks which presentations are flagged "to be recomputed"
-    --          and recomputes them if they are displayed.
-    --          This method doesn't force any Computation.
-    --          Recomputes Flagged selections if they are activated.
-
-
-                       
+    Update (me              : mutable;
+            theIObj         : InteractiveObject from AIS;
+            theUpdateViewer : Boolean from Standard = Standard_True);
+    ---Purpose: Updates displayed interactive object by checking and
+    --          recomputing its flagged as "to be recomputed" presentation
+    --          and selection structures. This method does not force any
+    --          recomputation on its own. The method recomputes selections
+    --          even if they are loaded without activation in particular selector.
 
     SetDisplayMode(me     : mutable;
                   aniobj : InteractiveObject from AIS;
index dd649e4..ab1b8a3 100644 (file)
@@ -1270,42 +1270,44 @@ void AIS_InteractiveContext::RecomputeSelectionOnly(const Handle(AIS_Interactive
 //function : Update
 //purpose  : 
 //=======================================================================
-
-void AIS_InteractiveContext::Update(const Handle(AIS_InteractiveObject)& anIObj,
-                                    const Standard_Boolean updateviewer)
+void AIS_InteractiveContext::Update (const Handle(AIS_InteractiveObject)& theIObj,
+                                     const Standard_Boolean theUpdateViewer)
 {
-  if(anIObj.IsNull()) return;
+  if (theIObj.IsNull())
+  {
+    return;
+  }
 
-  
+  TColStd_ListOfInteger aListOfFlaggedPrsModes;
+  theIObj->ToBeUpdated (aListOfFlaggedPrsModes);
 
-  TColStd_ListOfInteger LL;
-  anIObj->ToBeUpdated(LL);
-  TColStd_ListIteratorOfListOfInteger ITI(LL);
-  Standard_Boolean wasupdated(Standard_False);
-  
-  for (;ITI.More();ITI.Next()){
-    anIObj->Update(ITI.Value(),Standard_False);
-    wasupdated = Standard_True;
+  TColStd_ListIteratorOfListOfInteger aPrsModesIt (aListOfFlaggedPrsModes);
+  for ( ; aPrsModesIt.More(); aPrsModesIt.Next())
+  {
+    theIObj->Update (aPrsModesIt.Value(), Standard_False);
   }
-  
-  if(wasupdated)
-    mgrSelector->Update(anIObj);
-  
-  if(updateviewer){
-    if(!myObjects.IsBound(anIObj)) return;
-    switch(myObjects(anIObj)->GraphicStatus()){
-    case AIS_DS_Displayed:
-    case AIS_DS_Temporary:
-      myMainVwr->Update();
-      break;
-    default:
-      break;
+
+  mgrSelector->Update(theIObj);
+
+  if (theUpdateViewer)
+  {
+    if (!myObjects.IsBound (theIObj))
+    {
+      return;
+    }
+
+    switch (myObjects (theIObj)->GraphicStatus())
+    {
+      case AIS_DS_Displayed:
+      case AIS_DS_Temporary:
+        myMainVwr->Update();
+        break;
+      default:
+        break;
     }
   }
 }
 
-
-
 //=======================================================================
 //function : SetLocation
 //purpose  : 
index d9acce4..b5aa361 100644 (file)
@@ -2120,6 +2120,59 @@ static int VDisplay2 (Draw_Interpretor& di, Standard_Integer argc, const char**
   return 0;
 }
 
+//===============================================================================================
+//function : VUpdate
+//purpose  :
+//===============================================================================================
+static int VUpdate (Draw_Interpretor& /*theDi*/, Standard_Integer theArgsNb, const char** theArgVec)
+{
+  Handle(AIS_InteractiveContext) aContextAIS = ViewerTest::GetAISContext();
+  if (aContextAIS.IsNull())
+  {
+    std::cout << theArgVec[0] << "AIS context is not available.\n";
+    return 1;
+  }
+
+  if (theArgsNb < 2)
+  {
+    std::cout << theArgVec[0] << ": insufficient arguments. Type help for more information.\n";
+    return 1;
+  }
+
+  const ViewerTest_DoubleMapOfInteractiveAndName& anAISMap = GetMapOfAIS();
+
+  AIS_ListOfInteractive aListOfIO;
+
+  for (int anArgIt = 1; anArgIt < theArgsNb; ++anArgIt)
+  {
+    TCollection_AsciiString aName = TCollection_AsciiString (theArgVec[anArgIt]);
+
+    Handle(AIS_InteractiveObject) anAISObj;
+    if (anAISMap.IsBound2 (aName))
+    {
+      anAISObj = Handle(AIS_InteractiveObject)::DownCast (anAISMap.Find2 (aName));
+    }
+
+    if (anAISObj.IsNull())
+    {
+      std::cout << theArgVec[0] << ": no AIS interactive object named \"" << aName << "\".\n";
+      return 1;
+    }
+
+    aListOfIO.Append (anAISObj);
+  }
+
+  AIS_ListIteratorOfListOfInteractive anIOIt (aListOfIO);
+  for (; anIOIt.More(); anIOIt.Next())
+  {
+    aContextAIS->Update (anIOIt.Value(), Standard_False);
+  }
+
+  aContextAIS->UpdateCurrentViewer();
+
+  return 0;
+}
+
 //==============================================================================
 //function : VPerf
 //purpose  : Test the annimation of an object along a
@@ -3370,6 +3423,11 @@ void ViewerTest::Commands(Draw_Interpretor& theCommands)
       "\n\t\t: Displays named objects",
                  __FILE__,VDisplay2,group);
 
+  theCommands.Add ("vupdate",
+      "vupdate name1 [name2] ... [name n]"
+      "\n\t\t: Updates named objects in interactive context",
+      __FILE__, VUpdate, group);
+
   theCommands.Add("verase",
       "verase [name1] ...  [name n]"
       "\n\t\t: Erases selected or named objects."
index 6e45afe..df4e03c 100644 (file)
@@ -1649,6 +1649,115 @@ static Standard_Integer VPlaneBuilder (Draw_Interpretor& /*di*/,
   return 0;
 }
 
+//===============================================================================================
+//function : VChangePlane
+//purpose  :
+//===============================================================================================
+static int VChangePlane (Draw_Interpretor& /*theDi*/, Standard_Integer theArgsNb, const char** theArgVec)
+{
+  Handle(AIS_InteractiveContext) aContextAIS = ViewerTest::GetAISContext();
+  if (aContextAIS.IsNull())
+  {
+    std::cout << theArgVec[0] << "AIS context is not available.\n";
+    return 1;
+  }
+
+  if (theArgsNb < 3 || theArgsNb > 11)
+  {
+    std::cerr << theArgVec[0] 
+              << ": incorrect number of command arguments.\n"
+              << "Type help for more information.\n";
+    return 1;
+  }
+
+  TCollection_AsciiString aName (theArgVec[1]);
+
+  Handle(AIS_Plane) aPlane = GetMapOfAIS().IsBound2(aName)
+    ? Handle(AIS_Plane)::DownCast (GetMapOfAIS().Find2 (aName))
+    : NULL;
+
+  if ( aPlane.IsNull() )
+  {
+    std::cout << theArgVec[0] 
+              << ": there is no interactive plane with the given name."
+              << "Type help for more information.\n";
+    return 1;
+  }
+
+  Standard_Real aCenterX = aPlane->Center().X();
+  Standard_Real aCenterY = aPlane->Center().Y();
+  Standard_Real aCenterZ = aPlane->Center().Z();
+
+  Standard_Real aDirX = aPlane->Component()->Axis().Direction().X();
+  Standard_Real aDirY = aPlane->Component()->Axis().Direction().Y();
+  Standard_Real aDirZ = aPlane->Component()->Axis().Direction().Z();
+
+  Standard_Real aSizeX = 0.0;
+  Standard_Real aSizeY = 0.0;
+  aPlane->Size (aSizeX, aSizeY);
+  Standard_Boolean isUpdate = Standard_True;
+
+  TCollection_AsciiString aPName, aPValue;
+  for (Standard_Integer anArgIt = 1; anArgIt < theArgsNb; ++anArgIt)
+  {
+    const TCollection_AsciiString anArg = theArgVec[anArgIt];
+    TCollection_AsciiString anArgCase = anArg;
+    anArgCase.UpperCase();
+    if (ViewerTest::SplitParameter (anArg, aPName, aPValue))
+    {
+      aPName.UpperCase();
+      if (aPName.IsEqual ("X"))
+      {
+        aCenterX = aPValue.RealValue();
+      }
+      else if (aPName.IsEqual ("Y"))
+      {
+        aCenterY = aPValue.RealValue();
+      }
+      else if (aPName.IsEqual ("Z"))
+      {
+        aCenterZ = aPValue.RealValue();
+      }
+      else if (aPName.IsEqual ("DX"))
+      {
+        aDirX = aPValue.RealValue();
+      }
+      else if (aPName.IsEqual ("DY"))
+      {
+        aDirY = aPValue.RealValue();
+      }
+      else if (aPName.IsEqual ("DZ"))
+      {
+        aDirZ = aPValue.RealValue();
+      }
+      else if (aPName.IsEqual ("SX"))
+      {
+        aSizeX = aPValue.RealValue();
+      }
+      else if (aPName.IsEqual ("SY"))
+      {
+        aSizeY = aPValue.RealValue();
+      }
+    }
+    else if (anArg.IsEqual ("NOUPDATE"))
+    {
+      isUpdate = Standard_False;
+    }
+  }
+
+  gp_Dir aDirection (aDirX, aDirY, aDirZ);
+  gp_Pnt aCenterPnt (aCenterX, aCenterY, aCenterZ);
+  aPlane->SetCenter (aCenterPnt);
+  aPlane->SetComponent (new Geom_Plane (aCenterPnt, aDirection));
+  aPlane->SetSize (aSizeX, aSizeY);
+
+  if (isUpdate)
+  {
+    aContextAIS->Update (aPlane, Standard_True);
+  }
+
+  return 0;
+}
 
 //==============================================================================
 // Fonction  vline
@@ -4963,6 +5072,20 @@ void ViewerTest::ObjectCommands(Draw_Interpretor& theCommands)
     "vplane  PlaneName [AxisName/PlaneName/PointName] [PointName/PointName/PointName] [Nothing/Nothing/PointName] [TypeOfSensitivity]",
     __FILE__,VPlaneBuilder,group);
 
+  theCommands.Add ("vchangeplane", "vchangeplane usage: \n"
+    "   vchangeplane <plane_name>"
+    " [x=center_x y=center_y z=center_z]"
+    " [dx=dir_x dy=dir_y dz=dir_z]"
+    " [sx=size_x sy=size_y]"
+    " [noupdate]\n"
+    "   - changes parameters of the plane:\n"
+    "   - x y z     - center\n"
+    "   - dx dy dz  - normal\n"
+    "   - sx sy     - plane sizes\n"
+    "   - noupdate  - do not update/redisplay the plane in context\n"
+    "   Please enter coordinates in format \"param=value\" in arbitrary order.",
+    __FILE__, VChangePlane, group);
+
   theCommands.Add("vplanepara",
     "vplanepara  PlaneName  ",
     __FILE__,VPlaneBuilder,group);
diff --git a/tests/bugs/vis/bug24569 b/tests/bugs/vis/bug24569
new file mode 100644 (file)
index 0000000..0c83162
--- /dev/null
@@ -0,0 +1,47 @@
+puts "============"
+puts "CR24569"
+puts "============"
+puts ""
+
+#######################################################################
+#  Test for conversion of sensitives by AIS_InteractiveContext::Update
+#######################################################################
+
+set aV "Driver1/Viewer1/View1"
+vinit name=$aV l=32 t=32 w=400 h=400
+vactivate $aV
+vclear
+
+vpoint p1 0 0 0
+vpoint p2 1 0 0
+vpoint p3 0 1 0
+
+vplane pl1 p1 p2 p3 0
+vfit
+
+vmoveto 200 256
+checkcolor 395 200 0 1 1
+
+if { $stat != 1 } {
+  puts "Error : Selection of AIS_Plane does not work initially!"
+}
+
+puts "Testing of plane sensitivity update:"
+
+vchangeplane pl1 x=-150 y=150 z=0 sx=10 sy=10
+vupdate pl1
+vmoveto 200 240
+checkcolor 199 23 0 1 0
+
+if { $stat != 1 } {
+  puts "Error : Sensitive entity of AIS_Plane is not updated!"
+}
+
+vmoveto 200 28
+checkcolor 199 23 0 1 1
+
+if { $stat != 1 } {
+  puts "Error : Sensitive entity of AIS_Plane is incorrect after update!"
+}
+
+set only_screen 1