IPAL52924: Edit Group Standalone: Filters with Source: Mesh, Initial selection does not work

+ Enable "New Mesh" option in Create Boundary Elements dialog independently of type of selected object
    (SMESHGUI_Make2DFrom3DOp.cxx)
This commit is contained in:
eap 2015-10-27 20:57:08 +03:00
parent 3369d458ea
commit d4c5851320
4 changed files with 109 additions and 72 deletions

View File

@ -870,8 +870,8 @@ SMESHGUI_FilterTable::SMESHGUI_FilterTable( SMESHGUI* theModule,
QWidget* parent, QWidget* parent,
const int type ) const int type )
: QWidget( parent ), : QWidget( parent ),
myIsLocked( false ), mySMESHGUI( theModule ),
mySMESHGUI( theModule ) myIsLocked( false )
{ {
myEntityType = -1; myEntityType = -1;
@ -888,8 +888,8 @@ SMESHGUI_FilterTable::SMESHGUI_FilterTable( SMESHGUI* theModule,
QWidget* parent, QWidget* parent,
const QList<int>& types ) const QList<int>& types )
: QWidget( parent ), : QWidget( parent ),
myIsLocked( false ), mySMESHGUI( theModule ),
mySMESHGUI( theModule ) myIsLocked( false )
{ {
myEntityType = -1; myEntityType = -1;
Init(types); Init(types);
@ -1155,7 +1155,7 @@ bool SMESHGUI_FilterTable::IsValid (const bool theMess, const int theEntityType)
bool aRes = false; bool aRes = false;
bool isSignalsBlocked = aTable->signalsBlocked(); bool isSignalsBlocked = aTable->signalsBlocked();
aTable->blockSignals(true); aTable->blockSignals(true);
double aThreshold = (int)aTable->text(i, 2).toDouble(&aRes); /*double aThreshold =*/ aTable->text(i, 2).toDouble( &aRes );
aTable->blockSignals(isSignalsBlocked); aTable->blockSignals(isSignalsBlocked);
if (!aRes && aTable->isEditable(i, 2)) if (!aRes && aTable->isEditable(i, 2))
@ -3365,7 +3365,7 @@ bool SMESHGUI_FilterDlg::onApply()
if (!myFilter[ aCurrType ]->GetPredicate()->_is_nil()) { if (!myFilter[ aCurrType ]->GetPredicate()->_is_nil()) {
// //
bool toFilter = (( SMESH::FindActorByObject( myMesh )) || bool toFilter = (( getActor() ) ||
( myInitSourceWgOnApply && mySourceWg ) || ( myInitSourceWgOnApply && mySourceWg ) ||
( mySourceGrp->checkedId() == Dialog && mySourceWg )); ( mySourceGrp->checkedId() == Dialog && mySourceWg ));
if ( toFilter ) { if ( toFilter ) {
@ -3416,7 +3416,7 @@ bool SMESHGUI_FilterDlg::createFilter (const int theType)
if ( mgr && mgr->booleanValue( "SMESH", "use_precision", false ) ) if ( mgr && mgr->booleanValue( "SMESH", "use_precision", false ) )
aPrecision = mgr->integerValue( "SMESH", "controls_precision", aPrecision ); aPrecision = mgr->integerValue( "SMESH", "controls_precision", aPrecision );
for (CORBA::ULong i = 0; i < n; i++) { for ( int i = 0; i < n; i++) {
SMESH::Filter::Criterion aCriterion = createCriterion(); SMESH::Filter::Criterion aCriterion = createCriterion();
myTable->GetCriterion(i, aCriterion); myTable->GetCriterion(i, aCriterion);
aCriterion.Precision = aPrecision; aCriterion.Precision = aPrecision;
@ -3622,6 +3622,35 @@ void SMESHGUI_FilterDlg::filterSelectionSource (const int theType,
theResIds.append(aResIter.Key()); theResIds.append(aResIter.Key());
} }
//=======================================================================
//function : getActor
//purpose : Returns an actor to show filtered entities
//=======================================================================
SMESH_Actor* SMESHGUI_FilterDlg::getActor()
{
SMESH_Actor* meshActor = SMESH::FindActorByObject( myMesh );
if ( meshActor && meshActor->GetVisibility() )
return meshActor;
SALOME_DataMapIteratorOfDataMapOfIOMapOfInteger anIter(myIObjects);
for ( ; anIter.More(); anIter.Next())
{
Handle(SALOME_InteractiveObject) io = anIter.Key();
if ( io->hasEntry() )
{
SMESH_Actor* actor = SMESH::FindActorByEntry( io->getEntry() );
if ( !actor )
continue;
if ( actor->GetVisibility() )
return actor;
if ( !meshActor )
meshActor = actor;
}
}
return meshActor;
}
//======================================================================= //=======================================================================
// name : SMESHGUI_FilterDlg::selectInViewer // name : SMESHGUI_FilterDlg::selectInViewer
// Purpose : Select given entities in viewer // Purpose : Select given entities in viewer
@ -3644,7 +3673,7 @@ void SMESHGUI_FilterDlg::selectInViewer (const int theType, const QList<int>& th
} }
// Clear selection // Clear selection
SMESH_Actor* anActor = SMESH::FindActorByObject(myMesh); SMESH_Actor* anActor = getActor();
if ( !anActor || !anActor->hasIO() ) if ( !anActor || !anActor->hasIO() )
return; return;

View File

@ -45,17 +45,18 @@
#include CORBA_SERVER_HEADER(SMESH_Filter) #include CORBA_SERVER_HEADER(SMESH_Filter)
#include CORBA_SERVER_HEADER(SMESH_Mesh) #include CORBA_SERVER_HEADER(SMESH_Mesh)
class QFrame; class LightApp_SelectionMgr;
class QButtonGroup; class QButtonGroup;
class QCheckBox; class QCheckBox;
class QFrame;
class QGroupBox; class QGroupBox;
class QPushButton; class QPushButton;
class QStackedWidget;
class QTableWidget; class QTableWidget;
class QTableWidgetItem; class QTableWidgetItem;
class QStackedWidget;
class LightApp_SelectionMgr;
class SMESHGUI; class SMESHGUI;
class SMESHGUI_FilterLibraryDlg; class SMESHGUI_FilterLibraryDlg;
class SMESH_Actor;
class SVTK_Selector; class SVTK_Selector;
/*! /*!
@ -282,6 +283,7 @@ private:
void setIdsToWg( QWidget*, const QList<int>& ); void setIdsToWg( QWidget*, const QList<int>& );
Selection_Mode getSelMode( const int ) const; Selection_Mode getSelMode( const int ) const;
void updateSelection(); void updateSelection();
SMESH_Actor* getActor();
private: private:
// widgets // widgets

View File

@ -128,8 +128,8 @@ SMESHGUI_GroupDlg::SMESHGUI_GroupDlg( SMESHGUI* theModule,
mySelector( SMESH::GetViewWindow( theModule )->GetSelector() ), mySelector( SMESH::GetViewWindow( theModule )->GetSelector() ),
myIsBusy( false ), myIsBusy( false ),
myNameChanged( false ), myNameChanged( false ),
myIsApplyAndClose( false ), myNbChangesOfContents(0),
myNbChangesOfContents(0) myIsApplyAndClose( false )
{ {
initDialog( true ); initDialog( true );
if ( !theMesh->_is_nil() ) if ( !theMesh->_is_nil() )
@ -612,6 +612,8 @@ void SMESHGUI_GroupDlg::init (SMESH::SMESH_GroupBase_ptr theGroup,
case SMESH::EDGE: aType = grpEdgeSelection; break; case SMESH::EDGE: aType = grpEdgeSelection; break;
case SMESH::FACE: aType = grpFaceSelection; break; case SMESH::FACE: aType = grpFaceSelection; break;
case SMESH::VOLUME: aType = grpVolumeSelection; break; case SMESH::VOLUME: aType = grpVolumeSelection; break;
case SMESH::ALL:
case SMESH::NB_ELEMENT_TYPES: break;
} }
myTypeGroup->button(aType)->setChecked(true); myTypeGroup->button(aType)->setChecked(true);
@ -1075,7 +1077,7 @@ bool SMESHGUI_GroupDlg::onApply()
// check and add all selected GEOM objects: they must be // check and add all selected GEOM objects: they must be
// a sub-shapes of the main GEOM and must be of one type // a sub-shapes of the main GEOM and must be of one type
TopAbs_ShapeEnum aGroupType = TopAbs_SHAPE; TopAbs_ShapeEnum aGroupType = TopAbs_SHAPE;
for ( int i =0; i < myGeomObjects->length(); i++) { for ( int i =0; i < (int)myGeomObjects->length(); i++) {
TopAbs_ShapeEnum aSubShapeType = (TopAbs_ShapeEnum)myGeomObjects[i]->GetShapeType(); TopAbs_ShapeEnum aSubShapeType = (TopAbs_ShapeEnum)myGeomObjects[i]->GetShapeType();
if (i == 0) if (i == 0)
aGroupType = aSubShapeType; aGroupType = aSubShapeType;
@ -1809,6 +1811,10 @@ void SMESHGUI_GroupDlg::onFilterAccepted()
mesh = myGroupOnFilter->GetMesh(); mesh = myGroupOnFilter->GetMesh();
} }
myFilter->SetMesh( mesh ); myFilter->SetMesh( mesh );
// highlight ids if selection changed in the Viewer (IPAL52924)
myCurrentLineEdit = 0;
onObjectSelectionChanged();
} }
updateButtons(); updateButtons();
@ -2139,15 +2145,13 @@ void SMESHGUI_GroupDlg::onRemove()
} }
} }
else if (myCurrentLineEdit == myGroupLine) { else if (myCurrentLineEdit == myGroupLine) {
Standard_Boolean aRes;
//SALOME_ListIteratorOfListIO anIt (mySelectionMgr->StoredIObjects());
SALOME_ListIO aList; SALOME_ListIO aList;
mySelectionMgr->selectedObjects( aList ); mySelectionMgr->selectedObjects( aList );
SALOME_ListIteratorOfListIO anIt (aList); SALOME_ListIteratorOfListIO anIt (aList);
for ( ; anIt.More(); anIt.Next()) { for ( ; anIt.More(); anIt.Next()) {
SMESH::SMESH_Group_var aGroup = SMESH::IObjectToInterface<SMESH::SMESH_Group>(anIt.Value()); SMESH::SMESH_Group_var aGroup = SMESH::IObjectToInterface<SMESH::SMESH_Group>(anIt.Value());
if (aRes && !aGroup->_is_nil()) { if (!aGroup->_is_nil()) {
// check if mesh is the same // check if mesh is the same
if (aGroup->GetType() == aType && aGroup->GetMesh()->GetId() == myMesh->GetId()) { if (aGroup->GetType() == aType && aGroup->GetMesh()->GetId() == myMesh->GetId()) {
SMESH::long_array_var anElements = aGroup->GetListOfID(); SMESH::long_array_var anElements = aGroup->GetListOfID();
@ -2285,18 +2289,20 @@ void SMESHGUI_GroupDlg::onHelp()
{ {
LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication()); LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
if (app) if (app)
app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString( "" ), myHelpFileName); {
else { app->onHelpContextModule
QString platform; ( mySMESHGUI ? app->moduleName( mySMESHGUI->moduleName() ) : QString(""), myHelpFileName );
}
else
{
#ifdef WIN32 #ifdef WIN32
platform = "winapplication"; QString platform = "winapplication";
#else #else
platform = "application"; QString platform = "application";
#endif #endif
SUIT_MessageBox::warning(this, tr( "WRN_WARNING" ), SUIT_MessageBox::warning(this, tr( "WRN_WARNING" ),
tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ). tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).
arg(app->resourceMgr()->stringValue( "ExternalBrowser", arg(app->resourceMgr()->stringValue( "ExternalBrowser", platform)).
platform)).
arg(myHelpFileName)); arg(myHelpFileName));
} }
} }

View File

@ -299,14 +299,14 @@ void SMESHGUI_Make2DFrom3DOp::selectionDone()
myDlg->selectObject( names, types, ids ); myDlg->selectObject( names, types, ids );
// enable/desable "new mesh" button // enable/desable "new mesh" button
bool isMesh = true; bool isMesh = true; // EAP - it's sometimes necessary to copy to a new mesh
for ( int i = 0; i < ids.count() && isMesh; ++i ) // for ( int i = 0; i < ids.count() && isMesh; ++i )
{ // {
_PTR(SObject) sobj = // _PTR(SObject) sobj =
SMESHGUI::activeStudy()->studyDS()->FindObjectID( ids[i].toLatin1().constData() ); // SMESHGUI::activeStudy()->studyDS()->FindObjectID( ids[i].toLatin1().constData() );
mySrcMesh = SMESH::SObjectToInterface<SMESH::SMESH_Mesh>( sobj ); // mySrcMesh = SMESH::SObjectToInterface<SMESH::SMESH_Mesh>( sobj );
isMesh = !mySrcMesh->_is_nil(); // isMesh = !mySrcMesh->_is_nil();
} // }
myDlg->setNewMeshEnabled( isMesh ); myDlg->setNewMeshEnabled( isMesh );
} }
catch ( const SALOME::SALOME_Exception& S_ex ) { catch ( const SALOME::SALOME_Exception& S_ex ) {
@ -374,7 +374,7 @@ bool SMESHGUI_Make2DFrom3DOp::isValid( QString& msg ) const
idSource = SMESH::SObjectToInterface<SMESH::SMESH_IDSource>( sobj ); idSource = SMESH::SObjectToInterface<SMESH::SMESH_IDSource>( sobj );
if ( !idSource->_is_nil() ) { if ( !idSource->_is_nil() ) {
SMESH::array_of_ElementType_var types = idSource->GetTypes(); SMESH::array_of_ElementType_var types = idSource->GetTypes();
for ( int j = 0; j < types->length(); ++j ) for ( int j = 0; j < (int) types->length(); ++j )
if ( types[j] == SMESH::VOLUME ) if ( types[j] == SMESH::VOLUME )
hasVolumes = true; hasVolumes = true;
else if ( types[j] == SMESH::FACE ) else if ( types[j] == SMESH::FACE )