X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMGUI%2FGEOMGUI_OCCSelector.cxx;h=65b1eeb67145d89aa08be843c382dbf3682731f9;hb=2dbe613765884256942925d8a95293e3c473caec;hp=3db11fd4ec7e8ee488025f62845cf8bcdaaf1043;hpb=654e26d8595fdd7690c309922933978d2ff3d6b9;p=modules%2Fgeom.git diff --git a/src/GEOMGUI/GEOMGUI_OCCSelector.cxx b/src/GEOMGUI/GEOMGUI_OCCSelector.cxx index 3db11fd4e..65b1eeb67 100644 --- a/src/GEOMGUI/GEOMGUI_OCCSelector.cxx +++ b/src/GEOMGUI/GEOMGUI_OCCSelector.cxx @@ -17,31 +17,35 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // +// File : GEOMGUI_OCCSelector.cxx +// Author : Alexander SOLOVYOV, Open CASCADE S.A.S. (alexander.solovyov@opencascade.com) +// + #include "GEOMGUI_OCCSelector.h" #include #include +#include +#include #include -#include -#include +#include +#include #include +#include +#include + #include -#include +#include +#include #include -#include +#include #include -#include -#include #include -#include #include -#include -#include - //================================================================ // Function : GEOMGUI_OCCSelector @@ -67,65 +71,79 @@ GEOMGUI_OCCSelector::~GEOMGUI_OCCSelector() void GEOMGUI_OCCSelector::getSelection( SUIT_DataOwnerPtrList& aList ) const { OCCViewer_Viewer* vw = viewer(); - if ( !vw ) + if (!vw) return; Handle(AIS_InteractiveContext) ic = vw->getAISContext(); - - if ( ic->HasOpenedContext() ) + + if (ic->HasOpenedContext()) + { + TopoDS_Shape curBigShape; + TopTools_IndexedMapOfShape subShapes; + + for (ic->InitSelected(); ic->MoreSelected(); ic->NextSelected()) { - for ( ic->InitSelected(); ic->MoreSelected(); ic->NextSelected() ) - { - Handle(SelectMgr_EntityOwner) anOwner = ic->SelectedOwner(); - if ( anOwner.IsNull() ) - continue; - - Handle(AIS_InteractiveObject) io = Handle(AIS_InteractiveObject)::DownCast( anOwner->Selectable() ); - - QString entryStr = entry( io ); - int index = -1; - - if ( anOwner->ComesFromDecomposition() ) // == Local Selection - { - TopoDS_Shape subShape = anOwner->Shape(); - Handle(AIS_Shape) aisShape = Handle(AIS_Shape)::DownCast( io ); - if ( !aisShape.IsNull() ) - { - TopoDS_Shape bigShape = aisShape->Shape(); - - TopTools_IndexedMapOfShape subShapes; - TopExp::MapShapes( bigShape, subShapes ); - index = subShapes.FindIndex( subShape ); - } - } - - if ( !entryStr.isEmpty() ) - { - LightApp_DataOwner* owner; - if ( index > -1 ) // Local Selection - owner = new LightApp_DataSubOwner( entryStr, index ); - else // Global Selection - owner = new LightApp_DataOwner( entryStr ); - - aList.append( SUIT_DataOwnerPtr( owner ) ); - } - } + Handle(StdSelect_BRepOwner) anOwner = Handle(StdSelect_BRepOwner)::DownCast(ic->SelectedOwner()); + if (anOwner.IsNull()) + continue; + + Handle(AIS_InteractiveObject) io = Handle(AIS_InteractiveObject)::DownCast(anOwner->Selectable()); + + QString entryStr = entry(io); + int index = -1; + + if (anOwner->ComesFromDecomposition()) // == Local Selection + { + TopoDS_Shape subShape = anOwner->Shape(); + Handle(AIS_Shape) aisShape = Handle(AIS_Shape)::DownCast(io); + if (!aisShape.IsNull()) + { + TopoDS_Shape bigShape = aisShape->Shape(); + + if (!bigShape.IsEqual(curBigShape)) + { + curBigShape = bigShape; + subShapes.Clear(); + TopExp::MapShapes(bigShape, subShapes); + } + index = subShapes.FindIndex(subShape); + } + } + + if (!entryStr.isEmpty()) + { + LightApp_DataOwner* owner; + if (index > -1) // Local Selection + owner = new LightApp_DataSubOwner (entryStr, index); + else // Global Selection + owner = new LightApp_DataOwner (entryStr); + + aList.append(SUIT_DataOwnerPtr(owner)); + } } + } else + { + for (ic->InitCurrent(); ic->MoreCurrent(); ic->NextCurrent()) { - for ( ic->InitCurrent(); ic->MoreCurrent(); ic->NextCurrent() ) - { - Handle(AIS_InteractiveObject) io = ic->Current(); - - QString entryStr = entry( io ); - - if ( !entryStr.isEmpty() ) - { - LightApp_DataOwner* owner = new LightApp_DataOwner( entryStr ); - aList.append( SUIT_DataOwnerPtr( owner ) ); - } - } + Handle(AIS_InteractiveObject) io = ic->Current(); + + QString entryStr = entry( io ); + + if ( !entryStr.isEmpty() ) + { + LightApp_DataOwner* owner = new LightApp_DataOwner( entryStr ); + aList.append( SUIT_DataOwnerPtr( owner ) ); + } } + } + + // add externally selected objects + SUIT_DataOwnerPtrList::const_iterator anExtIter; + for (anExtIter = mySelectedExternals.begin(); anExtIter != mySelectedExternals.end(); anExtIter++) + { + aList.append(*anExtIter); + } } //================================================================ @@ -175,14 +193,16 @@ void GEOMGUI_OCCSelector::setSelection( const SUIT_DataOwnerPtrList& aList ) Handle(AIS_InteractiveContext) ic = vw->getAISContext(); + // "entry - list_of_int" map for LOCAL selection #ifndef WNT - NCollection_DataMap indexesMap; // "entry - list_of_int" map for LOCAL selection + NCollection_DataMap indexesMap; #else - NCollection_DataMap indexesMap; // "entry - list_of_int" map for LOCAL selection + NCollection_DataMap indexesMap; #endif + QMap globalSelMap; // only Key=entry from this map is used. value(int) is NOT used at all. SelectMgr_IndexedMapOfOwner ownersmap; // map of owners to be selected - + AIS_ListOfInteractive aDispList; ic->DisplayedObjects( aDispList ); @@ -195,12 +215,12 @@ void GEOMGUI_OCCSelector::setSelection( const SUIT_DataOwnerPtrList& aList ) { QString entry = subOwner->entry(); #ifndef WNT - if ( indexesMap.IsBound( TCollection_AsciiString((char*)entry.latin1()))) + if ( indexesMap.IsBound( TCollection_AsciiString(entry.toLatin1().data()))) #else - if ( indexesMap.IsBound( (char*)entry.latin1())) + if ( indexesMap.IsBound( entry.toLatin1().data() ) ) #endif { - TColStd_IndexedMapOfInteger& subIndexes = indexesMap.ChangeFind((char*)entry.latin1()); + TColStd_IndexedMapOfInteger& subIndexes = indexesMap.ChangeFind(entry.toLatin1().data()); subIndexes.Add( subOwner->index() ); //indexesMap.replace( entry, subIndexes ); } @@ -208,17 +228,18 @@ void GEOMGUI_OCCSelector::setSelection( const SUIT_DataOwnerPtrList& aList ) { TColStd_IndexedMapOfInteger subIndexes; subIndexes.Add( subOwner->index() ); - indexesMap.Bind((char*)entry.latin1(), subIndexes); + indexesMap.Bind(entry.toLatin1().data(), subIndexes); } - } + } else // the owner is NOT a sub owner, maybe it is a DataOwner == GLOBAL selection { const LightApp_DataOwner* owner = dynamic_cast( (*itr).operator->() ); if ( owner ) { - SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); + SalomeApp_Study* appStudy = + dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); QString anEntry = appStudy->referencedToEntry( owner->entry() ); - + globalSelMap[anEntry] = 1; } } @@ -235,48 +256,77 @@ void GEOMGUI_OCCSelector::setSelection( const SUIT_DataOwnerPtrList& aList ) SelectMgr_IndexedMapOfOwner owners; getEntityOwners( io, ic, owners ); // get all owners - for ( int i = 1, n = owners.Extent(); i <= n; i++ ) + int i, n = owners.Extent(); + + // 1. Prepare map of shapes for local selection + TopTools_IndexedMapOfShape aMapOfShapes; + bool isLocal = false; + + Handle(StdSelect_BRepOwner) anOwner; + for (i = 1; i <= n && !isLocal; i++) { - Handle(SelectMgr_EntityOwner) anOwner = owners( i ); - if ( anOwner.IsNull() || !anOwner->HasShape() ) - continue; - - // GLOBAL selection - if ( !anOwner->ComesFromDecomposition() && globalSelMap.contains( entryStr ) ) - { - ownersmap.Add( anOwner ); - } - // LOCAL selection - else - { - Handle(AIS_Shape) aisShape = Handle(AIS_Shape)::DownCast( io ); - - if ( !aisShape.IsNull() && indexesMap.IsBound( (char*)entryStr.latin1() ) ) - { - TopoDS_Shape shape = aisShape->Shape(); - TopTools_IndexedMapOfShape aMapOfShapes; - TopExp::MapShapes( shape, aMapOfShapes ); - const TColStd_IndexedMapOfInteger& subIndexes = indexesMap.ChangeFind((char*)entryStr.latin1()); - - const TopoDS_Shape& aSubShape = anOwner->Shape(); - int aSubShapeId = aMapOfShapes.FindIndex( aSubShape ); - - // check if the "sub_shape_index" is found in the "map of indexes for this entry", - // which was passes in the parameter - if ( subIndexes.Contains( aSubShapeId ) ) - { - ownersmap.Add( anOwner ); - } - } - } // end of local selection + anOwner = Handle(StdSelect_BRepOwner)::DownCast(owners( i )); + if (!anOwner.IsNull() && anOwner->HasShape()) + { + if (anOwner->ComesFromDecomposition() || !globalSelMap.contains(entryStr)) + { + // has a local selection + Handle(AIS_Shape) aisShape = Handle(AIS_Shape)::DownCast( io ); + if (!aisShape.IsNull() && indexesMap.IsBound(entryStr.toLatin1().data())) + { + isLocal = true; + TopoDS_Shape shape = aisShape->Shape(); + aMapOfShapes.Clear(); + TopExp::MapShapes(shape, aMapOfShapes); + } + } + } + } + + // 2. Process all owners + for (i = 1; i <= n; i++) + { + anOwner = Handle(StdSelect_BRepOwner)::DownCast(owners( i )); + + if ( anOwner.IsNull() || !anOwner->HasShape() ) + continue; + + // GLOBAL selection + if ( !anOwner->ComesFromDecomposition() && globalSelMap.contains( entryStr ) ) + { + ownersmap.Add( anOwner ); + globalSelMap[entryStr]++; + } + // LOCAL selection + else + { + if (isLocal) + { + const TColStd_IndexedMapOfInteger& subIndexes = + indexesMap.ChangeFind(entryStr.toLatin1().data()); + + const TopoDS_Shape& aSubShape = anOwner->Shape(); + int aSubShapeId = aMapOfShapes.FindIndex( aSubShape ); + + // check if the "sub_shape_index" is found in the "map of indexes for this entry", + // which was passes in the parameter + if ( subIndexes.Contains( aSubShapeId ) ) + { + ownersmap.Add( anOwner ); + } + } + } // end of LOCAL selection } // end of for(owners) - }// end of if(entry) - }// end of for(AIS_all_ios) + } // end of if(entry) + } // end of for(AIS_all_ios) vw->unHighlightAll( false ); // DO the selection - for ( int i = 1, n = ownersmap.Extent(); i <= n; i++ ) + int i = 1, n = ownersmap.Extent(); + bool isAutoHilight = ic->AutomaticHilight(); + ic->SetAutomaticHilight(Standard_False); //Bug 17269: for better performance + for (; i <= n; i++) { Handle(SelectMgr_EntityOwner) owner = ownersmap( i ); if ( owner->State() ) @@ -287,6 +337,28 @@ void GEOMGUI_OCCSelector::setSelection( const SUIT_DataOwnerPtrList& aList ) else ic->AddOrRemoveSelected( Handle(AIS_InteractiveObject)::DownCast(owner->Selectable()), false ); } + ic->SetAutomaticHilight(isAutoHilight); //Bug 17269: restore mode + if (n < 3000) + ic->HilightSelected(/*updateviewer*/Standard_True); + else + vw->update(); - vw->update(); + // fill extra selected + mySelectedExternals.clear(); + for ( SUIT_DataOwnerPtrList::const_iterator itr2 = aList.begin(); itr2 != aList.end(); ++itr2 ) + { + const LightApp_DataSubOwner* subOwner = + dynamic_cast( (*itr2).operator->() ); + if ( !subOwner ) + { + const LightApp_DataOwner* owner = dynamic_cast( (*itr2).operator->() ); + if ( owner ) + { + SalomeApp_Study* appStudy = + dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); + QString anEntry = appStudy->referencedToEntry( owner->entry() ); + if (globalSelMap[anEntry] == 1) mySelectedExternals.append(*itr2); + } + } + } }