- added interface for changing sensitivity of a particular selection through both interactive and local 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
: 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 :
//! Returns the pixel tolerance.
Standard_EXPORT Standard_Integer PixelTolerance() const;
+
+ //! 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.
+ Standard_EXPORT void SetSelectionSensitivity (const Handle(AIS_InteractiveObject)& theObject,
+ const Standard_Integer theMode,
+ const Standard_Integer theNewSensitivity);
//! Puts the location aLocation on the initial graphic
//! representation and the selection for the entity aniobj.
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);
+}
//! Returns the pixel tolerance.
Standard_EXPORT Standard_Integer PixelTolerance() const;
-
+
+ //! 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.
+ Standard_EXPORT void SetSelectionSensitivity (const Handle(AIS_InteractiveObject)& theObject,
+ const Standard_Integer theMode,
+ const Standard_Integer theNewSensitivity);
+
//! Resets the transient list of presentations previously displayed in immediate mode
//! and begins accumulation of new list by following AddToImmediateList()/Color()/Highlight() calls.
Standard_EXPORT Standard_Boolean BeginImmediateDraw();
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";
"\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;
}
{
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;
+}
//! a specific entity in selection algorithms
//! useful for small sized entities.
Standard_EXPORT Standard_Integer SensitivityFactor() const;
+
+ //! Allows to manage sensitivity of a particular sensitive entity
+ Standard_EXPORT void SetSensitivityFactor (const Standard_Integer theNewSens);
//! Returns the number of sub-entities or elements in
//! sensitive entity. Is used to determine if entity is
Standard_EXPORT SelectBasics_SensitiveEntity (const Handle(SelectBasics_EntityOwner)& theOwnerId);
- //! Allows to manage the sensitivity of the entity
- void SetSensitivityFactor (const Standard_Integer theSensFactor);
-
Handle(SelectBasics_EntityOwner) myOwnerId;
// 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
: myMode (theModeIdx),
mySelectionState (SelectMgr_SOS_Unknown),
myBVHUpdateStatus (SelectMgr_TBU_None),
- mySensFactor (2)
+ mySensFactor (2),
+ myIsCustomSens (Standard_False)
{}
SelectMgr_Selection::~SelectMgr_Selection()
anEntity->SetActiveForSelection();
}
- mySensFactor = Max (mySensFactor,
- anEntity->BaseSensitive()->SensitivityFactor());
+ if (myIsCustomSens)
+ {
+ anEntity->BaseSensitive()->SetSensitivityFactor (mySensFactor);
+ }
+ else
+ {
+ mySensFactor = Max (mySensFactor,
+ anEntity->BaseSensitive()->SensitivityFactor());
+ }
}
}
{
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);
+ }
+}
//! 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, MMgt_TShared)
protected:
mutable SelectMgr_StateOfSelection mySelectionState;
mutable SelectMgr_TypeOfBVHUpdate myBVHUpdateStatus;
Standard_Integer mySensFactor;
+ Standard_Boolean myIsCustomSens;
};
DEFINE_STANDARD_HANDLE(SelectMgr_Selection, MMgt_TShared)
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 (SelectMgr_SequenceOfSelector::Iterator aLocalIter (aSelectors); aLocalIter.More(); aLocalIter.Next())
+ {
+ Handle(SelectMgr_ViewerSelector)& aCurSel = aLocalIter.ChangeValue();
+ aCurSel->myTolerances.Decrement (aPrevSens);
+ aCurSel->myTolerances.Add (theNewSens);
+ aCurSel->myToUpdateTolerance = Standard_True;
+ }
+ }
+}
//! Sets type of update of selection with theMode of theObject to the given theType.
Standard_EXPORT void SetUpdateMode (const Handle(SelectMgr_SelectableObject)& theObject, const Standard_Integer theMode, const SelectMgr_TypeOfUpdate theType);
-
-
+ //! 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.
+ Standard_EXPORT void SetSelectionSensitivity (const Handle(SelectMgr_SelectableObject)& theObject,
+ const Standard_Integer theMode,
+ const Standard_Integer theNewSens);
DEFINE_STANDARD_RTTI(SelectMgr_SelectionManager,MMgt_TShared)
Standard_Integer ToSetMaxParamValue;
Standard_Real MaxParamValue;
+ Standard_Integer ToSetSensitivity;
+ Standard_Integer SelectionMode;
+ Standard_Integer Sensitivity;
+
//! Empty constructor
ViewerTest_AspectsChangeSet()
: ToSetVisibility (0),
FreeBoundaryColor (DEFAULT_FREEBOUNDARY_COLOR),
ToEnableIsoOnTriangulation (-1),
ToSetMaxParamValue (0),
- MaxParamValue (500000) {}
+ MaxParamValue (500000),
+ ToSetSensitivity (0),
+ SelectionMode (-1),
+ Sensitivity (-1) {}
//! @return true if no changes have been requested
Standard_Boolean IsEmpty() const
&& ToSetShowFreeBoundary == 0
&& ToSetFreeBoundaryColor == 0
&& ToSetFreeBoundaryWidth == 0
- && ToSetMaxParamValue == 0;
+ && ToSetMaxParamValue == 0
+ && ToSetSensitivity == 0;
}
//! @return true if properties are valid
std::cout << "Error: the max parameter value should be greater than zero (specified " << MaxParamValue << ")\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;
}
aChangeSet->ToSetMaxParamValue = 1;
aChangeSet->MaxParamValue = Draw::Atof (theArgVec[anArgIter]);
}
+ 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";
aCtx->IsoOnTriangulation (aChangeSet->ToEnableIsoOnTriangulation == 1, aPrs);
toRedisplay = Standard_True;
}
+ else if (aChangeSet->ToSetSensitivity != 0)
+ {
+ aCtx->SetSelectionSensitivity (aPrs, aChangeSet->SelectionMode, aChangeSet->Sensitivity);
+ }
if (!aDrawer.IsNull())
{
if (aChangeSet->ToSetShowFreeBoundary == 1)
Handle(AIS_ColoredDrawer) aCurColDrawer = aColoredPrs->CustomAspects (aSubShape);
aCurColDrawer->SetMaximalParameterValue (aChangeSet->MaxParamValue);
}
+ if (aChangeSet->ToSetSensitivity != 0)
+ {
+ aCtx->SetSelectionSensitivity (aPrs, aChangeSet->SelectionMode, aChangeSet->Sensitivity);
+ }
}
}
if (toDisplay)
"\n\t\t: [-subshapes subname1 [subname2 [...]]]"
"\n\t\t: [-isoontriangulation 0|1]"
"\n\t\t: [-setMaxParamValue {value}]"
+ "\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."
--- /dev/null
+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
+
+# 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
--- /dev/null
+puts "============"
+puts "CR26462"
+puts "============"
+puts ""
+
+##########################################################################################
+puts "Visualization - selection does not adapt to line width change"
+##########################################################################################
+
+pload VISUALIZATION QAcommands
+
+vinit
+OCC26462
+
+set only_screen 1