]> SALOME platform Git repositories - modules/smesh.git/commitdiff
Salome HOME
[bos #41485] Fixed memory error, possibly related to this issue. Fixed updating of... jfa/41485 49/head
authorjfa <jfa@opencascade.com>
Tue, 21 May 2024 16:06:26 +0000 (17:06 +0100)
committerjfa <jfa@opencascade.com>
Wed, 30 Oct 2024 13:48:11 +0000 (13:48 +0000)
12 files changed:
doc/gui/images/groups_in_OB.png
doc/gui/images/image88.gif [deleted file]
doc/gui/images/image88.jpg [changed mode: 0644->0755]
doc/gui/images/image89.jpg [new file with mode: 0644]
doc/gui/input/constructing_meshes.rst
src/SMESHDS/SMESHDS_Script.cxx
src/SMESHGUI/SMESHGUI.cxx
src/SMESH_I/SMESH_Gen_i.cxx
src/SMESH_I/SMESH_Gen_i.hxx
src/SMESH_I/SMESH_Gen_i_1.cxx
src/SMESH_I/SMESH_Group_i.cxx
src/SMESH_I/SMESH_Mesh_i.cxx

index 1ffb96a6b4b301d5f4000605ac9a1ebb495c52ff..c68ed37b3aa5c39c9690bbd55bf6175fcf0adbca 100644 (file)
Binary files a/doc/gui/images/groups_in_OB.png and b/doc/gui/images/groups_in_OB.png differ
diff --git a/doc/gui/images/image88.gif b/doc/gui/images/image88.gif
deleted file mode 100644 (file)
index 553656d..0000000
Binary files a/doc/gui/images/image88.gif and /dev/null differ
old mode 100644 (file)
new mode 100755 (executable)
index 9499ab2..2d3daa9
Binary files a/doc/gui/images/image88.jpg and b/doc/gui/images/image88.jpg differ
diff --git a/doc/gui/images/image89.jpg b/doc/gui/images/image89.jpg
new file mode 100644 (file)
index 0000000..9499ab2
Binary files /dev/null and b/doc/gui/images/image89.jpg differ
index 923ecf92982b13a7cc76ec9fd738652901c0972a..fcebdb3685bffadf68ff80ea7023180865c112e4 100644 (file)
@@ -210,6 +210,10 @@ When the Preview dialog is closed, the question about the storage of temporarily
 
 These elements can be kept in the mesh.
 
+Since the mesh, its submesh(es) and group(s) are now not empty, their **Object Browser** icons will be updated accordingly.
+
+       .. image:: ../images/image89.jpg
+               :align: center
 
 .. _submesh_order_anchor:
 
index f1e484397d9542c73463f1d83bf39c4a999e9f4c..450a69bcacee487cece1855c2582c662fe5655fc 100644 (file)
@@ -35,7 +35,8 @@ using namespace std;
 //purpose  : 
 //=======================================================================
 SMESHDS_Script::SMESHDS_Script(bool theIsEmbeddedMode):
-  myIsEmbeddedMode(theIsEmbeddedMode)
+  myIsEmbeddedMode(theIsEmbeddedMode),
+  myIsModified(true)
 {
   //cerr << "=========================== myIsEmbeddedMode " << myIsEmbeddedMode << endl;
 }
index fe6d17ac64be9e441f31443edadebca3f08833fc..29487f6e09379f8200a4409b2b87949df76278ff 100644 (file)
@@ -410,9 +410,6 @@ namespace
         {
           _PTR(SObject) aMeshSO = SMESH::FindSObject( aMeshes[i] );
           if ( aMeshSO ) {
-            _PTR(StudyBuilder) aBuilder = aStudy->NewBuilder();
-            _PTR(AttributePixMap) aPixmap = aBuilder->FindOrCreateAttribute( aMeshSO, "AttributePixMap" );
-            aPixmap->SetPixMap( "ICON_SMESH_TREE_MESH_IMPORTED" );
             if ( theCommandID == SMESHOp::OpImportUNV ) // mesh names aren't taken from the file for UNV import
               SMESH::SetName( aMeshSO, QFileInfo(filename).fileName() );
 
@@ -607,7 +604,7 @@ namespace
     {
       format = "CGNS";
       notSupportedElemTypes.push_back( SMESH::Entity_Ball );
-    }    
+    }
     else if ( isGMF )
     {
       format = "GMF";
@@ -707,7 +704,7 @@ namespace
       checkBoxes << QObject::tr( "CGNS_EXPORT_ELEMS_BY_TYPE" ) << QObject::tr("STRUCTUREDCGNS");
 
       SalomeApp_CheckFileDlg* fd = new SalomeApp_CheckFileDlg ( SMESHGUI::desktop(), false, checkBoxes, true, true );
-      
+
       fd->setWindowTitle( aTitle );
       fd->setNameFilter( QObject::tr( "CGNS_FILES_FILTER" ) + " (*.cgns)" );
 
@@ -717,18 +714,18 @@ namespace
       SMESHGUI_FileValidator* fv = new SMESHGUI_FileValidator( fd );
       fd->setValidator( fv );
       fd->SetChecked( option, 0 );
-      
+
       if ( fd->exec() )
       {
         aFilename     = fd->selectedFile();
-        structureCGNS = fd->IsChecked( 1 );        
+        structureCGNS = fd->IsChecked( 1 );
       }
 
       toOverwrite = fv->isOverwrite( aFilename );
       option      = fd->IsChecked( 0 );
       SMESHGUI::resourceMgr()->setValue("SMESH", theOptionResource, option );
       toCreateGroups = option;
-      
+
       delete fd;
     }
     else if ( isUNV || isDAT ) // Export to [ UNV | DAT ] - one option
@@ -768,11 +765,11 @@ namespace
       QStringList filters;
       aFilterMap.insert( QObject::tr( "STL_ASCII_FILES_FILTER" ) + " (*.stl)", 1 );
       aFilterMap.insert( QObject::tr( "STL_BIN_FILES_FILTER" )   + " (*.stl)", 0 );
-      
+
       QMap<QString, int>::const_iterator it = aFilterMap.begin();
       for ( ; it != aFilterMap.end(); ++it )
-        filters.push_back( it.key() );    
-     
+        filters.push_back( it.key() );
+
       SUIT_FileDlg* fd = new SUIT_FileDlg( SMESHGUI::desktop(), false, true, true );
       fd->setWindowTitle( aTitle );
       fd->setNameFilters( filters );
@@ -1031,7 +1028,7 @@ namespace
                                     aFilename.toUtf8().data(),
                                     toOverwrite && aMeshIndex == 0,
                                     toCreateGroups );
-            else                                  
+            else
               aMeshItem->ExportStructuredCGNS( aMeshOrGroup,
                                                 aFilename.toUtf8().data(),
                                                 toOverwrite && aMeshIndex == 0 );
@@ -1069,11 +1066,11 @@ namespace
           SUIT_MessageBox::warning(SMESHGUI::desktop(),
                                    QObject::tr("SMESH_WRN_WARNING"),
                                    QObject::tr("SMESH_EXPORT_FAILED") + SalomeApp_Tools::ExceptionToString(S_ex));
-        }          
+        }
         else
           SUIT_MessageBox::warning(SMESHGUI::desktop(),
                                    QObject::tr("SMESH_WRN_WARNING"),
-                                   SalomeApp_Tools::ExceptionToString(S_ex));                                           
+                                   SalomeApp_Tools::ExceptionToString(S_ex));
         wc.resume();
       }
     }
@@ -4196,7 +4193,7 @@ void SMESHGUI::createSMESHAction( const int id, const QString& po_id, const QStr
     pix = resMgr->loadPixmap( "SMESH", tr( QString( "ICON_%1" ).arg( po_id ).toLatin1().data() ), false );
   if ( !pix.isNull() )
     icon = QIcon( pix );
-  
+
   QString tooltip    = tr( QString( "TOP_%1" ).arg( po_id ).toLatin1().data() ),
           menu       = tr( QString( "MEN_%1" ).arg( po_id ).toLatin1().data() ),
           status_bar = tr( QString( "STB_%1" ).arg( po_id ).toLatin1().data() );
index 1c78a25268a822ff4b26e282c0f1e8ffd35028e0..942aacd5717c950d253f8c4fcd5a59f4da850d21 100644 (file)
@@ -1401,12 +1401,15 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CreateMeshesFromUNV( const char* theFileName
   checkFileReadable( theFileName );
 
   SMESH::SMESH_Mesh_var aMesh = createMesh();
+
   string aFileName;
+
   // publish mesh in the study
   if ( CanPublishInStudy( aMesh ) ) {
     SALOMEDS::StudyBuilder_var aStudyBuilder = getStudyServant()->NewBuilder();
     aStudyBuilder->NewCommand();  // There is a transaction
-    SALOMEDS::SObject_wrap aSO = PublishMesh( aMesh.in(), aFileName.c_str() );
+    SALOMEDS::SObject_wrap aSO =
+      PublishMesh( aMesh.in(), aFileName.c_str(), "ICON_SMESH_TREE_MESH_IMPORTED" );
     aStudyBuilder->CommitCommand();
     if ( !aSO->_is_nil() ) {
       // Update Python script
@@ -1438,13 +1441,6 @@ SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMED( const char*
 {
   checkFileReadable( theFileName );
 
-#ifdef WIN32
-  char bname[ _MAX_FNAME ];
-  _splitpath( theFileName, NULL, NULL, bname, NULL );
-  string aFileName = bname;
-#else
-  string aFileName = basename( const_cast<char *>( theFileName ));
-#endif
   // Retrieve mesh names from the file
   DriverMED_R_SMESHDS_Mesh myReader;
   myReader.SetFile( theFileName );
@@ -1481,7 +1477,7 @@ SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMED( const char*
         // publish mesh in the study
         SALOMEDS::SObject_wrap aSO;
         if ( CanPublishInStudy( mesh ) )
-          aSO = PublishMesh( mesh.in(), meshName.c_str() );
+          aSO = PublishMesh( mesh.in(), meshName.c_str(), "ICON_SMESH_TREE_MESH_IMPORTED" );
 
         // Python Dump
         if ( !aSO->_is_nil() ) {
@@ -1529,7 +1525,7 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CreateMeshesFromSTL( const char* theFileName
   checkFileReadable( theFileName );
 
   SMESH::SMESH_Mesh_var aMesh = createMesh();
-  //string aFileName;
+
 #ifdef WIN32
   char bname[ _MAX_FNAME ];
   _splitpath( theFileName, NULL, NULL, bname, NULL );
@@ -1537,11 +1533,13 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CreateMeshesFromSTL( const char* theFileName
 #else
   string aFileName = basename( const_cast<char *>(theFileName) );
 #endif
+
   // publish mesh in the study
   if ( CanPublishInStudy( aMesh ) ) {
     SALOMEDS::StudyBuilder_var aStudyBuilder = getStudyServant()->NewBuilder();
     aStudyBuilder->NewCommand();  // There is a transaction
-    SALOMEDS::SObject_wrap aSO = PublishInStudy( SALOMEDS::SObject::_nil(), aMesh.in(), aFileName.c_str() );
+    SALOMEDS::SObject_wrap aSO =
+      PublishMesh( aMesh.in(), aFileName.c_str(), "ICON_SMESH_TREE_MESH_IMPORTED" );
     aStudyBuilder->CommitCommand();
     if ( !aSO->_is_nil() ) {
       // Update Python script
@@ -1616,7 +1614,7 @@ SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromCGNS( const char*
         // publish mesh in the study
         SALOMEDS::SObject_wrap aSO;
         if ( CanPublishInStudy( mesh ) )
-          aSO = PublishMesh( mesh.in(), meshName.c_str() );
+          aSO = PublishMesh( mesh.in(), meshName.c_str(), "ICON_SMESH_TREE_MESH_IMPORTED" );
 
         // Python Dump
         if ( !aSO->_is_nil() ) {
@@ -1667,7 +1665,8 @@ SMESH_Gen_i::CreateMeshesFromGMF( const char*             theFileName,
   if ( CanPublishInStudy( aMesh ) ) {
     SALOMEDS::StudyBuilder_var aStudyBuilder = getStudyServant()->NewBuilder();
     aStudyBuilder->NewCommand();  // There is a transaction
-    SALOMEDS::SObject_wrap aSO = PublishInStudy( SALOMEDS::SObject::_nil(), aMesh.in(), aFileName.c_str() );
+    SALOMEDS::SObject_wrap aSO =
+      PublishMesh( aMesh.in(), aFileName.c_str(), "ICON_SMESH_TREE_MESH_IMPORTED" );
     aStudyBuilder->CommitCommand();
     if ( !aSO->_is_nil() ) {
       // Update Python script
@@ -1737,7 +1736,7 @@ SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMESHIO(const char* theFileName,
       // publish mesh in the study
       SALOMEDS::SObject_wrap aSO;
       if (CanPublishInStudy(mesh))
-        aSO = PublishMesh(mesh.in(), meshName.c_str());
+        aSO = PublishMesh(mesh.in(), meshName.c_str(), "ICON_SMESH_TREE_MESH_IMPORTED");
 
       // Save SO to use in a python dump
       sobjects.emplace_back(aSO);
index 1b3af8ad506a974b952fb06192d4bb42e1a33e9d..3236fb1b6783b2af52e40a072de886c7624659fc 100644 (file)
@@ -524,7 +524,8 @@ public:
   // publishing methods
   SALOMEDS::SComponent_ptr PublishComponent();
   SALOMEDS::SObject_ptr PublishMesh (SMESH::SMESH_Mesh_ptr theMesh,
-                                     const char*           theName = 0);
+                                     const char*           theName = 0,
+                                     const char*           thePixMap = 0);
   SALOMEDS::SObject_ptr PublishHypothesis (SMESH::SMESH_Hypothesis_ptr theHyp,
                                            const char*                 theName = 0);
   SALOMEDS::SObject_ptr PublishSubMesh (SMESH::SMESH_Mesh_ptr    theMesh,
@@ -536,6 +537,7 @@ public:
                                       GEOM::GEOM_Object_ptr  theShapeObject,
                                       const char*            theName = 0);
   void UpdateIcons(SMESH::SMESH_Mesh_ptr theMesh);
+  void UpdateGroupIcon(SMESH::SMESH_GroupBase_ptr theGroup);
   void HighLightInvalid(CORBA::Object_ptr theObject, bool isInvalid);
   bool IsInvalid(SALOMEDS::SObject_ptr theObject);
   bool AddHypothesisToShape(SMESH::SMESH_Mesh_ptr       theMesh,
index 0d2ff3d6f633ffd8b348a75dfb729c566f4a6770..18cde4fee7f90af7e1192197a12749e8dbfb333c 100644 (file)
@@ -607,7 +607,8 @@ SALOMEDS::SComponent_ptr SMESH_Gen_i::PublishComponent()
 //=======================================================================
 
 SALOMEDS::SObject_ptr SMESH_Gen_i::PublishMesh (SMESH::SMESH_Mesh_ptr theMesh,
-                                                const char*           theName)
+                                                const char*           theName,
+                                                const char*           thePixMap)
 {
   if ( !myIsEnablePublish )
     return SALOMEDS::SObject::_nil();
@@ -631,7 +632,8 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::PublishMesh (SMESH::SMESH_Mesh_ptr theMesh,
     else
       aTag++;
 
-    aMeshSO = publish( theMesh, father, aTag, "ICON_SMESH_TREE_MESH_WARN" );
+    aMeshSO = publish( theMesh, father, aTag,
+                       thePixMap ? thePixMap : "ICON_SMESH_TREE_MESH_WARN" );
     if ( aMeshSO->_is_nil() )
       return aMeshSO._retn();
   }
@@ -977,18 +979,13 @@ void SMESH_Gen_i::UpdateIcons( SMESH::SMESH_Mesh_ptr theMesh )
       if ( idSrc->_is_nil() )
         continue;
 
-      SMESH::SMESH_GroupBase_var     grp = SMESH::SMESH_GroupBase::_narrow( obj );
-      SMESH::SMESH_GroupOnFilter_var gof = SMESH::SMESH_GroupOnFilter::_narrow( obj );
-      const bool         isGroup = !grp->_is_nil();
-      const bool isGroupOnFilter = !gof->_is_nil();
-
       bool isEmpty = ( mesh_i->NbNodes() == 0 );
       if ( !isEmpty )
       {
-        if ( isGroupOnFilter ) // GetTypes() can be very long on GroupOnFilter!
-        {
-          SMESH::smIdType_array_var nbByType = mesh_i->GetNbElementsByType();
-          isEmpty = ( nbByType[ grp->GetType() ] == 0 );
+        SMESH::SMESH_GroupBase_var grp = SMESH::SMESH_GroupBase::_narrow( obj );
+        if ( !grp->_is_nil() ) {
+          UpdateGroupIcon(grp);
+          continue;
         }
         else
         {
@@ -1013,17 +1010,46 @@ void SMESH_Gen_i::UpdateIcons( SMESH::SMESH_Mesh_ptr theMesh )
 
       if ( isEmpty )
         SetPixMap( so, "ICON_SMESH_TREE_MESH_WARN");
-      else if ( !isGroup )
-        SetPixMap( so, "ICON_SMESH_TREE_MESH" );
-      else if ( isGroupOnFilter )
-        SetPixMap( so, "ICON_SMESH_TREE_GROUP_ON_FILTER" );
       else
-        SetPixMap( so, "ICON_SMESH_TREE_GROUP" );
+        SetPixMap( so, "ICON_SMESH_TREE_MESH" );
 
     } // loop on sub-meshes or groups
   } // loop on roots
 }
 
+//=======================================================================
+//function : UpdateGroupIcon
+//purpose  : update icon of a group
+//=======================================================================
+
+void SMESH_Gen_i::UpdateGroupIcon( SMESH::SMESH_GroupBase_ptr theGroup )
+{
+  SALOMEDS::SObject_wrap so = ObjectToSObject( theGroup );
+  if ( so->_is_nil() )
+    return;
+
+  SMESH::SMESH_GroupOnFilter_var gof = SMESH::SMESH_GroupOnFilter::_narrow( theGroup );
+  const bool isGroupOnFilter = !gof->_is_nil();
+
+  bool isEmpty = false;
+  if ( isGroupOnFilter ) // GetTypes() can be very long on GroupOnFilter!
+  {
+    SMESH::smIdType_array_var nbByType = theGroup->GetMesh()->GetNbElementsByType();
+    isEmpty = ( nbByType[ theGroup->GetType() ] == 0 );
+  }
+  else
+  {
+    isEmpty = ( theGroup->Size() == 0 );
+  }
+
+  if ( isEmpty )
+    SetPixMap( so, "ICON_SMESH_TREE_MESH_WARN");
+  else if ( isGroupOnFilter )
+    SetPixMap( so, "ICON_SMESH_TREE_GROUP_ON_FILTER" );
+  else
+    SetPixMap( so, "ICON_SMESH_TREE_GROUP" );
+}
+
 //=======================================================================
 //function : HighLightInvalid
 //purpose  : change font color of a object in the Object Browser
index ddc625907d15db26e683a696a317519ef81dec4d..c9ff263392ad537a080d6686516656c69f41218d 100644 (file)
@@ -261,16 +261,19 @@ void SMESH_Group_i::Clear()
   if ( myPreMeshInfo )
     myPreMeshInfo->FullLoadFromFile();
 
+  SMESH::SMESH_Group_var me = _this();
+
   // Update Python script
-  SMESH::TPythonDump() << SMESH::SMESH_Group_var(_this()) << ".Clear()";
+  SMESH::TPythonDump() << me << ".Clear()";
 
   // Clear the group
   SMESHDS_Group* aGroupDS = dynamic_cast<SMESHDS_Group*>( GetGroupDS() );
   if (aGroupDS) {
     aGroupDS->Clear();
-    return;
+    SMESH_Gen_i* aGen = GetMeshServant()->GetGen();
+    aGen->UpdateGroupIcon(me);
+    Modified(); // notify dependent Filter with FT_BelongToMeshGroup criterion
   }
-  Modified(); // notify dependent Filter with FT_BelongToMeshGroup criterion
 }
 
 //=============================================================================
@@ -301,20 +304,28 @@ SMESH::smIdType  SMESH_Group_i::Add( const SMESH::smIdType_array& theIDs )
   if ( myPreMeshInfo )
     myPreMeshInfo->FullLoadFromFile();
 
+  SMESH::SMESH_Group_var me = _this();
+
   // Update Python script
-  SMESH::TPythonDump() << "nbAdd = " << SMESH::SMESH_Group_var(_this()) << ".Add( " << theIDs << " )";
+  SMESH::TPythonDump() << "nbAdd = " << me << ".Add( " << theIDs << " )";
 
   // Add elements to the group
   SMESHDS_Group* aGroupDS = dynamic_cast<SMESHDS_Group*>( GetGroupDS() );
   if (aGroupDS) {
+    bool wasEmpty = aGroupDS->IsEmpty();
     int nbAdd = 0;
     for ( CORBA::ULong i = 0; i < theIDs.length(); i++) {
       int anID = (int) theIDs[i];
       if ( aGroupDS->Add( anID ))
         nbAdd++;
     }
-    if ( nbAdd )
+    if ( nbAdd ) {
       Modified(); // notify dependent Filter with FT_BelongToMeshGroup criterion
+      if (wasEmpty) {
+        SMESH_Gen_i* aGen = GetMeshServant()->GetGen();
+        aGen->UpdateGroupIcon(me);
+      }
+    }
     return nbAdd;
   }
   MESSAGE("attempt to add elements to a vague group");
@@ -332,9 +343,10 @@ SMESH::smIdType  SMESH_Group_i::Remove( const SMESH::smIdType_array& theIDs )
   if ( myPreMeshInfo )
     myPreMeshInfo->FullLoadFromFile();
 
+  SMESH::SMESH_Group_var me = _this();
+
   // Update Python script
-  SMESH::TPythonDump() << "nbDel = " << SMESH::SMESH_Group_var(_this())
-                << ".Remove( " << theIDs << " )";
+  SMESH::TPythonDump() << "nbDel = " << me << ".Remove( " << theIDs << " )";
 
   // Remove elements from the group
   SMESHDS_Group* aGroupDS = dynamic_cast<SMESHDS_Group*>( GetGroupDS() );
@@ -345,8 +357,13 @@ SMESH::smIdType  SMESH_Group_i::Remove( const SMESH::smIdType_array& theIDs )
       if ( aGroupDS->Remove( anID ))
         nbDel++;
     }
-    if ( nbDel )
+    if ( nbDel ) {
       Modified(); // notify dependent Filter with FT_BelongToMeshGroup criterion
+      if (aGroupDS->IsEmpty()) {
+        SMESH_Gen_i* aGen = GetMeshServant()->GetGen();
+        aGen->UpdateGroupIcon(me);
+      }
+    }
     return nbDel;
   }
   MESSAGE("attempt to remove elements from a vague group");
@@ -361,24 +378,27 @@ SMESH::smIdType  SMESH_Group_i::Remove( const SMESH::smIdType_array& theIDs )
 
 typedef bool (SMESHDS_Group::*TFunChangeGroup)(const smIdType);
 
-CORBA::Long 
-ChangeByPredicate( SMESH::Predicate_i*       thePredicate,
-                   SMESHDS_GroupBase*        theGroupBase,
-                   SMESH::NotifyerAndWaiter* theGroupImpl,
-                   TFunChangeGroup           theFun)
+CORBA::Long ChangeByPredicate( SMESH::Predicate_i* thePredicate,
+                               SMESHDS_GroupBase*  theGroupBase,
+                               SMESH_GroupBase_i*  theGroup,
+                               TFunChangeGroup     theFun)
 {
   CORBA::Long aNb = 0;
-  if(SMESHDS_Group* aGroupDS = dynamic_cast<SMESHDS_Group*>(theGroupBase)){
+  if (SMESHDS_Group* aGroupDS = dynamic_cast<SMESHDS_Group*>(theGroupBase)) {
     SMESH::Controls::Filter::TIdSequence aSequence;
     const SMDS_Mesh* aMesh = theGroupBase->GetMesh();
     SMESH::Filter_i::GetElementsId(thePredicate,aMesh,aSequence);
     
     CORBA::Long i = 0, iEnd = aSequence.size();
-    for(; i < iEnd; i++)
-      if((aGroupDS->*theFun)(aSequence[i]))
+    for (; i < iEnd; i++)
+      if ((aGroupDS->*theFun)(aSequence[i]))
         aNb++;
-    if ( aNb )
-      theGroupImpl->Modified();
+    if ( aNb ) {
+      theGroup->Modified();
+      SMESH_Gen_i* aGen = theGroup->GetMeshServant()->GetGen();
+      SMESH::SMESH_GroupBase_var aGroup = theGroup->_this();
+      aGen->UpdateGroupIcon(aGroup);
+    }
     return aNb;
   }
   return aNb;
@@ -428,11 +448,16 @@ SMESH::smIdType  SMESH_Group_i::AddFrom( SMESH::SMESH_IDSource_ptr theSource )
         aGroupDS->SMDSGroup().Add( elemIt->next() );
   }
 
+  SMESH::SMESH_Group_var me = _this();
+
   // Update Python script
-  pd << "nbAdd = " << SMESH::SMESH_Group_var(_this()) << ".AddFrom( " << theSource << " )";
+  pd << "nbAdd = " << me << ".AddFrom( " << theSource << " )";
 
-  if ( prevNb != Size() )
+  if ( prevNb != Size() ) {
+    SMESH_Gen_i* aGen = GetMeshServant()->GetGen();
+    aGen->UpdateGroupIcon(me);
     Modified(); // notify dependent Filter with FT_BelongToMeshGroup criterion
+  }
 
   return Size() - prevNb;
 }
@@ -830,17 +855,18 @@ void SMESH_GroupOnFilter_i::SetFilter(SMESH::Filter_ptr theFilter)
     myFilter->SetMesh( SMESH::SMESH_Mesh::_nil() ); // to UnRegister() the mesh
   }
 
+  SMESH_Gen_i* aGen = GetMeshServant()->GetGen();
+  SMESH::SMESH_GroupOnFilter_var me = _this();
+
   if ( SMESHDS_GroupOnFilter* grDS = dynamic_cast< SMESHDS_GroupOnFilter*>( GetGroupDS() ))
   {
     grDS->SetPredicate( GetPredicate( myFilter ));
+    aGen->UpdateGroupIcon(me);
     Modified(); // notify dependent Filter with FT_BelongToMeshGroup criterion
   }
 
-  SMESH::SMESH_GroupOnFilter_var me = _this();
-
   // mark the group valid after edition
-  GetMeshServant()->GetGen()->HighLightInvalid( me, false );
-
+  aGen->HighLightInvalid( me, false );
 
   SMESH::TPythonDump()<< me <<".SetFilter( "<< theFilter <<" )";
 }
@@ -1078,4 +1104,3 @@ void SMESH_GroupOnFilter_i::OnBaseObjModified(NotifyerAndWaiter* /*filter*/, boo
   if ( SMESHDS_GroupOnFilter* grDS = dynamic_cast< SMESHDS_GroupOnFilter*>( GetGroupDS() ))
     grDS->SetPredicate( GetPredicate( myFilter )); // group resets its cache
 }
-
index 7f732ae9cf051d3bb220e4e1dcb3bb0941f2c8fb..b12b05895f529008578fb565935a01218f26e3b8 100644 (file)
@@ -1414,6 +1414,9 @@ SMESH::SMESH_Group_ptr SMESH_Mesh_i::IntersectGroups( SMESH::SMESH_GroupBase_ptr
         resGroupDS->SMDSGroup().Add( e );
     }
   }
+
+  GetGen()->UpdateGroupIcon(aResGrp);
+
   // Update Python script
   pyDump << aResGrp << " = " << SMESH::SMESH_Mesh_var(_this()) << ".IntersectGroups( "
          << theGroup1 << ", " << theGroup2 << ", '" << theName << "')";
@@ -1500,6 +1503,8 @@ SMESH_Mesh_i::IntersectListOfGroups(const SMESH::ListOfGroups& theGroups,
       resGroupDS->SMDSGroup().Add( e );
   }
 
+  GetGen()->UpdateGroupIcon(aResGrp);
+
   // Update Python script
   pyDump << aResGrp << " = " << SMESH::SMESH_Mesh_var( _this() )
          << ".IntersectListOfGroups( " << theGroups << ", '" << theName << "' )";
@@ -1561,6 +1566,9 @@ SMESH::SMESH_Group_ptr SMESH_Mesh_i::CutGroups( SMESH::SMESH_GroupBase_ptr theGr
         resGroupDS->SMDSGroup().Add( e );
     }
   }
+
+  GetGen()->UpdateGroupIcon(aResGrp);
+
   // Update Python script
   pyDump << aResGrp << " = " << SMESH::SMESH_Mesh_var(_this()) << ".CutGroups( "
          << theGroup1 << ", " << theGroup2 << ", '" << theName << "')";
@@ -1661,6 +1669,8 @@ SMESH_Mesh_i::CutListOfGroups(const SMESH::ListOfGroups& theMainGroups,
       resGroupDS->SMDSGroup().Add( e );
   }
 
+  GetGen()->UpdateGroupIcon(aResGrp);
+
   // Update Python script
   pyDump << aResGrp << " = " << SMESH::SMESH_Mesh_var( _this() )
          << ".CutListOfGroups( " << theMainGroups << ", "
@@ -4576,7 +4586,7 @@ void SMESH_Mesh_i::ExportStructuredCGNS( SMESH::SMESH_IDSource_ptr meshPart,
     meshName = name.in();
   }
   SMESH_TRY;
-  
+
   SMESH::SMESH_Mesh_var mesh = meshPart->GetMesh();
   SMESH_Mesh_i*       mesh_i = SMESH::DownCast<SMESH_Mesh_i*>( mesh );
   mesh_i->Load();