X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FStdMeshersGUI%2FStdMeshersGUI_SubShapeSelectorWdg.cxx;h=6cddeb013df3c32f4be9d46a0785b2c28664fbd7;hp=935df0cc39f7119edfdc249b0711beff7ed24f2f;hb=8297100f3672d89ff864961311a8738eb46d980d;hpb=5d68554076bbca0e1e95fb0db215a6c2b84b6c54 diff --git a/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.cxx b/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.cxx index 935df0cc3..6cddeb013 100644 --- a/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.cxx +++ b/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -24,29 +24,22 @@ #include "StdMeshersGUI_SubShapeSelectorWdg.h" // SMESH Includes -#include "SMESH_Type.h" -#include "SMESHGUI_MeshUtils.h" +#include "SMESHGUI_Utils.h" +#include "SMESHGUI_VTKUtils.h" #include "SMESH_Actor.h" -#include "SMESH_PreviewActorsCollection.h" -#include "SMESH_ActorUtils.h" -#include "SMESHGUI_GroupUtils.h" #include "SMESH_Gen_i.hxx" -#include "SMESHGUI_GEOMGenUtils.h" #include "SMESH_LogicalFilter.hxx" - -// SVTK Includes -#include -#include -#include -#include +#include "SMESH_PreviewActorsCollection.h" +#include "SMESH_Type.h" // SALOME GUI includes -#include #include -#include - -// SUIT Includes +#include +#include #include +#include +#include +#include // GEOM Includes #include @@ -62,11 +55,9 @@ // OCCT includes #include -#include #include #include #include -#include #define SPACING 6 @@ -92,7 +83,7 @@ StdMeshersGUI_SubShapeSelectorWdg myListWidget = new QListWidget( this ); myAddButton = new QPushButton( tr( "SMESH_BUT_ADD" ), this ); - myRemoveButton = new QPushButton( tr( "SMESH_BUT_REMOVE" ), this ); + myRemoveButton = new QPushButton( tr( "SMESH_BUT_REMOVE" ), this ); myInfoLabel = new QLabel( this ); myPrevButton = new QPushButton( "<<", this ); myNextButton = new QPushButton( ">>", this ); @@ -143,6 +134,8 @@ StdMeshersGUI_SubShapeSelectorWdg::~StdMeshersGUI_SubShapeSelectorWdg() mySelectionMgr->removeFilter( myFilter ); delete myFilter; myFilter=0; + mySelectionMgr->clearSelected(); + SUIT_SelectionFilter* filter; foreach( filter, myGeomFilters ) delete filter; @@ -179,7 +172,7 @@ void StdMeshersGUI_SubShapeSelectorWdg::init() connect( myPrevButton, SIGNAL(clicked()), SLOT(onPrevious())); connect( myNextButton, SIGNAL(clicked()), SLOT(onNext())); - connect( mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + connect( mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(selectionIntoArgument())); connect( myListWidget, SIGNAL(itemSelectionChanged()), this, SLOT(onListSelectionChanged())); updateState(); @@ -209,7 +202,7 @@ void StdMeshersGUI_SubShapeSelectorWdg::setFilter() */ //================================================================================ -void StdMeshersGUI_SubShapeSelectorWdg::showPreview( bool visible) +void StdMeshersGUI_SubShapeSelectorWdg::ShowPreview( bool visible) { if ( !myPreviewActor ) return; @@ -224,11 +217,24 @@ void StdMeshersGUI_SubShapeSelectorWdg::showPreview( bool visible) } } +//================================================================================ +/*! + * \brief Clears selected IDs. This is a workaround of a bug that + * SUIT_SelectionMgr::clearSelected() does not emit currentSelectionChanged + */ +//================================================================================ + +void StdMeshersGUI_SubShapeSelectorWdg::ClearSelected() +{ + mySelectedIDs.clear(); + selectionIntoArgument(); +} + //================================================================================= -// function : SelectionIntoArgument() +// function : selectionIntoArgument() // purpose : Called when selection as changed or other case //================================================================================= -void StdMeshersGUI_SubShapeSelectorWdg::SelectionIntoArgument() +void StdMeshersGUI_SubShapeSelectorWdg::selectionIntoArgument() { if ( !myPreviewActor ) return; @@ -242,10 +248,11 @@ void StdMeshersGUI_SubShapeSelectorWdg::SelectionIntoArgument() if (nbSel > 0) { SALOME_ListIteratorOfListIO anIt (aList); - - for ( ; anIt.More(); anIt.Next()) { // Loop on selected objects + + for ( ; anIt.More(); anIt.Next()) // Loop on selected objects + { Handle(SALOME_InteractiveObject) IO = anIt.Value(); - + GEOM::GEOM_Object_var aGeomObj = GetGeomObjectByEntry( IO->getEntry() ); if ( !CORBA::is_nil( aGeomObj ) ) { // Selected Object From Study GEOM::GEOM_Object_var aGeomFatherObj = aGeomObj->GetMainShape(); @@ -254,7 +261,7 @@ void StdMeshersGUI_SubShapeSelectorWdg::SelectionIntoArgument() TopoDS_Shape shape; if ( !CORBA::is_nil( aGeomFatherObj ) ) { // Get Main Shape - GEOM::GEOM_Object_var aGeomMain = GetGeomObjectByEntry( myEntry ); + GEOM::GEOM_Object_var aGeomMain = GetGeomObjectByEntry( myEntry.c_str() ); if ( !CORBA::is_nil( aGeomMain ) && aGeomMain->GetType() == 37 ) { // Main Shape is a Group GEOM::GEOM_Object_var aMainFatherObj = aGeomMain->GetMainShape(); if ( !CORBA::is_nil( aMainFatherObj ) ) @@ -263,10 +270,11 @@ void StdMeshersGUI_SubShapeSelectorWdg::SelectionIntoArgument() aFatherEntry = aGeomFatherObj->GetStudyEntry(); } - if ( aFatherEntry != "" && ( aFatherEntry == myEntry || aFatherEntry == aMainFatherEntry ) ) + if (( ! aFatherEntry.isEmpty() ) && + ( aFatherEntry == myEntry.c_str() || aFatherEntry == aMainFatherEntry ) ) { if ( aGeomObj->GetType() == 37 /*GEOM_GROUP*/ ) { // Selected Group that belongs the main object - GEOMBase::GetShape(aGeomObj, shape); + GEOMBase::GetShape(aGeomObj, shape); if ( !shape.IsNull() ) { TopExp_Explorer exp( shape, mySubShType ); for ( ; exp.More(); exp.Next() ) { @@ -341,7 +349,9 @@ void StdMeshersGUI_SubShapeSelectorWdg::onAdd() } onListSelectionChanged(); myListWidget->blockSignals( false ); - myAddButton->setEnabled( myMaxSize == -1 || myListOfIDs.size() < myMaxSize ); + + mySelectedIDs.clear(); + myAddButton->setEnabled( false ); } //================================================================================= @@ -368,7 +378,7 @@ void StdMeshersGUI_SubShapeSelectorWdg::onRemove() onListSelectionChanged(); myListWidget->blockSignals( false ); - myAddButton->setEnabled( true ); + myAddButton->setEnabled( !mySelectedIDs.isEmpty() ); } void StdMeshersGUI_SubShapeSelectorWdg::onPrevious() @@ -402,7 +412,7 @@ void StdMeshersGUI_SubShapeSelectorWdg::onListSelectionChanged() if ( !myPreviewActor ) return; - mySelectionMgr->clearSelected(); + //mySelectionMgr->clearSelected(); TColStd_MapOfInteger aIndexes; QList selItems = myListWidget->selectedItems(); QListWidgetItem* anItem; @@ -411,18 +421,34 @@ void StdMeshersGUI_SubShapeSelectorWdg::onListSelectionChanged() // update remove button myRemoveButton->setEnabled( selItems.size() > 0 ); + + emit selectionChanged(); } //================================================================================= // function : setGeomShape // purpose : Called to set geometry whose sub-shapes are selected //================================================================================ -void StdMeshersGUI_SubShapeSelectorWdg::SetGeomShapeEntry( const QString& theEntry ) +void StdMeshersGUI_SubShapeSelectorWdg::SetGeomShapeEntry( const QString& theEntry, + const QString& theMainShapeEntry ) { - if ( theEntry != "") { + if ( !theEntry.isEmpty() || theMainShapeEntry.isEmpty() ) + { myParamValue = theEntry; - myEntry = theEntry; - myGeomShape = GetTopoDSByEntry( theEntry ); + myEntry = theEntry.toStdString(); + myMainEntry = theMainShapeEntry.toStdString(); + + if ( myMainEntry.empty() ) myMainEntry = myEntry; + if ( myEntry.empty() ) myEntry = myMainEntry; + if ( myMainEntry.length() > myEntry.length() && + theMainShapeEntry.startsWith( theEntry )) + std::swap( myMainEntry, myEntry ); + + myGeomShape = GetTopoDSByEntry( myEntry.c_str() ); + if ( myEntry == myMainEntry ) + myMainShape = myGeomShape; + else + myMainShape = GetTopoDSByEntry( myMainEntry.c_str() ); updateState(); myIsNotCorrected = true; } @@ -445,9 +471,10 @@ void StdMeshersGUI_SubShapeSelectorWdg::updateState() myAddButton->setEnabled( mySelectedIDs.size() > 0 ); if (state) { + SUIT_OverrideCursor wc; myPreviewActor = new SMESH_PreviewActorsCollection(); myPreviewActor->SetSelector( mySelector ); - myPreviewActor->Init( myGeomShape, mySubShType, myEntry ); + myPreviewActor->Init( myGeomShape, myMainShape, mySubShType, myEntry.c_str() ); myPreviewActor->SetShown( false ); myIsShown = false; if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) { @@ -500,24 +527,22 @@ SMESH::long_array_var StdMeshersGUI_SubShapeSelectorWdg::GetListOfIDs() { SMESH::long_array_var anArray = new SMESH::long_array; - if ( myMainEntry != "" && myIsNotCorrected ) - myListOfIDs = GetCorrectedListOfIDs( true ); + // if ( myMainEntry != "" && myIsNotCorrected ) + // myListOfIDs = GetCorrectedListOfIDs( true ); int size = myListOfIDs.size(); anArray->length( size ); - if ( size ) { - for (int i = 0; i < size; i++) { - anArray[i] = myListOfIDs.at(i); - } - } + for (int i = 0; i < size; i++) + anArray[i] = myListOfIDs.at(i); + return anArray; } //================================================================================= // function : SetListOfIds -// purpose : Called to set the list of SubShapes IDs +// purpose : Called to set the list of SubShapes IDs. Returns false if any ID is invalid //================================================================================= -void StdMeshersGUI_SubShapeSelectorWdg::SetListOfIDs( SMESH::long_array_var theIds) +bool StdMeshersGUI_SubShapeSelectorWdg::SetListOfIDs( SMESH::long_array_var theIds) { mySelectedIDs.clear(); myListOfIDs.clear(); @@ -525,20 +550,38 @@ void StdMeshersGUI_SubShapeSelectorWdg::SetListOfIDs( SMESH::long_array_var theI for ( int i = 0; i < size; i++ ) mySelectedIDs.append( theIds[ i ] ); - mySelectedIDs = GetCorrectedListOfIDs( false ); + myListWidget->blockSignals( true ); + myListWidget->clear(); + myListWidget->blockSignals( false ); + + bool isOk = true; + if ( myPreviewActor ) + { + for ( int i = 0; i < size && isOk; i++ ) + isOk = myPreviewActor->IsValidIndex( theIds[ i ] ); + } + else if ( !myMainShape.IsNull() ) + { + TopTools_IndexedMapOfShape aMainMap; + TopExp::MapShapes(myMainShape, aMainMap); + for ( int i = 0; i < size && isOk; i++ ) + isOk = ( theIds[ i ] > 0 && theIds[ i ] <= aMainMap.Extent() ); + } + // mySelectedIDs = GetCorrectedListOfIDs( false, &isOk ); onAdd(); + return isOk; } //================================================================================= // function : SetMainShapeEntry // purpose : Called to set the Entry of main shape of the mesh //================================================================================= -void StdMeshersGUI_SubShapeSelectorWdg::SetMainShapeEntry( const QString& theEntry ) -{ - myMainEntry = theEntry; - myMainShape = GetTopoDSByEntry( theEntry ); - myIsNotCorrected = true; -} +// void StdMeshersGUI_SubShapeSelectorWdg::SetMainShapeEntry( const QString& theEntry ) +// { +// myMainEntry = theEntry; +// myMainShape = GetTopoDSByEntry( theEntry ); +// myIsNotCorrected = true; +// } //================================================================================= // function : GetMainShapeEntry @@ -546,48 +589,85 @@ void StdMeshersGUI_SubShapeSelectorWdg::SetMainShapeEntry( const QString& theEnt //================================================================================= const char* StdMeshersGUI_SubShapeSelectorWdg::GetMainShapeEntry() { - if ( myMainEntry == "") - return myEntry.toLatin1().data(); - - return myMainEntry.toLatin1().data(); + if ( myMainEntry.empty() ) myMainEntry = ""; + return myMainEntry.c_str(); } //================================================================================= // function : GetCorrectedListOfIds // purpose : Called to convert the list of IDs from sub-shape IDs to main shape IDs //================================================================================= -QList StdMeshersGUI_SubShapeSelectorWdg::GetCorrectedListOfIDs( bool fromSubshapeToMainshape ) -{ - if ( ( myMainShape.IsNull() || myGeomShape.IsNull() ) && fromSubshapeToMainshape ) - return myListOfIDs; - else if ( ( myMainShape.IsNull() || myGeomShape.IsNull() ) && !fromSubshapeToMainshape ) - return mySelectedIDs; - - QList aList; - TopTools_IndexedMapOfShape aGeomMap; - TopTools_IndexedMapOfShape aMainMap; - TopExp::MapShapes(myGeomShape, aGeomMap); - TopExp::MapShapes(myMainShape, aMainMap); - - if ( fromSubshapeToMainshape ) { // convert indexes from sub-shape to mainshape - int size = myListOfIDs.size(); - for (int i = 0; i < size; i++) { - TopoDS_Shape aSubShape = aGeomMap.FindKey( myListOfIDs.at(i) ); - int index = aMainMap.FindIndex( aSubShape ); - aList.append( index ); - } - myIsNotCorrected = false; - } else { // convert indexes from main shape to sub-shape - int size = mySelectedIDs.size(); - for (int i = 0; i < size; i++) { - TopoDS_Shape aSubShape = aMainMap.FindKey( mySelectedIDs.at(i) ); - int index = aGeomMap.FindIndex( aSubShape ); - aList.append( index ); - } - } - - return aList; -} +// QList +// StdMeshersGUI_SubShapeSelectorWdg::GetCorrectedListOfIDs( bool fromSubshapeToMainshape, +// bool* isOK ) +// { +// if (( myMainShape.IsNull() || myGeomShape.IsNull() ) && fromSubshapeToMainshape ) +// return myListOfIDs; +// else if (( myMainShape.IsNull() /*||*/&& myGeomShape.IsNull() ) && !fromSubshapeToMainshape ) +// return mySelectedIDs; + +// if ( !fromSubshapeToMainshape ) // called from SetListOfIDs +// { +// if ( myMainShape.IsNull() ) +// std::swap( myMainShape, myGeomShape ); +// } + +// QList aList; +// TopTools_IndexedMapOfShape aGeomMap, aMainMap; +// TopExp::MapShapes(myMainShape, aMainMap); +// if ( !myGeomShape.IsNull() ) +// TopExp::MapShapes(myGeomShape, aGeomMap); + +// bool ok = true; +// if ( fromSubshapeToMainshape ) // convert indexes from sub-shape to mainshape +// { +// int size = myListOfIDs.size(); +// for (int i = 0; i < size; i++) { +// int index = myListOfIDs.at(i); +// if ( aGeomMap.Extent() < index ) +// { +// ok = false; +// } +// else +// { +// TopoDS_Shape aSubShape = aGeomMap.FindKey( index ); +// if ( mySubShType != aSubShape.ShapeType() ) +// ok = false; +// if ( !aMainMap.Contains( aSubShape )) +// ok = false; +// else +// index = aMainMap.FindIndex( aSubShape ); +// } +// aList.append( index ); +// } +// myIsNotCorrected = false; +// } +// else // convert indexes from main shape to sub-shape, or just check indices +// { +// int size = mySelectedIDs.size(); +// for (int i = 0; i < size; i++) { +// int index = mySelectedIDs.at(i); +// if ( aMainMap.Extent() < index ) +// { +// ok = false; +// } +// else +// { +// TopoDS_Shape aSubShape = aMainMap.FindKey( index ); +// if ( mySubShType != aSubShape.ShapeType() ) +// ok = false; +// if ( !aGeomMap.Contains( aSubShape ) && !aGeomMap.IsEmpty() ) +// ok = false; +// else +// index = aGeomMap.FindIndex( aSubShape ); +// } +// aList.append( index ); +// } +// } +// if ( isOK ) *isOK = ok; + +// return aList; +// } void StdMeshersGUI_SubShapeSelectorWdg::updateButtons() {