]> SALOME platform Git repositories - modules/smesh.git/commitdiff
Salome HOME
0021198: EDF 1548 GEOM: Writing of coordinates system into exported UNV files
authoreap <eap@opencascade.com>
Mon, 23 Jan 2012 08:02:02 +0000 (08:02 +0000)
committereap <eap@opencascade.com>
Mon, 23 Jan 2012 08:02:02 +0000 (08:02 +0000)
   Read/write CS and units. Use vector instead of map as TDataSet

src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx
src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx
src/DriverUNV/UNV2411_Structure.cxx
src/DriverUNV/UNV2411_Structure.hxx
src/DriverUNV/UNV2412_Structure.cxx
src/DriverUNV/UNV2412_Structure.hxx

index ea8c52af8242965d909da48daee0874015b47326..01bcefe3002bd118a72ff5d3b0afee6962b9aaf1 100644 (file)
 
 #include "utilities.h"
 
+#include "UNV164_Structure.hxx"
 #include "UNV2411_Structure.hxx"
 #include "UNV2412_Structure.hxx"
 #include "UNV2417_Structure.hxx"
+#include "UNV2420_Structure.hxx"
 #include "UNV_Utilities.hxx"
 
 #include <Basics_Utils.hxx>
@@ -42,6 +44,52 @@ static int MYDEBUG = 1;
 static int MYDEBUG = 0;
 #endif
 
+namespace
+{
+  /*!
+   * \brief Move node coordinates to the global Cartesian CS
+   */
+  void transformNodes( UNV2411::TDataSet::const_iterator fromNode,
+                       UNV2411::TDataSet::const_iterator endNode,
+                       const UNV2420::TRecord &          csRecord )
+  {
+    const int csLabel = fromNode->exp_coord_sys_num;
+
+    UNV2411::TDataSet::const_iterator nodeIt;
+
+    // apply Transformation Matrix
+    if ( !csRecord.isIdentityMatrix() )
+    {
+      for ( nodeIt = fromNode; nodeIt != endNode; ++nodeIt )
+      {
+        const UNV2411::TRecord& nodeRec = *nodeIt;
+        if ( nodeRec.exp_coord_sys_num == csLabel )
+          csRecord.ApplyMatrix( (double*) nodeRec.coord );
+      }
+    }
+
+    // transform from Cylindrical CS
+    if ( csRecord.coord_sys_type == UNV2420::Cylindrical )
+    {
+      for ( nodeIt = fromNode; nodeIt != endNode; ++nodeIt )
+      {
+        const UNV2411::TRecord& nodeRec = *nodeIt;
+        if ( nodeRec.exp_coord_sys_num == csLabel )
+          csRecord.FromCylindricalCS( (double*) nodeRec.coord );
+      }
+    }
+    // transform from Spherical CS
+    else if ( csRecord.coord_sys_type == UNV2420::Spherical )
+    {
+      for ( nodeIt = fromNode; nodeIt != endNode; ++nodeIt )
+      {
+        const UNV2411::TRecord& nodeRec = *nodeIt;
+        if ( nodeRec.exp_coord_sys_num == csLabel )
+          csRecord.FromSphericalCS( (double*) nodeRec.coord );
+      }
+    }
+  }
+}
 
 DriverUNV_R_SMDS_Mesh::~DriverUNV_R_SMDS_Mesh()
 {
@@ -55,49 +103,89 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform()
   Kernel_Utils::Localizer loc;
   Status aResult = DRS_OK;
   std::ifstream in_stream(myFile.c_str());
-  try{
+  try
+  {
     {
+      // Read Units
+      UNV164::TRecord aUnitsRecord;
+      UNV164::Read( in_stream, aUnitsRecord );
+
+      // Read Coordinate systems
+      UNV2420::TDataSet aCoordSysDataSet;
+      UNV2420::Read(in_stream, myMeshName, aCoordSysDataSet);
+
+      // Read nodes
       using namespace UNV2411;
       TDataSet aDataSet2411;
       UNV2411::Read(in_stream,aDataSet2411);
       if(MYDEBUG) MESSAGE("Perform - aDataSet2411.size() = "<<aDataSet2411.size());
+
+      // Move nodes in a global CS
+      if ( !aCoordSysDataSet.empty() )
+      {
+        UNV2420::TDataSet::const_iterator csIter = aCoordSysDataSet.begin();
+        for ( ; csIter != aCoordSysDataSet.end(); ++csIter )
+        {
+          // find any node in this CS
+          TDataSet::const_iterator nodeIter = aDataSet2411.begin();
+          for (; nodeIter != aDataSet2411.end(); nodeIter++)
+            if ( nodeIter->exp_coord_sys_num == csIter->coord_sys_label )
+            {
+              transformNodes( nodeIter, aDataSet2411.end(), *csIter );
+              break;
+            }
+        }
+      }
+      // Move nodes to SI unit system
+      const double lenFactor = aUnitsRecord.factors[ UNV164::LENGTH_FACTOR ]; 
+      if ( lenFactor != 1. )
+      {
+        TDataSet::iterator nodeIter = aDataSet2411.begin(), nodeEnd;
+        for ( nodeEnd = aDataSet2411.end(); nodeIter != nodeEnd; nodeIter++)
+        {
+          UNV2411::TRecord& nodeRec = *nodeIter;
+          nodeRec.coord[0] *= lenFactor;
+          nodeRec.coord[1] *= lenFactor;
+          nodeRec.coord[2] *= lenFactor;
+        }
+      }
+
+      // Create nodes in the mesh
       TDataSet::const_iterator anIter = aDataSet2411.begin();
-      for(; anIter != aDataSet2411.end(); anIter++){
-        const TNodeLab& aLabel = anIter->first;
-        const TRecord& aRec = anIter->second;
-        //MESSAGE("AddNodeWithID " << aLabel << " " << aRec.coord[0] << " " << aRec.coord[1] << " " << aRec.coord[2]);
-        myMesh->AddNodeWithID(aRec.coord[0],aRec.coord[1],aRec.coord[2],aLabel);
+      for(; anIter != aDataSet2411.end(); anIter++)
+      {
+        const TRecord& aRec = *anIter;
+        myMesh->AddNodeWithID(aRec.coord[0],aRec.coord[1],aRec.coord[2],aRec.label);
       }
     }
     {
       using namespace UNV2412;
-      in_stream.seekg(0);
       TDataSet aDataSet2412;
       UNV2412::Read(in_stream,aDataSet2412);
       TDataSet::const_iterator anIter = aDataSet2412.begin();
       if(MYDEBUG) MESSAGE("Perform - aDataSet2412.size() = "<<aDataSet2412.size());
-      for(; anIter != aDataSet2412.end(); anIter++){
+      for(; anIter != aDataSet2412.end(); anIter++)
+      {
         SMDS_MeshElement* anElement = NULL;
-        const TElementLab& aLabel = anIter->first;
-        const TRecord& aRec = anIter->second;
+        const TRecord& aRec = *anIter;
         if(IsBeam(aRec.fe_descriptor_id)) {
           switch ( aRec.node_labels.size() ) {
           case 2: // edge with two nodes
             //MESSAGE("add edge " << aLabel << " " << aRec.node_labels[0] << " " << aRec.node_labels[1]);
             anElement = myMesh->AddEdgeWithID(aRec.node_labels[0],
                                               aRec.node_labels[1],
-                                              aLabel);
+                                              aRec.label);
             break;
           case 3: // quadratic edge (with 3 nodes)
-            //MESSAGE("add edge " << aLabel << " " << aRec.node_labels[0] << " " << aRec.node_labels[1] << " " << aRec.node_labels[2]);
+            //MESSAGE("add edge " << aRec.label << " " << aRec.node_labels[0] << " " << aRec.node_labels[1] << " " << aRec.node_labels[2]);
             anElement = myMesh->AddEdgeWithID(aRec.node_labels[0],
                                               aRec.node_labels[2],
                                               aRec.node_labels[1],
-                                              aLabel);
+                                              aRec.label);
           }
         }
         else if(IsFace(aRec.fe_descriptor_id)) {
-          //MESSAGE("add face " << aLabel);
+          //MESSAGE("add face " << aRec.label);
           switch(aRec.fe_descriptor_id){
           case 41: // Plane Stress Linear Triangle      
           case 51: // Plane Strain Linear Triangle      
@@ -108,7 +196,7 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform()
             anElement = myMesh->AddFaceWithID(aRec.node_labels[0],
                                               aRec.node_labels[1],
                                               aRec.node_labels[2],
-                                              aLabel);
+                                              aRec.label);
             break;
             
           case 42: //  Plane Stress Parabolic Triangle       
@@ -117,14 +205,14 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform()
           case 72: //  Membrane Parabolic Triangle           
           case 82: //  Axisymetric Solid Parabolic Triangle  
           case 92: //  Thin Shell Parabolic Triangle         
-            //MESSAGE("add face " << aLabel << " " << aRec.node_labels[0] << " " << aRec.node_labels[1] << " " << aRec.node_labels[2] << " " << aRec.node_labels[3] << " " << aRec.node_labels[4] << " " << aRec.node_labels[5]);
+            //MESSAGE("add face " << aRec.label << " " << aRec.node_labels[0] << " " << aRec.node_labels[1] << " " << aRec.node_labels[2] << " " << aRec.node_labels[3] << " " << aRec.node_labels[4] << " " << aRec.node_labels[5]);
             anElement = myMesh->AddFaceWithID(aRec.node_labels[0],
                                               aRec.node_labels[2],
                                               aRec.node_labels[4],
                                               aRec.node_labels[1],
                                               aRec.node_labels[3],
                                               aRec.node_labels[5],
-                                              aLabel);
+                                              aRec.label);
             break;
             
           case 44: // Plane Stress Linear Quadrilateral     
@@ -137,7 +225,7 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform()
                                               aRec.node_labels[1],
                                               aRec.node_labels[2],
                                               aRec.node_labels[3],
-                                              aLabel);
+                                              aRec.label);
             break;
             
           case 45: // Plane Stress Parabolic Quadrilateral      
@@ -154,12 +242,12 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform()
                                               aRec.node_labels[3],
                                               aRec.node_labels[5],
                                               aRec.node_labels[7],
-                                              aLabel);
+                                              aRec.label);
             break;
           }
         }
         else if(IsVolume(aRec.fe_descriptor_id)){
-          //MESSAGE("add volume " << aLabel);
+          //MESSAGE("add volume " << aRec.label);
           switch(aRec.fe_descriptor_id){
             
           case 111: // Solid Linear Tetrahedron - TET4
@@ -167,7 +255,7 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform()
                                                 aRec.node_labels[2],
                                                 aRec.node_labels[1],
                                                 aRec.node_labels[3],
-                                                aLabel);
+                                                aRec.label);
             break;
 
           case 118: // Solid Quadratic Tetrahedron - TET10
@@ -184,7 +272,7 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform()
                                                 aRec.node_labels[6],
                                                 aRec.node_labels[8],
                                                 aRec.node_labels[7],
-                                                aLabel);
+                                                aRec.label);
             break;
             
           case 112: // Solid Linear Prism - PRISM6
@@ -194,7 +282,7 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform()
                                                 aRec.node_labels[3],
                                                 aRec.node_labels[5],
                                                 aRec.node_labels[4],
-                                                aLabel);
+                                                aRec.label);
             break;
             
           case 113: // Solid Quadratic Prism - PRISM15
@@ -217,7 +305,7 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform()
                                                 aRec.node_labels[6],
                                                 aRec.node_labels[8],
                                                 aRec.node_labels[7],
-                                                aLabel);
+                                                aRec.label);
             break;
             
           case 115: // Solid Linear Brick - HEX8
@@ -229,7 +317,7 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform()
                                                 aRec.node_labels[7],
                                                 aRec.node_labels[6],
                                                 aRec.node_labels[5],
-                                                aLabel);
+                                                aRec.label);
             break;
 
           case 116: // Solid Quadratic Brick - HEX20
@@ -257,7 +345,7 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform()
                                                 aRec.node_labels[11],
                                                 aRec.node_labels[10],
                                                 aRec.node_labels[9],
-                                                aLabel);
+                                                aRec.label);
             break;
 
           case 114: // pyramid of 13 nodes (quadratic) - PIRA13
@@ -275,18 +363,17 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform()
                                                 aRec.node_labels[10],
                                                 aRec.node_labels[9],
                                                 aRec.node_labels[12],
-                                                aLabel);
+                                                aRec.label);
             break;
 
           }
         }
         if(!anElement)
-          MESSAGE("DriverUNV_R_SMDS_Mesh::Perform - can not add element with ID = "<<aLabel<<" and type = "<<aRec.fe_descriptor_id);
+          MESSAGE("DriverUNV_R_SMDS_Mesh::Perform - can not add element with ID = "<<aRec.label<<" and type = "<<aRec.fe_descriptor_id);
       }
     }
     {
       using namespace UNV2417;      
-      in_stream.seekg(0);
       TDataSet aDataSet2417;
       UNV2417::Read(in_stream,aDataSet2417);
       if(MYDEBUG) MESSAGE("Perform - aDataSet2417.size() = "<<aDataSet2417.size());
index a3e10c2c1bad17e5674bfeda57eaf1df4fe29e7e..a70c93962770ec808ccea786b6e1a14fa47a1e73 100644 (file)
 
 #include "utilities.h"
 
+#include "UNV164_Structure.hxx"
 #include "UNV2411_Structure.hxx"
 #include "UNV2412_Structure.hxx"
 #include "UNV2417_Structure.hxx"
+#include "UNV2420_Structure.hxx"
 #include "UNV_Utilities.hxx"
 
 #include <Basics_Utils.hxx>
@@ -64,6 +66,10 @@ Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform()
   Status aResult = DRS_OK;
   std::ofstream out_stream(myFile.c_str());
   try{
+
+    UNV164::Write( out_stream ); // unit system
+    UNV2420::Write( out_stream, myMeshName ); // Coordinate system
+
     {
       using namespace UNV2411;
       TDataSet aDataSet2411;
@@ -71,14 +77,15 @@ Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform()
       //-----------------------------------
       MESSAGE("Perform - myMesh->NbNodes() = "<<myMesh->NbNodes());
       SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator();
-      for(; aNodesIter->more();){
+      TRecord aRec;
+      while ( aNodesIter->more() )
+      {
         const SMDS_MeshNode* aNode = aNodesIter->next();
-        TRecord aRec;
+        aRec.label    = aNode->GetID();
         aRec.coord[0] = aNode->X();
         aRec.coord[1] = aNode->Y();
         aRec.coord[2] = aNode->Z();
-        const TNodeLab& aLabel = aNode->GetID();
-        aDataSet2411.insert(TDataSet::value_type(aLabel,aRec));
+        aDataSet2411.push_back( aRec );
       }
       MESSAGE("Perform - aDataSet2411.size() = "<<aDataSet2411.size());
       UNV2411::Write(out_stream,aDataSet2411);
@@ -92,11 +99,12 @@ Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform()
       MESSAGE("Perform - myMesh->NbEdges() = "<<myMesh->NbEdges());
       if(myMesh->NbEdges()){
         SMDS_EdgeIteratorPtr anIter = myMesh->edgesIterator();
-        for(; anIter->more();){
+        while( anIter->more() )
+        {
           const SMDS_MeshEdge* anElem = anIter->next();
-          TElementLab aLabel = anElem->GetID();
           int aNbNodes = anElem->NbNodes();
           TRecord aRec;
+          aRec.label = anElem->GetID();
           aRec.node_labels.reserve(aNbNodes);
           SMDS_ElemIteratorPtr aNodesIter;
           aNodesIter = anElem->nodesIteratorToUNV();
@@ -105,24 +113,27 @@ Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform()
           } else {
             aRec.fe_descriptor_id = 11;
           }
-          for(; aNodesIter->more();){
+          while( aNodesIter->more())
+          {
             const SMDS_MeshElement* aNode = aNodesIter->next();
             aRec.node_labels.push_back(aNode->GetID());
           }
-          aDataSet2412.insert(TDataSet::value_type(aLabel,aRec));
+          aDataSet2412.push_back(aRec);
         }
         MESSAGE("Perform - aDataSet2412.size() = "<<aDataSet2412.size());
       }
 
       MESSAGE("Perform - myMesh->NbFaces() = "<<myMesh->NbFaces());
-      if(myMesh->NbFaces()){
+      if ( myMesh->NbFaces() )
+      {
         SMDS_FaceIteratorPtr anIter = myMesh->facesIterator();
-        for(; anIter->more();){
+        while ( anIter->more())
+        {
           const SMDS_MeshFace* anElem = anIter->next();
           if ( anElem->IsPoly() ) continue;
-          TElementLab aLabel = anElem->GetID();
           int aNbNodes = anElem->NbNodes();
           TRecord aRec;
+          aRec.label = anElem->GetID();
           aRec.node_labels.reserve(aNbNodes);
           SMDS_ElemIteratorPtr aNodesIter;
           aNodesIter = anElem->nodesIteratorToUNV();
@@ -150,18 +161,18 @@ Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform()
           default:
             continue;
           }
-          aDataSet2412.insert(TDataSet::value_type(aLabel,aRec));
+          aDataSet2412.push_back(aRec);
         }
         MESSAGE("Perform - aDataSet2412.size() = "<<aDataSet2412.size());
       }
 
       MESSAGE("Perform - myMesh->NbVolumes() = "<<myMesh->NbVolumes());
-      if(myMesh->NbVolumes()){
+      if ( myMesh->NbVolumes() )
+      {
         SMDS_VolumeIteratorPtr anIter = myMesh->volumesIterator();
-        for(; anIter->more();){
+        while ( anIter->more())
+        {
           const SMDS_MeshVolume* anElem = anIter->next();
-          TElementLab aLabel = anElem->GetID();
-
           int aNbNodes = anElem->NbNodes();
           //MESSAGE("aNbNodes="<<aNbNodes);
           SMDS_ElemIteratorPtr aNodesIter;
@@ -214,13 +225,15 @@ Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform()
           }
           if(anId>0){
             TRecord aRec;
+            aRec.label = anElem->GetID();
             aRec.fe_descriptor_id = anId;
             aRec.node_labels.reserve(aNbNodes);
-            for(; aNodesIter->more() && aRec.node_labels.size() < aNbNodes; ) {
+            while ( aNodesIter->more() && aRec.node_labels.size() < aNbNodes )
+            {
               const SMDS_MeshElement* aNode = aNodesIter->next();
               aRec.node_labels.push_back(aNode->GetID());
             }
-            aDataSet2412.insert(TDataSet::value_type(aLabel,aRec));
+            aDataSet2412.push_back(aRec);
           }
         }
         MESSAGE("Perform - aDataSet2412.size() = "<<aDataSet2412.size());
index 2505d58059dfdd01bd2d821115182c19126aa824..d86e7df05ee7fbccd9e4e80fa012a0eb7d76097f 100644 (file)
@@ -33,8 +33,8 @@ using namespace UNV2411;
 static string _label_dataset = "2411";
 
 UNV2411::TRecord::TRecord():
-  exp_coord_sys_num(0),
-  disp_coord_sys_num(0),
+  exp_coord_sys_num(1),
+  disp_coord_sys_num(1),
   color(11)//(0) -  0019936: EDF 794 SMESH : Export UNV : Node color and group id
 {}
 
@@ -54,16 +54,16 @@ void UNV2411::Read(std::ifstream& in_stream, TDataSet& theDataSet)
    * always 3 coordinates in the UNV file, no matter
    * which dimensionality libMesh is in
    */
-  TNodeLab aLabel;
   std::string num_buf;
-  for(; !in_stream.eof();){
-    in_stream >> aLabel ;
-    if(aLabel == -1){
+  while ( !in_stream.eof() )
+  {
+    TRecord aRec;
+    in_stream >> aRec.label ;
+    if ( aRec.label == -1 ) {
       // end of dataset is reached
       break;
     }
 
-    TRecord aRec;
     in_stream>>aRec.exp_coord_sys_num;
     in_stream>>aRec.disp_coord_sys_num;
     in_stream>>aRec.color;
@@ -77,7 +77,7 @@ void UNV2411::Read(std::ifstream& in_stream, TDataSet& theDataSet)
       aRec.coord[d] = D_to_e(num_buf);
     }
 
-    theDataSet.insert(TDataSet::value_type(aLabel,aRec));
+    theDataSet.push_back(aRec);
   }
 }
 
@@ -94,12 +94,12 @@ void UNV2411::Write(std::ofstream& out_stream, const TDataSet& theDataSet)
   out_stream<<"  "<<_label_dataset<<"\n";
 
   TDataSet::const_iterator anIter = theDataSet.begin();
-  for(; anIter != theDataSet.end(); anIter++){
-    const TNodeLab& aLabel = anIter->first;
-    const TRecord& aRec = anIter->second;
+  for(; anIter != theDataSet.end(); anIter++)
+  {
+    const TRecord& aRec = *anIter;
     char buf[78];
     sprintf(buf, "%10d%10d%10d%10d\n", 
-            aLabel,
+            aRec.label,
             aRec.exp_coord_sys_num,
             aRec.disp_coord_sys_num,
             aRec.color);
index a35b393dd651ed3de023274924c81f80c0aa46a0..5e84c47f3ca15466e49662298447fcc7472ab2e6 100644 (file)
 
 #include "SMESH_DriverUNV.hxx"
 
-#include <map>
+#include <vector>
 #include <fstream>      
 
 namespace UNV2411{
   
+  typedef int TNodeLab; // type of node label
+
   struct MESHDRIVERUNV_EXPORT TRecord{
     TRecord();
+    TNodeLab label;
     int exp_coord_sys_num;  // export coordinate system number
     int disp_coord_sys_num;  // displacement coordinate system number
     int color;  // color                                
     double coord[3];  // node coordinates in the part coordinate system
   };
   
-  typedef int TNodeLab; // type of node label
-  typedef std::map<TNodeLab,TRecord> TDataSet;
+  typedef std::vector<TRecord> TDataSet;
 
   MESHDRIVERUNV_EXPORT void
     Read(std::ifstream& in_stream, TDataSet& theDataSet);
index 9b01e1d3d42daf21a1601ee515003a1d70de5479..dac26a93bc3a202487541b1693f0f9d7f8947749 100644 (file)
@@ -183,12 +183,14 @@ using namespace UNV2412;
 static string _label_dataset = "2412";
 
 UNV2412::TRecord::TRecord():
+  label(-1),
+  fe_descriptor_id(-1),
   phys_prop_tab_num(2),
   mat_prop_tab_num(1),
   color(7),
   beam_orientation(0),
-  beam_fore_end(0),
-  beam_aft_end(0)
+  beam_fore_end(1), // default values
+  beam_aft_end(1) // default values
 {}
 
 void UNV2412::Read(std::ifstream& in_stream, TDataSet& theDataSet)
@@ -203,16 +205,15 @@ void UNV2412::Read(std::ifstream& in_stream, TDataSet& theDataSet)
   if(!beginning_of_dataset(in_stream,_label_dataset))
     EXCEPTION(runtime_error,"ERROR: Could not find "<<_label_dataset<<" dataset!");
 
-  TElementLab aLabel;
-  for(; !in_stream.eof();){
-    in_stream >> aLabel ;
-    if(aLabel == -1){
+  TRecord aRec;
+  while( !in_stream.eof())
+  {
+    in_stream >> aRec.label ;
+    if (aRec.label == -1)
       // end of dataset is reached
       break;
-    }
     
     int n_nodes;
-    TRecord aRec;
     in_stream>>aRec.fe_descriptor_id;
     in_stream>>aRec.phys_prop_tab_num;
     in_stream>>aRec.mat_prop_tab_num;
@@ -226,12 +227,11 @@ void UNV2412::Read(std::ifstream& in_stream, TDataSet& theDataSet)
     }
 
     aRec.node_labels.resize(n_nodes);
-    for(int j=0; j < n_nodes; j++){
+    for(int j=0; j < n_nodes; j++)
       // read node labels
       in_stream>>aRec.node_labels[j];             
-    }
 
-    theDataSet.insert(TDataSet::value_type(aLabel,aRec));
+    theDataSet.push_back(aRec);
   }
 
 }
@@ -249,17 +249,18 @@ void UNV2412::Write(std::ofstream& out_stream, const TDataSet& theDataSet)
   out_stream<<"  "<<_label_dataset<<"\n";
 
   TDataSet::const_iterator anIter = theDataSet.begin();
-  for(; anIter != theDataSet.end(); anIter++){
-    const TElementLab& aLabel = anIter->first;
-    const TRecord& aRec = anIter->second;
-    out_stream<<std::setw(10)<<aLabel;  /* element ID */
+  for(; anIter != theDataSet.end(); anIter++)
+  {
+    const TRecord& aRec = *anIter;
+    out_stream<<std::setw(10)<<aRec.label;  /* element ID */
     out_stream<<std::setw(10)<<aRec.fe_descriptor_id;  /* type of element */
     out_stream<<std::setw(10)<<aRec.phys_prop_tab_num;
     out_stream<<std::setw(10)<<aRec.mat_prop_tab_num;
     out_stream<<std::setw(10)<<aRec.color;
     out_stream<<std::setw(10)<<aRec.node_labels.size()<<std::endl;  /* No. of nodes per element */
 
-    if(IsBeam(aRec.fe_descriptor_id)){
+    if(IsBeam(aRec.fe_descriptor_id))
+    {
       out_stream<<std::setw(10)<<aRec.beam_orientation;
       out_stream<<std::setw(10)<<aRec.beam_fore_end;
       out_stream<<std::setw(10)<<aRec.beam_aft_end<<std::endl;
index 9da59e387500f3a8e95060dbc5fdeabfc3d92bbf..455532e1c9144ac47ec3da63907605b75c3b673e 100644 (file)
 
 #include "SMESH_DriverUNV.hxx"
 
-#include <map>
 #include <vector>
-#include <fstream>      
-
+#include <fstream>
 
 namespace UNV2412{
   
   typedef std::vector<int> TNodeLabels; // Nodal connectivities
+  typedef int TElementLab; // type of element label
 
-  struct MESHDRIVERUNV_EXPORT TRecord{
+  struct MESHDRIVERUNV_EXPORT TRecord
+  {
     TRecord();
 
+    TElementLab label;
     int fe_descriptor_id;  // FE descriptor id
     int phys_prop_tab_num;  // physical property table number
     int mat_prop_tab_num;  // material property table number
@@ -49,8 +50,7 @@ namespace UNV2412{
     int beam_aft_end;  // beam  aft-end cross section number
   };
   
-  typedef int TElementLab; // type of element label
-  typedef std::map<TElementLab,TRecord> TDataSet;
+  typedef std::vector<TRecord> TDataSet;
 
   MESHDRIVERUNV_EXPORT void
     Read(std::ifstream& in_stream, TDataSet& theDataSet);