Salome HOME
Add support for tetra, pyramid and prism
[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 using namespace std;
28 #include "DriverDAT_R_SMDS_Mesh.h"
29
30 #include "utilities.h"
31
32 DriverDAT_R_SMDS_Mesh::DriverDAT_R_SMDS_Mesh()
33 {
34         ;
35 }
36
37 DriverDAT_R_SMDS_Mesh::~DriverDAT_R_SMDS_Mesh()
38 {
39         ;
40 }
41
42 void DriverDAT_R_SMDS_Mesh::SetMesh(SMDS_Mesh * aMesh)
43 {
44         myMesh = aMesh;
45 }
46
47 void DriverDAT_R_SMDS_Mesh::SetFile(string aFile)
48 {
49         myFile = aFile;
50 }
51
52 void DriverDAT_R_SMDS_Mesh::SetFileId(FILE * aFileId)
53 {
54         myFileId = aFileId;
55 }
56
57 void DriverDAT_R_SMDS_Mesh::SetMeshId(int aMeshId)
58 {
59         myMeshId = aMeshId;
60 }
61
62 void DriverDAT_R_SMDS_Mesh::Add()
63 {
64         ;
65 }
66
67 void DriverDAT_R_SMDS_Mesh::Read()
68 {
69
70         int i, j;
71         int nbNodes, nbCells;
72         int intNumPoint;
73         float coordX, coordY, coordZ;
74         int nbNoeuds;
75
76         int intNumMaille, Degre;
77         int ValElement;
78         int ValDegre;
79         int NoeudsMaille[20];
80         int NoeudMaille;
81
82         bool ok;
83
84         MESSAGE("in DriverDAT_R_SMDS_Mesh::Read()");
85   /****************************************************************************
86   *                      OUVERTURE DU FICHIER EN LECTURE                      *
87   ****************************************************************************/
88         char *file2Read = (char *)myFile.c_str();
89         myFileId = fopen(file2Read, "r");
90         if (myFileId < 0)
91         {
92                 fprintf(stderr, ">> ERREUR : ouverture du fichier %s \n", file2Read);
93                 exit(EXIT_FAILURE);
94         }
95
96         fscanf(myFileId, "%d %d\n", &nbNodes, &nbCells);
97
98   /****************************************************************************
99   *                       LECTURE DES NOEUDS                                  *
100   ****************************************************************************/
101         fprintf(stdout, "\n(************************)\n");
102         fprintf(stdout, "(* NOEUDS DU MAILLAGE : *)\n");
103         fprintf(stdout, "(************************)\n");
104
105         for (i = 0; i < nbNodes; i++)
106         {
107                 fscanf(myFileId, "%d %e %e %e\n", &intNumPoint, &coordX, &coordY,
108                         &coordZ);
109                 ok = myMesh->AddNodeWithID(coordX, coordY, coordZ, intNumPoint);
110         }
111
112         fprintf(stdout, "%d noeuds\n", myMesh->NbNodes());
113   /****************************************************************************
114   *                       LECTURE DES ELEMENTS                                *
115   ****************************************************************************/
116         fprintf(stdout, "\n(**************************)\n");
117         fprintf(stdout, "(* ELEMENTS DU MAILLAGE : *)\n");
118         fprintf(stdout, "(**************************)");
119
120         fprintf(stdout, "%d elements\n", nbCells);
121
122         for (i = 0; i < nbCells; i++)
123         {
124                 fscanf(myFileId, "%d %d", &intNumMaille, &ValElement);
125                 Degre = abs(ValElement / 100);
126                 nbNoeuds = ValElement - (Degre * 100);
127
128                 // Recuperation des noeuds de la maille
129                 for (j = 0; j < nbNoeuds; j++)
130                 {
131                         fscanf(myFileId, "%d", &NoeudMaille);
132                         NoeudsMaille[j] = NoeudMaille;
133                 }
134
135                 // Analyse des cas de cellules
136                 switch (ValElement)
137                 {
138                 case 102:;
139                 case 103:;
140                         {
141                                 ValDegre = 3;
142                                 nbNoeuds = 2;
143                                 ok = myMesh->AddEdgeWithID(NoeudsMaille[0], NoeudsMaille[1],
144                                         intNumMaille);
145                                 break;
146                         }
147                 case 204:;
148                 case 208:;
149                         {
150                                 ValDegre = 9;
151                                 nbNoeuds = 4;
152                                 ok = myMesh->AddFaceWithID(NoeudsMaille[0], NoeudsMaille[1],
153                                         NoeudsMaille[2], NoeudsMaille[3], intNumMaille);
154                                 break;
155                         }
156                 case 203:;
157                 case 206:;
158                         {
159                                 ValDegre = 5;
160                                 nbNoeuds = 3;
161                                 ok = myMesh->AddFaceWithID(NoeudsMaille[0], NoeudsMaille[1],
162                                         NoeudsMaille[2], intNumMaille);
163                                 break;
164                         }
165                 case 308:;
166                 case 320:;
167                         {
168                                 ValDegre = 12;
169                                 nbNoeuds = 8;
170                                 if (ValElement == 320)
171                                 {
172                                         //A voir, correspondance VTK
173                                         NoeudsMaille[4] = NoeudsMaille[8];
174                                         NoeudsMaille[5] = NoeudsMaille[9];
175                                         NoeudsMaille[6] = NoeudsMaille[10];
176                                         NoeudsMaille[7] = NoeudsMaille[11];
177                                 }
178                                 ok = myMesh->AddVolumeWithID(NoeudsMaille[0], NoeudsMaille[1],
179                                         NoeudsMaille[2], NoeudsMaille[3], NoeudsMaille[4],
180                                         NoeudsMaille[5], NoeudsMaille[6], NoeudsMaille[7],
181                                         intNumMaille);
182                                 break;
183                         }
184                 case 304:;
185                 case 310:;
186                         {
187                                 ValDegre = 10;
188                                 nbNoeuds = 4;
189                                 if (ValElement == 310)
190                                         NoeudsMaille[3] = NoeudsMaille[6];
191                                 ok = myMesh->AddVolumeWithID(NoeudsMaille[0], NoeudsMaille[1],
192                                         NoeudsMaille[2], NoeudsMaille[3], intNumMaille);
193                                 break;
194                         }
195                 case 306:;
196                 case 315:;
197                         {
198                                 ValDegre = 12;
199                                 nbNoeuds = 8;
200                                 if (ValElement == 315)
201                                 {
202                                         NoeudsMaille[3] = NoeudsMaille[6];
203                                         NoeudsMaille[4] = NoeudsMaille[7];
204                                         NoeudsMaille[5] = NoeudsMaille[8];
205                                 }
206                                 NoeudsMaille[7] = NoeudsMaille[5];
207                                 NoeudsMaille[6] = NoeudsMaille[5];
208                                 NoeudsMaille[5] = NoeudsMaille[4];
209                                 NoeudsMaille[4] = NoeudsMaille[3];
210                                 NoeudsMaille[3] = NoeudsMaille[2];
211                                 ok = myMesh->AddVolumeWithID(NoeudsMaille[0], NoeudsMaille[1],
212                                         NoeudsMaille[2], NoeudsMaille[3], NoeudsMaille[4],
213                                         NoeudsMaille[5], intNumMaille);
214                                 break;
215                         }
216
217                 }
218         }
219
220   /****************************************************************************
221   *                      FERMETURE DU FICHIER                      *
222   ****************************************************************************/
223         fclose(myFileId);
224
225 }