Salome HOME
[bos #32517][EDF] Dynamic logging: Removed MYDEBUG.
[modules/smesh.git] / src / DriverMED / DriverMED_R_SMESHDS_Mesh.cxx
index b3c91db53016b0149fc8870e29f6c4201a26d41e..9eab4fc8858bec48fc6344e878c6c35f0b53895c 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2022  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
 #include "MED_Utilities.hxx"
 
 #include <NCollection_Map.hxx>
+#include <smIdType.hxx>
 
 #include "utilities.h"
 
 //#include <stdlib.h>
 
-#ifdef _DEBUG_
-static int MYDEBUG = 0;
-//#define _DEXCEPT_
-#else
-static int MYDEBUG = 0;
-#endif
-
 #define _EDF_NODE_IDS_
 
 using namespace MED;
@@ -109,8 +103,8 @@ Driver_Mesh::Status DriverMED_R_SMESHDS_Mesh::Perform()
   try {
 #endif
     myFamilies.clear();
-    if(MYDEBUG) MESSAGE("Perform - myFile : "<<myFile);
-    PWrapper aMed = CrWrapper(myFile,true);
+    MESSAGE("Perform - myFile : "<<myFile);
+    PWrapper aMed = CrWrapperR(myFile);
 
     aResult = DRS_EMPTY;
     TInt aNbMeshes = aMed->GetNbMeshes();
@@ -124,7 +118,7 @@ Driver_Mesh::Status DriverMED_R_SMESHDS_Mesh::Perform()
       if (myMeshId != -1) aMeshName = SMESH_Comment( myMeshId );
       else                aMeshName = myMeshName;
 
-      if(MYDEBUG) MESSAGE("Perform - aMeshName : "<<aMeshName<<"; "<<aMeshInfo->GetName());
+      MESSAGE("Perform - aMeshName : "<<aMeshName<<"; "<<aMeshInfo->GetName());
       if ( aMeshName != aMeshInfo->GetName() ) continue;
       aResult = DRS_OK;
 
@@ -132,18 +126,18 @@ Driver_Mesh::Status DriverMED_R_SMESHDS_Mesh::Perform()
       //------------------------------------------------
       TErr anErr;
       TInt aNbFams = aMed->GetNbFamilies(aMeshInfo);
-      if(MYDEBUG) MESSAGE("Read " << aNbFams << " families");
+      MESSAGE("Read " << aNbFams << " families");
       for (TInt iFam = 0; iFam < aNbFams; iFam++)
       {
         PFamilyInfo aFamilyInfo = aMed->GetPFamilyInfo(aMeshInfo,iFam+1,&anErr);
         if(anErr >= 0){
           TInt aFamId = aFamilyInfo->GetId();
-          if(MYDEBUG) MESSAGE("Family " << aFamId << " :");
+          MESSAGE("Family " << aFamId << " :");
 
           DriverMED_FamilyPtr aFamily (new DriverMED_Family);
 
           TInt aNbGrp = aFamilyInfo->GetNbGroup();
-          if(MYDEBUG) MESSAGE("belong to " << aNbGrp << " groups");
+          MESSAGE("belong to " << aNbGrp << " groups");
           bool isAttrOk = false;
           if(aFamilyInfo->GetNbAttr() == aNbGrp)
             isAttrOk = true;
@@ -154,9 +148,9 @@ Driver_Mesh::Status DriverMED_R_SMESHDS_Mesh::Perform()
               TInt anAttrVal = aFamilyInfo->GetAttrVal(iGr);
               aFamily->SetGroupAttributVal(anAttrVal);
             }
-            if(MYDEBUG) MESSAGE(aGroupName);
+            MESSAGE(aGroupName);
             if ( strncmp( aGroupName.c_str(), NIG_GROUP_PREFIX, strlen(NIG_GROUP_PREFIX) ) != 0 )
-              aFamily->AddGroupName(aGroupName);
+              aFamily->AddGroupName( fixUTF8( aGroupName ));
           }
           aFamily->SetId( aFamId );
           myFamilies[aFamId] = aFamily;
@@ -181,7 +175,7 @@ Driver_Mesh::Status DriverMED_R_SMESHDS_Mesh::Perform()
 
       EBooleen anIsNodeNum = aNodeInfo->IsElemNum();
       TInt aNbElems = aNodeInfo->GetNbElem();
-      if(MYDEBUG) MESSAGE("Perform - aNodeInfo->GetNbElem() = "<<aNbElems<<"; anIsNodeNum = "<<anIsNodeNum);
+      MESSAGE("Perform - aNodeInfo->GetNbElem() = "<<aNbElems<<"; anIsNodeNum = "<<anIsNodeNum);
       DriverMED_FamilyPtr aFamily;
       for ( TInt iElem = 0; iElem < aNbElems; iElem++ )
       {
@@ -225,7 +219,7 @@ Driver_Mesh::Status DriverMED_R_SMESHDS_Mesh::Perform()
 
       // Reading pre information about all MED cells
       //--------------------------------------------
-      typedef MED::TVector<int> TNodeIds;
+      typedef MED::TVector<smIdType> TNodeIds;
       bool takeNumbers = true;  // initially we trust the numbers from file
       MED::TEntityInfo aEntityInfo = aMed->GetEntityInfo(aMeshInfo, eNOD);
       MED::TEntityInfo::iterator anEntityIter = aEntityInfo.begin();
@@ -266,14 +260,14 @@ Driver_Mesh::Status DriverMED_R_SMESHDS_Mesh::Perform()
             }
 #endif
             if ( !anIsNodeNum )
-              aNodeIds.swap( *(aBallInfo->myConn ));
+              aNodeIds.assign( aBallInfo->myConn->begin(), aBallInfo->myConn->end());
 
             // allocate array of diameters
-            vtkIdType maxID = myMesh->MaxElementID() + aNbBalls;
+            vtkIdType maxID = FromSmIdType<vtkIdType>(myMesh->MaxElementID() + aNbBalls);
             if ( anIsElemNum && !aBallInfo->myElemNum->empty() )
               maxID = *std::max_element( aBallInfo->myElemNum->begin(),
                                          aBallInfo->myElemNum->end() );
-            myMesh->getGrid()->AllocateDiameters( maxID ); // performance optimization
+            myMesh->GetGrid()->AllocateDiameters( maxID ); // performance optimization
 
             // create balls
             SMDS_MeshElement* anElement;
@@ -318,7 +312,7 @@ Driver_Mesh::Status DriverMED_R_SMESHDS_Mesh::Perform()
             EBooleen anIsElemNum = takeNumbers ? aPolygoneInfo->IsElemNum() : eFAUX;
 
             typedef SMDS_MeshFace* (SMESHDS_Mesh::* FAddPolyWithID)
-              (const std::vector<int> & nodes_ids, const int ID);
+              (const std::vector<smIdType> & nodes_ids, const smIdType ID);
             typedef SMDS_MeshFace* (SMESHDS_Mesh::* FAddPolygon)
               (const std::vector<const SMDS_MeshNode*> & nodes);
 
@@ -355,7 +349,7 @@ Driver_Mesh::Status DriverMED_R_SMESHDS_Mesh::Perform()
 #endif
                 if ( anIsElemNum ) {
                   TInt anElemId = aPolygoneInfo->GetElemNum( iElem );
-                  anElement = (myMesh->*addPolyWithID)( aNodeIds, anElemId );
+                  anElement = (myMesh->*addPolyWithID)( aNodeIds, ToSmIdType(anElemId) );
                 }
                 if ( !anElement ) {
                   aNodes.resize( aNbConn );
@@ -436,7 +430,7 @@ Driver_Mesh::Status DriverMED_R_SMESHDS_Mesh::Perform()
 #endif
                 if(anIsElemNum){
                   TInt anElemId = aPolyedreInfo->GetElemNum(iElem);
-                  anElement = myMesh->AddPolyhedralVolumeWithID(aNodeIds,aQuantities,anElemId);
+                  anElement = myMesh->AddPolyhedralVolumeWithID(aNodeIds,aQuantities,ToSmIdType(anElemId));
                 }
                 if(!anElement){
                   vector<const SMDS_MeshNode*> aNodes(aNbNodes);
@@ -474,8 +468,8 @@ Driver_Mesh::Status DriverMED_R_SMESHDS_Mesh::Perform()
             PCellInfo aCellInfo = aMed->GetPCellInfo(aMeshInfo,anEntity,aGeom);
             EBooleen anIsElemNum = takeNumbers ? aCellInfo->IsElemNum() : eFAUX;
             TInt aNbElems = aCellInfo->GetNbElem();
-            if(MYDEBUG) MESSAGE("Perform - anEntity = "<<anEntity<<"; anIsElemNum = "<<anIsElemNum);
-            if(MYDEBUG) MESSAGE("Perform - aGeom = "<<aGeom<<"; aNbElems = "<<aNbElems);
+            MESSAGE("Perform - anEntity = "<<anEntity<<"; anIsElemNum = "<<anIsElemNum);
+            MESSAGE("Perform - aGeom = "<<aGeom<<"; aNbElems = "<<aNbElems);
 
             TInt aNbNodes = -1;
             switch(aGeom){
@@ -502,7 +496,7 @@ Driver_Mesh::Status DriverMED_R_SMESHDS_Mesh::Perform()
             default:;
             }
             vector<TInt> aNodeIds(aNbNodes);
-            for ( int iElem = 0; iElem < aNbElems; iElem++ )
+            for ( TInt iElem = 0; iElem < aNbElems; iElem++ )
             {
               bool anIsValidConnect = false;
               TCConnSlice aConnSlice = aCellInfo->GetConnSlice(iElem);
@@ -1038,8 +1032,6 @@ Driver_Mesh::Status DriverMED_R_SMESHDS_Mesh::Perform()
     aResult = addMessage( "Unknown exception", /*isFatal=*/true );
   }
 #endif
-  if (myMesh)
-    myMesh->compactMesh();
 
   // Mantis issue 0020483
   if (aResult == DRS_OK && isDescConn) {
@@ -1047,7 +1039,7 @@ Driver_Mesh::Status DriverMED_R_SMESHDS_Mesh::Perform()
     aResult = DRS_WARN_DESCENDING;
   }
 
-  if(MYDEBUG) MESSAGE("Perform - aResult status = "<<aResult);
+  MESSAGE("Perform - aResult status = "<<aResult);
   return aResult;
 }
 
@@ -1056,9 +1048,9 @@ list<string> DriverMED_R_SMESHDS_Mesh::GetMeshNames(Status& theStatus)
   list<string> aMeshNames;
 
   try {
-    if(MYDEBUG) MESSAGE("GetMeshNames - myFile : " << myFile);
+    MESSAGE("GetMeshNames - myFile : " << myFile);
     theStatus = DRS_OK;
-    PWrapper aMed = CrWrapper(myFile);
+    PWrapper aMed = CrWrapperR(myFile);
 
     if (TInt aNbMeshes = aMed->GetNbMeshes()) {
       for (int iMesh = 0; iMesh < aNbMeshes; iMesh++) {
@@ -1092,8 +1084,8 @@ list<TNameAndType> DriverMED_R_SMESHDS_Mesh::GetGroupNamesAndTypes()
     set<string>::const_iterator aGrNamesIter = aGroupNames.begin();
     for (; aGrNamesIter != aGroupNames.end(); aGrNamesIter++)
     {
-      const set< SMDSAbs_ElementType >& types = aFamily->GetTypes();
-      set< SMDSAbs_ElementType >::const_iterator type = types.begin();
+      const ElemTypeSet& types = aFamily->GetTypes();
+      ElemTypeSet::const_iterator type = types.begin();
       for ( ; type != types.end(); ++type )
       {
         TNameAndType aNameAndType = make_pair( *aGrNamesIter, *type );
@@ -1109,28 +1101,59 @@ list<TNameAndType> DriverMED_R_SMESHDS_Mesh::GetGroupNamesAndTypes()
 
 void DriverMED_R_SMESHDS_Mesh::GetGroup(SMESHDS_Group* theGroup)
 {
-  string aGroupName (theGroup->GetStoreName());
-  if(MYDEBUG) MESSAGE("Get Group " << aGroupName);
+  TFamilyVec * famVecPtr;
 
-  map<int, DriverMED_FamilyPtr>::iterator aFamsIter = myFamilies.begin();
-  for (; aFamsIter != myFamilies.end(); aFamsIter++)
+  if ( myGroups2FamiliesMap.IsEmpty() ) // PAL23514
   {
-    DriverMED_FamilyPtr aFamily = (*aFamsIter).second;
-    if (aFamily->GetTypes().count( theGroup->GetType() ) && aFamily->MemberOf(aGroupName))
+    TFamilyVec famVector( 1 );
+    map<int, DriverMED_FamilyPtr>::iterator famIter = myFamilies.begin();
+    for ( ; famIter != myFamilies.end(); famIter++ )
     {
-      const ElementsSet&           anElements = aFamily->GetElements();
-      ElementsSet::const_iterator anElemsIter = anElements.begin();
-      for (; anElemsIter != anElements.end(); anElemsIter++)
+      DriverMED_FamilyPtr    family = famIter->second;
+      const MED::TStringSet& groups = family->GetGroupNames();
+      famVector[ 0 ] = family;
+      MED::TStringSet::const_iterator grpIter = groups.begin();
+      for ( ; grpIter != groups.end(); ++grpIter )
       {
-        const SMDS_MeshElement * element = *anElemsIter;
-        if ( element->GetType() == theGroup->GetType() ) // Issue 0020576
-          theGroup->SMDSGroup().Add(element);
+        TCollection_AsciiString groupName = grpIter->c_str();
+        if (( famVecPtr = myGroups2FamiliesMap.ChangeSeek( groupName )))
+          famVecPtr->push_back( family );
+        else
+          myGroups2FamiliesMap.Bind( groupName, famVector );
+      }
+    }
+  }
+
+  const char* aGroupName = theGroup->GetStoreName();
+  MESSAGE("Get Group " << aGroupName);
+
+  if (( famVecPtr = myGroups2FamiliesMap.ChangeSeek( aGroupName )))
+  {
+    size_t groupSize = 0;
+    for ( size_t i = 0; i < famVecPtr->size(); ++i )
+    {
+      DriverMED_FamilyPtr aFamily = (*famVecPtr)[i];
+      groupSize += aFamily->NbElements( theGroup->GetType() );
+    }
+    theGroup->SMDSGroup().Reserve( groupSize );
+
+    for ( size_t i = 0; i < famVecPtr->size(); ++i )
+    {
+      DriverMED_FamilyPtr aFamily = (*famVecPtr)[i];
+      if ( aFamily->GetTypes().count( theGroup->GetType() ))
+      {
+        const ElementsSet&           anElements = aFamily->GetElements();
+        ElementsSet::const_iterator anElemsIter = anElements.begin();
+        for (; anElemsIter != anElements.end(); anElemsIter++)
+        {
+          const SMDS_MeshElement * element = *anElemsIter;
+          if ( element->GetType() == theGroup->GetType() ) // Issue 0020576
+            theGroup->SMDSGroup().Add(element);
+        }
+        int aGroupAttrVal = aFamily->GetGroupAttributVal();
+        if( aGroupAttrVal != 0 )
+          theGroup->SetColorGroup(aGroupAttrVal);
       }
-      int aGroupAttrVal = aFamily->GetGroupAttributVal();
-      if( aGroupAttrVal != 0)
-        theGroup->SetColorGroup(aGroupAttrVal);
-//       if ( element ) -- Issue 0020576
-//         theGroup->SetType( theGroup->SMDSGroup().GetType() );
     }
   }
 }