0029262: Visualization - AIS_InteractiveContext::Load() does not register Object...
authorkgv <kgv@opencascade.com>
Wed, 25 Oct 2017 14:27:23 +0000 (17:27 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 26 Oct 2017 09:53:38 +0000 (12:53 +0300)
AIS_InteractiveContext::Load() now loads the object regardless specified selection mode and decomposition flag.
AIS_InteractiveContext::Load() and ::KeepTemporary() now register object in the Viewer
in the same way as ::Display() does.

Draw Harness command vdisplay has been extended with new flag -erased to load object into context in erased state.

src/AIS/AIS_InteractiveContext.cxx
src/AIS/AIS_InteractiveContext.hxx
src/ViewerTest/ViewerTest.cxx
tests/bugs/vis/bug29262 [new file with mode: 0644]

index 12c3077..fdc85ec 100644 (file)
@@ -457,6 +457,10 @@ void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIO
   {
     Erase  (theIObj, theToUpdateViewer);
     Load (theIObj, theSelectionMode, theToAllowDecomposition);
+    if (Handle(AIS_GlobalStatus)* aStatusPtr = myObjects.ChangeSeek (theIObj))
+    {
+      (*aStatusPtr)->SetDisplayMode (theDispMode);
+    }
     return;
   }
 
@@ -484,7 +488,7 @@ void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIO
   {
     Handle(AIS_GlobalStatus) aStatus = new AIS_GlobalStatus (AIS_DS_Displayed, theDispMode, theSelectionMode);
     myObjects.Bind   (theIObj, aStatus);
-    Handle(Graphic3d_ViewAffinity) anAffinity = myMainVwr->StructureManager()->RegisterObject (theIObj);
+    myMainVwr->StructureManager()->RegisterObject (theIObj);
     myMainPM->Display(theIObj, theDispMode);
     if (theSelectionMode != -1)
     {
@@ -567,23 +571,20 @@ void AIS_InteractiveContext::Load (const Handle(AIS_InteractiveObject)& theIObj,
     return;
   }
 
-  if (theSelMode == -1
-  && !theToAllowDecomposition)
+  if (!myObjects.IsBound (theIObj))
   {
-    if (!myObjects.IsBound (theIObj))
-    {
-      Standard_Integer aDispMode, aHiMod, aSelModeDef;
-      GetDefModes (theIObj, aDispMode, aHiMod, aSelModeDef);
-      Handle(AIS_GlobalStatus) aStatus = new AIS_GlobalStatus (AIS_DS_Erased, aDispMode, aSelModeDef);
-      myObjects.Bind (theIObj, aStatus);
-    }
+    Standard_Integer aDispMode, aHiMod, aSelModeDef;
+    GetDefModes (theIObj, aDispMode, aHiMod, aSelModeDef);
+    Handle(AIS_GlobalStatus) aStatus = new AIS_GlobalStatus (AIS_DS_Erased, aDispMode, theSelMode != -1 ? theSelMode : aSelModeDef);
+    myObjects.Bind (theIObj, aStatus);
+    myMainVwr->StructureManager()->RegisterObject (theIObj);
+  }
 
-    // Register theIObj in the selection manager to prepare further activation of selection
-    const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
-    if (!mgrSelector->Contains (anObj))
-    {
-      mgrSelector->Load (theIObj);
-    }
+  // Register theIObj in the selection manager to prepare further activation of selection
+  const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
+  if (!mgrSelector->Contains (anObj))
+  {
+    mgrSelector->Load (theIObj);
   }
 }
 
@@ -785,6 +786,7 @@ Standard_Boolean AIS_InteractiveContext::KeepTemporary(const Handle(AIS_Interact
                                                         Standard_False);
 //    GS->SubIntensityOn();
     myObjects.Bind(anIObj,GS);
+    myMainVwr->StructureManager()->RegisterObject (anIObj);
     mgrSelector->Load(anIObj);
     mgrSelector->Activate(anIObj,SM,myMainSel);
     
index 86fd16b..c954768 100644 (file)
@@ -121,7 +121,6 @@ public: //! @name object display management
   //! If AllowDecomp = Standard_True and, if the interactive object is of the "Shape" type,
   //! these "standard" selection modes will be automatically activated as a function of the modes present in the Local Context.
   //! The loaded objects will be selectable but displayable in highlighting only when detected by the Selector.
-  //! This method is available only when Local Contexts are open.
   Standard_EXPORT void Load (const Handle(AIS_InteractiveObject)& aniobj, const Standard_Integer SelectionMode = -1, const Standard_Boolean AllowDecomp = Standard_False);
 
   //! Hides the object. The object's presentations are simply flagged as invisible and therefore excluded from redrawing.
index b61329a..44d0a45 100644 (file)
@@ -4250,6 +4250,11 @@ static int VDisplay2 (Draw_Interpretor& theDI,
     {
       toReDisplay = Standard_True;
     }
+    else if (aNameCase == "-erased"
+          || aNameCase == "-load")
+    {
+      aDispStatus = AIS_DS_Erased;
+    }
     else
     {
       aNamesOfDisplayIO.Append (aName);
@@ -6084,7 +6089,7 @@ void ViewerTest::Commands(Draw_Interpretor& theCommands)
       "\n\t\t:                                         [offsetX offsetY]]]"
       "\n\t\t:          [-dispMode mode] [-highMode mode]"
       "\n\t\t:          [-layer index] [-top|-topmost|-overlay|-underlay]"
-      "\n\t\t:          [-redisplay]"
+      "\n\t\t:          [-redisplay] [-erased]"
       "\n\t\t:          name1 [name2] ... [name n]"
       "\n\t\t: Displays named objects."
       "\n\t\t: Option -local enables displaying of objects in local"
@@ -6093,6 +6098,7 @@ void ViewerTest::Commands(Draw_Interpretor& theCommands)
       "\n\t\t:  -noupdate    Suppresses viewer redraw call."
       "\n\t\t:  -mutable     Enables optimizations for mutable objects."
       "\n\t\t:  -neutral     Draws objects in main viewer."
+      "\n\t\t:  -erased      Loads the object into context, but does not display it."
       "\n\t\t:  -layer       Sets z-layer for objects."
       "\n\t\t:               Alternatively -overlay|-underlay|-top|-topmost"
       "\n\t\t:               options can be used for the default z-layers."
diff --git a/tests/bugs/vis/bug29262 b/tests/bugs/vis/bug29262
new file mode 100644 (file)
index 0000000..30dd793
--- /dev/null
@@ -0,0 +1,20 @@
+puts "========"
+puts "0029262: Visualization - AIS_InteractiveContext::Load() does not register Object in the Viewer"
+puts "========"
+puts ""
+
+pload MODELING VISUALIZATION
+vclear
+vclose ALL
+vinit View1
+vinit View2
+box b 1 2 3
+vdisplay -dispMode 1 -inview -erased b
+vdisplay b
+vfit
+if { [vreadpixel 200 200 rgb name] != "DARKGOLDENROD3" } { puts "Error: object is not displayed in Shaded mode" }
+vdump $imagedir/${casename}_view2.png
+
+vactivate View1
+if { [vreadpixel 200 200 rgb name] != "BLACK" } { puts "Error: object view affinity is ignored" }
+vdump $imagedir/${casename}_view1.png