From: eap Date: Thu, 23 Jun 2011 12:39:01 +0000 (+0000) Subject: 0021014: EDF 1583 SMESH: Improvement of the Python Dump for the creation of groups X-Git-Tag: V6_4_0a1~179 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=066bcc34710069839c0b2b2ab87c2acfa71ee449;p=modules%2Fsmesh.git 0021014: EDF 1583 SMESH: Improvement of the Python Dump for the creation of groups To create/edit SMESH_GroupOnFilter --- diff --git a/doc/salome/gui/SMESH/images/a-creategroup.png b/doc/salome/gui/SMESH/images/a-creategroup.png index d23ee825d..ee2b6baa4 100755 Binary files a/doc/salome/gui/SMESH/images/a-creategroup.png and b/doc/salome/gui/SMESH/images/a-creategroup.png differ diff --git a/doc/salome/gui/SMESH/images/creategroup.png b/doc/salome/gui/SMESH/images/creategroup.png index eefc9e275..ec24a4fed 100755 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 index 000000000..0a494c097 Binary files /dev/null and b/doc/salome/gui/SMESH/images/creategroup_on_filter.png differ diff --git a/doc/salome/gui/SMESH/images/editgroup.png b/doc/salome/gui/SMESH/images/editgroup.png index 2d8cb8dd0..fb102242e 100755 Binary files a/doc/salome/gui/SMESH/images/editgroup.png and b/doc/salome/gui/SMESH/images/editgroup.png differ diff --git a/doc/salome/gui/SMESH/input/creating_groups.doc b/doc/salome/gui/SMESH/input/creating_groups.doc index 85d633a22..de0953a55 100644 --- a/doc/salome/gui/SMESH/input/creating_groups.doc +++ b/doc/salome/gui/SMESH/input/creating_groups.doc @@ -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 Create -Group. -\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 Create Group item (also available in the +contextual menu of the mesh).
+To create a group of any type you should define the following:
  • Name field allows to enter the name of your new group.
  • +
  • Color - 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.
  • -SALOME Platform distinguishes between the two Group types: -Standalone Group and Group on Geometry. +SALOME Platform distinguishes between the three Group types: +Standalone Group, Group on Geometry and Group on Filter. \anchor standalone_group

    "Standalone Group"

    -Standalone Group consists of mesh elements, which you can define in +Standalone Group contains a list of mesh elements, which you can define in the following ways: +In the manual edition mode you can + -To remove a selected element or elements from the list click the -\b Remove button. The Sort List button allows to sort the list of IDs of -mesh elements. -\n Select from 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 Color - 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 Color attribute defines -the colors used for the display of the elements of the group. -\n Warning 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: 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 -
    In this picture the brown cells belong to a group defined manually.
    +
    In this picture the brown cells belong to a group defined + manually.
    \image html image131.gif -
    In this picture the brown cells belong to the group defined by the criterion -Taper > 0.
    +
    In this picture the brown cells belong to the group defined by + the criterion Taper > 0.
    See Also a sample TUI Script of a \ref tui_create_standalone_group "Create a Standalone Group" operation. + \anchor group_on_geom

    "Group on Geometry"

    -To create a group on geometry check Group on geometry in the \b Group -\b type field. Group on geometry 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 Group on geometry 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.
    +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 -
    In this picture the cells which belong to a certain face are -selected in green.
    +
    In this picture the cells which belong to a certain + geometrical face are selected in green.
    See Also a sample TUI Script of a \ref tui_create_group_on_geometry "Create a Group on Geometry" operation. + + +\anchor group_on_filter

    "Group on Filter"

    + +To create a group on filter check Group on filter in the +Group type 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.
    To define a group, +click the Set filter 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 + +See Also a sample TUI Script of a +\ref tui_create_group_on_filter "Create a Group on Filter" operation. + */ diff --git a/doc/salome/gui/SMESH/input/editing_groups.doc b/doc/salome/gui/SMESH/input/editing_groups.doc index d255c3f82..d59bdcb10 100644 --- a/doc/salome/gui/SMESH/input/editing_groups.doc +++ b/doc/salome/gui/SMESH/input/editing_groups.doc @@ -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 +standalone group. You can change criteria of the filter of +the group on filter. For more information see \ref creating_groups_page "Creating Groups" page. -
  • Click the \b Apply or Apply and Close button to confirm modification of the -group.
  • +
  • Click the \b Apply or Apply and Close button to confirm +modification of the group.
  • \anchor convert_to_standalone -To convert an existing group on geometry into standalone group -of elements and modify: +To convert an existing group on geometry or a group on filer into +a standalone group of elements and modify:
      -
    1. Select your group on geometry in the Object Browser and in the \b Mesh menu click -the Edit Group as Standalone item.
    2. +
    3. Select your group on geometry (or your group on filter) in the +Object Browser and in the \b Mesh menu click the Edit Group as +Standalone item.
    4. \image html image74.gif
      "Edit Group as Standalone" button
      -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.
    5. Click the \b Apply or Apply and Close button to confirm modification of the group.
    6. diff --git a/doc/salome/gui/SMESH/input/grouping_elements.doc b/doc/salome/gui/SMESH/input/grouping_elements.doc index 3ec4117c4..8d0754630 100644 --- a/doc/salome/gui/SMESH/input/grouping_elements.doc +++ b/doc/salome/gui/SMESH/input/grouping_elements.doc @@ -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: + diff --git a/doc/salome/gui/SMESH/input/selection_filter_library.doc b/doc/salome/gui/SMESH/input/selection_filter_library.doc index 9657f4c0d..823643d80 100644 --- a/doc/salome/gui/SMESH/input/selection_filter_library.doc +++ b/doc/salome/gui/SMESH/input/selection_filter_library.doc @@ -9,8 +9,8 @@ via Tools / Selection filter library. \image html selectionfilterlibrary.png Library file name shows the path and the file name where your -filters will be stored. By clicking the Browse button you can load an -existing filter library. +filters will be stored. By clicking the Browse button you can +load an existing filter library. \n Names of filters lists the filters created or uploaded for the current study. You can \b Add or \b Delete filters. \n In Filter name 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 Standalone Group using filters (for this click -Set Filters button in the Create Group menu), the menu -for setting filters looks a bit differently. Toggling Insert filter -in viewer 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 Initial Selection or the Current Group. -\n Copy from... button gives you a possibility to load an +When we create a group using filters (for this click +Set Filters button in the Create Group dialog), the menu +for setting filters looks a bit differently (see below). Switching +on Insert filter in viewer checkbox limits selection of elements +in the Viewer using your current filter. +
      +In the \b Source field you choose if the filter will be applied to +the whole \b Mesh, the Initial Selection or the Current +Group. If \b Mesh is chosen, the elements satisfying the filter +will be selected in the 3D Viewer. If Initial Selection is +chosen, the filter will be applied to the selected elements and the +elements rejected by the filter will be deseleced. If Current +Group is chosen, the filter will be applied to the list of +elements in the Greate Croup dialog and the elements rejected +by the filter will be removed from the list. +
      +Copy from... button gives you a possibility to load an existing filter from Selection filter library and Add to... button gives you a possibility to save your current filter in the Library. -\n Note: If the button Apply and Close is disabled, there +
      +Note: If the button Apply and Close 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. diff --git a/doc/salome/gui/SMESH/input/tui_grouping_elements.doc b/doc/salome/gui/SMESH/input/tui_grouping_elements.doc index 1aa73a484..a163d13f5 100644 --- a/doc/salome/gui/SMESH/input/tui_grouping_elements.doc +++ b/doc/salome/gui/SMESH/input/tui_grouping_elements.doc @@ -74,6 +74,51 @@ aSmeshGroup2 = quadra.GroupOnGeom(aGeomGroupE) salome.sg.updateObjBrowser(1) \endcode +
      +\anchor tui_create_group_on_filter + +

      Create a Group on Filter

      + +\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 +
      \anchor tui_edit_group

      Edit a Group

      diff --git a/src/SMESHGUI/SMESHGUI_GroupDlg.cxx b/src/SMESHGUI/SMESHGUI_GroupDlg.cxx index 3aa9e6abf..eac52ffe4 100644 --- a/src/SMESHGUI/SMESHGUI_GroupDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_GroupDlg.cxx @@ -39,6 +39,7 @@ #include #include #include +#include // SALOME GEOM includes #include @@ -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(), + SMESH_LogicalFilter::LO_OR, + /*takeOwnership=*/true); + myGroupFilter = new SMESH_LogicalFilter(QList(), + SMESH_LogicalFilter::LO_OR, + /*takeOwnership=*/true); SalomeApp_Study* aStudy = dynamic_cast( 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 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 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( 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 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(); } diff --git a/src/SMESHGUI/SMESHGUI_GroupDlg.h b/src/SMESHGUI/SMESHGUI_GroupDlg.h index da356287d..a7fb25f0d 100644 --- a/src/SMESHGUI/SMESHGUI_GroupDlg.h +++ b/src/SMESHGUI/SMESHGUI_GroupDlg.h @@ -39,6 +39,7 @@ #include #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 myActorsList; SMESH::SMESH_Group_var myGroup; SMESH::SMESH_GroupOnGeom_var myGroupOnGeom; + SMESH::SMESH_GroupOnFilter_var myGroupOnFilter; + SMESH::Filter_var myFilter; QList 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 myActions; bool myNameChanged; //added by skl for IPAL19574 + int myNbChangesOfContents; // nb add's and remove's QString myObjectToSelect; bool myIsApplyAndClose; diff --git a/src/SMESHGUI/SMESH_msg_en.ts b/src/SMESHGUI/SMESH_msg_en.ts index ffe19eced..f7c54e5d6 100644 --- a/src/SMESHGUI/SMESH_msg_en.ts +++ b/src/SMESHGUI/SMESH_msg_en.ts @@ -1106,7 +1106,7 @@ Please enter correct values and try again SMESH_BUT_FILTER - Set &Filters + Set &Filter SMESH_BUT_HELP @@ -1445,6 +1445,10 @@ add the exported data to its contents? SMESH_GROUP_GEOMETRY Group on geometry + + SMESH_GROUP_FILTER + Group on filter + SMESH_GROUP_SELECTED %1 Groups @@ -3482,6 +3486,13 @@ Input value precision can be adjusted using SMESH plugins + + SMESHGUI_GroupDlg + + ALLOW_ELEM_LIST_MODIF + Enable manual edition + + SMESHGUI