Salome HOME
Merge br_enable_import_mesh. Enable import mesh and save/load SMESH study.
[modules/smesh.git] / src / DriverDAT / DriverDAT_R_SMDS_Mesh.cxx
1 //  SMESH DriverDAT : driver to read and write 'dat' files
2 //
3 //  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
5 // 
6 //  This library is free software; you can redistribute it and/or 
7 //  modify it under the terms of the GNU Lesser General Public 
8 //  License as published by the Free Software Foundation; either 
9 //  version 2.1 of the License. 
10 // 
11 //  This library is distributed in the hope that it will be useful, 
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of 
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
14 //  Lesser General Public License for more details. 
15 // 
16 //  You should have received a copy of the GNU Lesser General Public 
17 //  License along with this library; if not, write to the Free Software 
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
19 // 
20 //  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
21 //
22 //
23 //
24 //  File   : DriverDAT_R_SMDS_Mesh.cxx
25 //  Module : SMESH
26
27 #include "DriverDAT_R_SMDS_Mesh.h"
28 #include "utilities.h"
29
30 extern "C"
31 {
32
33 /**
34  * Factory function which will be called by SMESHDriver
35  */
36 void * SMESH_createDATMeshReader()
37 {
38         return new DriverDAT_R_SMDS_Mesh();
39 }
40 }
41
42 DriverDAT_R_SMDS_Mesh::DriverDAT_R_SMDS_Mesh()
43 {
44         ;
45 }
46
47 DriverDAT_R_SMDS_Mesh::~DriverDAT_R_SMDS_Mesh()
48 {
49         ;
50 }
51
52 void DriverDAT_R_SMDS_Mesh::SetMesh(SMDS_Mesh * aMesh)
53 {
54         myMesh = aMesh;
55 }
56
57 void DriverDAT_R_SMDS_Mesh::SetFile(string aFile)
58 {
59         myFile = aFile;
60 }
61
62 void DriverDAT_R_SMDS_Mesh::SetFileId(FILE * aFileId)
63 {
64         myFileId = aFileId;
65 }
66
67 void DriverDAT_R_SMDS_Mesh::SetMeshId(int aMeshId)
68 {
69         myMeshId = aMeshId;
70 }
71
72 void DriverDAT_R_SMDS_Mesh::Add()
73 {
74         ;
75 }
76
77 void DriverDAT_R_SMDS_Mesh::Read()
78 {
79
80         int i, j;
81         int nbNodes, nbCells;
82         int intNumPoint;
83         float coordX, coordY, coordZ;
84         int nbNoeuds;
85
86         int intNumMaille, Degre;
87         int ValElement;
88         int ValDegre;
89         int NoeudsMaille[20];
90         int NoeudMaille;
91
92         bool ok;
93
94         MESSAGE("in DriverDAT_R_SMDS_Mesh::Read()");
95   /****************************************************************************
96   *                      OUVERTURE DU FICHIER EN LECTURE                      *
97   ****************************************************************************/
98         char *file2Read = (char *)myFile.c_str();
99         myFileId = fopen(file2Read, "r");
100         if (myFileId < 0)
101         {
102                 fprintf(stderr, ">> ERREUR : ouverture du fichier %s \n", file2Read);
103                 exit(EXIT_FAILURE);
104         }
105
106         fscanf(myFileId, "%d %d\n", &nbNodes, &nbCells);
107
108   /****************************************************************************
109   *                       LECTURE DES NOEUDS                                  *
110   ****************************************************************************/
111         fprintf(stdout, "\n(************************)\n");
112         fprintf(stdout, "(* NOEUDS DU MAILLAGE : *)\n");
113         fprintf(stdout, "(************************)\n");
114
115         for (i = 0; i < nbNodes; i++)
116         {
117                 fscanf(myFileId, "%d %e %e %e\n", &intNumPoint, &coordX, &coordY,
118                         &coordZ);
119                 ok = myMesh->AddNodeWithID(coordX, coordY, coordZ, intNumPoint);
120         }
121
122         fprintf(stdout, "%d noeuds\n", myMesh->NbNodes());
123   /****************************************************************************
124   *                       LECTURE DES ELEMENTS                                *
125   ****************************************************************************/
126         fprintf(stdout, "\n(**************************)\n");
127         fprintf(stdout, "(* ELEMENTS DU MAILLAGE : *)\n");
128         fprintf(stdout, "(**************************)");
129
130         fprintf(stdout, "%d elements\n", nbCells);
131
132         for (i = 0; i < nbCells; i++)
133         {
134                 fscanf(myFileId, "%d %d", &intNumMaille, &ValElement);
135                 Degre = abs(ValElement / 100);
136                 nbNoeuds = ValElement - (Degre * 100);
137
138                 // Recuperation des noeuds de la maille
139                 for (j = 0; j < nbNoeuds; j++)
140                 {
141                         fscanf(myFileId, "%d", &NoeudMaille);
142                         NoeudsMaille[j] = NoeudMaille;
143                 }
144
145                 // Analyse des cas de cellules
146                 switch (ValElement)
147                 {
148                 case 102:;
149                 case 103:;
150                         {
151                                 ValDegre = 3;
152                                 nbNoeuds = 2;
153                                 ok = myMesh->AddEdgeWithID(NoeudsMaille[0], NoeudsMaille[1],
154                                         intNumMaille);
155                                 break;
156                         }
157                 case 204:;
158                 case 208:;
159                         {
160                                 ValDegre = 9;
161                                 nbNoeuds = 4;
162                                 ok = myMesh->AddFaceWithID(NoeudsMaille[0], NoeudsMaille[1],
163                                         NoeudsMaille[2], NoeudsMaille[3], intNumMaille);
164                                 break;
165                         }
166                 case 203:;
167                 case 206:;
168                         {
169                                 ValDegre = 5;
170                                 nbNoeuds = 3;
171                                 ok = myMesh->AddFaceWithID(NoeudsMaille[0], NoeudsMaille[1],
172                                         NoeudsMaille[2], intNumMaille);
173                                 break;
174                         }
175                 case 308:;
176                 case 320:;
177                         {
178                                 ValDegre = 12;
179                                 nbNoeuds = 8;
180                                 if (ValElement == 320)
181                                 {
182                                         //A voir, correspondance VTK
183                                         NoeudsMaille[4] = NoeudsMaille[8];
184                                         NoeudsMaille[5] = NoeudsMaille[9];
185                                         NoeudsMaille[6] = NoeudsMaille[10];
186                                         NoeudsMaille[7] = NoeudsMaille[11];
187                                 }
188                                 ok = myMesh->AddVolumeWithID(NoeudsMaille[0], NoeudsMaille[1],
189                                         NoeudsMaille[2], NoeudsMaille[3], NoeudsMaille[4],
190                                         NoeudsMaille[5], NoeudsMaille[6], NoeudsMaille[7],
191                                         intNumMaille);
192                                 break;
193                         }
194                 case 304:;
195                 case 310:;
196                         {
197                                 ValDegre = 10;
198                                 nbNoeuds = 4;
199                                 if (ValElement == 310)
200                                         NoeudsMaille[3] = NoeudsMaille[6];
201                                 ok = myMesh->AddVolumeWithID(NoeudsMaille[0], NoeudsMaille[1],
202                                         NoeudsMaille[2], NoeudsMaille[3], intNumMaille);
203                                 break;
204                         }
205                 case 306:;
206                 case 315:;
207                         {
208                                 ValDegre = 12;
209                                 nbNoeuds = 8;
210                                 if (ValElement == 315)
211                                 {
212                                         NoeudsMaille[3] = NoeudsMaille[6];
213                                         NoeudsMaille[4] = NoeudsMaille[7];
214                                         NoeudsMaille[5] = NoeudsMaille[8];
215                                 }
216                                 NoeudsMaille[7] = NoeudsMaille[5];
217                                 NoeudsMaille[6] = NoeudsMaille[5];
218                                 NoeudsMaille[5] = NoeudsMaille[4];
219                                 NoeudsMaille[4] = NoeudsMaille[3];
220                                 NoeudsMaille[3] = NoeudsMaille[2];
221                                 ok = myMesh->AddVolumeWithID(NoeudsMaille[0], NoeudsMaille[1],
222                                         NoeudsMaille[2], NoeudsMaille[3], NoeudsMaille[4],
223                                         NoeudsMaille[5], intNumMaille);
224                                 break;
225                         }
226
227                 }
228         }
229
230   /****************************************************************************
231   *                      FERMETURE DU FICHIER                      *
232   ****************************************************************************/
233         fclose(myFileId);
234
235 }