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
 
 
 \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>
 <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
 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>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>
 </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>
 
 
 \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>
 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>
 </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
 
 
 \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>
 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>
 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
 </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
 
 
 \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
 
 \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.  
 
 
 <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>
 
 \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
 
 \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.
 
 
 <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
 
 
 \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.
 
 \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
 </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>
 <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>
 
 
 \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>
 
 <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:
 \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>
 <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
 <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>
 
 
 </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
 \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
 \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.
 
 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.
 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.
 
 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
 
 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>
 <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_TypeFilter.hxx>
 #include <SMESH_Actor.h>
 #include <SMESH_ActorUtils.h>
+#include <SMESH_LogicalFilter.hxx>
 
 // SALOME GEOM includes
 #include <GEOMBase.h>
 
 // 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 ),
     mySelector( SMESH::GetViewWindow( theModule )->GetSelector() ),
     myIsBusy( false ),
     myNameChanged( false ),
-    myIsApplyAndClose( false )
+    myIsApplyAndClose( false ),
+    myNbChangesOfContents(0)
 {
   initDialog( true );
   if ( !theMesh->_is_nil() )
 {
   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 ),
     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() )
 {
   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* 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( rb1, 0 );
   myGrpTypeGroup->addButton( rb2, 1 );
+  myGrpTypeGroup->addButton( rb3, 2 );
   aGrpTypeBoxLayout->addWidget( rb1 );
   aGrpTypeBoxLayout->addWidget( rb2 );
   aGrpTypeBoxLayout->addWidget( rb1 );
   aGrpTypeBoxLayout->addWidget( rb2 );
+  aGrpTypeBoxLayout->addWidget( rb3 );
   aGrpTypeBox->setEnabled( create );
   myGrpTypeId = -1;
 
   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 );
   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 );
 
   /***************************************************************/
   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 );
   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 );
 
 
   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 );
 
   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 );
 
   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 );
   /***************************************************************/
   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 );
 
   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( 0, wg1 );
   myWGStack->insertWidget( 1, wg2 );
+  myWGStack->insertWidget( 2, wg3 );
 
   /***************************************************************/
   QGroupBox* aColorBox = new QGroupBox(tr( "SMESH_SET_COLOR" ), this);
 
   /***************************************************************/
   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(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(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()));
   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);
 
   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 );
 
   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);
 
   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;
   }
     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();
   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
 
   // 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 );
 
   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
     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);*/
 
     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;
   myGrpTypeGroup->button(grpType)->setChecked(true);
   onGrpTypeChanged(grpType);
 
   myTypeId = aType;
-  if ( grpType == 0 ) {
+  if ( grpType == 0 ) { // standalone group
     myCurrentLineEdit = 0;
     myElements->clear();
     myCurrentLineEdit = 0;
     myElements->clear();
+    myAllowElemsModif->setChecked( true );
+
     setSelectionMode(aType);
 
     setShowEntityMode(); // depends on myTypeId
     setSelectionMode(aType);
 
     setShowEntityMode(); // depends on myTypeId
@@ -601,7 +633,7 @@ void SMESHGUI_GroupDlg::init (SMESH::SMESH_GroupBase_ptr theGroup,
       myElements->selectAll();
     }
   }
       myElements->selectAll();
     }
   }
-  else
+  else if ( grpType == 1 ) // group on geom
   {
     QString aShapeName( "" );
     _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
   {
     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 );
         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);
   }
     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();
 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);
 }
   myOKBtn->setEnabled(enable);
   myApplyBtn->setEnabled(enable);
 }
@@ -662,9 +727,13 @@ void SMESHGUI_GroupDlg::onTypeChanged (int id)
 {
   if (myTypeId != id) {
     myElements->clear();
 {
   if (myTypeId != id) {
     myElements->clear();
-    if (myCurrentLineEdit == 0)
-      setSelectionMode(id);
     myTypeId = id;
     myTypeId = id;
+
+    int curSelMode = mySelectionMode;
+    mySelectionMode = grpNoSelection;
+    setSelectionMode( curSelMode );
+    onObjectSelectionChanged();
+
     setShowEntityMode();
   }
 }
     setShowEntityMode();
   }
 }
@@ -683,6 +752,7 @@ void SMESHGUI_GroupDlg::onGrpTypeChanged (int id)
     onSelectGeomGroup(id == 1);
   }
   myGrpTypeId = 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 );
   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();
   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 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;
       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;
       mySelectionMgr->installFilter(myGroupFilter);
       if ( aViewWindow ) aViewWindow->SetSelectionMode(ActorSelection);
       break;
+    }
     case grpMeshSelection:
       mySelectionMgr->installFilter(myMeshFilter);
       if ( aViewWindow ) aViewWindow->SetSelectionMode(ActorSelection);
     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;
 
   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;
   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
       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;
         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();
         myGroupOnGeom = SMESH::SMESH_GroupOnGeom::_nil();
+        myGroupOnFilter = SMESH::SMESH_GroupOnFilter::_nil();
       }
     }
 
       }
     }
 
@@ -797,63 +914,40 @@ bool SMESHGUI_GroupDlg::onApply()
       if (myMesh->_is_nil())
         return false;
 
       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());
 
       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
       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
 
     } 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
 
       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;
   }
     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;
 
     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());
       _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);
       }
                                                     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( "" );
       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);
     SMESHGUI::Modified();
     mySMESHGUI->updateObjBrowser(true);
+    SMESH::UpdateView(); // asv: fix of BUG PAL5515
     mySelectionMgr->clearSelected();
     mySelectionMgr->clearSelected();
-    anIsOk = true;
-  }
 
 
-  if( anIsOk )
     if( LightApp_Application* anApp =
         dynamic_cast<LightApp_Application*>( SUIT_Session::session()->activeApplication() ) )
       myObjectToSelect = anApp->browseObjects( anEntryList, isApplyAndClose() );
     if( LightApp_Application* anApp =
         dynamic_cast<LightApp_Application*>( SUIT_Session::session()->activeApplication() ) )
       myObjectToSelect = anApp->browseObjects( anEntryList, isApplyAndClose() );
-
+  }
   return anIsOk;
 }
 
   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()
 {
 //=================================================================================
 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();
   mySelectionMode = grpNoSelection;
   setSelectionMode( selMode );
   updateButtons();
@@ -1546,6 +1670,12 @@ void SMESHGUI_GroupDlg::setFilters()
   else
     myFilterDlg->Init( aType );
 
   else
     myFilterDlg->Init( aType );
 
+  if ( !myGroupOnFilter->_is_nil() )
+  {
+    myFilterDlg->SetFilter( myFilter, aType );
+    myFilterDlg->Init( aType );
+  }
+
   myFilterDlg->SetSelection();
   myFilterDlg->SetMesh( myMesh );
   myFilterDlg->SetSourceWg( myElements, false );
   myFilterDlg->SetSelection();
   myFilterDlg->SetMesh( myMesh );
   myFilterDlg->SetSourceWg( myElements, false );
@@ -1566,6 +1696,28 @@ void SMESHGUI_GroupDlg::onFilterAccepted()
     mySelectSubMesh->setChecked( false );
     mySelectGroup->setChecked( false );
   }
     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;
   if (aNbSel == 0 || myActorsList.count() == 0 || myMesh->_is_nil()) return;
 
   myIsBusy = true;
+  int sizeBefore = myElements->count();
 
   SMESH::ElementType aType = SMESH::ALL;
   switch(myTypeId) {
 
   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();
       // 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);
       aBelongToGeom->SetGeom(myGeomObjects[0]);
       aBelongToGeom->SetShapeName(aGroupSO->GetName().c_str());
       aBelongToGeom->SetElementType(aType);
@@ -1799,6 +1952,8 @@ void SMESHGUI_GroupDlg::onAdd()
     onListSelectionChanged();
   }
   myIsBusy = false;
     onListSelectionChanged();
   }
   myIsBusy = false;
+  if ( sizeBefore < myElements->count() )
+    ++myNbChangesOfContents;
   //  mySelectionMgr->clearSelected();
   updateButtons();
 }
   //  mySelectionMgr->clearSelected();
   updateButtons();
 }
@@ -1810,6 +1965,8 @@ void SMESHGUI_GroupDlg::onAdd()
 void SMESHGUI_GroupDlg::onRemove()
 {
   myIsBusy = true;
 void SMESHGUI_GroupDlg::onRemove()
 {
   myIsBusy = true;
+  int sizeBefore = myElements->count();
+
   if (myCurrentLineEdit == 0) {
     QList<QListWidgetItem*> selItems = myElements->selectedItems();
     QListWidgetItem* item;
   if (myCurrentLineEdit == 0) {
     QList<QListWidgetItem*> selItems = myElements->selectedItems();
     QListWidgetItem* item;
@@ -1901,6 +2058,8 @@ void SMESHGUI_GroupDlg::onRemove()
     }
   }
   myIsBusy = false;
     }
   }
   myIsBusy = false;
+  if ( sizeBefore > myElements->count() )
+    myNbChangesOfContents += 2; // it's used to detect that "Add" was only once
   updateButtons();
 }
 
   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 <SALOMEconfig.h>
 #include CORBA_SERVER_HEADER(SMESH_Mesh)
 #include CORBA_SERVER_HEADER(SMESH_Group)
+#include CORBA_SERVER_HEADER(SMESH_Filter)
 
 class QGroupBox;
 class QLabel;
 
 class QGroupBox;
 class QLabel;
@@ -60,6 +61,7 @@ class SUIT_Operation;
 class SVTK_Selector;
 class SUIT_SelectionFilter;
 class LightApp_SelectionMgr;
 class SVTK_Selector;
 class SUIT_SelectionFilter;
 class LightApp_SelectionMgr;
+class SMESH_LogicalFilter;
 
 //=================================================================================
 // class    : SMESHGUI_GroupDlg
 
 //=================================================================================
 // class    : SMESHGUI_GroupDlg
@@ -144,7 +146,9 @@ private:
 
   void                          setIsApplyAndClose( const bool theFlag );
   bool                          isApplyAndClose() const;
 
   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 */
   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;
   
   QStackedWidget*               myWGStack;
   QCheckBox*                    mySelectAll;
+  QCheckBox*                    myAllowElemsModif;
   QLabel*                       myElementsLab;
   QListWidget*                  myElements;
   QLabel*                       myElementsLab;
   QListWidget*                  myElements;
-  QPushButton*                  myFilter;
+  QPushButton*                  myFilterBtn;
   QPushButton*                  myAddBtn;
   QPushButton*                  myRemoveBtn;
   QPushButton*                  mySortBtn;
   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;
   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;
   
   QList<int>                    myIdList;
   GEOM::ListOfGO_var            myGeomObjects;
   
@@ -205,8 +212,8 @@ private:
   //Handle(SMESH_TypeFilter)      mySubMeshFilter;
   //Handle(SMESH_TypeFilter)      myGroupFilter;
   SUIT_SelectionFilter*         myMeshFilter;
   //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;
   SUIT_SelectionFilter*         myGeomFilter;
   
   SMESHGUI_FilterDlg*           myFilterDlg;
@@ -218,6 +225,7 @@ private:
   QMap<QAction*, int>           myActions;
 
   bool                          myNameChanged; //added by skl for IPAL19574
   QMap<QAction*, int>           myActions;
 
   bool                          myNameChanged; //added by skl for IPAL19574
+  int                           myNbChangesOfContents; // nb add's and remove's
 
   QString                       myObjectToSelect;
   bool                          myIsApplyAndClose;
 
   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>
     </message>
     <message>
         <source>SMESH_BUT_FILTER</source>
-        <translation>Set &amp;Filters</translation>
+        <translation>Set &amp;Filter</translation>
     </message>
     <message>
         <source>SMESH_BUT_HELP</source>
     </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>
         <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>
     <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>
         <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>
 <context>
     <name>SMESHGUI</name>
     <message>