\page creating_groups_page Creating groups
-\n In MESH you can create groups of elements of different types. To
-create a group of elements in the \b Mesh menu select <b>Create
-Group</b>.
-\n To create any group you should define the following:
+\n In MESH you can create groups of elements of a certain type whose
+contents is defined in different ways. To create a group, in the \b
+Mesh menu select <b>Create Group</b> item (also available in the
+contextual menu of the mesh).<br>
+To create a group of any type you should define the following:
<ul>
-<li><b>Mesh</b> - the name of the mesh whose elements will form your
+<li><b>Mesh</b> - the mesh whose elements will form your
group. You can select your mesh in the Objet Browser or in the 3D
viewer.</li>
<li><b>Elements Type</b> - set of radio buttons allows to select the type of
<li><b>Volumes</b></li>
</ul>
<li><b>Name</b> field allows to enter the name of your new group.</li>
+<li><b>Color</b> - allows to assign to the group a certain color, for
+example, defining boundary conditions. The chosen color is used to
+display the elements of the group. The color attribute of the group is
+not persistent, it is lost if you save and then load the study from
+the file.</li>
</ul>
-SALOME Platform distinguishes between the two Group types:
-<b>Standalone Group</b> and <b>Group on Geometry</b>.
+SALOME Platform distinguishes between the three Group types:
+<b>Standalone Group</b>, <b>Group on Geometry</b> and <b>Group on Filter</b>.
\anchor standalone_group <br><h2>"Standalone Group"</h2>
-<b>Standalone Group</b> consists of mesh elements, which you can define in
+<b>Standalone Group</b> contains a list of mesh elements, which you can define in
the following ways:
<ul>
-<li>Choosing them manually with the mouse in the 3D Viewer. You can
-click on an element in the 3D viewer and it will be highlighted. After
-that click the \b Add button and the ID of this element will be added to
-the list.</li>
-<li>Applying Filters. The <b>Set filter</b> button allows to apply a
-definite filter to selection of the elements of your group. See more
-about filters on the
-\ref selection_filter_library_page "Selection filter library" page.</li>
-<li>By adding all existing entities of the chosen type to the
-group. For this turn on the <b>Select All</b> check box. In this
-mode all controls, which allow selecting the entities manually or by filters, are disabled.</li>
+<li>By adding all entities of the chosen type existing in the
+ mesh. For this, turn on the <b>Select All</b> check box. In this mode
+ all controls, which allow selecting the entities in other ways are
+ disabled.</li>
+<li>By applying the Filter. The <b>Set filter</b> button allows to
+ define the filter for selection of the elements for your group. See more
+ about filters on the
+ \ref selection_filter_library_page "Selection filter library" page.<br>
+ If the <b>Enable manual edition</b> check box is turned off, the defined
+ filter defines contents of the group. In this mode, the filter is
+ applied to all elements of the mesh. If none entity satisfies the
+ filter, the \b Apply button is disabled.<br>
+ If the <b>Enable manual edition</b> check box is turned on, the defined
+ filter can be used to for selection of entities composing the group.</li>
+<li>By choosing entities manually with the mouse in the 3D Viewer. For
+ this, turn on the <b>Enable manual edition</b> check box. You can
+ click on an element in the 3D viewer and it will be highlighted. After
+ that click the \b Add button and the ID of this element will be
+ added to the list.</li>
+<li>By adding entities from either a submesh or an existing
+ group. For this, turn on the <b>Enable manual edition</b> check
+ box. <b>Select from</b> set of fields allows to select a submesh or
+ a group of an appropriate type.</li>
+</ul>
+In the <b>manual edition</b> mode you can
+<ul>
+<li>click the \b Remove button to remove selected elements from the list</li>
+<li>click the <b>Sort List</b> button to sort the list of IDs of
+mesh elements.</li>
</ul>
-To remove a selected element or elements from the list click the
-\b Remove button. The <b>Sort List</b> button allows to sort the list of IDs of
-mesh elements.
-\n <b>Select from</b> set of fields allows to choose a submesh or an existing
-group whose elements of the previously defined type will be added to
-the list of elements which will form the new group.
-\n <b>Color</b> - allows to assign to the group a certain color, for
-example, defining boundary conditions. This feature introduces a
-useful element of preprocessing in Mesh module. Note that <b>Color</b> attribute defines
-the colors used for the display of the elements of the group.
-\n <b>Warning</b> The Med Color group interface may change in future versions of Salome.
\image html creategroup.png
-For example, to create a new group containing all entities of the
+
+For example, to create a new group containing all faces of an
existing group and some other faces selected in the viewer:
<ul>
-<li> select the "Face" type of entities and input the name of the new group.</li>
-<li> checks "Group" checkbox in "Select From" group.</li>
-<li> select the existing group in the object browser or in the viewer.</li>
-<li> click "Add" in "Content" group. "Id Elements" list will be filled
+<li> Select the \b Face type of entities and input the name of the new group.</li>
+<li> Check the \b Group checkbox in <b>Select From</b> group.</li>
+<li> Select the existing group of faces in the object browser or in the viewer</li>
+<li> Click \b Add in \b Content group. <b>Id Elements</b> list will be filled
with IDs of faces belonging to the exising group.</li>
-<li> select other faces in the viewer.</li>
-<li> click "Apply" button to create the new group.</li>
+<li> Select other faces in the viewer.</li>
+<li> Click \b Add in \b Content group.</li>
+<li> Click \b Apply button to create the new group.</li>
</ul>
Please note that the new group does not have references to the source
-group. It contains only the list of face IDs. So if the old group will
-be changed, the new one will not be modified.
+group. It contains only the list of face IDs. So if the source group
+is changed, the new one is not updated accordingly.
\image html image130.gif
-<center>In this picture the brown cells belong to a group defined manually.</center>
+<center>In this picture the brown cells belong to a group defined
+ manually.</center>
\image html image131.gif
-<center>In this picture the brown cells belong to the group defined by the criterion
-<b>Taper > 0</b>.</center>
+<center>In this picture the brown cells belong to the group defined by
+ the criterion <b>Taper > 0</b>.</center>
<b>See Also</b> a sample TUI Script of a
\ref tui_create_standalone_group "Create a Standalone Group"
operation.
+
\anchor group_on_geom <br><h2>"Group on Geometry"</h2>
-To create a group on geometry check <b>Group on geometry</b> in the \b Group
-\b type field. <b>Group on geometry</b> contains the elements of a certain type
-belonging to the selected geometrical object. To define a group select
-in the Objet Browser or in the 3D viewer a geometrical object from
-which the elements will be taken. After confirmation of the operation
-a new group of mesh elements will be created.
+To create a group on geometry check <b>Group on geometry</b> in the \b
+Group \b type field. The group on geometry contains the elements
+of a certain type generated on the selected geometrical object. Group
+contents is dynamically updated if the mesh is modified.<br>
+To define a group, select in the Objet Browser or in the 3D viewer a
+geometrical object from which the elements will be taken. After
+confirmation of the operation a new group of mesh elements will be
+created.
\image html a-creategroup.png
\image html image132.gif
-<center>In this picture the cells which belong to a certain face are
-selected in green.</center>
+<center>In this picture the cells which belong to a certain
+ geometrical face are selected in green.</center>
<b>See Also</b> a sample TUI Script of a
\ref tui_create_group_on_geometry "Create a Group on Geometry"
operation.
+
+
+\anchor group_on_filter <br><h2>"Group on Filter"</h2>
+
+To create a group on filter check <b>Group on filter</b> in the <b>
+Group type</b> field. The group on filter contains the elements
+of a certain type satisfying the defined filter. Group contents is
+dynamically updated if the mesh is modified.<br> To define a group,
+click the <b>Set filter</b> button and define criteria of the
+filter in the opened dialog. After confirmation of the operation a
+new group of mesh elements will be created. See more about filters on
+the \ref selection_filter_library_page "Selection filter library" page.
+
+\image html creategroup_on_filter.png
+
+<b>See Also</b> a sample TUI Script of a
+\ref tui_create_group_on_filter "Create a Group on Filter" operation.
+
*/
#include <SMESH_TypeFilter.hxx>
#include <SMESH_Actor.h>
#include <SMESH_ActorUtils.h>
+#include <SMESH_LogicalFilter.hxx>
// SALOME GEOM includes
#include <GEOMBase.h>
mySelector( SMESH::GetViewWindow( theModule )->GetSelector() ),
myIsBusy( false ),
myNameChanged( false ),
- myIsApplyAndClose( false )
+ myIsApplyAndClose( false ),
+ myNbChangesOfContents(0)
{
initDialog( true );
if ( !theMesh->_is_nil() )
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() )
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;
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 );
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 );
/***************************************************************/
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);
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()));
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 );
if (myMesh->_is_nil() )
myTypeGroup->button(0)->setChecked(true);
- updateButtons();
- //myName->setText(GetDefaultName(tr( "SMESH_GROUP" )));
+ onSelectAll(); //updateButtons();
}
//=================================================================================
myFilterDlg->setParent( 0 );
delete myFilterDlg;
}
+ if ( myMeshFilter ) delete myMeshFilter;
+ if ( mySubMeshFilter ) delete mySubMeshFilter;
+ if ( myGroupFilter ) delete myGroupFilter;
+ if ( myGeomFilter ) delete myGeomFilter;
}
//=================================================================================
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
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
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
myElements->selectAll();
}
}
- else
+ else if ( grpType == 1 ) // group on geom
{
QString aShapeName( "" );
_PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
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();
}
//=================================================================================
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);
}
{
if (myTypeId != id) {
myElements->clear();
- if (myCurrentLineEdit == 0)
- setSelectionMode(id);
myTypeId = id;
+
+ int curSelMode = mySelectionMode;
+ mySelectionMode = grpNoSelection;
+ setSelectionMode( curSelMode );
+ onObjectSelectionChanged();
+
setShowEntityMode();
}
}
onSelectGeomGroup(id == 1);
}
myGrpTypeId = id;
+ updateButtons();
}
//=================================================================================
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();
case grpVolumeSelection:
if ( aViewWindow ) aViewWindow->SetSelectionMode(isSelectAll ? ActorSelection : VolumeSelection);
break;
- case grpSubMeshSelection:
- mySelectionMgr->installFilter(mySubMeshFilter);
+ case grpSubMeshSelection: {
+
+ SMESH_TypeFilter* f = 0;
+ switch (myTypeId) {
+ case 0: f = new SMESH_TypeFilter(SUBMESH); break;
+ case 1: f = new SMESH_TypeFilter(SUBMESH_EDGE); break;
+ case 2: f = new SMESH_TypeFilter(SUBMESH_FACE); break;
+ case 3: f = new SMESH_TypeFilter(SUBMESH_SOLID); break;
+ default:f = new SMESH_TypeFilter(SUBMESH);
+ }
+ QList<SUIT_SelectionFilter*> filtList;
+ filtList.append( f );
+ filtList.append( new SMESH_TypeFilter(SUBMESH_COMPOUND));
+ mySubMeshFilter->setFilters( filtList );
+
+ mySelectionMgr->installFilter( mySubMeshFilter );
+
if ( aViewWindow ) aViewWindow->SetSelectionMode(ActorSelection);
break;
- case grpGroupSelection:
+ }
+ case grpGroupSelection: {
+
+ SMESH_TypeFilter* f = 0;
+ switch (myTypeId) {
+ case 0: f = new SMESH_TypeFilter(GROUP_NODE); break;
+ case 1: f = new SMESH_TypeFilter(GROUP_EDGE); break;
+ case 2: f = new SMESH_TypeFilter(GROUP_FACE); break;
+ case 3: f = new SMESH_TypeFilter(GROUP_VOLUME); break;
+ default:f = new SMESH_TypeFilter(GROUP);
+ }
+ QList<SUIT_SelectionFilter*> filtList;
+ filtList.append( f );
+ myGroupFilter->setFilters( filtList );
+
mySelectionMgr->installFilter(myGroupFilter);
if ( aViewWindow ) aViewWindow->SetSelectionMode(ActorSelection);
break;
+ }
case grpMeshSelection:
mySelectionMgr->installFilter(myMeshFilter);
if ( aViewWindow ) aViewWindow->SetSelectionMode(ActorSelection);
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();
}
}
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
}
}
- 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());
myName->text().toLatin1().data(),
aGroupVar);
}
+ resultGroup = SMESH::SMESH_GroupBase::_narrow( myGroupOnGeom );
+ isCreation = true;
- SALOMEDS::Color aColor = getGroupColor();
- myGroupOnGeom->SetColor(aColor);
+ }
+ else { // edition
- _PTR(SObject) aMeshGroupSO = SMESH::FindSObject(myGroupOnGeom);
- if( aMeshGroupSO )
- anEntryList.append( aMeshGroupSO->GetID().c_str() );
+ resultGroup = SMESH::SMESH_GroupBase::_narrow( myGroupOnGeom );
+ isCreation = false;
+ }
+ anIsOk = true;
+ }
+ if (myGrpTypeId == 2) // group on filter
+ {
+ if ( myFilter->_is_nil() ) return false;
- //SMESH::setFileName ( aMeshGroupSO, QString::number(myColorSpinBox->value()) );
- SMESH::setFileType ( aMeshGroupSO,"COULEURGROUP" );
+ if (CORBA::is_nil(myGroupOnFilter)) { // creation
+ if (myMesh->_is_nil())
+ return false;
- /* init for next operation */
+ myGroupOnFilter = myMesh->CreateGroupFromFilter(aType,
+ myName->text().toLatin1().data(),
+ myFilter);
+
+ resultGroup = SMESH::SMESH_GroupBase::_narrow( myGroupOnFilter );
+ isCreation = true;
+ }
+ else
+ {
+ myGroupOnFilter->SetFilter( myFilter );
+
+ resultGroup = SMESH::SMESH_GroupBase::_narrow( myGroupOnFilter );
+ isCreation = false;
+ }
+ anIsOk = true;
+ }
+
+ if( anIsOk )
+ {
+ SALOMEDS::Color aColor = getGroupColor();
+ resultGroup->SetColor(aColor);
+
+ _PTR(SObject) aMeshGroupSO = SMESH::FindSObject( resultGroup );
+ if( aMeshGroupSO )
+ anEntryList.append( aMeshGroupSO->GetID().c_str() );
+
+ if ( isCreation )
+ {
+ SMESH::setFileType ( aMeshGroupSO, "COULEURGROUP" );
+
+ /* init for the next operation */
myName->setText( "" );
- myGroupOnGeom = SMESH::SMESH_GroupOnGeom::_nil();
+ myElements->clear();
+ myGroup = SMESH::SMESH_Group::_nil();
+ myGroupOnGeom = SMESH::SMESH_GroupOnGeom::_nil();
+ myGroupOnFilter = SMESH::SMESH_GroupOnFilter::_nil();
+ myFilter = SMESH::Filter::_nil();
}
- else { // edition
- myGroupOnGeom->SetName(myName->text().toLatin1().data());
-
- SALOMEDS::Color aColor = getGroupColor();
- myGroupOnGeom->SetColor(aColor);
-
- _PTR(SObject) aMeshGroupSO = SMESH::FindSObject(myGroupOnGeom);
- if(SMESH_Actor *anActor = SMESH::FindActorByEntry(aMeshGroupSO->GetID().c_str())) {
- anActor->setName(myName->text().toLatin1().data());
- switch ( myTypeId ) {
- case 0: anActor->SetNodeColor( aColor.R, aColor.G, aColor.B ); break;
- case 1: anActor->SetEdgeColor( aColor.R, aColor.G, aColor.B ); break;
- case 2:
- case 3: anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B ); break;
+ else
+ {
+ myGroup->SetName(myName->text().toLatin1().data());
+
+ if ( aMeshGroupSO )
+ if(SMESH_Actor *anActor = SMESH::FindActorByEntry(aMeshGroupSO->GetID().c_str())) {
+ anActor->setName(myName->text().toLatin1().data());
+ switch ( myTypeId ) {
+ case 0: anActor->SetNodeColor( aColor.R, aColor.G, aColor.B ); break;
+ case 1: anActor->SetEdgeColor( aColor.R, aColor.G, aColor.B ); break;
+ case 2:
+ case 3: anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B ); break;
+ }
}
- }
}
-
SMESHGUI::Modified();
mySMESHGUI->updateObjBrowser(true);
+ SMESH::UpdateView(); // asv: fix of BUG PAL5515
mySelectionMgr->clearSelected();
- anIsOk = true;
- }
- if( anIsOk )
if( LightApp_Application* anApp =
dynamic_cast<LightApp_Application*>( SUIT_Session::session()->activeApplication() ) )
myObjectToSelect = anApp->browseObjects( anEntryList, isApplyAndClose() );
-
+ }
return anIsOk;
}
}
//=================================================================================
-// 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();
else
myFilterDlg->Init( aType );
+ if ( !myGroupOnFilter->_is_nil() )
+ {
+ myFilterDlg->SetFilter( myFilter, aType );
+ myFilterDlg->Init( aType );
+ }
+
myFilterDlg->SetSelection();
myFilterDlg->SetMesh( myMesh );
myFilterDlg->SetSourceWg( myElements, 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();
}
//=================================================================================
if (aNbSel == 0 || myActorsList.count() == 0 || myMesh->_is_nil()) return;
myIsBusy = true;
+ int sizeBefore = myElements->count();
SMESH::ElementType aType = SMESH::ALL;
switch(myTypeId) {
// 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);
onListSelectionChanged();
}
myIsBusy = false;
+ if ( sizeBefore < myElements->count() )
+ ++myNbChangesOfContents;
// mySelectionMgr->clearSelected();
updateButtons();
}
void SMESHGUI_GroupDlg::onRemove()
{
myIsBusy = true;
+ int sizeBefore = myElements->count();
+
if (myCurrentLineEdit == 0) {
QList<QListWidgetItem*> selItems = myElements->selectedItems();
QListWidgetItem* item;
}
}
myIsBusy = false;
+ if ( sizeBefore > myElements->count() )
+ myNbChangesOfContents += 2; // it's used to detect that "Add" was only once
updateButtons();
}