1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-19 13:40:49 +03:00

Compare commits

...

1 Commits

Author SHA1 Message Date
kgv
59df732aaa 0028390: Visualization, AIS_InteractiveContext - add topmost-only picking strategy
AIS_InteractiveContext::PickingStrategy(), added new property
defining picking strategy SelectMgr_PickingStrategy.
Strategy SelectMgr_PickingStrategy_OnlyTopmost allows picking only
topmost detected entity not rejected by Selection Filters.
2017-04-13 15:07:27 +03:00
6 changed files with 100 additions and 21 deletions

View File

@@ -95,6 +95,7 @@ myCurLocalIndex(0),
myCurDetected(0),
myCurHighlighted(0),
myZDetectionFlag(0),
myPickingStrategy (SelectMgr_PickingStrategy_FirstAcceptable),
myIsAutoActivateSelMode(Standard_True)
{
InitAttributes();

View File

@@ -17,33 +17,32 @@
#ifndef _AIS_InteractiveContext_HeaderFile
#define _AIS_InteractiveContext_HeaderFile
#include <Standard.hxx>
#include <Standard_Type.hxx>
#include <AIS_DataMapOfIOStatus.hxx>
#include <PrsMgr_PresentationManager3d.hxx>
#include <StdSelect_ViewerSelector3d.hxx>
#include <TCollection_AsciiString.hxx>
#include <Standard_Boolean.hxx>
#include <Prs3d_Drawer.hxx>
#include <Quantity_NameOfColor.hxx>
#include <Standard_Integer.hxx>
#include <AIS_DataMapOfILC.hxx>
#include <AIS_DataMapOfIOStatus.hxx>
#include <AIS_DisplayMode.hxx>
#include <AIS_DisplayStatus.hxx>
#include <AIS_ClearMode.hxx>
#include <AIS_KindOfInteractive.hxx>
#include <Standard_Real.hxx>
#include <AIS_ListOfInteractive.hxx>
#include <AIS_Selection.hxx>
#include <AIS_StatusOfDetection.hxx>
#include <AIS_StatusOfPick.hxx>
#include <AIS_TypeOfIso.hxx>
#include <Aspect_TypeOfFacingModel.hxx>
#include <Graphic3d_HighlightStyle.hxx>
#include <Graphic3d_NameOfMaterial.hxx>
#include <Standard_ShortReal.hxx>
#include <TColStd_ListOfInteger.hxx>
#include <AIS_DisplayMode.hxx>
#include <AIS_TypeOfIso.hxx>
#include <AIS_StatusOfDetection.hxx>
#include <AIS_StatusOfPick.hxx>
#include <TColgp_Array1OfPnt2d.hxx>
#include <Prs3d_Drawer.hxx>
#include <Graphic3d_HighlightStyle.hxx>
#include <PrsMgr_PresentationManager3d.hxx>
#include <SelectMgr_IndexedMapOfOwner.hxx>
#include <AIS_ClearMode.hxx>
#include <SelectMgr_ListOfFilter.hxx>
#include <SelectMgr_PickingStrategy.hxx>
#include <Standard.hxx>
#include <Standard_Type.hxx>
#include <StdSelect_ViewerSelector3d.hxx>
#include <TCollection_AsciiString.hxx>
#include <TColgp_Array1OfPnt2d.hxx>
#include <TColStd_ListOfInteger.hxx>
#include <TopAbs_ShapeEnum.hxx>
#include <SelectMgr_ListOfFilter.hxx>
#include <AIS_ListOfInteractive.hxx>
@@ -144,6 +143,26 @@ public:
Standard_EXPORT Standard_Boolean GetAutoActivateSelection() const;
//! Setup picking strategy - which entities detected by picking line will be accepted, considering Selection Filters.
//! By default (SelectMgr_PickingStrategy_FirstAcceptable), Selection Filters reduce the list of entities
//! so that the context accepts topmost in remaining.
//!
//! This means that entities behind non-selectable (by filters) parts can be picked by user.
//! If this behavior is undesirable, and user wants that non-selectable (by filters) parts
//! should remain an obstacle for picking, SelectMgr_PickingStrategy_OnlyTopmost can be set instead.
//!
//! Notice, that since Selection Manager operates only objects registered in it,
//! SelectMgr_PickingStrategy_OnlyTopmost will NOT prevent picking entities behind
//! visible by unregistered in Selection Manager presentations (e.g. deactivated).
//! Hence, SelectMgr_PickingStrategy_OnlyTopmost changes behavior only with Selection Filters enabled.
void SetPickingStrategy (const SelectMgr_PickingStrategy theStrategy)
{
myPickingStrategy = theStrategy;
}
//! Return picking strategy; SelectMgr_PickingStrategy_FirstAcceptable by default.
SelectMgr_PickingStrategy PickingStrategy() const { return myPickingStrategy; }
//! Controls the choice between the using the display
//! and selection modes of open local context which you
//! have defined and activating those available by default.
@@ -1719,6 +1738,7 @@ protected:
Standard_Integer myCurDetected;
Standard_Integer myCurHighlighted;
Standard_Boolean myZDetectionFlag;
SelectMgr_PickingStrategy myPickingStrategy; //!< picking strategy to be applied within MoveTo()
Standard_Boolean myIsAutoActivateSelMode;
};

View File

@@ -329,16 +329,22 @@ AIS_StatusOfDetection AIS_InteractiveContext::MoveTo (const Standard_Integer th
// (the objects must be AIS_Shapes)
const Standard_Integer aDetectedNb = myMainSel->NbPicked();
Standard_Integer aNewDetected = 0;
Standard_Boolean toIgnoreDetTop = Standard_False;
for (Standard_Integer aDetIter = 1; aDetIter <= aDetectedNb; ++aDetIter)
{
Handle(SelectMgr_EntityOwner) anOwner = myMainSel->Picked (aDetIter);
if (anOwner.IsNull()
|| !myFilters->IsOk (anOwner))
{
if (myPickingStrategy == SelectMgr_PickingStrategy_OnlyTopmost)
{
toIgnoreDetTop = Standard_True;
}
continue;
}
if (aNewDetected < 1)
if (aNewDetected < 1
&& !toIgnoreDetTop)
{
aNewDetected = aDetIter;
}

View File

@@ -22,6 +22,7 @@ SelectMgr_ListIteratorOfListOfFilter.hxx
SelectMgr_ListOfFilter.hxx
SelectMgr_OrFilter.cxx
SelectMgr_OrFilter.hxx
SelectMgr_PickingStrategy.hxx
SelectMgr_RectangularFrustum.cxx
SelectMgr_RectangularFrustum.hxx
SelectMgr_SelectableObject.cxx

View File

@@ -0,0 +1,24 @@
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef _SelectMgr_PickingStrategy_HeaderFile
#define _SelectMgr_PickingStrategy_HeaderFile
//! Enumeration defines picking strategy - which entities detected by picking line will be accepted, considering selection filters.
enum SelectMgr_PickingStrategy
{
SelectMgr_PickingStrategy_FirstAcceptable, //!< the first detected entity passing selection filter is accepted (e.g. any)
SelectMgr_PickingStrategy_OnlyTopmost //!< only topmost detected entity passing selection filter is accepted
};
#endif // _SelectMgr_PickingStrategy_HeaderFile

View File

@@ -10059,6 +10059,30 @@ static int VSelectionProperties (Draw_Interpretor& theDi,
{
aHiStyle->SetTransparency (aCmd.ArgFloat ("hiTransp"));
}
if (aCmd.HasOption ("pickStrategy"))
{
SelectMgr_PickingStrategy aStrategy = SelectMgr_PickingStrategy_FirstAcceptable;
TCollection_AsciiString aVal (aCmd.Arg ("pickStrategy", 0).c_str());
aVal.LowerCase();
if (aVal == "first"
|| aVal == "firstaccepted"
|| aVal == "firstacceptable")
{
aStrategy = SelectMgr_PickingStrategy_FirstAcceptable;
}
else if (aVal == "topmost"
|| aVal == "onlyTopmost")
{
aStrategy = SelectMgr_PickingStrategy_OnlyTopmost;
}
else
{
std::cout << "Syntax error: unknwon picking strategy '" << aVal << "'\n";
return 1;
}
aCtx->SetPickingStrategy (aStrategy);
}
if (aCmd.HasOption ("print") || theArgsNb == 1)
{
@@ -10687,6 +10711,9 @@ void ViewerTest::ViewerCommands(Draw_Interpretor& theCommands)
"\n vselprops [options]"
"\n Customizes selection and dynamic highlight parameters for the whole interactive context:"
"\n -autoActivate {0|1} : disables|enables default computation and activation of global selection mode"
"\n -pickStrategy {first|topmost} : defines picking strategy"
"\n 'first' to pick first acceptable (default)"
"\n 'topmost' to pick only topmost (and nothing, if topmost is rejected by filters)"
"\n -pixTol value : sets up pixel tolerance"
"\n -selColor {name|r g b} : sets selection color"
"\n -hiColor {name|r g b} : sets dynamic highlight color"