]> OCCT Git - occt-copy.git/commitdiff
0026462: Visualization - selection does not adapt to line width change
authorvpa <vpa@opencascade.com>
Mon, 31 Aug 2015 07:32:00 +0000 (10:32 +0300)
committerabv <abv@opencascade.com>
Fri, 11 Sep 2015 12:21:39 +0000 (15:21 +0300)
- added interface for changing sensitivity of a particular selection through both local and interactive context;
- added corresponding methods for changing sensitivity to SelectMgr_SelectionManager, SelectMgr_Selection and SelectBasics_SensitiveEntity;
- option -setSensitivity was implemented in vaspects Draw command;
- test case for issue #26462

15 files changed:
src/AIS/AIS_InteractiveContext.cdl
src/AIS/AIS_InteractiveContext.cxx
src/AIS/AIS_LocalContext.cdl
src/AIS/AIS_LocalContext.cxx
src/QABugs/QABugs_19.cxx
src/SelectBasics/SelectBasics_SensitiveEntity.cdl
src/SelectBasics/SelectBasics_SensitiveEntity.cxx
src/SelectBasics/SelectBasics_SensitiveEntity.lxx
src/SelectMgr/SelectMgr_Selection.cxx
src/SelectMgr/SelectMgr_Selection.hxx
src/SelectMgr/SelectMgr_SelectionManager.cdl
src/SelectMgr/SelectMgr_SelectionManager.cxx
src/ViewerTest/ViewerTest.cxx
tests/bugs/vis/bug26462_1 [new file with mode: 0644]
tests/bugs/vis/bug26462_2 [new file with mode: 0644]

index 66094f7ee7c6884089423428220596eafc6c3779..f75a954ee8c90b2ae9bca5f06b484fcd6eff6640 100644 (file)
@@ -442,7 +442,15 @@ is
     ---Purpose: Returns the pixel tolerance.
 
                   ---Category: put locations on objects....
-                  --           
+                  --
+
+    SetSelectionSensitivity (me                : mutable;
+                             theObject         : InteractiveObject from AIS;
+                             theMode           : Integer from Standard;
+                             theNewSensitivity : Integer from Standard);
+    ---Purpose: Allows to manage sensitivity of a particular selection of interactive object theObject and
+    --          changes previous sensitivity value of all sensitive entities in selection with theMode to
+    --          the given theNewSensitivity.          
 
     SetLocation(me:mutable;
                aniobj : InteractiveObject from AIS;
index 24df744e626322ecf85c6fbd3c4c7144cbe46aec..a0a1556dc564299e602868b6aefc27166ca58ff3 100644 (file)
@@ -2622,6 +2622,23 @@ Standard_Integer AIS_InteractiveContext::PixelTolerance() const
        : myMainSel->PixelTolerance();
 }
 
+//=======================================================================
+//function : SetSelectionSensitivity
+//purpose  : Allows to manage sensitivity of a particular selection of interactive object theObject
+//=======================================================================
+void AIS_InteractiveContext::SetSelectionSensitivity (const Handle(AIS_InteractiveObject)& theObject,
+                                                      const Standard_Integer theMode,
+                                                      const Standard_Integer theNewSensitivity)
+{
+  if (HasOpenedContext())
+  {
+    myLocalContexts (myCurLocalIndex)->SetSelectionSensitivity (theObject, theMode, theNewSensitivity);
+    return;
+  }
+
+  mgrSelector->SetSelectionSensitivity (theObject, theMode, theNewSensitivity);
+}
+
 //=======================================================================
 //function : IsInLocal
 //purpose  :
index f123a8693c19f0808c1f26b6967f2276b9bf624b..ac7a3b9344cfc06f39a3e34685c704119ac3efac 100644 (file)
@@ -447,6 +447,14 @@ is
     ---Level: Public 
     ---Purpose: Returns the pixel tolerance.
 
+    SetSelectionSensitivity (me                : mutable;
+                             theObject         : InteractiveObject from AIS;
+                             theMode           : Integer from Standard;
+                             theNewSensitivity : Integer from Standard);
+    ---Purpose: Allows to manage sensitivity of a particular selection of interactive object theObject and
+    --          changes previous sensitivity value of all sensitive entities in selection with theMode to
+    --          the given theNewSensitivity.   
+
                         ---Category: IMMEDIATE MODE
 
 
index b810c921789a953c7c9de68d43abd84741993541..c8f94e84d25465e96550fdd01d4a5db80924fc45 100644 (file)
@@ -1149,3 +1149,14 @@ Standard_Integer AIS_LocalContext::PixelTolerance() const {
 
   return myMainVS->PixelTolerance();
 }
+
+//=======================================================================
+//function : SetSelectionSensitivity
+//purpose  : Allows to manage sensitivity of a particular selection of interactive object theObject
+//=======================================================================
+void AIS_LocalContext::SetSelectionSensitivity (const Handle(AIS_InteractiveObject)& theObject,
+                                                const Standard_Integer theMode,
+                                                const Standard_Integer theNewSensitivity)
+{
+  mySM->SetSelectionSensitivity (theObject, theMode, theNewSensitivity);
+}
index be55212a2a954034911fe792f117c08b59c77311..0120428d64062c7b201e7b3cd48f3d73cd594437 100755 (executable)
@@ -4207,6 +4207,61 @@ static Standard_Integer OCC26195 (Draw_Interpretor& theDI, Standard_Integer theA
   return 0;
 }
 
+//=======================================================================
+//function : OCC26462
+//purpose  :
+//=======================================================================
+static Standard_Integer OCC26462 (Draw_Interpretor& theDI, Standard_Integer /*theArgNb*/, const char** /*theArgVec*/)
+{
+  if (ViewerTest::GetAISContext().IsNull())
+  {
+    std::cerr << "Error: No opened context!\n";
+    return 1;
+  }
+
+  BRepPrimAPI_MakeBox aBuilder1 (gp_Pnt (10.0, 10.0, 0.0), 10.0, 10.0, 10.0);
+  BRepPrimAPI_MakeBox aBuilder2 (10.0, 10.0, 10.0);
+  Handle(AIS_InteractiveObject) aBox1 = new AIS_Shape (aBuilder1.Shape());
+  Handle(AIS_InteractiveObject) aBox2 = new AIS_Shape (aBuilder2.Shape());
+
+  const Handle(AIS_InteractiveContext) aCtx = ViewerTest::GetAISContext();
+  aCtx->OpenLocalContext();
+  aCtx->Display (aBox1, 0, 2);
+  aCtx->Display (aBox2, 0, 2);
+  ViewerTest::CurrentView()->FitAll();
+  aCtx->SetWidth (aBox1, 3);
+  aCtx->SetWidth (aBox2, 3);
+
+  aCtx->MoveTo (305, 322, ViewerTest::CurrentView());
+  aCtx->ShiftSelect();
+  aCtx->MoveTo (103, 322, ViewerTest::CurrentView());
+  aCtx->ShiftSelect();
+  if (aCtx->NbSelected() != 0)
+  {
+    theDI << "ERROR: no boxes must be selected!\n";
+    return 1;
+  }
+
+  aCtx->SetSelectionSensitivity (aBox1, 2, 5);
+
+  aCtx->MoveTo (305, 322, ViewerTest::CurrentView());
+  aCtx->ShiftSelect();
+  if (aCtx->NbSelected() != 1)
+  {
+    theDI << "ERROR: b1 was not selected\n";
+    return 1;
+  }
+  aCtx->MoveTo (103, 322, ViewerTest::CurrentView());
+  aCtx->ShiftSelect();
+  if (aCtx->NbSelected() != 1)
+  {
+    theDI << "ERROR: b2 is selected after b1's tolerance increased\n";
+    return 1;
+  }
+
+  return 0;
+}
+
 void QABugs::Commands_19(Draw_Interpretor& theCommands) {
   const char *group = "QABugs";
 
@@ -4292,5 +4347,8 @@ void QABugs::Commands_19(Draw_Interpretor& theCommands) {
                    "\n\t\t: [toPrintPixelCoord 0|1] - prints 3d projection of pixel coordinate or center of"
                    "\n\t\t: selecting rectangle onto near and far view frustum planes",
                    __FILE__, OCC26195, group);
+  theCommands.Add ("OCC26462",
+                   "OCC26462: Checks the ability to manage sensitivity of a particular selection mode in local context",
+                   __FILE__, OCC26462, group);
   return;
 }
index c31e6b8a8b3d2a0fbbc90d788c39f6ef2b162097..34a64c9cc13e5533954dc1ae10e939a1c1e5bd87 100644 (file)
@@ -46,6 +46,12 @@ is
     ---C++: return const&
     ---Purpose: Returns pointer to owner of the entity
 
+    SetSensitivityFactor (me : mutable;
+                          theSensFactor : Integer from Standard)
+      is static;
+    ---Level: Public
+    ---Purpose: Allows to manage the sensitivity of the entity
+
 
     Matches (me           : mutable;
             theMgr        : out SelectingVolumeManager from SelectBasics;
@@ -91,12 +97,6 @@ is
     ---Purpose: Returns inversed location transformation matrix if the shape corresponding
     --          to this entity has init location set. Otherwise, returns identity matrix.
 
-    SetSensitivityFactor (me : mutable;
-                          theSensFactor : Integer from Standard)
-      is protected;
-    ---C++: inline
-    ---Purpose: Allows to manage the sensitivity of the entity
-
 
 fields
     
index b04aa82066f495088e9df87829922361acf8e16f..cf7dd65ed889618d08eb26bc17386562a5fe09fe 100644 (file)
@@ -43,3 +43,15 @@ const Handle(SelectBasics_EntityOwner)& SelectBasics_SensitiveEntity::OwnerId()
 {
   return myOwnerId;
 }
+
+//=======================================================================
+// function : SetSensitivityFactor
+// purpose  : Allows to manage sensitivity of a particular entity
+//=======================================================================
+void SelectBasics_SensitiveEntity::SetSensitivityFactor (const Standard_Integer theNewSens)
+{
+  Standard_ASSERT_RAISE (theNewSens > 0,
+    "Error! Selection sensitivity have positive value.");
+
+  mySFactor = theNewSens;
+}
index 380ceb17fc7d135b0b71038c5e98a8389f845070..9d134fecc1c46085bb202bb4ae42bda3add6c31f 100644 (file)
 // Alternatively, this file may be used under the terms of Open CASCADE
 // commercial license or contractual agreement.
 
-//=======================================================================
-// function : SetSensitivityFactor
-// purpose  : Allows to manage the sensitivity of the entity
-//=======================================================================
-inline void SelectBasics_SensitiveEntity::SetSensitivityFactor (const Standard_Integer theSensFactor)
-{
-  mySFactor = theSensFactor;
-}
-
 //=======================================================================
 // function : SensitivityFactor
 // purpose  : Gets sensitivity factor for the entity
index 4bfb2a8dd0fa4d86dfdcf407d6c8c79cf08a222e..5eb8c0d7bb931eaf8ae76fa983e1335dc575252c 100644 (file)
@@ -29,7 +29,8 @@ SelectMgr_Selection::SelectMgr_Selection (const Standard_Integer theModeIdx)
 : myMode (theModeIdx),
   mySelectionState (SelectMgr_SOS_Unknown),
   myBVHUpdateStatus (SelectMgr_TBU_None),
-  mySensFactor (2)
+  mySensFactor (2),
+  myIsCustomSens (Standard_False)
 {}
 
 SelectMgr_Selection::~SelectMgr_Selection()
@@ -73,8 +74,15 @@ void SelectMgr_Selection::Add (const Handle(SelectBasics_SensitiveEntity)& theSe
       anEntity->SetActiveForSelection();
     }
 
-    mySensFactor = Max (mySensFactor,
-                        anEntity->BaseSensitive()->SensitivityFactor());
+    if (myIsCustomSens)
+    {
+      anEntity->BaseSensitive()->SetSensitivityFactor (mySensFactor);
+    }
+    else
+    {
+      mySensFactor = Max (mySensFactor,
+                          anEntity->BaseSensitive()->SensitivityFactor());
+    }
   }
 }      
 
@@ -138,3 +146,20 @@ Standard_Integer SelectMgr_Selection::Sensitivity() const
 {
   return mySensFactor;
 }
+
+//==================================================
+// function: SetSensitivity
+// purpose : Changes sensitivity of the selection and all its entities to the given value.
+//           IMPORTANT: This method does not update any outer selection structures, so for
+//           proper updates use SelectMgr_SelectionManager::SetSelectionSensitivity method.
+//==================================================
+void SelectMgr_Selection::SetSensitivity (const Standard_Integer theNewSens)
+{
+  mySensFactor = theNewSens;
+  myIsCustomSens = Standard_True;
+  for (Standard_Integer anIdx = 0; anIdx < myEntities.Size(); ++anIdx)
+  {
+    Handle(SelectMgr_SensitiveEntity)& anEntity = myEntities.ChangeValue (anIdx);
+    anEntity->BaseSensitive()->SetSensitivityFactor (theNewSens);
+  }
+}
index 1536b68a36974cfac7c77436a6fcbc376f21321f..7a48b25bff6d789d1538e2ebc215014ac5487b8b 100644 (file)
@@ -133,6 +133,11 @@ public:
   //! Returns sensitivity of the selection
   Standard_EXPORT Standard_Integer Sensitivity() const;
 
+  //! Changes sensitivity of the selection and all its entities to the given value.
+  //! IMPORTANT: This method does not update any outer selection structures, so for
+  //! proper updates use SelectMgr_SelectionManager::SetSelectionSensitivity method.
+  Standard_EXPORT void SetSensitivity (const Standard_Integer theNewSens);
+
   DEFINE_STANDARD_RTTI (SelectMgr_Selection)
 
 protected:
@@ -149,6 +154,7 @@ private:
   mutable SelectMgr_StateOfSelection                              mySelectionState;
   mutable SelectMgr_TypeOfBVHUpdate                               myBVHUpdateStatus;
   Standard_Integer                                                mySensFactor;
+  Standard_Boolean                                                myIsCustomSens;
 };
 
 DEFINE_STANDARD_HANDLE(SelectMgr_Selection, MMgt_TShared)
index 157d671a4459b1a055aef93e146cda7c502f999b..27ba83700f5a18ce49fb319eeb91ace7b434dd24 100644 (file)
@@ -201,7 +201,14 @@ is
       is static;
     ---Purpose: Sets type of update of selection with theMode of theObject to the given theType.
 
-
+    SetSelectionSensitivity (me : mutable;
+                             theObject : SelectableObject from SelectMgr;
+                             theMode : Integer from Standard;
+                             theNewSens : Integer from Standard)
+      is static;
+    ---Purpose: Allows to manage sensitivity of a particular selection of interactive object theObject and
+    --          changes previous sensitivity value of all sensitive entities in selection with theMode
+    --          to the given theNewSensitivity.
 
 
 
index 88ff77cbd2eabd4b061a7e622af438c27a4fdb3b..d2a1012dbdb0da87402707017828fe3375a05fae 100644 (file)
@@ -903,3 +903,51 @@ void SelectMgr_SelectionManager::SetUpdateMode (const Handle(SelectMgr_Selectabl
     theObject->Selection (theMode)->UpdateStatus (theType);
 }
 
+//=======================================================================
+//function : SetSelectionSensitivity
+//purpose  : Allows to manage sensitivity of a particular selection of interactive object theObject and
+//           changes previous sensitivity value of all sensitive entities in selection with theMode
+//           to the given theNewSensitivity.
+//=======================================================================
+void SelectMgr_SelectionManager::SetSelectionSensitivity (const Handle(SelectMgr_SelectableObject)& theObject,
+                                                          const Standard_Integer theMode,
+                                                          const Standard_Integer theNewSens)
+{
+  Standard_ASSERT_RAISE (theNewSens > 0,
+    "Error! Selection sensitivity have positive value.");
+
+  if (theObject.IsNull() || !theObject->HasSelection (theMode))
+    return;
+
+  Handle(SelectMgr_Selection) aSel = theObject->Selection (theMode);
+  const Standard_Integer aPrevSens = aSel->Sensitivity();
+  aSel->SetSensitivity (theNewSens);
+
+  if (!(myGlobal.Contains (theObject) || myLocal.IsBound (theObject)))
+    return;
+
+if (myGlobal.Contains (theObject))
+  {
+    for (TColStd_MapIteratorOfMapOfTransient aSelectorsIter (mySelectors); aSelectorsIter.More(); aSelectorsIter.Next())
+    {
+      Handle(SelectMgr_ViewerSelector) aSelector = Handle(SelectMgr_ViewerSelector)::DownCast (aSelectorsIter.Key());
+      if (aSelector->Contains (theObject))
+      {
+        aSelector->myTolerances.Decrement (aPrevSens);
+        aSelector->myTolerances.Add (theNewSens);
+        aSelector->myToUpdateTolerance = Standard_True;
+      }
+    }
+  }
+  if (myLocal.IsBound (theObject))
+  {
+    const SelectMgr_SequenceOfSelector& aSelectors = myLocal (theObject);
+    for (Standard_Integer aSelectorsIdx = 1; aSelectorsIdx <= aSelectors.Length(); aSelectorsIdx++)
+    {
+      Handle(SelectMgr_ViewerSelector) aCurSel = Handle(SelectMgr_ViewerSelector)::DownCast (aSelectors (aSelectorsIdx));
+      aCurSel->myTolerances.Decrement (aPrevSens);
+      aCurSel->myTolerances.Add (theNewSens);
+      aCurSel->myToUpdateTolerance = Standard_True;
+    }
+  }
+}
index b3b020f6fb00b4c2516bea99d0f9dfd7c64e1ea0..6d7031896383661f7785a976b556b49fa0e50b03 100644 (file)
@@ -1498,6 +1498,10 @@ struct ViewerTest_AspectsChangeSet
   Standard_Integer         ToSetFreeBoundaryColor;
   Quantity_Color           FreeBoundaryColor;
 
+  Standard_Integer         ToSetSensitivity;
+  Standard_Integer         SelectionMode;
+  Standard_Integer         Sensitivity;
+
   //! Empty constructor
   ViewerTest_AspectsChangeSet()
   : ToSetVisibility   (0),
@@ -1514,7 +1518,10 @@ struct ViewerTest_AspectsChangeSet
     ToSetFreeBoundaryWidth (0),
     FreeBoundaryWidth      (1.0),
     ToSetFreeBoundaryColor (0),
-    FreeBoundaryColor      (DEFAULT_FREEBOUNDARY_COLOR) {}
+    FreeBoundaryColor          (DEFAULT_FREEBOUNDARY_COLOR),
+    ToSetSensitivity (0),
+    SelectionMode (-1),
+    Sensitivity (-1) {}
 
   //! @return true if no changes have been requested
   Standard_Boolean IsEmpty() const
@@ -1526,7 +1533,8 @@ struct ViewerTest_AspectsChangeSet
         && ToSetMaterial          == 0
         && ToSetShowFreeBoundary  == 0
         && ToSetFreeBoundaryColor == 0
-        && ToSetFreeBoundaryWidth == 0;
+        && ToSetFreeBoundaryWidth == 0
+        && ToSetSensitivity       == 0;
   }
 
   //! @return true if properties are valid
@@ -1568,6 +1576,11 @@ struct ViewerTest_AspectsChangeSet
       std::cout << "Error: the free boundary width should be within [1; 10] range (specified " << FreeBoundaryWidth << ")\n";
       isOk = Standard_False;
     }
+    if (Sensitivity <= 0 && ToSetSensitivity)
+    {
+      std::cout << "Error: sensitivity parameter value should be positive (specified " << Sensitivity << ")\n";
+      isOk = Standard_False;
+    }
     return isOk;
   }
 
@@ -2056,6 +2069,29 @@ static Standard_Integer VAspects (Draw_Interpretor& /*theDI*/,
       aChangeSet->ToSetFreeBoundaryWidth = -1;
       aChangeSet->FreeBoundaryWidth = 1.0;
     }
+    else if (anArg == "-setsensitivity")
+    {
+      if (isDefaults)
+      {
+        std::cout << "Error: wrong syntax. -setSensitivity can not be used together with -defaults call!\n";
+        return 1;
+      }
+
+      if (aNames.IsEmpty())
+      {
+        std::cout << "Error: object and selection mode should specified explicitly when -setSensitivity is used!\n";
+        return 1;
+      }
+
+      if (anArgIter + 2 >= theArgNb)
+      {
+        std::cout << "Error: wrong syntax at " << anArg << "\n";
+        return 1;
+      }
+      aChangeSet->ToSetSensitivity = 1;
+      aChangeSet->SelectionMode = Draw::Atoi (theArgVec[++anArgIter]);
+      aChangeSet->Sensitivity = Draw::Atoi (theArgVec[++anArgIter]);
+    }
     else
     {
       std::cout << "Error: wrong syntax at " << anArg << "\n";
@@ -2208,6 +2244,10 @@ static Standard_Integer VAspects (Draw_Interpretor& /*theDI*/,
       {
         aCtx->UnsetWidth (aPrs, Standard_False);
       }
+      else if (aChangeSet->ToSetSensitivity != 0)
+      {
+        aCtx->SetSelectionSensitivity (aPrs, aChangeSet->SelectionMode, aChangeSet->Sensitivity);
+      }
       if (!aDrawer.IsNull())
       {
         if (aChangeSet->ToSetShowFreeBoundary == 1)
@@ -2265,6 +2305,10 @@ static Standard_Integer VAspects (Draw_Interpretor& /*theDI*/,
           {
             aColoredPrs->UnsetCustomAspects (aSubShape, Standard_True);
           }
+          if (aChangeSet->ToSetSensitivity != 0)
+          {
+            aCtx->SetSelectionSensitivity (aPrs, aChangeSet->SelectionMode, aChangeSet->Sensitivity);
+          }
         }
       }
       if (toDisplay)
@@ -5321,6 +5365,7 @@ void ViewerTest::Commands(Draw_Interpretor& theCommands)
       "\n\t\t:          [-setFreeBoundaryWidth Width] [-unsetFreeBoundaryWidth]"
       "\n\t\t:          [-setFreeBoundaryColor {ColorName | R G B}] [-unsetFreeBoundaryColor]"
       "\n\t\t:          [-subshapes subname1 [subname2 [...]]]"
+      "\n\t\t:          [-setSensitivity {selection_mode} {value}]"
       "\n\t\t: Manage presentation properties of all, selected or named objects."
       "\n\t\t: When -subshapes is specified than following properties will be"
       "\n\t\t: assigned to specified sub-shapes."
diff --git a/tests/bugs/vis/bug26462_1 b/tests/bugs/vis/bug26462_1
new file mode 100644 (file)
index 0000000..68ffc0a
--- /dev/null
@@ -0,0 +1,53 @@
+puts "============"
+puts "CR26462"
+puts "============"
+puts ""
+
+##########################################################################################
+puts "Visualization - selection does not adapt to line width change"
+##########################################################################################
+
+pload VISUALIZATION MODELING
+
+vinit
+box b1 10 10 10
+box b2 10 10 10
+
+vdisplay b1 b2
+vsetlocation b1 10 10 0
+vfit
+
+vaspects b1 b2 -setWidth 3
+
+vselmode 2 1
+# try to select b1 and b2
+vselect 305 322 1
+vselect 103 322 1
+# check that both boxes were not selected with default tolerance value
+set aNbSelected [vnbselected]
+if {$aNbSelected != "0"} {
+  puts "ERROR: no boxes must be selected!"
+}
+
+# increase tolerance for b1
+vaspects b1 -setSensitivity 2 4
+
+# enable selection with local context opened
+vselmode 2 1
+# select edge of b1
+vselect 305 322
+# check that b1's edge was selected
+set aNbSelected [vnbselected]
+if {$aNbSelected != "1"} {
+  puts "ERROR: b1 was not selected"
+}
+# try to select b2
+vselect 103 322 1
+# check that increase of tolerance for b1 doesn't influence
+# on b2
+set aNbSelected [vnbselected]
+if {$aNbSelected != "1"} {
+  puts "ERROR: b2 is selected after b1's tolerance increased"
+}
+
+set only_screen 1
diff --git a/tests/bugs/vis/bug26462_2 b/tests/bugs/vis/bug26462_2
new file mode 100644 (file)
index 0000000..7840718
--- /dev/null
@@ -0,0 +1,15 @@
+puts "============"
+puts "CR26462"
+puts "============"
+puts ""
+
+##########################################################################################
+puts "Visualization - selection does not adapt to line width change"
+##########################################################################################
+
+pload VISUALIZATION QAcommands
+
+vinit
+OCC26462
+
+set only_screen 1