Salome HOME
Update copyright information
[modules/smesh.git] / src / SMESH_I / SMESH_Gen_i_1.cxx
index 77e5e3b9381607fed1974d472aac087daa372cf1..a7567450f5f94174f07ecd5a6e5969494e33b712 100644 (file)
@@ -1,31 +1,29 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
 //
-//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
 //
-//  This library is free software; you can redistribute it and/or
-//  modify it under the terms of the GNU Lesser General Public
-//  License as published by the Free Software Foundation; either
-//  version 2.1 of the License.
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
 //
-//  This library is distributed in the hope that it will be useful,
-//  but WITHOUT ANY WARRANTY; without even the implied warranty of
-//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-//  Lesser General Public License for more details.
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
 //
-//  You should have received a copy of the GNU Lesser General Public
-//  License along with this library; if not, write to the Free Software
-//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
-//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-//  SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-// File      : SMESH_Gen_i_1.cxx
-// Created   : Thu Oct 21 17:24:06 2004
-// Author    : Edward AGAPOV (eap)
-// Module    : SMESH
-// $Header: 
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+//  File      : SMESH_Gen_i_1.cxx
+//  Created   : Thu Oct 21 17:24:06 2004
+//  Author    : Edward AGAPOV (eap)
+//  Module    : SMESH
+
 #include "SMESH_Gen_i.hxx"
 
 #include "SMESH_Mesh_i.hxx"
 
 #ifdef _DEBUG_
 static int MYDEBUG = 0;
-static int VARIABLE_DEBUG = 0;
+//static int VARIABLE_DEBUG = 0;
 #else
 static int MYDEBUG = 0;
-static int VARIABLE_DEBUG = 0;
+//static int VARIABLE_DEBUG = 0;
 #endif
 
 //=============================================================================
@@ -137,6 +135,11 @@ long SMESH_Gen_i::GetVolumeGroupsTag()
   return SMESH::Tag_VolumeGroups;
 }
 
+long SMESH_Gen_i::Get0DElementsGroupsTag()
+{
+  return SMESH::Tag_0DElementsGroups;
+}
+
 //=============================================================================
 /*!
  *  SMESH_Gen_i::CanPublishInStudy
@@ -371,9 +374,9 @@ static void addReference (SALOMEDS::Study_ptr   theStudy,
 //=============================================================================
 
 SALOMEDS::SObject_ptr SMESH_Gen_i::PublishInStudy(SALOMEDS::Study_ptr   theStudy,
-                                                 SALOMEDS::SObject_ptr theSObject,
-                                                 CORBA::Object_ptr     theIOR,
-                                                 const char*           theName)
+                                                  SALOMEDS::SObject_ptr theSObject,
+                                                  CORBA::Object_ptr     theIOR,
+                                                  const char*           theName)
      throw (SALOME::SALOME_Exception)
 {
   Unexpect aCatch(SALOME_SalomeException);
@@ -468,9 +471,9 @@ static long findMaxChildTag( SALOMEDS::SObject_ptr theSObject )
     if ( !aStudy->_is_nil() ) {
       SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator( theSObject );
       for ( ; anIter->More(); anIter->Next() ) {
-       long nTag = anIter->Value()->Tag();
-       if ( nTag > aTag )
-         aTag = nTag;
+        long nTag = anIter->Value()->Tag();
+        if ( nTag > aTag )
+          aTag = nTag;
       }
     }
   }
@@ -628,7 +631,10 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::PublishSubMesh (SALOMEDS::Study_ptr      theS
     SetName( aRootSO, aRootName );
 
     // Add new submesh to corresponding sub-tree
-    aSubMeshSO = publish (theStudy, theSubMesh, aRootSO, 0, "ICON_SMESH_TREE_MESH_WARN");
+    SMESH::array_of_ElementType_var elemTypes = theSubMesh->GetTypes();
+    const int isEmpty = ( elemTypes->length() == 0 );
+    const char* pm[2] = { "ICON_SMESH_TREE_MESH", "ICON_SMESH_TREE_MESH_WARN" };
+    aSubMeshSO = publish (theStudy, theSubMesh, aRootSO, 0, pm[isEmpty] );
     if ( aSubMeshSO->_is_nil() )
       return aSubMeshSO._retn();
   }
@@ -690,7 +696,20 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::PublishGroup (SALOMEDS::Study_ptr    theStudy
         SetName( aRootSO, aRootNames[aType] );
 
       // Add new group to corresponding sub-tree
-      aGroupSO = publish (theStudy, theGroup, aRootSO, 0, "ICON_SMESH_TREE_GROUP" );
+      SMESH::array_of_ElementType_var elemTypes = theGroup->GetTypes();
+      int isEmpty = ( elemTypes->length() == 0 );
+      std::string pm[2] = { "ICON_SMESH_TREE_GROUP", "ICON_SMESH_TREE_MESH_WARN" };
+      if ( SMESH::DownCast< SMESH_GroupOnFilter_i* > ( theGroup ))
+      {
+        pm[0] = "ICON_SMESH_TREE_GROUP_ON_FILTER";
+      }
+      else if ( SMESH::DownCast< SMESH_Group_i* > ( theGroup ))
+      {
+        SMESH::array_of_ElementType_var allElemTypes = theMesh->GetTypes();
+        for ( size_t i =0; i < allElemTypes->length() && isEmpty; ++i )
+          isEmpty = ( allElemTypes[i] != theGroup->GetType() );
+      }
+      aGroupSO = publish (theStudy, theGroup, aRootSO, 0, pm[isEmpty].c_str() );
     }
     if ( aGroupSO->_is_nil() )
       return aGroupSO._retn();
@@ -890,71 +909,146 @@ bool SMESH_Gen_i::RemoveHypothesisFromShape(SALOMEDS::Study_ptr         theStudy
 //function : UpdateParameters
 //purpose  : 
 //=======================================================================
-void SMESH_Gen_i::UpdateParameters(CORBA::Object_ptr theObject, const char* theParameters)
+void SMESH_Gen_i::UpdateParameters(/*CORBA::Object_ptr theObject,*/ const char* theParameters)
 {
-
-  if(VARIABLE_DEBUG)
-    cout<<"UpdateParameters : "<<theParameters<<endl;
   SALOMEDS::Study_ptr aStudy = GetCurrentStudy();
-  if(aStudy->_is_nil() || CORBA::is_nil(theObject)) 
-    return;
-
-  SALOMEDS::SObject_var aSObj =  ObjectToSObject(aStudy,theObject);
-  if(aSObj->_is_nil())  
+  if ( aStudy->_is_nil() )
     return;
-  
-  SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder();
-  
-  SALOMEDS::GenericAttribute_var aFindAttr;
-  bool hasAttr = aSObj->FindAttribute(aFindAttr, "AttributeString");
-  if(VARIABLE_DEBUG)
-    cout<<"Find Attribute "<<hasAttr<<endl;
-
-  SALOMEDS::GenericAttribute_var anAttr;
-  anAttr = aStudyBuilder->FindOrCreateAttribute( aSObj, "AttributeString");
-  SALOMEDS::AttributeString_var aStringAttr = SALOMEDS::AttributeString::_narrow(anAttr);
-
-  TCollection_AsciiString aNewParams;
-  TCollection_AsciiString aOldParameters(aStringAttr->Value());
-  TCollection_AsciiString anInputParams(ParseParameters(theParameters));
-  
-  if(!hasAttr)
-    aNewParams = anInputParams;
-  else 
-    aNewParams = aOldParameters+"|"+anInputParams;
-
-  if(VARIABLE_DEBUG)
+  myLastParameters.clear();
+  int pos = 0, prevPos = 0, len = strlen( theParameters );
+  if ( len == 0 ) return;
+  while ( pos <= len )
+  {
+    if ( pos == len || theParameters[pos] == ':' )
     {
-      cout<<"Input Parameters : "<<anInputParams<<endl;
-      cout<<"Old Parameters : "<<aOldParameters<<endl;
-      cout<<"New Parameters : "<<aNewParams<<endl;
+      if ( prevPos < pos )
+      {
+        string val(theParameters + prevPos, theParameters + pos );
+        if ( !aStudy->IsVariable( val.c_str() ))
+          val.clear();
+        myLastParameters.push_back( val );
+      }
+      else
+      {
+        myLastParameters.push_back("");
+      }
+      prevPos = pos+1;
     }
-  
-  
-  aStringAttr->SetValue( aNewParams.ToCString() );
+    ++pos;
+  }
+  return;
+
+  // OLD VARIANT
+
+  // if(VARIABLE_DEBUG)
+  //   cout<<"UpdateParameters : "<<theParameters<<endl;
+  // //SALOMEDS::Study_ptr aStudy = GetCurrentStudy();
+  // if(aStudy->_is_nil() || CORBA::is_nil(theObject)) 
+  //   return;
+
+  // SALOMEDS::SObject_var aSObj =  ObjectToSObject(aStudy,theObject);
+  // if(aSObj->_is_nil())  
+  //   return;
+
+  // SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder();
+
+  // SALOMEDS::GenericAttribute_var aFindAttr;
+  // bool hasAttr = aSObj->FindAttribute(aFindAttr, "AttributeString");
+  // if(VARIABLE_DEBUG)
+  //   cout<<"Find Attribute "<<hasAttr<<endl;
+
+  // SALOMEDS::GenericAttribute_var anAttr;
+  // anAttr = aStudyBuilder->FindOrCreateAttribute( aSObj, "AttributeString");
+  // SALOMEDS::AttributeString_var aStringAttr = SALOMEDS::AttributeString::_narrow(anAttr);
+
+  // CORBA::String_var oldparVar = aStringAttr->Value();
+  // CORBA::String_var inpparVar = ParseParameters(theParameters);
+  // TCollection_AsciiString aNewParams;
+  // TCollection_AsciiString aOldParameters(oldparVar.inout());
+  // TCollection_AsciiString anInputParams(inpparVar.inout());
+  // if(!hasAttr)
+  //   aNewParams = anInputParams;
+  // else 
+  //   {
+  //     int pos = aOldParameters.SearchFromEnd("|");
+  //     if(pos==-1) pos = 0;
+  //     TCollection_AsciiString previousParamFull(aOldParameters.Split(pos));
+  //     TCollection_AsciiString previousParam(previousParamFull);
+  //     TCollection_AsciiString theRepet("1");
+  //     pos = previousParam.SearchFromEnd(";*=");
+  //     if(pos >= 0)
+  //       {
+  //         theRepet = previousParam.Split(pos+2);
+  //         pos = pos-1;
+  //         if(pos==-1) pos = 0;
+  //         previousParam.Split(pos);
+  //       }
+  //     if(previousParam == anInputParams)
+  //       {
+  //         theRepet = theRepet.IntegerValue()+1;
+  //         aNewParams = aOldParameters + previousParam + ";*=" + theRepet;
+  //       }
+  //     else
+  //       {
+  //         aNewParams = aOldParameters + previousParamFull + "|" + anInputParams;
+  //       }
+  //   }
+
+  // if(VARIABLE_DEBUG)
+  // {
+  //   cout<<"Input Parameters : "<<anInputParams<<endl;
+  //   cout<<"Old Parameters : "<<aOldParameters<<endl;
+  //   cout<<"New Parameters : "<<aNewParams<<endl;
+  // }
+
+  // aStringAttr->SetValue( aNewParams.ToCString() );
 }
 
 //=======================================================================
 //function : ParseParameters
-//purpose  : 
+//purpose  : Replace variables by their values
 //=======================================================================
 char* SMESH_Gen_i::ParseParameters(const char* theParameters)
 {
-  const char* aParameters = CORBA::string_dup(theParameters);
+  //const char* aParameters = theParameters;
+//   const char* aParameters = CORBA::string_dup(theParameters);
   TCollection_AsciiString anInputParams;
-  SALOMEDS::Study_ptr aStudy = GetCurrentStudy();
+  SALOMEDS::Study_var aStudy = GetCurrentStudy();
   if( !aStudy->_is_nil() ) {
-    SALOMEDS::ListOfListOfStrings_var aSections = aStudy->ParseVariables(aParameters);
-    for(int j=0;j<aSections->length();j++) {
-      SALOMEDS::ListOfStrings aVars= aSections[j];
-      for(int i=0;i<aVars.length();i++ ) {
-        anInputParams += aStudy->IsVariable(aVars[i].in()) ? 
-          TCollection_AsciiString(aVars[i].in()) : TCollection_AsciiString("");
-        if(i != aVars.length()-1)
-          anInputParams+=":";
+//     SALOMEDS::ListOfListOfStrings_var aSections = aStudy->ParseVariables(theParameters);
+//     for(int j=0;j<aSections->length();j++) {
+//       SALOMEDS::ListOfStrings aVars= aSections[j];
+//       for(int i=0;i<aVars.length();i++ ) {
+//         anInputParams += aStudy->IsVariable(aVars[i].in()) ? 
+//           TCollection_AsciiString(aVars[i].in()) : TCollection_AsciiString("");
+//         if(i != aVars.length()-1)
+//           anInputParams+=":";
+//       }
+//       if(j!=aSections->length()-1)
+//         anInputParams+="|";
+//     }
+    TCollection_AsciiString paramStr( theParameters );
+    static TCollection_AsciiString separators(":|");
+    int beg = 0, end;
+    char sep, *pParams = (char*)paramStr.ToCString();
+    while ( beg < paramStr.Length() )
+    {
+      end = beg-1;
+      while ( ++end < paramStr.Length() )
+        if ( pParams[end] == ':' || pParams[end] == '|')
+          break;
+      if ( end < paramStr.Length())
+      {
+        sep = pParams[end];
+        pParams[end] = '\0';
       }
-      if(j!=aSections->length()-1)
-        anInputParams+="|";
+      if ( aStudy->IsVariable( pParams+beg ))
+        anInputParams += pParams+beg;
+      if ( end < paramStr.Length() )
+        anInputParams += sep;
+      else
+        break;
+      beg = end + 1;
     }
   }
   return CORBA::string_dup(anInputParams.ToCString());