X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_FilterDlg.cxx;h=8db0a78141b2dac70528ed0d9926c16e7c5537e5;hb=a00f90ebab08741cc788e1d9c50a87e847cff142;hp=07f8a30a5cb2a966b399583e6d9c5976f109111b;hpb=0e9e37a6e8de402a037afc791e83691f7fb80bf4;p=modules%2Fsmesh.git diff --git a/src/SMESHGUI/SMESHGUI_FilterDlg.cxx b/src/SMESHGUI/SMESHGUI_FilterDlg.cxx index 07f8a30a5..8db0a7814 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-2014 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 @@ -51,6 +51,7 @@ #include #include #include +#include #include #include @@ -61,8 +62,6 @@ #include #include -#include -#include #include @@ -1148,7 +1147,7 @@ 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(); @@ -1158,10 +1157,6 @@ bool SMESHGUI_FilterTable::IsValid (const bool theMess, const int theEntityType) 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()) { @@ -1569,7 +1564,8 @@ void SMESHGUI_FilterTable::updateAdditionalWidget() aCriterion != SMESH::FT_OverConstrainedFace && aCriterion != SMESH::FT_OverConstrainedVolume) || - aCriterion == SMESH::FT_CoplanarFaces); + aCriterion == SMESH::FT_CoplanarFaces || + aCriterion == SMESH::FT_EqualNodes); if (!myAddWidgets.contains(anItem)) { @@ -1608,6 +1604,7 @@ const char* SMESHGUI_FilterTable::getPrecision( const int aType ) case SMESH::FT_Length2D: case SMESH::FT_MaxElementLength2D: case SMESH::FT_MaxElementLength3D: + case SMESH::FT_BallDiameter: retval = "length_precision"; break; case SMESH::FT_Volume3D: retval = "vol_precision"; break; @@ -1765,184 +1762,224 @@ void SMESHGUI_FilterTable::onCriterionChanged (const int row, const int col, con Table* aTable = myTables[ aType ]; ComboItem* aCompareItem = (ComboItem*)aTable->item(row, 1); - int aCriterionType = GetCriterionType(row); + // find out type of a existing threshould table item QtxColorButton* clrBtn = qobject_cast(aTable->cellWidget(row, 2)); - int aComboType = ComboItem::Type(); - int aIntSpinType = IntSpinItem::Type(); - int aDoubleSpinType = DoubleSpinItem::Type(); - QTableWidgetItem* aTableItem = aTable->item(row, 2); - bool isComboItem = false; - bool isIntSpinItem = false; - bool isDoubleSpinItem = false; - if (aTableItem) { - int aTableType = aTable->item(row, 2)->type(); - isComboItem = ( aTableType == aComboType ); - isIntSpinItem = ( aTableType == aIntSpinType ); - isDoubleSpinItem = ( aTableType == aDoubleSpinType ); + bool isComboItem = false; + bool isIntSpinItem = false; + bool isDoubleSpinItem = false; + if ( QTableWidgetItem* aTableItem = aTable->item(row, 2) ) + { + int aTableType = aTableItem->type(); + isComboItem = ( aTableType == ComboItem::Type() ); + isIntSpinItem = ( aTableType == IntSpinItem::Type() ); + isDoubleSpinItem = ( aTableType == DoubleSpinItem::Type() ); + } + + // find out a type of item required by a new criterion and other table features + 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 + bool isThresholdEditable = false; // actual for "simple" item types + switch ( aCriterionType ) + { + case SMESH::FT_AspectRatio: + case SMESH::FT_AspectRatio3D: + case SMESH::FT_Warping: + case SMESH::FT_MinimumAngle: + case SMESH::FT_Taper: + case SMESH::FT_Skew: + case SMESH::FT_Area: + case SMESH::FT_Volume3D: + case SMESH::FT_MaxElementLength2D: + case SMESH::FT_MaxElementLength3D: + anIsDoubleCriterion = true; break; + + case SMESH::FT_FreeBorders: + case SMESH::FT_FreeEdges: + case SMESH::FT_FreeNodes: + case SMESH::FT_FreeFaces: + case SMESH::FT_EqualNodes: + case SMESH::FT_EqualEdges: + case SMESH::FT_EqualFaces: + case SMESH::FT_EqualVolumes: break; + + case SMESH::FT_MultiConnection: + case SMESH::FT_MultiConnection2D: anIsIntCriterion = true; nbCompareSigns = 3; break; + + case SMESH::FT_Length: + case SMESH::FT_Length2D: anIsDoubleCriterion = true; 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_RangeOfIds: nbCompareSigns = 1; isThresholdEditable = true; break; + + case SMESH::FT_BadOrientedVolume: + case SMESH::FT_BareBorderVolume: + case SMESH::FT_BareBorderFace: + case SMESH::FT_OverConstrainedVolume: + case SMESH::FT_OverConstrainedFace: + case SMESH::FT_LinearOrQuadratic: break; + + case SMESH::FT_GroupColor: nbCompareSigns = 1; isThresholdEditable = true; break; + + case SMESH::FT_ElemGeomType: + comboIDs = geomTypes( aType ); anIsComboCriterion = true; nbCompareSigns = 1; break; + + case SMESH::FT_EntityType: + comboIDs = entityTypes( aType ); anIsComboCriterion = true; nbCompareSigns = 1; break; + + case SMESH::FT_CoplanarFaces: isThresholdEditable = true; break; + + case SMESH::FT_BallDiameter: anIsDoubleCriterion = true; break; + + case SMESH::FT_ConnectedElements: isThresholdEditable = true; break; + + case SMESH::FT_LessThan: + case SMESH::FT_MoreThan: + case SMESH::FT_EqualTo: + case SMESH::FT_LogicalNOT: + case SMESH::FT_LogicalAND: + case SMESH::FT_LogicalOR: + case SMESH::FT_Undefined: + default: return; } - - bool anIsDoubleCriterion = - aCriterionType == SMESH::FT_AspectRatio || - aCriterionType == SMESH::FT_AspectRatio3D || - aCriterionType == SMESH::FT_Taper || - aCriterionType == SMESH::FT_Warping || - aCriterionType == SMESH::FT_MinimumAngle || - aCriterionType == SMESH::FT_Skew || - aCriterionType == SMESH::FT_Area || - aCriterionType == SMESH::FT_Length || - aCriterionType == SMESH::FT_Length2D || - aCriterionType == SMESH::FT_MaxElementLength2D || - aCriterionType == SMESH::FT_MaxElementLength3D || - aCriterionType == SMESH::FT_Volume3D || - aCriterionType == SMESH::FT_EntityType; + + // get a precision of a double criterion int aPrecision = 0; if ( anIsDoubleCriterion ) { - const char* aPrecisionType = getPrecision( aCriterionType ); + const char* aPrecisionType = getPrecision( aCriterionType ); SUIT_ResourceMgr* aResourceMgr = SMESH::GetResourceMgr( mySMESHGUI ); if( aPrecisionType && aResourceMgr ) aPrecision = aResourceMgr->integerValue( "SMESH", aPrecisionType, aPrecision ); } - // if the precision is to be changed we should remove the existing - // spin item and create another one with new precision - bool anIsPrecisionChanged = false; - if ( anIsDoubleCriterion && isDoubleSpinItem ) { - if ( DoubleSpinItem* aDoubleSpinItem = dynamic_cast( aTable->item( row, 2 ) ) ) { - anIsPrecisionChanged = aDoubleSpinItem->precision() != aPrecision; + // check if the current item type satisfies the criterion + bool itemTypeKO = + ( aCriterionType == SMESH::FT_GroupColor && !clrBtn) || + ( anIsComboCriterion && !isComboItem ) || + ( anIsIntCriterion && !isIntSpinItem ) || + ( anIsDoubleCriterion && !isDoubleSpinItem ); + + if ( !itemTypeKO ) + { + if ( anIsDoubleCriterion ) + { + // if the precision is to be changed we should remove the existing + // spin item and create another one with new precision + if ( DoubleSpinItem* aDoubleSpinItem = dynamic_cast( aTable->item( row, 2 ))) + itemTypeKO = ( aDoubleSpinItem->precision() != aPrecision ); + else + itemTypeKO = true; + } + else if ( anIsComboCriterion ) + { + if ( ComboItem* aComboItem = dynamic_cast( aTable->item( row, 2 ))) + itemTypeKO = ( aComboItem->count() != comboIDs.count() ); + else + itemTypeKO = true; + } + else if ( !anIsIntCriterion && aCriterionType != SMESH::FT_GroupColor ) + { + itemTypeKO = ( clrBtn || isComboItem || isIntSpinItem || isDoubleSpinItem ); } } - if ( (aCriterionType != SMESH::FT_GroupColor && clrBtn) || - (aCriterionType != SMESH::FT_ElemGeomType && isComboItem) || - (aCriterionType != SMESH::FT_EntityType && isComboItem) || - (aCriterionType != SMESH::FT_MultiConnection && isIntSpinItem) || - (!anIsDoubleCriterion && isDoubleSpinItem) || - anIsPrecisionChanged ) + // update the table row + + bool isSignalsBlocked = aTable->signalsBlocked(); + aTable->blockSignals( true ); + + // update threshold table item + if ( itemTypeKO ) { - bool isSignalsBlocked = aTable->signalsBlocked(); - aTable->blockSignals( true ); aTable->removeCellWidget( row, 2 ); - aTable->setItem( row, 2, new QTableWidgetItem() ); - aTable->blockSignals( isSignalsBlocked ); - } - if ( (aCriterionType == SMESH::FT_GroupColor && !clrBtn) || - (aCriterionType == SMESH::FT_ElemGeomType && !isComboItem) || - (aCriterionType == SMESH::FT_EntityType && !isComboItem) || - (aCriterionType == SMESH::FT_MultiConnection && !isIntSpinItem) || - (anIsDoubleCriterion && !isDoubleSpinItem) || - anIsPrecisionChanged ) - { - bool isSignalsBlocked = aTable->signalsBlocked(); - aTable->blockSignals( true ); - if ( aCriterionType == SMESH::FT_GroupColor ) + + if ( aCriterionType == SMESH::FT_GroupColor ) // ---------------------- QtxColorButton + { aTable->setCellWidget( row, 2, new QtxColorButton( aTable ) ); - else if ( aCriterionType == SMESH::FT_ElemGeomType ) { - QList typeIds = geomTypes( aType ); - QMap typeNames; - QList::const_iterator anIter = typeIds.begin(); - for ( int i = 0; anIter != typeIds.end(); ++anIter, ++i) - { - QString typeKey = QString( "GEOM_TYPE_%1" ).arg( *anIter ); - typeNames[ *anIter ] = tr( typeKey.toLatin1().data() ); - } - ComboItem* typeBox = new ComboItem( typeNames ); - aTable->setItem( row, 2, typeBox ); - } - else if ( aCriterionType == SMESH::FT_EntityType ) { - QList typeIds = entityTypes( aType ); - QMap typeNames; - QList::const_iterator anIter = typeIds.begin(); - for ( int i = 0; anIter != typeIds.end(); ++anIter, ++i) + } + else if ( anIsComboCriterion ) // -------------------------------------------ComboItem + { + QString msgPrefix + ( aCriterionType == SMESH::FT_ElemGeomType ? "GEOM_TYPE_%1" : "ENTITY_TYPE_%1" ); + QMap names; + QList::const_iterator id = comboIDs.begin(); + for ( ; id != comboIDs.end(); ++id ) { - QString typeKey = QString( "ENTITY_TYPE_%1" ).arg( *anIter ); - typeNames[ *anIter ] = tr( typeKey.toLatin1().data() ); + QString name = msgPrefix.arg( *id ); + names[ *id ] = tr( name.toLatin1().data() ); } - ComboItem* typeBox = new ComboItem( typeNames ); - aTable->setItem( row, 2, typeBox ); + ComboItem* comboBox = new ComboItem( names ); + aTable->setItem( row, 2, comboBox ); } - else if ( aCriterionType == SMESH::FT_MultiConnection ) { + else if ( anIsIntCriterion ) // ------------------------------------------ IntSpinItem + { IntSpinItem* intSpin = new IntSpinItem( 0 ); aTable->setItem( row, 2, intSpin ); } - else if ( anIsDoubleCriterion ) { + else if ( anIsDoubleCriterion ) // -------------------------------------DoubleSpinItem + { DoubleSpinItem* dblSpin = new DoubleSpinItem( 0 ); dblSpin->setPrecision( aPrecision ); aTable->setItem( row, 2, dblSpin ); } - aTable->blockSignals( isSignalsBlocked ); - } - - // set Compare and enable/desable Threshold - if ((aType == SMESH::NODE && (aCriterionType == SMESH::FT_FreeNodes || - aCriterionType == SMESH::FT_EqualNodes )) || - (aType == SMESH::EDGE && (aCriterionType == SMESH::FT_FreeBorders || - aCriterionType == SMESH::FT_EqualEdges )) || - (aType == SMESH::FACE && (aCriterionType == SMESH::FT_BareBorderFace || - aCriterionType == SMESH::FT_OverConstrainedFace || - aCriterionType == SMESH::FT_FreeEdges || - aCriterionType == SMESH::FT_FreeFaces || - aCriterionType == SMESH::FT_EqualFaces)) || - (aType == SMESH::VOLUME && (aCriterionType == SMESH::FT_BadOrientedVolume || - aCriterionType == SMESH::FT_OverConstrainedVolume || - aCriterionType == SMESH::FT_BareBorderVolume || - aCriterionType == SMESH::FT_EqualVolumes )) || - aCriterionType == SMESH::FT_LinearOrQuadratic || - aCriterionType == SMESH::FT_CoplanarFaces || - aCriterionType == SMESH::FT_ConnectedElements - ) - { - // - No compare - bool isSignalsBlocked = aTable->signalsBlocked(); - aTable->blockSignals( true ); - - if (aCompareItem->count() > 0) - aCompareItem->clear(); - aTable->setEditable(false, row, 1); - // - Threshold is NOT editable for most of criteria - aTable->item(row, 2)->setText( QString("") ); - aTable->setEditable(( aCriterionType == SMESH::FT_ConnectedElements || - aCriterionType == SMESH::FT_CoplanarFaces ), row, 2); - aTable->blockSignals( isSignalsBlocked ); - } - else if (aCriterionType == SMESH::FT_RangeOfIds || - aCriterionType == SMESH::FT_GroupColor || - aCriterionType == SMESH::FT_ElemGeomType || - aCriterionType == SMESH::FT_EntityType || - aCriterionType == SMESH::FT_BelongToGeom || - aCriterionType == SMESH::FT_BelongToPlane || - aCriterionType == SMESH::FT_BelongToCylinder || - aCriterionType == SMESH::FT_BelongToGenSurface || - aCriterionType == SMESH::FT_LyingOnGeom) - { - // - EQUAL_TO compare ONLY - QMap aMap; - aMap[ SMESH::FT_EqualTo ] = tr("EQUAL_TO"); - aCompareItem->setItems(aMap); - // if (!aTable->isEditable(row, 2)) - aTable->setEditable(false, row, 1); - // - Threshold is editable - if (!aTable->isEditable(row, 2)) - aTable->setEditable(true, row, 2); + else // --------------------------------------------------------------QTableWidgetItem + { + aTable->setItem( row, 2, new QTableWidgetItem() ); + } } - else + + // set Compare + if ( anIsDoubleCriterion ) + nbCompareSigns = 3; + if ( aCompareItem->count() != nbCompareSigns ) { - // All compare signs - if (aCompareItem && aCompareItem->count() != 3) - { + switch ( nbCompareSigns ) { + case 0: { + aCompareItem->clear(); + break; + } + case 1: { + QMap aMap; + aMap[ SMESH::FT_EqualTo ] = tr("EQUAL_TO"); + aCompareItem->setItems(aMap); + break; + } + case 3: { + int oldValue = aCompareItem->value(); aCompareItem->setItems(getCompare()); + if ( oldValue >= 0 ) + aCompareItem->setValue( oldValue ); + break; } - // Threshold is editable - if (aTable->item( row, 2 )) { - QString aText = aTable->text(row, 2); - bool isOk = false; - aText.toDouble(&isOk); - aTable->item( row, 2 )->setText(isOk ? aText : QString("")); - if (!aTable->isEditable(row, 1)) - aTable->setEditable(true, row, 1); - if (!aTable->isEditable(row, 2)) - aTable->setEditable(true, row, 2); } } + aTable->setEditable( nbCompareSigns == 3, row, 1); + + // enable/desable Threshold + if ( aCriterionType == SMESH::FT_GroupColor || + anIsComboCriterion || + anIsIntCriterion || + anIsDoubleCriterion ) + { + isThresholdEditable = true; + } + if ( !isThresholdEditable ) + { + aTable->setItem( row, 2, new QTableWidgetItem() ); + } + aTable->setEditable( isThresholdEditable, row, 2); + + + aTable->blockSignals( isSignalsBlocked ); updateAdditionalWidget(); @@ -2618,7 +2655,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(); @@ -2635,7 +2674,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(); @@ -2694,6 +2735,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); @@ -3179,6 +3221,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 @@ -3232,6 +3289,7 @@ bool SMESHGUI_FilterDlg::onApply() if (!isValid()) return false; + SUIT_OverrideCursor wc; try { int aCurrType = myTable->GetType(); @@ -3292,6 +3350,8 @@ bool SMESHGUI_FilterDlg::createFilter (const int theType) aCriteria[ i ] = aCriterion; } + if ( !myFilter[ theType ]->_is_nil() ) + myFilter[ theType ]->UnRegister(); myFilter[ theType ] = aFilterMgr->CreateFilter(); myFilter[ theType ]->SetCriteria(aCriteria.inout()); @@ -3325,9 +3385,29 @@ SMESH::Filter_var SMESHGUI_FilterDlg::GetFilter() const void SMESHGUI_FilterDlg::SetFilter(SMESH::Filter_var filter, int type) { + if ( !filter->_is_nil() ) + filter->Register(); + if ( !myFilter[ type ]->_is_nil() ) + myFilter[ type ]->UnRegister(); + myFilter[ type ] = filter; } +//================================================================================ +/*! + * \brief call UnRegister() for myFilter's + */ +//================================================================================ + +void SMESHGUI_FilterDlg::UnRegisterFilters() +{ + QMap< int, SMESH::Filter_var >::iterator i_f = myFilter.begin(); + for ( ; i_f != myFilter.end(); ++i_f ) + if ( !i_f.value()->_is_nil() ) + i_f.value()->UnRegister(); + myFilter.clear(); +} + //======================================================================= // name : SMESHGUI_FilterDlg::insertFilterInViewer // Purpose : Insert filter in viewer @@ -3338,8 +3418,10 @@ void SMESHGUI_FilterDlg::insertFilterInViewer() 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 { @@ -3364,7 +3446,7 @@ void SMESHGUI_FilterDlg::filterSource (const int theType, int aSourceId = mySourceGrp->checkedId(); - if (aSourceId == Mesh) + if (aSourceId == Mesh || !myDiffSourcesEnabled ) { if (myMesh->_is_nil()) return;