X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_FilterDlg.cxx;h=d0f3a6512b620fd47c8dee5249af031c30cbd371;hp=3ffd0419bf4d0c124edf92abc76d61980ead5c5e;hb=10191484fe88a27e962b8e4b57e09d390d8705c7;hpb=fb698074ae763c4cf318dfa13501bb496594cfd3 diff --git a/src/SMESHGUI/SMESHGUI_FilterDlg.cxx b/src/SMESHGUI/SMESHGUI_FilterDlg.cxx index 3ffd0419b..d0f3a6512 100755 --- a/src/SMESHGUI/SMESHGUI_FilterDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_FilterDlg.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -6,7 +6,7 @@ // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -56,14 +56,13 @@ #include #include -#include -#include -#include +#include #include +#include +#include +#include #include -#include -#include #include @@ -799,7 +798,7 @@ void SMESHGUI_FilterTable::Table::setEditable (bool isEditable, //======================================================================= // name : SMESHGUI_FilterTable::Table::isEditable -// Purpose : Verify wheter cell is editable +// Purpose : Verify whether cell is editable //======================================================================= bool SMESHGUI_FilterTable::Table::isEditable (int row, int col) const { @@ -871,8 +870,8 @@ SMESHGUI_FilterTable::SMESHGUI_FilterTable( SMESHGUI* theModule, QWidget* parent, const int type ) : QWidget( parent ), - myIsLocked( false ), - mySMESHGUI( theModule ) + mySMESHGUI( theModule ), + myIsLocked( false ) { myEntityType = -1; @@ -889,8 +888,8 @@ SMESHGUI_FilterTable::SMESHGUI_FilterTable( SMESHGUI* theModule, QWidget* parent, const QList& types ) : QWidget( parent ), - myIsLocked( false ), - mySMESHGUI( theModule ) + mySMESHGUI( theModule ), + myIsLocked( false ) { myEntityType = -1; Init(types); @@ -1013,6 +1012,7 @@ void SMESHGUI_FilterTable::Init (const QList& theTypes) Table* aTable = createTable(mySwitchTableGrp, *typeIt); myTables[ *typeIt ] = aTable; ((QVBoxLayout*)mySwitchTableGrp->layout())->addWidget(myTables[ *typeIt ]); + myEntityType = -1; } } } @@ -1136,6 +1136,7 @@ bool SMESHGUI_FilterTable::IsValid (const bool theMess, const int theEntityType) errMsg = tr( "GROUPCOLOR_ERROR" ); } else if (aCriterion == SMESH::FT_RangeOfIds || + aCriterion == SMESH::FT_BelongToMeshGroup || aCriterion == SMESH::FT_BelongToGeom || aCriterion == SMESH::FT_BelongToPlane || aCriterion == SMESH::FT_BelongToCylinder || @@ -1149,20 +1150,16 @@ bool SMESHGUI_FilterTable::IsValid (const bool theMess, const int theEntityType) if (aTable->text(i, 2).isEmpty()) errMsg = tr( "ERROR" ); } - else + else // check correctness of a numeric value { bool aRes = false; bool isSignalsBlocked = aTable->signalsBlocked(); aTable->blockSignals(true); - double aThreshold = (int)aTable->text(i, 2).toDouble(&aRes); + /*double aThreshold =*/ aTable->text(i, 2).toDouble( &aRes ); aTable->blockSignals(isSignalsBlocked); if (!aRes && aTable->isEditable(i, 2)) errMsg = tr( "ERROR" ); - else if (aType == SMESH::EDGE && - GetCriterionType(i, aType) == SMESH::FT_MultiConnection && - aThreshold == 1) - errMsg = tr( "MULTIEDGES_ERROR" ); } if (!errMsg.isEmpty()) { @@ -1289,6 +1286,7 @@ void SMESHGUI_FilterTable::GetCriterion (const int theRow, } } else if ( aCriterionType != SMESH::FT_RangeOfIds && + aCriterionType != SMESH::FT_BelongToMeshGroup && aCriterionType != SMESH::FT_BelongToGeom && aCriterionType != SMESH::FT_BelongToPlane && aCriterionType != SMESH::FT_BelongToCylinder && @@ -1371,8 +1369,7 @@ void SMESHGUI_FilterTable::SetCriterion (const int theRow, { if ( strlen( theCriterion.ThresholdID ) > 0 ) // shape ID -> name { - _PTR(SObject) sobj = - SMESH::GetActiveStudyDocument()->FindObjectID( theCriterion.ThresholdID.in() ); + _PTR(SObject) sobj = SMESH::getStudy()->FindObjectID( theCriterion.ThresholdID.in() ); if ( !sobj ) aTable->item( theRow, 2 )->setText( QString( theCriterion.ThresholdID ) ); else @@ -1388,6 +1385,7 @@ void SMESHGUI_FilterTable::SetCriterion (const int theRow, } } else if (theCriterion.Type != SMESH::FT_RangeOfIds && + theCriterion.Type != SMESH::FT_BelongToMeshGroup && theCriterion.Type != SMESH::FT_BelongToGeom && theCriterion.Type != SMESH::FT_BelongToPlane && theCriterion.Type != SMESH::FT_BelongToCylinder && @@ -1404,6 +1402,7 @@ void SMESHGUI_FilterTable::SetCriterion (const int theRow, theCriterion.Type != SMESH::FT_OverConstrainedVolume && theCriterion.Type != SMESH::FT_LinearOrQuadratic) { + // Numberic criterion aTable->item( theRow, 2 )->setText(QString("%1").arg(theCriterion.Threshold, 0, 'g', 15)); } else @@ -1546,7 +1545,7 @@ void SMESHGUI_FilterTable::onRemoveBtn() //======================================================================= // name : SMESHGUI_FilterTable::updateAdditionalWidget -// Purpose : Enable/Disable widget with additonal parameters +// Purpose : Enable/Disable widget with additional parameters //======================================================================= void SMESHGUI_FilterTable::updateAdditionalWidget() { @@ -1560,19 +1559,30 @@ void SMESHGUI_FilterTable::updateAdditionalWidget() ComboItem* anItem = ((ComboItem*)aTable->item(aRow, 0)); int aCriterion = GetCriterionType(aRow); - bool toEnable = ((((ComboItem*)aTable->item(aRow, 1))->value() == SMESH::FT_EqualTo && - aCriterion != SMESH::FT_RangeOfIds && - aCriterion != SMESH::FT_FreeEdges && - aCriterion != SMESH::FT_FreeFaces && - aCriterion != SMESH::FT_BadOrientedVolume && - aCriterion != SMESH::FT_BareBorderFace && - aCriterion != SMESH::FT_BareBorderVolume && - aCriterion != SMESH::FT_OverConstrainedFace && - aCriterion != SMESH::FT_OverConstrainedVolume) - || - aCriterion == SMESH::FT_CoplanarFaces || + bool isDbl = ( aCriterion == SMESH::FT_AspectRatio || + aCriterion == SMESH::FT_AspectRatio3D || + aCriterion == SMESH::FT_Warping || + aCriterion == SMESH::FT_MinimumAngle || + aCriterion == SMESH::FT_Taper || + aCriterion == SMESH::FT_Skew || + aCriterion == SMESH::FT_Area || + aCriterion == SMESH::FT_Volume3D || + aCriterion == SMESH::FT_MaxElementLength2D || + aCriterion == SMESH::FT_MaxElementLength3D || + aCriterion == SMESH::FT_Length || + aCriterion == SMESH::FT_Length2D || + aCriterion == SMESH::FT_Deflection2D || + aCriterion == SMESH::FT_BallDiameter ); + + bool toEnable = (( isDbl && ((ComboItem*)aTable->item(aRow, 1))->value() == SMESH::FT_EqualTo) || + aCriterion == SMESH::FT_BelongToPlane || + aCriterion == SMESH::FT_BelongToCylinder || + aCriterion == SMESH::FT_BelongToGenSurface || + aCriterion == SMESH::FT_BelongToGeom || + aCriterion == SMESH::FT_LyingOnGeom || + aCriterion == SMESH::FT_CoplanarFaces || aCriterion == SMESH::FT_EqualNodes); - + if (!myAddWidgets.contains(anItem)) { myAddWidgets[ anItem ] = new AdditionalWidget(myWgStack); @@ -1608,6 +1618,7 @@ const char* SMESHGUI_FilterTable::getPrecision( const int aType ) retval = "len_tol_precision"; break; case SMESH::FT_Length: case SMESH::FT_Length2D: + case SMESH::FT_Deflection2D: case SMESH::FT_MaxElementLength2D: case SMESH::FT_MaxElementLength3D: case SMESH::FT_BallDiameter: @@ -1731,7 +1742,7 @@ static QList entityTypes( const int theType ) typeIds.append( SMDSEntity_Quad_Quadrangle ); typeIds.append( SMDSEntity_BiQuad_Quadrangle ); typeIds.append( SMDSEntity_Polygon ); - //typeIds.append( SMDSEntity_Quad_Polygon ); + typeIds.append( SMDSEntity_Quad_Polygon ); break; case SMESH::VOLUME: typeIds.append( SMDSEntity_Tetra ); @@ -1743,6 +1754,7 @@ static QList entityTypes( const int theType ) typeIds.append( SMDSEntity_TriQuad_Hexa ); typeIds.append( SMDSEntity_Penta ); typeIds.append( SMDSEntity_Quad_Penta ); + typeIds.append( SMDSEntity_BiQuad_Penta ); typeIds.append( SMDSEntity_Hexagonal_Prism ); typeIds.append( SMDSEntity_Polyhedra ); //typeIds.append( SMDSEntity_Quad_Polyhedra ); @@ -1782,13 +1794,13 @@ void SMESHGUI_FilterTable::onCriterionChanged (const int row, const int col, con } // find out a type of item required by a new criterion and other table features - int aCriterionType = GetCriterionType(row); + int aCriterionType = GetCriterionType(row); bool anIsDoubleCriterion = false; bool anIsIntCriterion = false; bool anIsComboCriterion = false; // other features: QList comboIDs; // values to show in a combo item - int nbCompareSigns = 0; // possible values are 0,1,3 + int nbCompareSigns = 0; // possible values are 0,1,3 bool isThresholdEditable = false; // actual for "simple" item types switch ( aCriterionType ) { @@ -1801,8 +1813,7 @@ void SMESHGUI_FilterTable::onCriterionChanged (const int row, const int col, con case SMESH::FT_Area: case SMESH::FT_Volume3D: case SMESH::FT_MaxElementLength2D: - case SMESH::FT_MaxElementLength3D: - anIsDoubleCriterion = true; break; + case SMESH::FT_MaxElementLength3D: anIsDoubleCriterion = true; break; case SMESH::FT_FreeBorders: case SMESH::FT_FreeEdges: @@ -1813,19 +1824,23 @@ void SMESHGUI_FilterTable::onCriterionChanged (const int row, const int col, con case SMESH::FT_EqualFaces: case SMESH::FT_EqualVolumes: break; + case SMESH::FT_NodeConnectivityNumber: case SMESH::FT_MultiConnection: - case SMESH::FT_MultiConnection2D: anIsIntCriterion = true; break; + case SMESH::FT_MultiConnection2D: anIsIntCriterion = true; nbCompareSigns = 3; break; case SMESH::FT_Length: - case SMESH::FT_Length2D: anIsDoubleCriterion = true; break; + case SMESH::FT_Length2D: + case SMESH::FT_Deflection2D: anIsDoubleCriterion = true; break; + + case SMESH::FT_BelongToMeshGroup: break; case SMESH::FT_BelongToGeom: case SMESH::FT_BelongToPlane: case SMESH::FT_BelongToCylinder: case SMESH::FT_BelongToGenSurface: - case SMESH::FT_LyingOnGeom: nbCompareSigns = 1; isThresholdEditable = true; break; + case SMESH::FT_LyingOnGeom: nbCompareSigns = 0; isThresholdEditable = true; break; - case SMESH::FT_RangeOfIds: nbCompareSigns = 1; isThresholdEditable = true; break; + case SMESH::FT_RangeOfIds: nbCompareSigns = 0; isThresholdEditable = true; break; case SMESH::FT_BadOrientedVolume: case SMESH::FT_BareBorderVolume: @@ -1960,7 +1975,10 @@ void SMESHGUI_FilterTable::onCriterionChanged (const int row, const int col, con break; } case 3: { + int oldValue = aCompareItem->value(); aCompareItem->setItems(getCompare()); + if ( oldValue >= 0 ) + aCompareItem->setValue( oldValue ); break; } } @@ -2100,7 +2118,7 @@ QTableWidgetItem* SMESHGUI_FilterTable::getCriterionItem (const int theType) con //======================================================================= // name : SMESHGUI_FilterTable::getCompareItem -// Purpose : Get combo table item for operation of comparision +// Purpose : Get combo table item for operation of comparison //======================================================================= QTableWidgetItem* SMESHGUI_FilterTable::getCompareItem () const { @@ -2165,6 +2183,7 @@ const QMap& SMESHGUI_FilterTable::getCriteria (const int theType) if (aCriteria.isEmpty()) { aCriteria[ SMESH::FT_RangeOfIds ] = tr("RANGE_OF_IDS"); + aCriteria[ SMESH::FT_BelongToMeshGroup ] = tr("BELONG_TO_MESH_GROUP"); aCriteria[ SMESH::FT_BelongToGeom ] = tr("BELONG_TO_GEOM"); aCriteria[ SMESH::FT_BelongToPlane ] = tr("BELONG_TO_PLANE"); aCriteria[ SMESH::FT_BelongToCylinder ] = tr("BELONG_TO_CYLINDER"); @@ -2174,6 +2193,7 @@ const QMap& SMESHGUI_FilterTable::getCriteria (const int theType) aCriteria[ SMESH::FT_GroupColor ] = tr("GROUP_COLOR"); aCriteria[ SMESH::FT_EqualNodes ] = tr("EQUAL_NODE"); aCriteria[ SMESH::FT_ConnectedElements ] = tr("CONNECTED_ELEMS"); + aCriteria[ SMESH::FT_NodeConnectivityNumber ] = tr("NODE_CONN_NUMBER"); } return aCriteria; } @@ -2186,6 +2206,7 @@ const QMap& SMESHGUI_FilterTable::getCriteria (const int theType) aCriteria[ SMESH::FT_MultiConnection ] = tr("MULTI_BORDERS"); aCriteria[ SMESH::FT_Length ] = tr("LENGTH"); aCriteria[ SMESH::FT_RangeOfIds ] = tr("RANGE_OF_IDS"); + aCriteria[ SMESH::FT_BelongToMeshGroup ] = tr("BELONG_TO_MESH_GROUP"); aCriteria[ SMESH::FT_BelongToGeom ] = tr("BELONG_TO_GEOM"); aCriteria[ SMESH::FT_BelongToPlane ] = tr("BELONG_TO_PLANE"); aCriteria[ SMESH::FT_BelongToCylinder ] = tr("BELONG_TO_CYLINDER"); @@ -2214,12 +2235,14 @@ const QMap& SMESHGUI_FilterTable::getCriteria (const int theType) aCriteria[ SMESH::FT_MaxElementLength2D ] = tr("MAX_ELEMENT_LENGTH_2D"); aCriteria[ SMESH::FT_FreeEdges ] = tr("FREE_EDGES"); aCriteria[ SMESH::FT_RangeOfIds ] = tr("RANGE_OF_IDS"); + aCriteria[ SMESH::FT_BelongToMeshGroup ] = tr("BELONG_TO_MESH_GROUP"); aCriteria[ SMESH::FT_BelongToGeom ] = tr("BELONG_TO_GEOM"); aCriteria[ SMESH::FT_BelongToPlane ] = tr("BELONG_TO_PLANE"); aCriteria[ SMESH::FT_BelongToCylinder ] = tr("BELONG_TO_CYLINDER"); aCriteria[ SMESH::FT_BelongToGenSurface ] = tr("BELONG_TO_GENSURFACE"); aCriteria[ SMESH::FT_LyingOnGeom ] = tr("LYING_ON_GEOM"); aCriteria[ SMESH::FT_Length2D ] = tr("LENGTH2D"); + aCriteria[ SMESH::FT_Deflection2D ] = tr("DEFLECTION2D"); aCriteria[ SMESH::FT_MultiConnection2D ] = tr("MULTI2D_BORDERS"); aCriteria[ SMESH::FT_FreeFaces ] = tr("FREE_FACES"); aCriteria[ SMESH::FT_BareBorderFace ] = tr("BARE_BORDER_FACE"); @@ -2241,6 +2264,7 @@ const QMap& SMESHGUI_FilterTable::getCriteria (const int theType) { aCriteria[ SMESH::FT_AspectRatio3D ] = tr("ASPECT_RATIO_3D"); aCriteria[ SMESH::FT_RangeOfIds ] = tr("RANGE_OF_IDS"); + aCriteria[ SMESH::FT_BelongToMeshGroup ] = tr("BELONG_TO_MESH_GROUP"); aCriteria[ SMESH::FT_BelongToGeom ] = tr("BELONG_TO_GEOM"); aCriteria[ SMESH::FT_LyingOnGeom ] = tr("LYING_ON_GEOM"); aCriteria[ SMESH::FT_BadOrientedVolume ] = tr("BAD_ORIENTED_VOLUME"); @@ -2263,6 +2287,7 @@ const QMap& SMESHGUI_FilterTable::getCriteria (const int theType) if (aCriteria.isEmpty()) { aCriteria[ SMESH::FT_RangeOfIds ] = tr("RANGE_OF_IDS"); + aCriteria[ SMESH::FT_BelongToMeshGroup ] = tr("BELONG_TO_MESH_GROUP"); aCriteria[ SMESH::FT_BelongToGeom ] = tr("BELONG_TO_GEOM"); aCriteria[ SMESH::FT_BelongToPlane ] = tr("BELONG_TO_PLANE"); aCriteria[ SMESH::FT_BelongToCylinder ] = tr("BELONG_TO_CYLINDER"); @@ -2279,6 +2304,7 @@ const QMap& SMESHGUI_FilterTable::getCriteria (const int theType) { aCriteria[ SMESH::FT_BallDiameter ] = tr("BALL_DIAMETER"); aCriteria[ SMESH::FT_RangeOfIds ] = tr("RANGE_OF_IDS"); + aCriteria[ SMESH::FT_BelongToMeshGroup ] = tr("BELONG_TO_MESH_GROUP"); aCriteria[ SMESH::FT_BelongToGeom ] = tr("BELONG_TO_GEOM"); aCriteria[ SMESH::FT_BelongToPlane ] = tr("BELONG_TO_PLANE"); aCriteria[ SMESH::FT_BelongToCylinder ] = tr("BELONG_TO_CYLINDER"); @@ -2294,6 +2320,7 @@ const QMap& SMESHGUI_FilterTable::getCriteria (const int theType) if (aCriteria.isEmpty()) { aCriteria[ SMESH::FT_RangeOfIds ] = tr("RANGE_OF_IDS"); + aCriteria[ SMESH::FT_BelongToMeshGroup ] = tr("BELONG_TO_MESH_GROUP"); aCriteria[ SMESH::FT_BelongToGeom ] = tr("BELONG_TO_GEOM"); aCriteria[ SMESH::FT_BelongToPlane ] = tr("BELONG_TO_PLANE"); aCriteria[ SMESH::FT_BelongToCylinder ] = tr("BELONG_TO_CYLINDER"); @@ -2309,6 +2336,7 @@ const QMap& SMESHGUI_FilterTable::getCriteria (const int theType) if (aCriteria.isEmpty()) { aCriteria[ SMESH::FT_RangeOfIds ] = tr("RANGE_OF_IDS"); + aCriteria[ SMESH::FT_BelongToMeshGroup ] = tr("BELONG_TO_MESH_GROUP"); aCriteria[ SMESH::FT_BelongToGeom ] = tr("BELONG_TO_GEOM"); aCriteria[ SMESH::FT_LyingOnGeom ] = tr("LYING_ON_GEOM"); aCriteria[ SMESH::FT_LinearOrQuadratic ] = tr("LINEAR"); @@ -2658,7 +2686,9 @@ SMESHGUI_FilterDlg::SMESHGUI_FilterDlg( SMESHGUI* theModule, : QDialog( SMESH::GetDesktop( theModule ) ), mySMESHGUI( theModule ), mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), - myInitSourceWgOnApply( true ) + myInitSourceWgOnApply( true ), + myInsertEnabled( true ), + myDiffSourcesEnabled( true ) { if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) mySelector = aViewWindow->GetSelector(); @@ -2675,7 +2705,9 @@ SMESHGUI_FilterDlg::SMESHGUI_FilterDlg( SMESHGUI* theModule, : QDialog( SMESH::GetDesktop( theModule ) ), mySMESHGUI( theModule ), mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), - myInitSourceWgOnApply( true ) + myInitSourceWgOnApply( true ), + myInsertEnabled( true ), + myDiffSourcesEnabled( true ) { if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) mySelector = aViewWindow->GetSelector(); @@ -2734,6 +2766,7 @@ QWidget* SMESHGUI_FilterDlg::createMainFrame (QWidget* theParent) int rows = aLay->rowCount(); int cols = aLay->columnCount(); + // This line looks strange when all additional parameters and mySetInViewer are hidden QFrame* aLine = new QFrame(aGrp); aLine->setFrameStyle(QFrame::HLine | QFrame::Sunken); aLay->addWidget(aLine, rows++, 0, 1, cols); @@ -2864,9 +2897,15 @@ void SMESHGUI_FilterDlg::Init (const int type, const bool setInViewer) //======================================================================= void SMESHGUI_FilterDlg::Init (const QList& theTypes, const bool setInViewer) { + if ( theTypes.empty() ) + { + Init( SMESH::ALL, setInViewer ); + return; + } mySourceWg = 0; myTypes = theTypes; myMesh = SMESH::SMESH_Mesh::_nil(); + myGroup = SMESH::SMESH_GroupOnFilter::_nil(); myIObjects.Clear(); myIsSelectionChanged = false; myToRestoreSelMode = false; @@ -2897,6 +2936,8 @@ void SMESHGUI_FilterDlg::Init (const QList& theTypes, const bool setInViewe connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), SLOT(onDeactivate())); connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), SLOT(reject())); + connect(mySMESHGUI, SIGNAL(SignalActivatedViewManager()), SLOT(onOpenView())); + connect(mySMESHGUI, SIGNAL(SignalCloseView()), SLOT(onCloseView())); updateMainButtons(); updateSelection(); @@ -2982,6 +3023,29 @@ void SMESHGUI_FilterDlg::reject() QDialog::reject(); } +//================================================================================= +// function : onOpenView() +// purpose : +//================================================================================= +void SMESHGUI_FilterDlg::onOpenView() +{ + if ( mySelector ) { + SMESH::SetPointRepresentation(false); + } + else { + mySelector = SMESH::GetViewWindow( mySMESHGUI )->GetSelector(); + } +} + +//================================================================================= +// function : onCloseView() +// purpose : +//================================================================================= +void SMESHGUI_FilterDlg::onCloseView() +{ + mySelector = 0; +} + //================================================================================= // function : onHelp() // purpose : @@ -3134,8 +3198,7 @@ bool SMESHGUI_FilterDlg::isValid() const QString aName; myTable->GetThreshold(i, aName); - std::vector<_PTR(SObject)> aList = - SMESH::GetActiveStudyDocument()->FindObjectByName(aName.toLatin1().constData(), "GEOM"); + std::vector<_PTR(SObject)> aList = SMESH::getStudy()->FindObjectByName(aName.toLatin1().constData(), "GEOM"); if (aList.size() == 0) { SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_INSUFFICIENT_DATA"), tr("BAD_SHAPE_NAME").arg(aName)); @@ -3145,8 +3208,7 @@ bool SMESHGUI_FilterDlg::isValid() const if (aType == SMESH::FT_BelongToCylinder || aType == SMESH::FT_BelongToPlane || aType == SMESH::FT_BelongToGenSurface ) { - CORBA::Object_var anObject = SMESH::SObjectToObject(aList[ 0 ]); - //GEOM::GEOM_Object_var aGeomObj = GEOM::GEOM_Object::_narrow(aList[ 0 ]->GetObject()); + CORBA::Object_var anObject = SMESH::SObjectToObject(aList[ 0 ]); GEOM::GEOM_Object_var aGeomObj = GEOM::GEOM_Object::_narrow(anObject); if (!aGeomObj->_is_nil()) { TopoDS_Shape aFace; @@ -3219,6 +3281,21 @@ void SMESHGUI_FilterDlg::SetSourceWg (QWidget* theWg, myInitSourceWgOnApply = initOnApply; } +//======================================================================= +//function : EnableFiltering +//purpose : Enables "Insert filter in the viewer" +// and different "Source"s (Mesh, Initial Selection, Current Group) +//======================================================================= + +void SMESHGUI_FilterDlg::SetEnabled( bool setInViewer, bool diffSources ) +{ + myInsertEnabled = setInViewer; + myDiffSourcesEnabled = diffSources; + + mySetInViewer->setVisible( myInsertEnabled ); + mySourceGrp->button(0)->parentWidget()->setVisible( myDiffSourcesEnabled ); +} + //======================================================================= // name : SMESHGUI_FilterDlg::SetMesh // Purpose : Set mesh @@ -3235,6 +3312,15 @@ void SMESHGUI_FilterDlg::SetMesh (SMESH::SMESH_Mesh_var theMesh) myButtons[BTN_Apply]->setEnabled(isEnable); } +//======================================================================= +// name : SMESHGUI_FilterDlg::SetGroup +// Purpose : Set a group being edited +//======================================================================= +void SMESHGUI_FilterDlg::SetGroup(SMESH::SMESH_GroupOnFilter_var group) +{ + myGroup = group; +} + //======================================================================= // name : SMESHGUI_FilterDlg::SetSelection // Purpose : Get filtered ids @@ -3282,13 +3368,21 @@ bool SMESHGUI_FilterDlg::onApply() insertFilterInViewer(); if (!myFilter[ aCurrType ]->GetPredicate()->_is_nil()) { - QList aResultIds; - filterSource(aCurrType, aResultIds); - // select in viewer - selectInViewer(aCurrType, aResultIds); + // + bool toFilter = (( getActor() ) || + ( myInitSourceWgOnApply && mySourceWg ) || + ( mySourceGrp->checkedId() == Dialog && mySourceWg )); + if ( toFilter ) { + QList aResultIds; + filterSource(aCurrType, aResultIds); + // select in viewer + selectInViewer(aCurrType, aResultIds); + // set ids to the dialog + if ( myInitSourceWgOnApply || mySourceGrp->checkedId() == Dialog ) + setIdsToWg(mySourceWg, aResultIds); + } } - myInsertState[ aCurrType ] = mySetInViewer->isChecked(); myApplyToState[ aCurrType ] = mySourceGrp->checkedId(); } @@ -3326,7 +3420,7 @@ bool SMESHGUI_FilterDlg::createFilter (const int theType) if ( mgr && mgr->booleanValue( "SMESH", "use_precision", false ) ) 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(); myTable->GetCriterion(i, aCriterion); aCriterion.Precision = aPrecision; @@ -3397,15 +3491,19 @@ void SMESHGUI_FilterDlg::UnRegisterFilters() //======================================================================= void SMESHGUI_FilterDlg::insertFilterInViewer() { - if (SVTK_Selector* aSelector = SMESH::GetSelector()) { + if (SVTK_Selector* aSelector = SMESH::GetSelector()) + { SMESH::ElementType anEntType = (SMESH::ElementType)myTable->GetType(); if (myFilter[ myTable->GetType() ]->_is_nil() || - myFilter[ myTable->GetType() ]->GetPredicate()->_is_nil() || - !mySetInViewer->isChecked()) { + myFilter[ myTable->GetType() ]->GetPredicate()->_is_nil() || + !mySetInViewer->isChecked() || + !myInsertEnabled ) + { SMESH::RemoveFilter(getFilterId(anEntType), aSelector); } - else { + else + { Handle(SMESHGUI_PredicateFilter) aFilter = new SMESHGUI_PredicateFilter(); aFilter->SetPredicate(myFilter[ myTable->GetType() ]->GetPredicate()); SMESH::RemoveFilter(getFilterId(anEntType), aSelector); //skl for IPAL12631 @@ -3427,7 +3525,7 @@ void SMESHGUI_FilterDlg::filterSource (const int theType, int aSourceId = mySourceGrp->checkedId(); - if (aSourceId == Mesh) + if (aSourceId == Mesh || !myDiffSourcesEnabled ) { if (myMesh->_is_nil()) return; @@ -3459,9 +3557,6 @@ void SMESHGUI_FilterDlg::filterSource (const int theType, if (aPred->IsSatisfy(*anIter)) theResIds.append(*anIter); } - // set ids to the dialog - if (myInitSourceWgOnApply || aSourceId == Dialog) - setIdsToWg(mySourceWg, theResIds); } //======================================================================= @@ -3533,13 +3628,42 @@ void SMESHGUI_FilterDlg::filterSelectionSource (const int theType, 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 // Purpose : Select given entities in viewer //======================================================================= void SMESHGUI_FilterDlg::selectInViewer (const int theType, const QList& theIds) { - if (mySelectionMgr == 0 || myMesh->_is_nil()) + if (mySelectionMgr == 0 || myMesh->_is_nil() ) return; mySelectionMgr->clearFilters(); @@ -3547,7 +3671,8 @@ void SMESHGUI_FilterDlg::selectInViewer (const int theType, const QList& th // Set new selection mode if necessary Selection_Mode aSelMode = getSelMode(theType); SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ); - if ( aViewWindow && aViewWindow->SelectionMode()!=aSelMode) { + if ( aViewWindow && aViewWindow->SelectionMode() != aSelMode ) + { mySelectionMgr->clearSelected(); mySelectionMgr->clearFilters(); SMESH::SetPointRepresentation( aSelMode == NodeSelection ); @@ -3555,13 +3680,11 @@ void SMESHGUI_FilterDlg::selectInViewer (const int theType, const QList& th } // Clear selection - SMESH_Actor* anActor = SMESH::FindActorByObject(myMesh); - if (!anActor || !anActor->hasIO()) + SMESH_Actor* anActor = getActor(); + if ( !anActor || !anActor->hasIO() ) return; Handle(SALOME_InteractiveObject) anIO = anActor->getIO(); - //mySelectionMgr->clearSelected(); - //mySelectionMgr->AddIObject(anIO, false); SALOME_ListIO aList; aList.Append(anIO); mySelectionMgr->setSelectedObjects(aList, false); @@ -3635,10 +3758,10 @@ void SMESHGUI_FilterDlg::onSelectionDone() const int type = myTable->GetCriterionType(aRow); QList types; - types << SMESH::FT_BelongToGeom << SMESH::FT_BelongToPlane - << SMESH::FT_BelongToCylinder << SMESH::FT_BelongToGenSurface - << SMESH::FT_LyingOnGeom << SMESH::FT_CoplanarFaces - << SMESH::FT_ConnectedElements; + types << SMESH::FT_BelongToGeom << SMESH::FT_BelongToPlane + << SMESH::FT_BelongToCylinder << SMESH::FT_BelongToGenSurface + << SMESH::FT_LyingOnGeom << SMESH::FT_CoplanarFaces + << SMESH::FT_ConnectedElements << SMESH::FT_BelongToMeshGroup; if ( !types.contains( type )) return; @@ -3670,13 +3793,31 @@ void SMESHGUI_FilterDlg::onSelectionDone() } break; } + case SMESH::FT_BelongToMeshGroup: // get a group Name and Entry + { + SMESH::SMESH_GroupBase_var grp = SMESH::IObjectToInterface(anIO); + if ( !grp->_is_nil() ) + { + if ( !myMesh->_is_nil() ) + { + SMESH::SMESH_Mesh_var mesh = grp->GetMesh(); + if ( ! myMesh->_is_equivalent( mesh )) + return; + } + if ( !myGroup->_is_nil() && myGroup->IsInDependency( grp )) + return; // avoid cyclic dependencies between Groups on Filter + + myTable->SetThreshold(aRow, SMESH::toQStr( grp->GetName() )); + myTable->SetID (aRow, anIO->getEntry() ); + } + } default: // get a GEOM object { GEOM::GEOM_Object_var anObj = SMESH::IObjectToInterface(anIO); if (!anObj->_is_nil()) { myTable->SetThreshold(aRow, GEOMBase::GetName(anObj)); - myTable->SetID(aRow, anIO->getEntry()); + myTable->SetID (aRow, anIO->getEntry()); } } } @@ -3761,6 +3902,23 @@ void SMESHGUI_FilterDlg::updateSelection() myIsSelectionChanged = true; } + else if ( aCriterionType == SMESH::FT_BelongToMeshGroup ) + { + SMESH_TypeFilter* typeFilter = 0; + switch ( myTable->GetType() ) + { + case SMESH::NODE : typeFilter = new SMESH_TypeFilter( SMESH::GROUP_NODE ); break; + case SMESH::ELEM0D : typeFilter = new SMESH_TypeFilter( SMESH::GROUP_0D ); break; + case SMESH::BALL : typeFilter = new SMESH_TypeFilter( SMESH::GROUP_BALL ); break; + case SMESH::EDGE : typeFilter = new SMESH_TypeFilter( SMESH::GROUP_EDGE ); break; + case SMESH::FACE : typeFilter = new SMESH_TypeFilter( SMESH::GROUP_FACE ); break; + case SMESH::VOLUME : typeFilter = new SMESH_TypeFilter( SMESH::GROUP_VOLUME ); break; + case SMESH::ALL : typeFilter = new SMESH_TypeFilter( SMESH::GROUP ); break; + default : typeFilter = 0; + } + if ( typeFilter ) + mySelectionMgr->installFilter( typeFilter ); + } else if ( aCriterionType == SMESH::FT_ConnectedElements ) { QList fList;