Salome HOME
NRI : Add KERNEL includes.
[modules/smesh.git] / src / DriverDAT / DriverDAT_R_SMDS_Mesh.cxx
1 using namespace std;
2 #include "DriverDAT_R_SMDS_Mesh.h"
3
4 #include "utilities.h"
5
6 DriverDAT_R_SMDS_Mesh::DriverDAT_R_SMDS_Mesh() {
7 ;
8 }
9
10 DriverDAT_R_SMDS_Mesh::~DriverDAT_R_SMDS_Mesh() {
11 ;
12 }
13
14 void DriverDAT_R_SMDS_Mesh::SetMesh(Handle(SMDS_Mesh)& aMesh) {
15   myMesh = aMesh;
16 }
17
18 void DriverDAT_R_SMDS_Mesh::SetFile(string aFile) {
19   myFile = aFile;
20 }
21
22 void DriverDAT_R_SMDS_Mesh::SetFileId(FILE* aFileId) {
23   myFileId = aFileId;
24 }
25
26 void DriverDAT_R_SMDS_Mesh::SetMeshId(int aMeshId) {
27   myMeshId = aMeshId;
28 }
29
30 void DriverDAT_R_SMDS_Mesh::Add() {
31   ;
32 }
33
34 void DriverDAT_R_SMDS_Mesh::Read() {
35
36   int i,j;
37   int nbNodes,nbCells;
38   int intNumPoint;
39   float coordX, coordY, coordZ;
40   int nbNoeuds;
41
42   int intNumMaille,Degre;
43   int ValElement;
44   int ValDegre;
45   int NoeudsMaille[20];
46   int NoeudMaille;
47
48   bool ok;
49
50   MESSAGE("in DriverDAT_R_SMDS_Mesh::Read()");
51   /****************************************************************************
52   *                      OUVERTURE DU FICHIER EN LECTURE                      *
53   ****************************************************************************/
54   char* file2Read = (char*)myFile.c_str();
55   myFileId = fopen(file2Read,"r");
56   if (myFileId < 0)
57     {
58       fprintf(stderr,">> ERREUR : ouverture du fichier %s \n",file2Read);
59       exit(EXIT_FAILURE);
60     }
61
62   fscanf(myFileId,"%d %d\n",&nbNodes,&nbCells);
63
64   /****************************************************************************
65   *                       LECTURE DES NOEUDS                                  *
66   ****************************************************************************/
67   fprintf(stdout,"\n(************************)\n");
68   fprintf(stdout,"(* NOEUDS DU MAILLAGE : *)\n");
69   fprintf(stdout,"(************************)\n");
70
71   for (i=0;i<nbNodes;i++) {
72     fscanf(myFileId,"%d %e %e %e\n",&intNumPoint,&coordX,&coordY,&coordZ);
73     ok = myMesh->AddNodeWithID(coordX,coordY,coordZ,intNumPoint);
74   }
75
76   fprintf(stdout,"%d noeuds\n",myMesh->NbNodes());
77   /****************************************************************************
78   *                       LECTURE DES ELEMENTS                                *
79   ****************************************************************************/
80   fprintf(stdout,"\n(**************************)\n");
81   fprintf(stdout,"(* ELEMENTS DU MAILLAGE : *)\n");
82   fprintf(stdout,"(**************************)");
83
84   fprintf(stdout,"%d elements\n",nbCells);
85
86   for (i=0; i<nbCells; i++) {
87     fscanf(myFileId,"%d %d",&intNumMaille,&ValElement);
88     Degre=abs(ValElement/100);
89     nbNoeuds=ValElement-(Degre*100);
90     
91     // Recuperation des noeuds de la maille
92     for (j=0; j<nbNoeuds; j++) {
93       fscanf(myFileId,"%d",&NoeudMaille);
94       NoeudsMaille[j]=NoeudMaille;
95     }
96     
97     // Analyse des cas de cellules
98     switch (ValElement) {
99     case 102 : ;
100     case 103 : ;
101       {
102       ValDegre=3;
103       nbNoeuds=2;
104       ok = myMesh->AddEdgeWithID(NoeudsMaille[0],NoeudsMaille[1],intNumMaille);
105       break;
106     }
107     case 204 : ;
108     case 208 : ;
109       {
110       ValDegre=9;
111       nbNoeuds=4;
112       ok = myMesh->AddFaceWithID(NoeudsMaille[0],NoeudsMaille[1],NoeudsMaille[2],NoeudsMaille[3],intNumMaille);
113       break;
114     }
115     case 203 : ;
116     case 206 : ;
117       {
118       ValDegre=5;
119       nbNoeuds=3;
120       ok = myMesh->AddFaceWithID(NoeudsMaille[0],NoeudsMaille[1],NoeudsMaille[2],intNumMaille);
121       break;
122     }
123     case 308 : ;
124     case 320 : ;
125       {
126       ValDegre=12;
127       nbNoeuds=8;
128       if (ValElement==320) {
129         //A voir, correspondance VTK
130         NoeudsMaille[4]=NoeudsMaille[8];
131         NoeudsMaille[5]=NoeudsMaille[9];
132         NoeudsMaille[6]=NoeudsMaille[10];
133         NoeudsMaille[7]=NoeudsMaille[11];
134       }
135       ok = myMesh->AddVolumeWithID(NoeudsMaille[0],NoeudsMaille[1],NoeudsMaille[2],NoeudsMaille[3],NoeudsMaille[4],NoeudsMaille[5],NoeudsMaille[6],NoeudsMaille[7],intNumMaille);
136      break;
137     }
138     case 304 : ;
139     case 310 : ;
140       {
141       ValDegre=10;
142       nbNoeuds=4;
143       if (ValElement==310)
144         NoeudsMaille[3]=NoeudsMaille[6];
145       ok = myMesh->AddVolumeWithID(NoeudsMaille[0],NoeudsMaille[1],NoeudsMaille[2],NoeudsMaille[3],intNumMaille);
146      break;
147     }
148     case 306 : ;
149     case 315 : ;
150       {
151       ValDegre=12;
152       nbNoeuds=8;
153       if (ValElement==315) {
154         NoeudsMaille[3]=NoeudsMaille[6];
155         NoeudsMaille[4]=NoeudsMaille[7];
156         NoeudsMaille[5]=NoeudsMaille[8];
157       }
158       NoeudsMaille[7]=NoeudsMaille[5];
159       NoeudsMaille[6]=NoeudsMaille[5];
160       NoeudsMaille[5]=NoeudsMaille[4];
161       NoeudsMaille[4]=NoeudsMaille[3];
162       NoeudsMaille[3]=NoeudsMaille[2];
163       ok = myMesh->AddVolumeWithID(NoeudsMaille[0],NoeudsMaille[1],NoeudsMaille[2],NoeudsMaille[3],NoeudsMaille[4],NoeudsMaille[5],intNumMaille);
164       break;
165     }
166
167     }
168   }
169
170   /****************************************************************************
171   *                      FERMETURE DU FICHIER                      *
172   ****************************************************************************/
173   fclose(myFileId);
174
175 }