MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
rec_face_conique.cpp
Aller à la documentation de ce fichier.
1 //####//------------------------------------------------------------
2 //####//------------------------------------------------------------
3 //####// MAGiC
4 //####// Jean Christophe Cuilliere et Vincent FRANCOIS
5 //####// Departement de Genie Mecanique - UQTR
6 //####//------------------------------------------------------------
7 //####// MAGIC est un projet de recherche de l equipe ERICCA
8 //####// du departement de genie mecanique de l Universite du Quebec a Trois Rivieres
9 //####// http://www.uqtr.ca/ericca
10 //####// http://www.uqtr.ca/
11 //####//------------------------------------------------------------
12 //####//------------------------------------------------------------
13 //####//
14 //####// rec_face_conique.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:56 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 #include "gestionversion.h"
23 
24 #pragma hdrstop
25 
26 #include "occ_fonction.h"
27 #include "rec_face_conique.h"
28 #include "tpl_map_entite.h"
29 #include "rec_contour.h"
30 #include "fem_noeud.h"
31 #include "fem_maillage.h"
32 #include "ot_mathematique.h"
33 
34 
35 #pragma package(smart_init)
36 
37 
38 
39 
40 
41 
42 
43 REC_FACE_CONIQUE::REC_FACE_CONIQUE(FEM_MAILLAGE* fem_mai, int Idealise, OCC_FONCTION_RECONSTRUCTION& fonc, int test, int* faces): REC_FACE(fem_mai,Idealise, fonc, test, faces)
44 {
45 
46 }
47 
48 
50 {
51 
52 }
53 
54 void REC_FACE_CONIQUE::Reconstruire(MG_FACE* face, double coef)
55 {
56 
57  MG_SURFACE* surface = face->get_surface();
58  TPL_LISTE_ENTITE <double> Parametres;
59  int type_surface = surface->get_type_geometrique(Parametres);
60 
61  double Pnt_Insersion[3];
62  Pnt_Insersion[0]= Parametres.get(0);
63  Pnt_Insersion[1]= Parametres.get(1);
64  Pnt_Insersion[2]= Parametres.get(2);
65 
66  double Vecteur1[3];
67  Vecteur1[0]= Parametres.get(3);
68  Vecteur1[1]= Parametres.get(4);
69  Vecteur1[2]= Parametres.get(5);
70 
71  double Vect_Directeur[3];
72  Vect_Directeur[0]= Parametres.get(6);
73  Vect_Directeur[1]= Parametres.get(7);
74  Vect_Directeur[2]= Parametres.get(8);
75  double Rayon = Parametres.get(9);
76  double Angle = acos(Parametres.get(11));
77 
78  //OCC_FONCTION fonction;
79 
80 
81  int nb_triangle = face->get_lien_fem_maillage()->get_nb();
82  TPL_MAP_ENTITE<FEM_NOEUD*> liste_noeuds0;
83 
84  for (int j =0; j<nb_triangle;j++)
85  {
87  if (!fem_maillage->contient(mgtri)) continue;
88  if (mgtri->get_nb_fem_noeud()==3)
89  {
90  FEM_NOEUD* noeud0=mgtri->get_fem_noeud(0);
91  FEM_NOEUD* noeud1=mgtri->get_fem_noeud(1);
92  FEM_NOEUD* noeud2=mgtri->get_fem_noeud(2);
93  liste_noeuds0.ajouter(noeud0);
94  liste_noeuds0.ajouter(noeud1);
95  liste_noeuds0.ajouter(noeud2);
96  }
97  if (mgtri->get_nb_fem_noeud()==6)
98  {
99  FEM_NOEUD* noeud0=mgtri->get_fem_noeud(0);
100  FEM_NOEUD* noeud1=mgtri->get_fem_noeud(1);
101  FEM_NOEUD* noeud2=mgtri->get_fem_noeud(2);
102  FEM_NOEUD* noeud3=mgtri->get_fem_noeud(3);
103  FEM_NOEUD* noeud4=mgtri->get_fem_noeud(4);
104  FEM_NOEUD* noeud5=mgtri->get_fem_noeud(5);
105  liste_noeuds0.ajouter(noeud0);
106  liste_noeuds0.ajouter(noeud1);
107  liste_noeuds0.ajouter(noeud2);
108  liste_noeuds0.ajouter(noeud3);
109  liste_noeuds0.ajouter(noeud4);
110  liste_noeuds0.ajouter(noeud5);
111  }
112  }
113 
114  for (int k =0; k < liste_noeuds0.get_nb();k++)
115  {
116  FEM_NOEUD* noeud=liste_noeuds0.get(k);
117  fonction.Ajouter_Point_Array_Ideal(noeud->get_x(),noeud->get_y(),noeud->get_z(),k+1);
118  }
119  fonction.Determiner_Param_Boite(liste_noeuds0.get_nb());
120 
121  double x0 = fonction.Get_Param_Boite(1);
122  double y0 = fonction.Get_Param_Boite(2);
123  double z0 = fonction.Get_Param_Boite(3);
124 
128 
129  Vect_Boite01.norme();
130  Vect_Boite02.norme();
131  Vect_Boite03.norme();
132 
133  OT_VECTEUR_3D Vect_Dirct0(Vect_Directeur[0],Vect_Directeur[1],Vect_Directeur[2]);
134  OT_VECTEUR_3D Vect_Directeur_Boite0(Vect_Dirct0*Vect_Boite01,Vect_Dirct0*Vect_Boite02,Vect_Dirct0*Vect_Boite03);
135 
136  OT_VECTEUR_3D Vect1(Vecteur1[0],Vecteur1[1],Vecteur1[2]);
137  OT_VECTEUR_3D Vect1_Boite0(Vect1*Vect_Boite01,Vect1*Vect_Boite02,Vect1*Vect_Boite03);
138 
139  OT_VECTEUR_3D Pnt_Inser0(Pnt_Insersion[0]-x0,Pnt_Insersion[1]-y0,Pnt_Insersion[2]-z0);
140  OT_VECTEUR_3D Pnt_Insersion_Boite0(Pnt_Inser0*Vect_Boite01,Pnt_Inser0*Vect_Boite02,Pnt_Inser0*Vect_Boite03);
141 
142  TPL_MAP_ENTITE<FEM_NOEUD*> liste_noeuds1;
143  for (int k =0; k < liste_noeuds0.get_nb();k++)
144  {
145  FEM_NOEUD* noeud=liste_noeuds0.get(k);
146  for (int l =0; l < fem_maillage->get_nb_fem_noeud();l++)
147  {
149  if(noeud0 == noeud)
150  {
151  FEM_NOEUD* noeud1 = fem_maillage->get_fem_noeud(l);
152  fonction.Ajouter_Point_Array_Ideal(noeud1->get_x(coef),noeud1->get_y(coef),noeud1->get_z(coef),k+1);
153  liste_noeuds1.ajouter(noeud1);
154  }
155  }
156 
157  }
158  fonction.Determiner_Param_Boite(liste_noeuds1.get_nb());
159 
160  double x1 = fonction.Get_Param_Boite(1);
161  double y1 = fonction.Get_Param_Boite(2);
162  double z1 = fonction.Get_Param_Boite(3);
163 
167 
168  Vect_Boite11.norme();
169  Vect_Boite12.norme();
170  Vect_Boite13.norme();
171 
172  Vect_Directeur[0]= (Vect_Directeur_Boite0.get_x()*Vect_Boite11.get_x()+Vect_Directeur_Boite0.get_y()*Vect_Boite12.get_x()+Vect_Directeur_Boite0.get_z()*Vect_Boite13.get_x());
173  Vect_Directeur[1]= (Vect_Directeur_Boite0.get_x()*Vect_Boite11.get_y()+Vect_Directeur_Boite0.get_y()*Vect_Boite12.get_y()+Vect_Directeur_Boite0.get_z()*Vect_Boite13.get_y());
174  Vect_Directeur[2]= (Vect_Directeur_Boite0.get_x()*Vect_Boite11.get_z()+Vect_Directeur_Boite0.get_y()*Vect_Boite12.get_z()+Vect_Directeur_Boite0.get_z()*Vect_Boite13.get_z());
175 
176  Pnt_Insersion[0]= x1 + Pnt_Insersion_Boite0.get_x()*Vect_Boite11.get_x()+Pnt_Insersion_Boite0.get_y()*Vect_Boite12.get_x()+Pnt_Insersion_Boite0.get_z()*Vect_Boite13.get_x();
177  Pnt_Insersion[1]= y1 + Pnt_Insersion_Boite0.get_x()*Vect_Boite11.get_y()+Pnt_Insersion_Boite0.get_y()*Vect_Boite12.get_y()+Pnt_Insersion_Boite0.get_z()*Vect_Boite13.get_y();;
178  Pnt_Insersion[2]= z1 + Pnt_Insersion_Boite0.get_x()*Vect_Boite11.get_z()+Pnt_Insersion_Boite0.get_y()*Vect_Boite12.get_z()+Pnt_Insersion_Boite0.get_z()*Vect_Boite13.get_z();;
179 
180  //Vecteur1[0]= Vect1_Boite0.get_x()*Vect_Boite11.get_x()+Vect1_Boite0.get_y()*Vect_Boite12.get_x()+Vect1_Boite0.get_z()*Vect_Boite13.get_x();
181  //Vecteur1[1]= Vect1_Boite0.get_x()*Vect_Boite11.get_y()+Vect1_Boite0.get_y()*Vect_Boite12.get_y()+Vect1_Boite0.get_z()*Vect_Boite13.get_y();
182  //Vecteur1[2]= Vect1_Boite0.get_x()*Vect_Boite11.get_z()+Vect1_Boite0.get_y()*Vect_Boite12.get_z()+Vect1_Boite0.get_z()*Vect_Boite13.get_z();
183 
184 
185  fonction.Ligne_Revolution(Pnt_Insersion,Vect_Directeur);
186 
187  double distance_min = 1E+308;
188  double distance_max = -1E+308;
189 
190  double Proj_Ptmax[3];
191  double Proj_Ptmin[3];
192 
193  for (int u =0; u<liste_noeuds1.get_nb();u++)
194  {
195  FEM_NOEUD* noeud = liste_noeuds1.get(u);
196  double distance = fonction.Distance_Point_Curve(noeud->get_x(coef),noeud->get_y(coef),noeud->get_z(coef));
198  double xx = fonction.Pnt_Proj_Ligne(1);
199  double yy = fonction.Pnt_Proj_Ligne(2);
200  double zz = fonction.Pnt_Proj_Ligne(3);
201  if(distance < distance_min)
202  {
203  distance_min = distance;
204  Proj_Ptmin[0] = fonction.Pnt_Proj_Ligne(1);
205  Proj_Ptmin[1] = fonction.Pnt_Proj_Ligne(2);
206  Proj_Ptmin[2] = fonction.Pnt_Proj_Ligne(3);
207  }
208  if(distance > distance_max)
209  {
210  distance_max = distance;
211  Proj_Ptmax[0] = fonction.Pnt_Proj_Ligne(1);
212  Proj_Ptmax[1] = fonction.Pnt_Proj_Ligne(2);
213  Proj_Ptmax[2] = fonction.Pnt_Proj_Ligne(3);
214  }
215  }
216 
217  Angle = atan((distance_max-distance_min) /OT_VECTEUR_3D(Proj_Ptmax[0]-Proj_Ptmin[0],Proj_Ptmax[1]-Proj_Ptmin[1],Proj_Ptmax[2]-Proj_Ptmin[2]).get_longueur());
218 
219 
220  fonction.Creer_Surface_Conique(Pnt_Insersion,Vect_Directeur,Rayon, Angle);
221 
223  int num_faceid = 0;
224  for (int l =0; l < mggeom->get_nb_mg_face();l++)
225  {
226  MG_FACE* F = mggeom->get_mg_face(l);
227  if(faceso[l]==1) num_faceid = num_faceid+1;
228  if(F == face )
229  {
230  //faceso[l] == 1;
232  goto Face_Trouvee;
233  }
234  }
235  Face_Trouvee:
236 
237 
238 
239 
240  for (int v =0; v<face->get_nb_mg_boucle();v++)
241  {
242  MG_BOUCLE* Boucle = face->get_mg_boucle(v);
244  Rec.Reconstruire(Boucle, coef);
245 
247  }
248 }
249 
251 {
252  //OCC_FONCTION fonction;
253  //fonction.Enregistrer(path);
254 }
255 
256 
257 
258 
259 
260 
261 
262 
263 
OCC_FONCTION_RECONSTRUCTION::Creer_Surface_Conique
int Creer_Surface_Conique(double Pnt_Insersion[3], double Vect_Directeur[3], double Rayon, double Angle)
Definition: occ_fonction_reconstruction.cpp:128
REC_BREP::fonction
OCC_FONCTION_RECONSTRUCTION & fonction
Definition: rec_brep.h:56
OCC_FONCTION_RECONSTRUCTION
Definition: occ_fonction_reconstruction.h:84
MG_BOUCLE
Definition: mg_boucle.h:35
gestionversion.h
MG_SURFACE
Definition: mg_surface.h:31
TPL_MAP_ENTITE
Definition: tpl_map_entite.h:35
MG_SURFACE::get_type_geometrique
virtual int get_type_geometrique(TPL_LISTE_ENTITE< double > &param)=0
REC_BREP::fem_maillage
FEM_MAILLAGE * fem_maillage
Definition: rec_brep.h:52
REC_FACE::testo
int testo
Definition: rec_face.h:46
fem_maillage.h
OCC_FONCTION_RECONSTRUCTION::Ajouter_Point_Array_Ideal
int Ajouter_Point_Array_Ideal(double x, double y, double z, int i)
Definition: occ_fonction_reconstruction.cpp:452
fem_noeud.h
OCC_FONCTION_RECONSTRUCTION::Ajouter_Contour_Face
int Ajouter_Contour_Face(int ii)
Definition: occ_fonction_reconstruction.cpp:71
OCC_FONCTION_RECONSTRUCTION::Ajouter_Surface_liste_Ideal
int Ajouter_Surface_liste_Ideal(int num)
Definition: occ_fonction_reconstruction.cpp:590
rec_face_conique.h
FEM_MAILLAGE::get_mg_geometrie
MG_GEOMETRIE * get_mg_geometrie(void)
Definition: fem_maillage.cpp:88
OCC_FONCTION_RECONSTRUCTION::Distance_Point_Curve
double Distance_Point_Curve(double x, double y, double z)
Definition: occ_fonction_reconstruction.cpp:527
REC_FACE_CONIQUE::~REC_FACE_CONIQUE
virtual ~REC_FACE_CONIQUE()
Definition: rec_face_conique.cpp:49
atan
double2 atan(double2 &val)
Definition: ot_doubleprecision.cpp:327
OT_VECTEUR_3D::get_x
virtual double get_x(void) const
Definition: ot_mathematique.cpp:417
MG_FACE::get_nb_mg_boucle
virtual int get_nb_mg_boucle(void)
Definition: mg_face.cpp:67
FEM_ELEMENT2
Definition: fem_element2.h:34
FEM_MAILLAGE::get_nb_fem_noeud
unsigned int get_nb_fem_noeud(void)
Definition: fem_maillage.cpp:190
FEM_NOEUD::get_y
virtual double get_y(double coef=0.)
Definition: fem_noeud.cpp:210
OCC_FONCTION_RECONSTRUCTION::Pnt_Proj_Ligne
double Pnt_Proj_Ligne(int ii)
Definition: occ_fonction_reconstruction.cpp:570
OCC_FONCTION_RECONSTRUCTION::Pt_Proj_Ligne
int Pt_Proj_Ligne()
Definition: occ_fonction_reconstruction.cpp:561
REC_FACE_CONIQUE::REC_FACE_CONIQUE
REC_FACE_CONIQUE(FEM_MAILLAGE *fem_mai, int Idealise, OCC_FONCTION_RECONSTRUCTION &fonc, int test, int *faces)
Definition: rec_face_conique.cpp:43
REC_CONTOUR
Definition: rec_contour.h:33
FEM_ELEMENT2::get_nb_fem_noeud
virtual int get_nb_fem_noeud(void)=0
REC_FACE
Definition: rec_face.h:34
OCC_FONCTION_RECONSTRUCTION::Determiner_Param_Boite
int Determiner_Param_Boite(int i)
Definition: occ_fonction_reconstruction.cpp:460
FEM_MAILLAGE::get_fem_noeud
FEM_NOEUD * get_fem_noeud(unsigned int num)
Definition: fem_maillage.cpp:162
rec_contour.h
FEM_MAILLAGE
Definition: fem_maillage.h:66
TPL_MAP_ENTITE::get_nb
virtual int get_nb(void)
Definition: tpl_map_entite.h:83
REC_FACE::faceso
int * faceso
Definition: rec_face.h:47
tpl_map_entite.h
OCC_FONCTION_RECONSTRUCTION::Get_Param_Boite
double Get_Param_Boite(int i)
Definition: occ_fonction_reconstruction.cpp:492
TPL_LISTE_ENTITE::get_nb
virtual int get_nb(void)
Definition: tpl_liste_entite.h:67
OT_VECTEUR_3D::norme
virtual void norme(void)
Definition: ot_mathematique.cpp:494
MG_GEOMETRIE::get_mg_face
MG_FACE * get_mg_face(unsigned int num)
Definition: mg_geometrie.cpp:1251
TPL_LISTE_ENTITE::get
virtual X get(int num)
Definition: tpl_liste_entite.h:72
ot_mathematique.h
FEM_NOEUD::get_x
virtual double get_x(double coef=0.)
Definition: fem_noeud.cpp:205
FEM_NOEUD
Definition: fem_noeud.h:35
OT_VECTEUR_3D::get_y
virtual double get_y(void) const
Definition: ot_mathematique.cpp:423
REC_CONTOUR::Reconstruire
void Reconstruire(MG_BOUCLE *Boucle, double coef)
Definition: rec_contour.cpp:45
REC_FACE_CONIQUE::Reconstruire
void Reconstruire(MG_FACE *face, double coef)
Definition: rec_face_conique.cpp:54
MG_GEOMETRIE::get_nb_mg_face
unsigned int get_nb_mg_face(void)
Definition: mg_geometrie.cpp:1264
acos
double2 acos(double2 &val)
Definition: ot_doubleprecision.cpp:224
OT_VECTEUR_3D
Definition: ot_mathematique.h:94
TPL_MAP_ENTITE::ajouter
virtual void ajouter(X x)
Definition: tpl_map_entite.h:55
FEM_NOEUD::get_z
virtual double get_z(double coef=0.)
Definition: fem_noeud.cpp:215
FEM_ELEMENT2::get_fem_noeud
virtual class FEM_NOEUD * get_fem_noeud(int num)=0
FEM_MAILLAGE::contient
bool contient(MG_IDENTIFICATEUR *id)
Definition: fem_maillage.cpp:110
TPL_MAP_ENTITE::get
virtual X get(int num)
Definition: tpl_map_entite.h:89
OT_VECTEUR_3D::get_z
virtual double get_z(void) const
Definition: ot_mathematique.cpp:429
MG_ELEMENT_TOPOLOGIQUE::get_lien_fem_maillage
virtual TPL_LISTE_ENTITE< FEM_ELEMENT_MAILLAGE * > * get_lien_fem_maillage(void)
Definition: mg_element_topologique.cpp:67
MG_GEOMETRIE
Definition: mg_geometrie.h:84
REC_FACE_CONIQUE::Enregistrer
void Enregistrer(char *path)
Definition: rec_face_conique.cpp:250
TPL_LISTE_ENTITE< double >
OCC_FONCTION_RECONSTRUCTION::Ligne_Revolution
int Ligne_Revolution(double Pnt_Inser[], double Vect_Direc[])
Definition: occ_fonction_reconstruction.cpp:516
REC_BREP::Idealiser
int Idealiser
Definition: rec_brep.h:53
MG_FACE
Definition: mg_face.h:34
occ_fonction.h
MG_FACE::get_mg_boucle
virtual MG_BOUCLE * get_mg_boucle(int num)
Definition: mg_face.cpp:72
MG_FACE::get_surface
virtual MG_SURFACE * get_surface(void)
Definition: mg_face.cpp:109