Salome HOME
0021014: EDF 1583 SMESH: Improvement of the Python Dump for the creation of groups
authoreap <eap@opencascade.com>
Thu, 23 Jun 2011 12:39:01 +0000 (12:39 +0000)
committereap <eap@opencascade.com>
Thu, 23 Jun 2011 12:39:01 +0000 (12:39 +0000)
  To create/edit SMESH_GroupOnFilter

12 files changed:
doc/salome/gui/SMESH/images/a-creategroup.png
doc/salome/gui/SMESH/images/creategroup.png
doc/salome/gui/SMESH/images/creategroup_on_filter.png [new file with mode: 0644]
doc/salome/gui/SMESH/images/editgroup.png
doc/salome/gui/SMESH/input/creating_groups.doc
doc/salome/gui/SMESH/input/editing_groups.doc
doc/salome/gui/SMESH/input/grouping_elements.doc
doc/salome/gui/SMESH/input/selection_filter_library.doc
doc/salome/gui/SMESH/input/tui_grouping_elements.doc
src/SMESHGUI/SMESHGUI_GroupDlg.cxx
src/SMESHGUI/SMESHGUI_GroupDlg.h
src/SMESHGUI/SMESH_msg_en.ts

index d23ee825da4c9dee936278d595c11ce0bf42a288..ee2b6baa4caad954d7152eddcc330c7016684ecd 100755 (executable)
Binary files a/doc/salome/gui/SMESH/images/a-creategroup.png and b/doc/salome/gui/SMESH/images/a-creategroup.png differ
index eefc9e2755c01617a73b93c5b343f1a4cb7a02f7..ec24a4feda84816946bebe69c6b4f02441fa5c7f 100755 (executable)
Binary files a/doc/salome/gui/SMESH/images/creategroup.png and b/doc/salome/gui/SMESH/images/creategroup.png differ
diff --git a/doc/salome/gui/SMESH/images/creategroup_on_filter.png b/doc/salome/gui/SMESH/images/creategroup_on_filter.png
new file mode 100644 (file)
index 0000000..0a494c0
Binary files /dev/null and b/doc/salome/gui/SMESH/images/creategroup_on_filter.png differ
index 2d8cb8dd0caea60ca2b932cd7cb922862a73af85..fb102242e2924ca975ee51b365be98b424c56174 100755 (executable)
Binary files a/doc/salome/gui/SMESH/images/editgroup.png and b/doc/salome/gui/SMESH/images/editgroup.png differ
index 85d633a22234080bce7e9977b990d579c1b15c5d..de0953a5592fc06c5383ce201f35b2517da7c783 100644 (file)
@@ -2,12 +2,13 @@
 
 \page creating_groups_page Creating groups
 
-\n In MESH you can create groups of elements of different types. To
-create a group of elements in the \b Mesh menu select <b>Create
-Group</b>.
-\n To create any group you should define the following:
+\n In MESH you can create groups of elements of a certain type whose
+contents is defined in different ways. To create a group, in the \b
+Mesh menu select <b>Create Group</b> item (also available in the
+contextual menu of the mesh).<br> 
+To create a group of any type you should define the following: 
 <ul>
-<li><b>Mesh</b> - the name of the mesh whose elements will form your
+<li><b>Mesh</b> - the mesh whose elements will form your
 group. You can select your mesh in the Objet Browser or in the 3D
 viewer.</li>
 <li><b>Elements Type</b> - set of radio buttons allows to select the type of
@@ -19,86 +20,122 @@ elements which will form your group:</li>
 <li><b>Volumes</b></li>
 </ul>
 <li><b>Name</b> field allows to enter the name of your new group.</li>
+<li><b>Color</b> - allows to assign to the group a certain color, for
+example, defining boundary conditions. The chosen color is used to
+display the elements of the group. The color attribute of the group is
+not persistent, it is lost if you save and then load the study from
+the file.</li>
 </ul>
-SALOME Platform distinguishes between the two Group types:
-<b>Standalone Group</b> and <b>Group on Geometry</b>.
+SALOME Platform distinguishes between the three Group types:
+<b>Standalone Group</b>, <b>Group on Geometry</b> and <b>Group on Filter</b>.
 
 \anchor standalone_group <br><h2>"Standalone Group"</h2>
 
-<b>Standalone Group</b> consists of mesh elements, which you can define in
+<b>Standalone Group</b> contains a list of mesh elements, which you can define in
 the following ways:
 <ul>
-<li>Choosing them manually with the mouse in the 3D Viewer. You can
-click on an element in the 3D viewer and it will be highlighted. After
-that click the \b Add button and the ID of this element will be added to
-the list.</li>
-<li>Applying Filters. The <b>Set filter</b> button allows to apply a
-definite filter to selection of the elements of your group. See more
-about filters on the
-\ref selection_filter_library_page "Selection filter library" page.</li>
-<li>By adding all existing entities of the chosen type to the
-group. For this turn on the <b>Select All</b> check box. In this
-mode all controls, which allow selecting the entities manually or by filters, are disabled.</li>
+<li>By adding all entities of the chosen type existing in the
+  mesh. For this, turn on the <b>Select All</b> check box. In this mode
+  all controls, which allow selecting the entities in other ways are
+  disabled.</li>
+<li>By applying the Filter. The <b>Set filter</b> button allows to
+  define the filter for selection of the elements for your group. See more
+  about filters on the 
+  \ref selection_filter_library_page "Selection filter library" page.<br>
+  If the <b>Enable manual edition</b> check box is turned off, the defined
+  filter defines contents of the group. In this mode, the filter is
+  applied to all elements of the mesh. If none entity satisfies the
+  filter, the \b Apply button is disabled.<br>
+  If the <b>Enable manual edition</b> check box is turned on, the defined
+  filter can be used to for selection of entities composing the group.</li>
+<li>By choosing entities manually with the mouse in the 3D Viewer. For
+  this, turn on the <b>Enable manual edition</b> check box. You can
+  click on an element in the 3D viewer and it will be highlighted. After
+  that click the \b Add button and the ID of this element will be
+  added to the list.</li>
+<li>By adding entities from either a submesh or an existing
+  group.  For this, turn on the <b>Enable manual edition</b> check
+  box. <b>Select from</b> set of fields allows to select a submesh or
+  a group of an appropriate type.</li>
+</ul>
+In the <b>manual edition</b> mode you can
+<ul>
+<li>click the \b Remove button to remove selected elements from the list</li>
+<li>click the <b>Sort List</b> button to sort the list of IDs of 
+mesh elements.</li>
 </ul>
-To remove a selected element or elements from the list click the
-\b Remove button. The <b>Sort List</b> button allows to sort the list of IDs of
-mesh elements.
-\n <b>Select from</b> set of fields allows to choose a submesh or an existing
-group whose elements of the previously defined type will be added to
-the list of elements which will form the new group.
-\n <b>Color</b> - allows to assign to the group a certain color, for
-example, defining boundary conditions. This feature introduces a
-useful element of preprocessing in Mesh module. Note that <b>Color</b> attribute defines
-the colors used for the display of the elements of the group. 
-\n <b>Warning</b> The Med Color group interface may change in future versions of Salome.
 
 \image html creategroup.png
 
-For example, to create a new group containing all entities of the
+
+For example, to create a new group containing all faces of an
 existing group and some other faces selected in the viewer:
 <ul>
-<li> select the "Face" type of entities and input the name of the new group.</li>
-<li> checks "Group" checkbox in "Select From" group.</li>
-<li> select the existing group in the object browser or in the viewer.</li>
-<li> click "Add" in "Content" group. "Id Elements" list will be filled
+<li> Select the \b Face type of entities and input the name of the new group.</li>
+<li> Check the \b Group checkbox in <b>Select From</b> group.</li>
+<li> Select the existing group of faces in the object browser or in the viewer</li>
+<li> Click \b Add in \b Content group. <b>Id Elements</b> list will be filled
 with IDs of faces belonging to the exising group.</li>
-<li> select other faces in the viewer.</li>
-<li> click "Apply" button to create the new group.</li>
+<li> Select other faces in the viewer.</li>
+<li> Click \b Add in \b Content group.</li>
+<li> Click \b Apply button to create the new group.</li>
 </ul>
 
 Please note that the new group does not have references to the source
-group. It contains only the list of face IDs. So if the old group will
-be changed, the new one will not be modified.
+group. It contains only the list of face IDs. So if the source group
+is changed, the new one is not updated accordingly.
 
 
 \image html image130.gif
-<center>In this picture the brown cells belong to a group defined manually.</center>
+<center>In this picture the brown cells belong to a group defined
+  manually.</center> 
 
 \image html image131.gif
-<center>In this picture the brown cells belong to the group defined by the criterion 
-<b>Taper > 0</b>.</center>
+<center>In this picture the brown cells belong to the group defined by
+  the criterion <b>Taper > 0</b>.</center>
 
 <b>See Also</b> a sample TUI Script of a 
 \ref tui_create_standalone_group "Create a Standalone Group"
 operation.  
 
+
 \anchor group_on_geom <br><h2>"Group on Geometry"</h2>
 
-To create a group on geometry check <b>Group on geometry</b> in the \b Group
-\b type field. <b>Group on geometry</b> contains the elements of a certain type
-belonging to the selected geometrical object. To define a group select
-in the Objet Browser or in the 3D viewer a geometrical object from
-which the elements will be taken. After confirmation of the operation
-a new group of mesh elements will be created.
+To create a group on geometry check <b>Group on geometry</b> in the \b
+Group \b type field. The group on geometry contains the elements
+of a certain type generated on the selected geometrical object. Group
+contents is dynamically updated if the mesh is modified.<br>
+To define a group, select in the Objet Browser or in the 3D viewer a
+geometrical object from which the elements will be taken. After
+confirmation of the operation a new group of mesh elements will be
+created.
 
 \image html a-creategroup.png
 
 \image html image132.gif
-<center>In this picture the cells which belong to a certain face are
-selected in green.</center>
+<center>In this picture the cells which belong to a certain
+  geometrical face are selected in green.</center>
 
 <b>See Also</b> a sample TUI Script of a 
 \ref tui_create_group_on_geometry "Create a Group on Geometry"
 operation.
 
+
+
+\anchor group_on_filter <br><h2>"Group on Filter"</h2>
+
+To create a group on filter check <b>Group on filter</b> in the <b>
+Group type</b> field. The group on filter contains the elements
+of a certain type satisfying the defined filter. Group contents is
+dynamically updated if the mesh is modified.<br> To define a group,
+click the <b>Set filter</b> button and define criteria of the
+filter in the opened dialog. After confirmation of the operation a
+new group of mesh elements will be created. See more about filters on
+the \ref selection_filter_library_page "Selection filter library" page.
+
+\image html creategroup_on_filter.png
+
+<b>See Also</b> a sample TUI Script of a 
+\ref tui_create_group_on_filter "Create a Group on Filter" operation.
+
 */
index d255c3f82fe968e99da1d0d3679b1fb88760c541..d59bdcb1045a43e2c17e7cd0f6050030e590fc85 100644 (file)
@@ -14,26 +14,29 @@ The following dialog box will appear:
 
 \image html editgroup.png
 
-In this dialog box you can modify the name of your group and add or
-remove the elements forming it. For more information see 
+In this dialog box you can modify the name and the color of your group
+despite of it's type. You can add or remove the elements forming the
+<em>standalone group</em>. You can change criteria of the filter of
+the <em>group on filter</em>. For more information see
 \ref creating_groups_page "Creating Groups" page.
 
-<li>Click the \b Apply or <b>Apply and Close</b> button to confirm modification of the
-group.</li>
+<li>Click the \b Apply or <b>Apply and Close</b> button to confirm
+modification of the group.</li>
 </ol>
 
 \anchor convert_to_standalone
-<em>To convert an existing group on geometry into standalone group
-of elements and modify:</em>
+<em>To convert an existing group on geometry or a group on filer into
+a standalone group of elements and modify:</em>
 <ol>
-<li>Select your group on geometry in the Object Browser and in the \b Mesh menu click
-the <b>Edit Group as Standalone</b> item.</li>
+<li>Select your group on geometry (or your group on filter) in the
+Object Browser and in the \b Mesh menu click the <b>Edit Group as
+Standalone</b> item.</li> 
 
 \image html image74.gif
 <center><em>"Edit Group as Standalone" button</em></center>
 
-The group on geometry will be converted into standalone group and can
-be modified as group of elements.
+The selected group will be converted into a standalone group and can
+it's contents can be modified.
 
 <li>Click the \b Apply or <b>Apply and Close</b> button to confirm modification of the
 group.</li>
index 3ec4117c4383329d508c535f71feec5d87cd5ca7..8d075463043193c59ed519fcf92e582d058deee7 100644 (file)
@@ -3,24 +3,29 @@
 \page grouping_elements_page Grouping elements
 
 In Mesh module it is possible to create groups of mesh elements:
-nodes, edges, faces or volumes:
+nodes, edges, faces or volumes. One group contains elements of only
+one type. The following ways of creation are possible:
+
 <ul>
-<li> by selecting the elements of the specified kind by their IDs or
-directly on the presentation in the VTK viewer - <b>Standalone
-group</b> tab of \subpage creating_groups_page "Create group"
-dialog.</li>
-<li> by creating a group of elements of the selected type from all
-such elements of the chosen geometrical object - <b>Group on
-geometry</b> tab of  \ref creating_groups_page "Create group" dialog.</li>
-<li> by creating a group including all types of elements from an
-existing geometrical object - using \subpage create_groups_from_geometry_page "Create Groups from Geometry" dialog.</li>
-<li> by creating several groups of elements (nodes,
-edges, faces and volumes) from the chosen submesh - using <b>Mesh -> Construct
-Group</b> Menu item. In this case groups of elements are created
-automatically.</li>
+<li> by selecting the elements using filters and/or
+  directly on the presentation in the VTK viewer, and/or by using
+  elements of other mesh objects - <b>Standalone group</b> tab of 
+  \ref standalone_group "Create group" dialog.</li>
+<li> by creating a group of elements generated on the chosen
+  geometrical object - <b>Group on geometry</b> tab of \ref
+  creating_groups_page "Create group" dialog and \ref
+  create_groups_from_geometry_page "Create Groups from Geometry"
+  dialog.</li>
+<li> by creating a group of elements satisfying to certain critaria -
+  <b>Group on filter</b> tab of \ref creating_groups_page 
+  "Create group" dialog.</li>
+<li> by creating groups of nodes and elements from the chosen submesh
+  (type of elements depends on dimension of submesh geometry) -
+  using <b>Mesh -> Construct Group</b> menu item (available in contextual
+  menu as well).</li>
 <li> by creating groups of entities from existing groups of superior
-dimensions - using \subpage group_of_underlying_elements_page "Create Group of Underlying Elements"
-dialog.</li>
+  dimensions - using \subpage group_of_underlying_elements_page
+  "Create Group of Underlying Elements" dialog.</li>
 </ul>
 
 
index 9657f4c0df3266604ef54216055b7c2ebede66a6..823643d80defc1d75404b75882ff2b23ad0dd65d 100644 (file)
@@ -9,8 +9,8 @@ via <b>Tools / Selection filter library</b>.
 \image html selectionfilterlibrary.png
 
 <b>Library file name</b> shows the path and the file name where your
-filters will be stored. By clicking the <em>Browse</em> button you can load an
-existing filter library.
+filters will be stored. By clicking the <em>Browse</em> button you can
+load an existing filter library.
 \n <b>Names of filters</b> lists the filters created or uploaded for
 the current study. You can \b Add or \b Delete filters.
 \n In <b>Filter name</b> box you can specify the name for your
@@ -31,18 +31,28 @@ specify logical relations between criteria using \b Binary operators
 Or and And.
 \n Some criteria should have the additional parameter of \b Tolerance.
 
-When we create a <b>Standalone Group</b> using filters (for this click
-<b>Set Filters</b> button in the <b>Create Group</b> menu), the menu
-for setting filters looks a bit differently. Toggling <b>Insert filter
-in viewer</b> checkbox enables to preview the group selected with your
-current filter in the viewer.
-\n In the \b Source field you choose if the filter will be applied to
-the whole \b Mesh, the <b>Initial Selection</b> or the <b>Current Group</b>. 
-\n <b>Copy from...</b> button gives you a possibility to load an
+When we create a group using filters (for this click
+<b>Set Filters</b> button in the <b>Create Group</b> dialog), the menu
+for setting filters looks a bit differently (see below). Switching
+on <b>Insert filter in viewer</b> checkbox limits selection of elements
+in the Viewer using your current filter.
+<br>
+In the \b Source field you choose if the filter will be applied to
+the whole \b Mesh, the <b>Initial Selection</b> or the <b>Current
+Group</b>. If \b Mesh is chosen, the elements satisfying the filter
+will be selected in the 3D Viewer. If <b> Initial Selection</b> is
+chosen, the filter will be applied to the selected elements and the
+elements rejected by the filter will be deseleced. If <b>Current
+Group</b> is chosen, the filter will be applied to the list of
+elements in the <em>Greate Croup</em> dialog and the elements rejected
+by the filter will be removed from the list.
+<br>
+<b>Copy from...</b> button gives you a possibility to load an
 existing filter from <b>Selection filter library</b> and <b>Add
 to...</b> button gives you a possibility to save your current filter
 in the Library.
-\n <b>Note:</b> If the button <b>Apply and Close</b> is disabled, there
+<br>
+<b>Note:</b> If the button <b>Apply and Close</b> is disabled, there
 is no selected mesh in the Object Browser and the filter can not be
 created. You have to select the mesh and the button will be enabled.
 
index 1aa73a4846b3502e1c76c92a7c13e842f958b7db..a163d13f5891cd4f35f334b09c3c447d35c7e665 100644 (file)
@@ -74,6 +74,51 @@ aSmeshGroup2 = quadra.GroupOnGeom(aGeomGroupE)
 salome.sg.updateObjBrowser(1)
 \endcode
 
+<br>
+\anchor tui_create_group_on_filter
+
+<h2>Create a Group on Filter</h2>
+
+\code
+from smesh import *
+SetCurrentStudy(salome.myStudy)
+
+box = geompy.MakeBoxDXDYDZ(10,10,10)
+
+# make a mesh with quadrangles of different area in range [1,16]
+mesh = Mesh(box,"Quad mesh")
+hyp1D = mesh.Segment().StartEndLength( 1, 4 )
+mesh.Quadrangle()
+mesh.Compute()
+
+# create a group on filter selecting faces of medium size
+critaria = [ \
+    GetCriterion(FACE, FT_Area, ">", 1.1, BinaryOp=FT_LogicalAND ),
+    GetCriterion(FACE, FT_Area, "<", 15.0 )
+    ]
+filt = GetFilterFromCriteria( critaria )
+filtGroup = mesh.GroupOnFilter( FACE, "group on filter", filt )
+print "Group on filter conatains %s elemens" % filtGroup.Size()
+
+# group on filter is updated if the mesh is modified
+hyp1D.SetStartLength( 2.5 )
+hyp1D.SetEndLength( 2.5 )
+mesh.Compute()
+print "After mesh change, group on filter conatains %s elemens" % filtGroup.Size()
+
+# set a new filter defining the group
+filt2 = GetFilter( FACE, FT_RangeOfIds, "1-50" )
+filtGroup.SetFilter( filt2 )
+print "With a new filter, group on filter conatains %s elemens" % filtGroup.Size()
+
+# group is updated at modification of the filter
+filt2.SetCriteria( [ GetCriterion( FACE, FT_RangeOfIds, "1-70" )])
+filtIDs3 = filtGroup.GetIDs()
+print "After filter modification, group on filter conatains %s elemens" % filtGroup.Size()
+
+salome.sg.updateObjBrowser(1)
+\endcode
+
 <br>
 \anchor tui_edit_group
 <h2>Edit a Group</h2>
index 3aa9e6abf3c1f6daab763c9a76654d10015ab1c1..eac52ffe464ff8ed896b17b59e3c057914559f1c 100644 (file)
@@ -39,6 +39,7 @@
 #include <SMESH_TypeFilter.hxx>
 #include <SMESH_Actor.h>
 #include <SMESH_ActorUtils.h>
+#include <SMESH_LogicalFilter.hxx>
 
 // SALOME GEOM includes
 #include <GEOMBase.h>
@@ -124,7 +125,8 @@ SMESHGUI_GroupDlg::SMESHGUI_GroupDlg( SMESHGUI* theModule,
     mySelector( SMESH::GetViewWindow( theModule )->GetSelector() ),
     myIsBusy( false ),
     myNameChanged( false ),
-    myIsApplyAndClose( false )
+    myIsApplyAndClose( false ),
+    myNbChangesOfContents(0)
 {
   initDialog( true );
   if ( !theMesh->_is_nil() )
@@ -150,7 +152,8 @@ SMESHGUI_GroupDlg::SMESHGUI_GroupDlg( SMESHGUI* theModule,
     mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ),
     mySelector( SMESH::GetViewWindow( theModule )->GetSelector() ),
     myIsBusy( false ),
-    myNameChanged( false )
+    myNameChanged( false ),
+    myNbChangesOfContents(0) // just not to use uninitialized variable
 {
   initDialog( false );
   if ( !theGroup->_is_nil() )
@@ -237,10 +240,13 @@ void SMESHGUI_GroupDlg::initDialog( bool create)
 
   QRadioButton* rb1 = new QRadioButton( tr( "SMESH_GROUP_STANDALONE" ), aGrpTypeBox );
   QRadioButton* rb2 = new QRadioButton( tr( "SMESH_GROUP_GEOMETRY" ),   aGrpTypeBox );
+  QRadioButton* rb3 = new QRadioButton( tr( "SMESH_GROUP_FILTER" ),     aGrpTypeBox );
   myGrpTypeGroup->addButton( rb1, 0 );
   myGrpTypeGroup->addButton( rb2, 1 );
+  myGrpTypeGroup->addButton( rb3, 2 );
   aGrpTypeBoxLayout->addWidget( rb1 );
   aGrpTypeBoxLayout->addWidget( rb2 );
+  aGrpTypeBoxLayout->addWidget( rb3 );
   aGrpTypeBox->setEnabled( create );
   myGrpTypeId = -1;
 
@@ -248,6 +254,7 @@ void SMESHGUI_GroupDlg::initDialog( bool create)
   myWGStack = new QStackedWidget( this );
   QWidget* wg1 = new QWidget( myWGStack );
   QWidget* wg2 = new QWidget( myWGStack );
+  QWidget* wg3 = new QWidget( myWGStack );
 
   /***************************************************************/
   QGroupBox* aContentBox = new QGroupBox( tr( "SMESH_CONTENT" ), wg1 );
@@ -256,23 +263,25 @@ void SMESHGUI_GroupDlg::initDialog( bool create)
   aContentBoxLayout->setSpacing( SPACING );
 
   mySelectAll = new QCheckBox( tr( "SELECT_ALL" ), aContentBox );
+  myAllowElemsModif = new QCheckBox( tr( "ALLOW_ELEM_LIST_MODIF" ), aContentBox );
 
   myElementsLab = new QLabel( tr( "SMESH_ID_ELEMENTS" ), aContentBox );
   myElements = new QListWidget( aContentBox );
   myElements->setSelectionMode( QListWidget::ExtendedSelection );
 
-  myFilter = new QPushButton( tr( "SMESH_BUT_FILTER" ), aContentBox );
+  myFilterBtn = new QPushButton( tr( "SMESH_BUT_FILTER" ), aContentBox );
   myAddBtn = new QPushButton( tr( "SMESH_BUT_ADD" ), aContentBox );
   myRemoveBtn = new QPushButton( tr( "SMESH_BUT_REMOVE" ), aContentBox );
   mySortBtn = new QPushButton( tr( "SMESH_BUT_SORT" ), aContentBox );
 
-  aContentBoxLayout->addWidget( mySelectAll,   0, 0 );
-  aContentBoxLayout->addWidget( myElementsLab, 1, 0 );
-  aContentBoxLayout->addWidget( myElements,    2, 0, 6, 1 );
-  aContentBoxLayout->addWidget( myFilter,      2, 1 );
-  aContentBoxLayout->addWidget( myAddBtn,      4, 1 );
-  aContentBoxLayout->addWidget( myRemoveBtn,   5, 1 );
-  aContentBoxLayout->addWidget( mySortBtn,     7, 1 );
+  aContentBoxLayout->addWidget( mySelectAll,       0, 0 );
+  aContentBoxLayout->addWidget( myAllowElemsModif, 1, 0 );
+  aContentBoxLayout->addWidget( myFilterBtn,       1, 1 );
+  aContentBoxLayout->addWidget( myElementsLab,     2, 0 );
+  aContentBoxLayout->addWidget( myElements,        3, 0, 6, 1 );
+  aContentBoxLayout->addWidget( myAddBtn,          3, 1 );
+  aContentBoxLayout->addWidget( myRemoveBtn,       4, 1 );
+  aContentBoxLayout->addWidget( mySortBtn,         8, 1 );
 
   aContentBoxLayout->setColumnStretch( 0, 1 );
   aContentBoxLayout->setRowStretch( 3, 1 );
@@ -328,15 +337,24 @@ void SMESHGUI_GroupDlg::initDialog( bool create)
   /***************************************************************/
   QGridLayout* wg2Layout = new QGridLayout( wg2 );
   wg2Layout->setMargin( 0 );
-  wg1Layout->setSpacing( SPACING );
+  wg2Layout->setSpacing( SPACING );
   wg2Layout->addWidget( geomObject,     0, 0 );
   wg2Layout->addWidget( myGeomGroupBtn, 0, 1 );
   wg2Layout->addWidget( myGeomGroupLine,0, 2 );
   wg2Layout->setRowStretch( 1, 5 );
 
+  /***************************************************************/
+  QPushButton * aFilter2 = new QPushButton( tr( "SMESH_BUT_FILTER" ), wg3 );
+  QGridLayout* wg3Layout = new QGridLayout( wg3 );
+  wg3Layout->setMargin( 0 );
+  wg3Layout->setSpacing( SPACING );
+  wg3Layout->addWidget( aFilter2, 0, 0 );
+  wg3Layout->setRowStretch( 1, 5 );
+
   /***************************************************************/
   myWGStack->insertWidget( 0, wg1 );
   myWGStack->insertWidget( 1, wg2 );
+  myWGStack->insertWidget( 2, wg3 );
 
   /***************************************************************/
   QGroupBox* aColorBox = new QGroupBox(tr( "SMESH_SET_COLOR" ), this);
@@ -398,8 +416,10 @@ void SMESHGUI_GroupDlg::initDialog( bool create)
   connect(myName,          SIGNAL(textChanged(const QString&)), this, SLOT(onNameChanged(const QString&)));
   connect(myElements,      SIGNAL(itemSelectionChanged()),      this, SLOT(onListSelectionChanged()));
 
-  connect(myFilter,        SIGNAL(clicked()),     this, SLOT(setFilters()));
+  connect(myFilterBtn,        SIGNAL(clicked()),     this, SLOT(setFilters()));
+  connect(aFilter2,        SIGNAL(clicked()),     this, SLOT(setFilters()));
   connect(mySelectAll,     SIGNAL(toggled(bool)), this, SLOT(onSelectAll()));
+  connect(myAllowElemsModif,SIGNAL(toggled(bool)), this, SLOT(onSelectAll()));
   connect(myAddBtn,        SIGNAL(clicked()),     this, SLOT(onAdd()));
   connect(myRemoveBtn,     SIGNAL(clicked()),     this, SLOT(onRemove()));
   connect(mySortBtn,       SIGNAL(clicked()),     this, SLOT(onSort()));
@@ -423,8 +443,12 @@ void SMESHGUI_GroupDlg::initDialog( bool create)
 
   mySelectionMode = grpNoSelection;
   myMeshFilter = new SMESH_TypeFilter(MESH);
-  mySubMeshFilter = new SMESH_TypeFilter(SUBMESH);
-  myGroupFilter = new SMESH_TypeFilter(GROUP);
+  mySubMeshFilter = new SMESH_LogicalFilter(QList<SUIT_SelectionFilter*>(),
+                                            SMESH_LogicalFilter::LO_OR,
+                                            /*takeOwnership=*/true);
+  myGroupFilter = new SMESH_LogicalFilter(QList<SUIT_SelectionFilter*>(),
+                                          SMESH_LogicalFilter::LO_OR,
+                                          /*takeOwnership=*/true);
   SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( mySMESHGUI->application()->activeStudy() );
   myGeomFilter = new GEOM_SelectionFilter( aStudy, true );
 
@@ -439,8 +463,7 @@ void SMESHGUI_GroupDlg::initDialog( bool create)
   if (myMesh->_is_nil() )
     myTypeGroup->button(0)->setChecked(true);
 
-  updateButtons();
-  //myName->setText(GetDefaultName(tr( "SMESH_GROUP" )));
+  onSelectAll(); //updateButtons();
 }
 
 //=================================================================================
@@ -454,6 +477,10 @@ SMESHGUI_GroupDlg::~SMESHGUI_GroupDlg()
     myFilterDlg->setParent( 0 );
     delete myFilterDlg;
   }
+  if ( myMeshFilter )    delete myMeshFilter;
+  if ( mySubMeshFilter ) delete mySubMeshFilter;
+  if ( myGroupFilter )   delete myGroupFilter;
+  if ( myGeomFilter )    delete myGeomFilter;
 }
 
 //=================================================================================
@@ -506,6 +533,7 @@ void SMESHGUI_GroupDlg::init (SMESH::SMESH_Mesh_ptr theMesh)
   setShowEntityMode();
   myGroup = SMESH::SMESH_Group::_nil();
   myGroupOnGeom = SMESH::SMESH_GroupOnGeom::_nil();
+  myGroupOnFilter = SMESH::SMESH_GroupOnFilter::_nil();
 
   // NPAL19389: create a group with a selection in another group
   // set actor of myMesh, if it is visible, else try
@@ -562,8 +590,10 @@ void SMESHGUI_GroupDlg::init (SMESH::SMESH_GroupBase_ptr theGroup,
 
   myGroup = SMESH::SMESH_Group::_narrow( theGroup );
   myGroupOnGeom = SMESH::SMESH_GroupOnGeom::_narrow( theGroup );
+  myGroupOnFilter = SMESH::SMESH_GroupOnFilter::_narrow( theGroup );
+  myFilter = SMESH::Filter::_nil();
 
-  if (myGroup->_is_nil() && myGroupOnGeom->_is_nil())
+  if (myGroup->_is_nil() && myGroupOnGeom->_is_nil() && myGroupOnFilter->_is_nil() )
     return;
 
   // NPAL19389: create a group with a selection in another group
@@ -578,14 +608,16 @@ void SMESHGUI_GroupDlg::init (SMESH::SMESH_GroupBase_ptr theGroup,
     anActor = SMESH::FindActorByObject(theGroup);
   SMESH::SetPickable(anActor);*/
 
-  int grpType = (!myGroup->_is_nil() ? 0 : (theIsConvert ? 0 : 1));
+  int grpType = (!myGroup->_is_nil() ? 0 : (theIsConvert ? 0 : myGroupOnGeom->_is_nil() ? 2 : 1));
   myGrpTypeGroup->button(grpType)->setChecked(true);
   onGrpTypeChanged(grpType);
 
   myTypeId = aType;
-  if ( grpType == 0 ) {
+  if ( grpType == 0 ) { // standalone group
     myCurrentLineEdit = 0;
     myElements->clear();
+    myAllowElemsModif->setChecked( true );
+
     setSelectionMode(aType);
 
     setShowEntityMode(); // depends on myTypeId
@@ -601,7 +633,7 @@ void SMESHGUI_GroupDlg::init (SMESH::SMESH_GroupBase_ptr theGroup,
       myElements->selectAll();
     }
   }
-  else
+  else if ( grpType == 1 ) // group on geom
   {
     QString aShapeName( "" );
     _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
@@ -613,12 +645,26 @@ void SMESHGUI_GroupDlg::init (SMESH::SMESH_GroupBase_ptr theGroup,
         aShapeName = aGroupShapeSO->GetName().c_str();
     }
     myGeomGroupLine->setText( aShapeName );
+  }
+  else // group on filter
+  {
+    myFilter = myGroupOnFilter->GetFilter();
+    if ( !myFilter->_is_nil() ) {
+      SMESH::Predicate_var perdicate = myFilter->GetPredicate();
+      if ( perdicate->_is_nil() )
+        myFilter = SMESH::Filter::_nil();
+    }
+  }
+
+  if ( grpType != 0 )
+  {
     myNameChanged = true;
     myName->blockSignals(true);
     myName->setText(theGroup->GetName());
     myName->blockSignals(false);
   }
-  updateButtons();
+
+  onSelectAll(); //updateButtons();
 }
 
 //=================================================================================
@@ -628,17 +674,36 @@ void SMESHGUI_GroupDlg::init (SMESH::SMESH_GroupBase_ptr theGroup,
 void SMESHGUI_GroupDlg::updateButtons()
 {
   bool enable = !myName->text().trimmed().isEmpty();
-
-  if (myGrpTypeId == 0) {
-    enable = enable && (mySelectAll->isChecked() || myElements->count() > 0);
-    enable = enable && (!myGroup->_is_nil() || !myMesh->_is_nil());
-  }
-  else if (myGrpTypeId == 1) {
-    if (CORBA::is_nil(myGroupOnGeom)) { // creation mode
-      enable = enable && myGeomObjects->length() > 0 && !myMesh->_is_nil();
+  if ( enable )
+  {
+    if (myGrpTypeId == 0) { // standalone
+      if ( !mySelectAll->isChecked() )
+      {
+        if ( myAllowElemsModif->isChecked() )
+        {
+          enable = ( myElements->count() > 0 );
+        }
+        else if ((enable = !myFilter->_is_nil() ))
+        {
+          SMESH::array_of_ElementType_var types = myFilter->GetTypes();
+          enable = types->length();
+        }
+      }
+      enable = enable && (!myGroup->_is_nil() || !myMesh->_is_nil());
+    }
+    else if (myGrpTypeId == 1) // on geom
+    {
+      if (CORBA::is_nil(myGroupOnGeom)) // creation mode
+        enable = ( myGeomObjects->length() > 0 && !myMesh->_is_nil() );
+    }
+    else if (myGrpTypeId == 2) // on filter
+    {
+      if (( enable = !myFilter->_is_nil() ))
+        if (CORBA::is_nil(myGroupOnFilter) )  // creation mode
+          enable = !myMesh->_is_nil();
     }
   }
-  
+
   myOKBtn->setEnabled(enable);
   myApplyBtn->setEnabled(enable);
 }
@@ -662,9 +727,13 @@ void SMESHGUI_GroupDlg::onTypeChanged (int id)
 {
   if (myTypeId != id) {
     myElements->clear();
-    if (myCurrentLineEdit == 0)
-      setSelectionMode(id);
     myTypeId = id;
+
+    int curSelMode = mySelectionMode;
+    mySelectionMode = grpNoSelection;
+    setSelectionMode( curSelMode );
+    onObjectSelectionChanged();
+
     setShowEntityMode();
   }
 }
@@ -683,6 +752,7 @@ void SMESHGUI_GroupDlg::onGrpTypeChanged (int id)
     onSelectGeomGroup(id == 1);
   }
   myGrpTypeId = id;
+  updateButtons();
 }
 
 //=================================================================================
@@ -704,7 +774,7 @@ void SMESHGUI_GroupDlg::setSelectionMode (int theMode)
   if (myMesh->_is_nil())
     return;
   SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI );
-  bool isSelectAll = mySelectAll->isChecked();
+  bool isSelectAll = mySelectAll->isChecked() || !myAllowElemsModif->isChecked();
   if (mySelectionMode != theMode) {
     // [PAL10408] mySelectionMgr->clearSelected();
     mySelectionMgr->clearFilters();
@@ -737,14 +807,44 @@ void SMESHGUI_GroupDlg::setSelectionMode (int theMode)
     case grpVolumeSelection:
       if ( aViewWindow ) aViewWindow->SetSelectionMode(isSelectAll ? ActorSelection : VolumeSelection);
       break;
-    case grpSubMeshSelection:
-      mySelectionMgr->installFilter(mySubMeshFilter);
+    case grpSubMeshSelection: {
+
+      SMESH_TypeFilter* f = 0;
+      switch (myTypeId) {
+      case 0: f = new SMESH_TypeFilter(SUBMESH); break;
+      case 1: f = new SMESH_TypeFilter(SUBMESH_EDGE); break;
+      case 2: f = new SMESH_TypeFilter(SUBMESH_FACE); break;
+      case 3: f = new SMESH_TypeFilter(SUBMESH_SOLID); break;
+      default:f = new SMESH_TypeFilter(SUBMESH);
+      }
+      QList<SUIT_SelectionFilter*> filtList;
+      filtList.append( f );
+      filtList.append( new SMESH_TypeFilter(SUBMESH_COMPOUND));
+      mySubMeshFilter->setFilters( filtList );
+
+      mySelectionMgr->installFilter( mySubMeshFilter );
+
       if ( aViewWindow ) aViewWindow->SetSelectionMode(ActorSelection);
       break;
-    case grpGroupSelection:
+    }
+    case grpGroupSelection: {
+
+      SMESH_TypeFilter* f = 0;
+      switch (myTypeId) {
+      case 0: f = new SMESH_TypeFilter(GROUP_NODE); break;
+      case 1: f = new SMESH_TypeFilter(GROUP_EDGE); break;
+      case 2: f = new SMESH_TypeFilter(GROUP_FACE); break;
+      case 3: f = new SMESH_TypeFilter(GROUP_VOLUME); break;
+      default:f = new SMESH_TypeFilter(GROUP);
+      }
+      QList<SUIT_SelectionFilter*> filtList;
+      filtList.append( f );
+      myGroupFilter->setFilters( filtList );
+
       mySelectionMgr->installFilter(myGroupFilter);
       if ( aViewWindow ) aViewWindow->SetSelectionMode(ActorSelection);
       break;
+    }
     case grpMeshSelection:
       mySelectionMgr->installFilter(myMeshFilter);
       if ( aViewWindow ) aViewWindow->SetSelectionMode(ActorSelection);
@@ -774,22 +874,39 @@ bool SMESHGUI_GroupDlg::onApply()
   if (myName->text().trimmed().isEmpty())
     return false;
 
+  SMESH::ElementType aType = SMESH::ALL;
+  switch (myTypeId) {
+  case 0: aType = SMESH::NODE; break;
+  case 1: aType = SMESH::EDGE; break;
+  case 2: aType = SMESH::FACE; break;
+  case 3: aType = SMESH::VOLUME; break;
+  }
+
   bool anIsOk = false;
   QStringList anEntryList;
-  if (myGrpTypeId == 0) { // on mesh elements
-    if (!mySelectAll->isChecked() && !myElements->count())
+
+  SMESH::SMESH_GroupBase_var resultGroup;
+  bool isCreation;
+    
+  if (myGrpTypeId == 0)  // standalone
+  {
+    if (!mySelectAll->isChecked() && !myElements->count() && myAllowElemsModif->isChecked())
       return false;
 
     mySelectionMgr->clearSelected();
 
     if (myGroup->_is_nil()) { // creation or conversion
       // check if group on geometry is not null
-      if (!CORBA::is_nil(myGroupOnGeom)) {
+      if (!myGroupOnGeom->_is_nil() || !myGroupOnFilter->_is_nil()) {
         if (myMesh->_is_nil())
           return false;
-        myGroup = myMesh->ConvertToStandalone( myGroupOnGeom );
-        // nullify pointer, because object become dead
+        if ( myGroupOnGeom->_is_nil() )
+          myGroup = myMesh->ConvertToStandalone( myGroupOnFilter );
+        else
+          myGroup = myMesh->ConvertToStandalone( myGroupOnGeom );
+
         myGroupOnGeom = SMESH::SMESH_GroupOnGeom::_nil();
+        myGroupOnFilter = SMESH::SMESH_GroupOnFilter::_nil();
       }
     }
 
@@ -797,63 +914,40 @@ bool SMESHGUI_GroupDlg::onApply()
       if (myMesh->_is_nil())
         return false;
 
-      SMESH::ElementType aType = SMESH::ALL;
-      switch (myTypeId) {
-      case 0: aType = SMESH::NODE; break;
-      case 1: aType = SMESH::EDGE; break;
-      case 2: aType = SMESH::FACE; break;
-      case 3: aType = SMESH::VOLUME; break;
-      }
-
       myGroup = SMESH::AddGroup(myMesh, aType, myName->text());
 
+      resultGroup = SMESH::SMESH_GroupBase::_narrow( myGroup );
+      isCreation = true;
+
       if ( mySelectAll->isChecked() ) {
         // select all
         myGroup->AddFrom(myMesh.in());
       }
       else {
         // select manually
-        SMESH::long_array_var anIdList = new SMESH::long_array;
-        int i, k = myElements->count();
-        anIdList->length(k);
-        for (i = 0; i < k; i++) {
-          anIdList[i] = myElements->item(i)->text().toInt();
+
+        if ( !myFilter->_is_nil() &&
+             ( myNbChangesOfContents == 1 || !myAllowElemsModif->isChecked()))
+        {
+          myGroup->AddFrom( myFilter );
+        }
+        else
+        {
+          SMESH::long_array_var anIdList = new SMESH::long_array;
+          int i, k = myElements->count();
+          anIdList->length(k);
+          for (i = 0; i < k; i++) {
+            anIdList[i] = myElements->item(i)->text().toInt();
+          }
+          myGroup->Add(anIdList.inout());
         }
-        
-        myGroup->Add(anIdList.inout());
       }
 
-      SALOMEDS::Color aColor = getGroupColor();
-      myGroup->SetColor(aColor);
-
-      _PTR(SObject) aMeshGroupSO = SMESH::FindSObject(myGroup);
-      if( aMeshGroupSO )
-        anEntryList.append( aMeshGroupSO->GetID().c_str() );
-
-      //SMESH::setFileName ( aMeshGroupSO, QString::number(myColorSpinBox->value()) );
-      SMESH::setFileType ( aMeshGroupSO, "COULEURGROUP" );
-
-      /* init for next operation */
-      myName->setText( "" );
-      myElements->clear();
-      myGroup = SMESH::SMESH_Group::_nil();
 
     } else { // edition
-      myGroup->SetName(myName->text().toLatin1().data());
 
-      SALOMEDS::Color aColor = getGroupColor();
-      myGroup->SetColor(aColor);
-
-      _PTR(SObject) aMeshGroupSO = SMESH::FindSObject(myGroup);
-      if(SMESH_Actor *anActor = SMESH::FindActorByEntry(aMeshGroupSO->GetID().c_str())) {
-        anActor->setName(myName->text().toLatin1().data());
-        switch ( myTypeId ) {
-        case 0: anActor->SetNodeColor( aColor.R, aColor.G, aColor.B ); break;
-        case 1: anActor->SetEdgeColor( aColor.R, aColor.G, aColor.B ); break;
-        case 2:
-        case 3: anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B ); break;
-        }
-      }
+      resultGroup = SMESH::SMESH_GroupBase::_narrow( myGroup );
+      isCreation = false;
 
       if ( mySelectAll->isChecked() ) {
         // select all
@@ -896,25 +990,14 @@ bool SMESHGUI_GroupDlg::onApply()
       }
     }
 
-    SMESHGUI::Modified();
-    mySMESHGUI->updateObjBrowser(true);
-    SMESH::UpdateView(); // asv: fix of BUG PAL5515
-    mySelectionMgr->clearSelected();
     anIsOk = true;
   }
-  else if (myGrpTypeId == 1) { // on geom object
+  else if (myGrpTypeId == 1) // on geom object
+  {
     if (CORBA::is_nil(myGroupOnGeom)) { // creation
       if (myMesh->_is_nil() || !myGeomObjects->length())
         return false;
 
-      SMESH::ElementType aType = SMESH::ALL;
-      switch (myTypeId) {
-      case 0: aType = SMESH::NODE; break;
-      case 1: aType = SMESH::EDGE; break;
-      case 2: aType = SMESH::FACE; break;
-      case 3: aType = SMESH::VOLUME; break;
-      }
-
       _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
       GEOM::GEOM_IGroupOperations_var aGroupOp =
         SMESH::GetGEOMGen()->GetIGroupOperations(aStudy->StudyId());
@@ -971,50 +1054,87 @@ bool SMESHGUI_GroupDlg::onApply()
                                                     myName->text().toLatin1().data(),
                                                     aGroupVar);
       }
+      resultGroup = SMESH::SMESH_GroupBase::_narrow( myGroupOnGeom );
+      isCreation = true;
 
-      SALOMEDS::Color aColor = getGroupColor();
-      myGroupOnGeom->SetColor(aColor);
+    }
+    else { // edition
 
-      _PTR(SObject) aMeshGroupSO = SMESH::FindSObject(myGroupOnGeom);
-      if( aMeshGroupSO )
-        anEntryList.append( aMeshGroupSO->GetID().c_str() );
+      resultGroup = SMESH::SMESH_GroupBase::_narrow( myGroupOnGeom );
+      isCreation = false;
+    }      
+    anIsOk = true;
+  }
+  if (myGrpTypeId == 2) // group on filter
+  {
+    if ( myFilter->_is_nil() ) return false;
 
-      //SMESH::setFileName ( aMeshGroupSO, QString::number(myColorSpinBox->value()) );
-      SMESH::setFileType ( aMeshGroupSO,"COULEURGROUP" );
+    if (CORBA::is_nil(myGroupOnFilter)) { // creation
+      if (myMesh->_is_nil())
+        return false;
 
-      /* init for next operation */
+      myGroupOnFilter = myMesh->CreateGroupFromFilter(aType,
+                                                      myName->text().toLatin1().data(),
+                                                      myFilter);
+
+      resultGroup = SMESH::SMESH_GroupBase::_narrow( myGroupOnFilter );
+      isCreation = true;
+    }
+    else
+    {
+      myGroupOnFilter->SetFilter( myFilter );
+
+      resultGroup = SMESH::SMESH_GroupBase::_narrow( myGroupOnFilter );
+      isCreation = false;
+    }
+    anIsOk = true;
+  }
+
+  if( anIsOk )
+  {
+    SALOMEDS::Color aColor = getGroupColor();
+    resultGroup->SetColor(aColor);
+
+    _PTR(SObject) aMeshGroupSO = SMESH::FindSObject( resultGroup );
+    if( aMeshGroupSO )
+      anEntryList.append( aMeshGroupSO->GetID().c_str() );
+
+    if ( isCreation )
+    {
+      SMESH::setFileType ( aMeshGroupSO, "COULEURGROUP" );
+
+      /* init for the next operation */
       myName->setText( "" );
-      myGroupOnGeom = SMESH::SMESH_GroupOnGeom::_nil();
+      myElements->clear();
+      myGroup         = SMESH::SMESH_Group::_nil();
+      myGroupOnGeom   = SMESH::SMESH_GroupOnGeom::_nil();
+      myGroupOnFilter = SMESH::SMESH_GroupOnFilter::_nil();
+      myFilter        = SMESH::Filter::_nil();
     }
-    else { // edition
-      myGroupOnGeom->SetName(myName->text().toLatin1().data());
-
-      SALOMEDS::Color aColor = getGroupColor();
-      myGroupOnGeom->SetColor(aColor);
-
-      _PTR(SObject) aMeshGroupSO = SMESH::FindSObject(myGroupOnGeom);
-      if(SMESH_Actor *anActor = SMESH::FindActorByEntry(aMeshGroupSO->GetID().c_str())) {
-        anActor->setName(myName->text().toLatin1().data());
-        switch ( myTypeId ) {
-        case 0: anActor->SetNodeColor( aColor.R, aColor.G, aColor.B ); break;
-        case 1: anActor->SetEdgeColor( aColor.R, aColor.G, aColor.B ); break;
-        case 2:
-        case 3: anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B ); break;
+    else
+    {
+      myGroup->SetName(myName->text().toLatin1().data());
+
+      if ( aMeshGroupSO )
+        if(SMESH_Actor *anActor = SMESH::FindActorByEntry(aMeshGroupSO->GetID().c_str())) {
+          anActor->setName(myName->text().toLatin1().data());
+          switch ( myTypeId ) {
+          case 0: anActor->SetNodeColor( aColor.R, aColor.G, aColor.B ); break;
+          case 1: anActor->SetEdgeColor( aColor.R, aColor.G, aColor.B ); break;
+          case 2:
+          case 3: anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B ); break;
+          }
         }
-      }
     }
-
     SMESHGUI::Modified();
     mySMESHGUI->updateObjBrowser(true);
+    SMESH::UpdateView(); // asv: fix of BUG PAL5515
     mySelectionMgr->clearSelected();
-    anIsOk = true;
-  }
 
-  if( anIsOk )
     if( LightApp_Application* anApp =
         dynamic_cast<LightApp_Application*>( SUIT_Session::session()->activeApplication() ) )
       myObjectToSelect = anApp->browseObjects( anEntryList, isApplyAndClose() );
-
+  }
   return anIsOk;
 }
 
@@ -1388,19 +1508,23 @@ void SMESHGUI_GroupDlg::onObjectSelectionChanged()
 }
 
 //=================================================================================
-// function : onSelectSubMesh()
-// purpose  : Called when selection in 3D view or ObjectBrowser is changed
+// function : onSelectAll()
+// purpose  : Called when "Select all" is checked
 //=================================================================================
 void SMESHGUI_GroupDlg::onSelectAll()
 {
-  myElementsLab->setEnabled( !mySelectAll->isChecked() );
-  myElements->setEnabled( !mySelectAll->isChecked() );
-  myFilter->setEnabled( !mySelectAll->isChecked() );
-  myAddBtn->setEnabled( !mySelectAll->isChecked() );
-  myRemoveBtn->setEnabled( !mySelectAll->isChecked() );
-  mySortBtn->setEnabled( !mySelectAll->isChecked() );
-  mySelectBox->setEnabled( !mySelectAll->isChecked() );
-  int selMode = mySelectionMode;
+  bool noElemsModif = ( mySelectAll->isChecked() || !myAllowElemsModif->isChecked() );
+
+  myElementsLab->setEnabled( !noElemsModif );
+  myElements->setEnabled   ( !noElemsModif );
+  myFilterBtn->setEnabled  ( !mySelectAll->isChecked() );
+  myAddBtn->setEnabled     ( !noElemsModif );
+  myRemoveBtn->setEnabled  ( !noElemsModif );
+  mySortBtn->setEnabled    ( !noElemsModif );
+  mySelectBox->setEnabled  ( !noElemsModif );
+  myAllowElemsModif->setEnabled( !mySelectAll->isChecked() );
+
+  int selMode     = mySelectionMode;
   mySelectionMode = grpNoSelection;
   setSelectionMode( selMode );
   updateButtons();
@@ -1546,6 +1670,12 @@ void SMESHGUI_GroupDlg::setFilters()
   else
     myFilterDlg->Init( aType );
 
+  if ( !myGroupOnFilter->_is_nil() )
+  {
+    myFilterDlg->SetFilter( myFilter, aType );
+    myFilterDlg->Init( aType );
+  }
+
   myFilterDlg->SetSelection();
   myFilterDlg->SetMesh( myMesh );
   myFilterDlg->SetSourceWg( myElements, false );
@@ -1566,6 +1696,28 @@ void SMESHGUI_GroupDlg::onFilterAccepted()
     mySelectSubMesh->setChecked( false );
     mySelectGroup->setChecked( false );
   }
+  // get a filter from myFilterDlg
+  myFilter = myFilterDlg->GetFilter();
+  if ( !myFilter->_is_nil() ) {
+    SMESH::Predicate_var perdicate = myFilter->GetPredicate();
+    if ( perdicate->_is_nil() )
+      myFilter = SMESH::Filter::_nil();
+  }
+  // set mesh to myFilter
+  if ( !myFilter->_is_nil() ) {
+    SMESH::SMESH_Mesh_var mesh = myMesh;
+    if ( mesh->_is_nil() ) {
+      if ( !myGroup->_is_nil() )
+        mesh = myGroup->GetMesh();
+      else if ( !myGroupOnGeom->_is_nil() )
+        mesh = myGroupOnGeom->GetMesh();
+      else if ( !myGroupOnFilter->_is_nil() )
+        mesh = myGroupOnFilter->GetMesh();
+    }
+    myFilter->SetMesh( mesh );
+  }
+
+  updateButtons();
 }
 
 //=================================================================================
@@ -1582,6 +1734,7 @@ void SMESHGUI_GroupDlg::onAdd()
   if (aNbSel == 0 || myActorsList.count() == 0 || myMesh->_is_nil()) return;
 
   myIsBusy = true;
+  int sizeBefore = myElements->count();
 
   SMESH::ElementType aType = SMESH::ALL;
   switch(myTypeId) {
@@ -1762,7 +1915,7 @@ void SMESHGUI_GroupDlg::onAdd()
       // Construct filter
       SMESH::FilterManager_var aFilterMgr = SMESH::GetFilterManager();
       SMESH::Filter_var aFilter = aFilterMgr->CreateFilter();
-      SMESH::BelongToGeom_var aBelongToGeom = aFilterMgr->CreateBelongToGeom();;
+      SMESH::BelongToGeom_var aBelongToGeom = aFilterMgr->CreateBelongToGeom();
       aBelongToGeom->SetGeom(myGeomObjects[0]);
       aBelongToGeom->SetShapeName(aGroupSO->GetName().c_str());
       aBelongToGeom->SetElementType(aType);
@@ -1799,6 +1952,8 @@ void SMESHGUI_GroupDlg::onAdd()
     onListSelectionChanged();
   }
   myIsBusy = false;
+  if ( sizeBefore < myElements->count() )
+    ++myNbChangesOfContents;
   //  mySelectionMgr->clearSelected();
   updateButtons();
 }
@@ -1810,6 +1965,8 @@ void SMESHGUI_GroupDlg::onAdd()
 void SMESHGUI_GroupDlg::onRemove()
 {
   myIsBusy = true;
+  int sizeBefore = myElements->count();
+
   if (myCurrentLineEdit == 0) {
     QList<QListWidgetItem*> selItems = myElements->selectedItems();
     QListWidgetItem* item;
@@ -1901,6 +2058,8 @@ void SMESHGUI_GroupDlg::onRemove()
     }
   }
   myIsBusy = false;
+  if ( sizeBefore > myElements->count() )
+    myNbChangesOfContents += 2; // it's used to detect that "Add" was only once
   updateButtons();
 }
 
index da356287d8dd689e0408811d3d54e6fd672caaed..a7fb25f0dce4b4e102285116c010992f46c1e2f9 100644 (file)
@@ -39,6 +39,7 @@
 #include <SALOMEconfig.h>
 #include CORBA_SERVER_HEADER(SMESH_Mesh)
 #include CORBA_SERVER_HEADER(SMESH_Group)
+#include CORBA_SERVER_HEADER(SMESH_Filter)
 
 class QGroupBox;
 class QLabel;
@@ -60,6 +61,7 @@ class SUIT_Operation;
 class SVTK_Selector;
 class SUIT_SelectionFilter;
 class LightApp_SelectionMgr;
+class SMESH_LogicalFilter;
 
 //=================================================================================
 // class    : SMESHGUI_GroupDlg
@@ -144,7 +146,9 @@ private:
 
   void                          setIsApplyAndClose( const bool theFlag );
   bool                          isApplyAndClose() const;
-  
+
+ private:
+
   SMESHGUI*                     mySMESHGUI;              /* Current SMESHGUI object */
   LightApp_SelectionMgr*        mySelectionMgr;          /* User shape selection */
   int                           myGrpTypeId;             /* Current group type id : standalone or group on geometry */
@@ -164,9 +168,10 @@ private:
   
   QStackedWidget*               myWGStack;
   QCheckBox*                    mySelectAll;
+  QCheckBox*                    myAllowElemsModif;
   QLabel*                       myElementsLab;
   QListWidget*                  myElements;
-  QPushButton*                  myFilter;
+  QPushButton*                  myFilterBtn;
   QPushButton*                  myAddBtn;
   QPushButton*                  myRemoveBtn;
   QPushButton*                  mySortBtn;
@@ -197,6 +202,8 @@ private:
   QList<SMESH_Actor*>           myActorsList;
   SMESH::SMESH_Group_var        myGroup;
   SMESH::SMESH_GroupOnGeom_var  myGroupOnGeom;
+  SMESH::SMESH_GroupOnFilter_var myGroupOnFilter;
+  SMESH::Filter_var             myFilter;
   QList<int>                    myIdList;
   GEOM::ListOfGO_var            myGeomObjects;
   
@@ -205,8 +212,8 @@ private:
   //Handle(SMESH_TypeFilter)      mySubMeshFilter;
   //Handle(SMESH_TypeFilter)      myGroupFilter;
   SUIT_SelectionFilter*         myMeshFilter;
-  SUIT_SelectionFilter*         mySubMeshFilter;
-  SUIT_SelectionFilter*         myGroupFilter;
+  SMESH_LogicalFilter*          mySubMeshFilter;
+  SMESH_LogicalFilter*          myGroupFilter;
   SUIT_SelectionFilter*         myGeomFilter;
   
   SMESHGUI_FilterDlg*           myFilterDlg;
@@ -218,6 +225,7 @@ private:
   QMap<QAction*, int>           myActions;
 
   bool                          myNameChanged; //added by skl for IPAL19574
+  int                           myNbChangesOfContents; // nb add's and remove's
 
   QString                       myObjectToSelect;
   bool                          myIsApplyAndClose;
index ffe19ecedabb5a46b15fc516ef5334ccdd455150..f7c54e5d61ac0fecb855a38c18bba536e7685f43 100644 (file)
@@ -1106,7 +1106,7 @@ Please enter correct values and try again</translation>
     </message>
     <message>
         <source>SMESH_BUT_FILTER</source>
-        <translation>Set &amp;Filters</translation>
+        <translation>Set &amp;Filter</translation>
     </message>
     <message>
         <source>SMESH_BUT_HELP</source>
@@ -1445,6 +1445,10 @@ add the exported data to its contents?</translation>
         <source>SMESH_GROUP_GEOMETRY</source>
         <translation>Group on geometry</translation>
     </message>
+    <message>
+        <source>SMESH_GROUP_FILTER</source>
+        <translation>Group on filter</translation>
+    </message>
     <message>
         <source>SMESH_GROUP_SELECTED</source>
         <translation>%1 Groups</translation>
@@ -3482,6 +3486,13 @@ Input value precision can be adjusted using
         <translation>SMESH plugins</translation>
     </message>
 </context>
+<context>
+    <name>SMESHGUI_GroupDlg</name>
+    <message>
+        <source>ALLOW_ELEM_LIST_MODIF</source>
+        <translation>Enable manual edition</translation>
+    </message>
+</context>
 <context>
     <name>SMESHGUI</name>
     <message>