Salome HOME
1704a231c85a9576864cf1a5dc6b62aba27a6b92
[modules/hexablock.git] / doc / pyplots / bielle_JPL.py
1 #!/usr/bin/python
2 # Copyright (C) 2009-2023  CEA, EDF
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20
21 #===============================================
22 # By Karima DEBCHI YATAGHENE Nov 2009 at CS 
23 # modifié par JPL le 19 avril 2010
24 # (reprise de BIELLE.last.test.py)
25 #===============================================
26
27 # @todo idée à terme : ne pas avoir à faire "a la mano" l'association de TOUS les vertex du modèle, mais faire
28 # en sorte qu'un certain nombre d'associations soient faites automatiquement.
29 # typiquement, pour une grille cylindrique (ex de 12 vertex comme celles du script) :
30 # 4 points doivent etre obligatoirement associés à la main
31 # les 8 autres devraient pouvoir l'etre automatiquement
32 #
33 # pour cela, il serait utile de pouvoir récupérer les propriétés de la grille cylindrique (qui ne sont pour le moment
34 # pas conservées toutes conservées dans le moteur HEXA, ou en tout cas pas toutes accessibles avec l'API python)
35
36 import GEOM
37 import geompy
38 import smesh
39 import HexaBlocks
40 import math
41 import SALOMEDS
42
43 def get_vertices_from_cylindrical(grille_cyl, nr, na, nl=1):
44     """
45     fonction qui prend en entrée une liste d'hexaèdres renvoyés par makeCylindrical, dans le cas FALSE uniquement
46     (ie : pas de remplissage de la partie centrale)
47     => du type grid_type
48     
49     renvoie une liste de sommets, dans cet ordre :
50
51     pour la grande grille cylindrique, la liste est constituée, dans l'ordre :
52     1) des vertex de la face du haut (k = 1) => na * 2
53     a) vertex externes (i = 1) => na
54     b) vertex internes (i = 0) => na
55     2) des vertex de la face du bas (k = 0) => na * 2
56     a) vertex externes (i = 1) => na
57     b) vertex internes (i = 0) => na
58     
59     @todo makeCylindrical renvoie une grille cylindrique
60     ie : une liste d'hexaèdres
61     pbmes :
62     1) une fois la grille cylindrique crée, elle est renvoyée sous forme d'un tableau d'hexaèdres
63     dans un certain ordre (cf. SPECS 2.3.6), mais pas sous forme d'objet "grille cylindrique"
64     => cette fonction ne pourra pas à terme etre intégrée sous forme de méthode.
65     2) impossible de faire des tests sur le cylindre (vide ou pas, récupération directe de nr, na, nl, ...)
66     """
67
68     # dans cette première version, on considère une grille cylindrique avec nr = 1 et nl = 1
69     if (nr !=1) or (nl != 1):
70         print("nr ou nl invalide(s) !!")
71         return None
72     
73     vertices = []
74     li_z = [nl, 0] # indice nl => face du haut, indice 0 => face du bas
75     li_x = [nr, 0] # indice nr => externe, indice 0 => interne
76     li_y = list(range(na)) # indices de 0 à (na-1)
77     for k in li_z: # suivant z
78         for i in li_x: # suivant x
79             for j in li_y: # suivant y 
80                 vertices.append(grille_cyl.getVertexIJK(i , j , k))
81                 
82     return vertices
83     
84 def set_association_from_cylindrical(model_vertices, geom_vertices):
85     """
86     réalise l'association entre :
87     1) les sommets issus d'une grille cylindrique (résultat de l'appel à get_vertices_from_cylindrical())
88     2) les sommets de la geometrie
89
90     l'association est faite dans l'ordre des vertex de la liste du modèle ie :
91     1) les sommets externes de la face du haut
92     2) les sommets internes de la face du haut
93     3) les sommets externes de la face du bas
94     4) les sommets internes de la face du bas
95     """
96     
97     for num, vertex in enumerate(model_vertices):
98         vertex.setAssociation(geom_vertices[num])
99         
100     pass
101
102 #=============================
103 # CREATION DOCUMENT
104 #=============================
105
106 doc = HexaBlocks.addDocument()
107
108 #=============================
109 # CREATION DU MODELE
110 #=============================
111
112 # Pour la bielle on doit creer deux grilles cylindriques et prismer les quadrangles entre ces deux dernieres
113
114 #=============================
115 # PARAMETRES
116 #=============================
117
118 R = 40.0
119
120 r_grd = R
121 r_grd_t = R/2
122
123 r_pte = R
124 r_pte_t = R/2
125
126 l = 200.0
127 h = 0.019999999553*2
128 #h = 40.
129
130 # Taille du grand cylindre
131 dr_grd = R
132 da_grd = 360
133 dl_grd = h
134
135 nr_grd = 1
136 na_grd = 6
137 nl_grd = 1
138
139 # Taille du petit cylindre
140 dr_pte = R
141 da_pte = 360
142 dl_pte = h
143
144 nr_pte = 1
145 na_pte = 6
146 nl_pte = 1
147
148
149 #=============================
150 # Creation des vecteurs
151 #=============================
152
153 dx = doc.addVector(l, 0, 0)
154 dy = doc.addVector(0, l, 0)
155 dz = doc.addVector(0, 0, l)
156
157 #=================================================
158 # Creation des centres des grilles cylindriques
159 #=================================================
160
161 c_grd = doc.addVertex(0, 0, 0)
162 c_pte = doc.addVertex(2*l, 0, 0)
163 dx_prime = doc.addVectorVertices( c_grd, c_pte )
164
165 #=================================================
166 # Creation de la grande grille cylindrique
167 #=================================================
168
169 grille_cyl_grd = doc.makeCylindrical(c_grd, dx, dz, dr_grd, da_grd, dl_grd, nr_grd, na_grd, nl_grd, False)
170
171 # on obtient une liste qui contient 6 hexaedres eguaux
172
173 # 30 = pi/6
174 # 60 = pi/3
175 # 45 = pi/4
176 # 90 = pi/2
177 # 180 = pi
178
179 alpha_x = 2*R*math.cos(math.pi/3)
180 alpha_y = 2*R*math.sin(math.pi/3)
181
182 x1 = doc.findVertex( 2*R, 0, h )
183 x2 = doc.findVertex( alpha_x, alpha_y, 0 )
184 x3 = doc.findVertex( alpha_x, -alpha_y, 0 )
185 x4 = doc.findVertex( 2*R, 0, 0 )
186
187 quad_11 = doc.findQuad(x1, x2)
188 quad_12 = doc.findQuad(x1, x3)
189
190 quad_list = [ quad_11 , quad_12 ]
191
192 #=================================================
193 # Creation de la petite grille cylindrique
194 #=================================================
195
196 grille_cyl_pte = doc.makeTranslation(grille_cyl_grd, dx_prime )
197
198 # on obtient une liste qui contient 6 hexaedres eguaux
199
200 y1 = doc.findVertex(2*l - 2*R , 0 , h)
201 y2 = doc.findVertex(2*l - alpha_x , alpha_y , 0)
202 y3 = doc.findVertex(2*l - alpha_x , -alpha_y , 0)
203 y4 = doc.findVertex(2*l - 2*R , 0 , 0)
204
205 quad_21 = doc.findQuad(y1, y2)
206 quad_22 = doc.findQuad(y1, y3)
207
208 #=================================================
209 # Assemblage des deux grilles cylindriques
210 #=================================================
211
212 # a priori ne sert que pour créer bielle.vtk : normal ??
213 model_biell_fin = doc.joinQuads(quad_list, quad_21, x1, y1, x4, y4, 1)
214
215
216 model_biell_fin.saveVtk("/tmp/bielle.vtk")
217 grille_cyl_pte.saveVtk("/tmp/grille_cyl_pte.vtk")
218 grille_cyl_grd.saveVtk("/tmp/grille_cyl_grd.vtk")
219
220
221 #===================================================================
222 # Recuperation des vertex du modele hexa bielle pour l association
223 #===================================================================
224
225 # pour la grande grille cylindrique, la liste est constituée, dans l'ordre :
226 # 1) des vertex de la face du haut (k = 1) => 12
227 #    a) vertex externes (i = 1) => 6
228 #    b) vertex internes (i = 0) => 6
229 # 2) des vertex de la face du bas (k = 0) => 12
230 #    a) vertex externes (i = 1) => 6
231 #    b) vertex internes (i = 0) => 6
232
233 mod_grd = get_vertices_from_cylindrical(grille_cyl_grd, nr_grd, na_grd, nl_grd)
234
235 # pour la petite grille cylindrique, la liste est constituée, dans l'ordre :
236 # 1) des vertex de la face du haut (k = 1) => 12
237 #    a) vertex externes (i = 1) => 6
238 #    b) vertex internes (i = 0) => 6
239 # 2) des vertex de la face du bas (k = 0) => 12
240 #    a) vertex externes (i = 1) => 6
241 #    b) vertex internes (i = 0) => 6
242
243 mod_pte = get_vertices_from_cylindrical(grille_cyl_pte, nr_pte, na_pte, nl_pte)
244
245 #===================================================================
246 # Recuperation des points de la geometrie bielle pour l association
247 #===================================================================
248
249 Bielle_geom = geompy.Import("/home/plumecoq/Karima/karima/hexa/cao_cea/crank.stp", "STEP")
250
251 geompy.addToStudy(Bielle_geom, "Bielle_geom")
252
253 Pt_A = geompy.MakeVertex(0, 0, h/2.)
254 Face_haut = geompy.GetFaceNearPoint(Bielle_geom, Pt_A)
255
256 Pt_B = geompy.MakeVertex(0, 0, -h/2.)
257 Face_bas = geompy.GetFaceNearPoint(Bielle_geom, Pt_B)
258
259 Edge_haut_droite = geompy.GetEdgesByLength(Face_haut, 0.136, 0.137)
260 Edge_haut_gauche = geompy.GetEdgesByLength(Face_haut, 0.131, 0.132)
261
262 # 1. grand cylindre :
263 geom_vert_grd = []
264 # 1.1 face du haut :
265 # 1.1.1 sommets externes :
266
267 # pour l'instant, la création des vertex de la geometrie se fait obligatoirement
268 # dans cet ordre :
269 y_h_g = geompy.MakeVertexOnSurface(Face_haut, 1, 0.5)
270
271 Edge_haut_grd = geompy.GetEdgeNearPoint(Bielle_geom, y_h_g)
272 x_h_g = geompy.MakeVertexOnCurve(Edge_haut_grd, 0)
273 z_h_g = geompy.MakeVertexOnCurve(Edge_haut_grd, 1)
274 u_h_g = geompy.MakeVertexOnCurve(Edge_haut_droite, 1)
275 w_h_g = geompy.MakeVertexOnCurve(Edge_haut_gauche, 0)
276
277 Edge_v_grd = geompy.MakeLineTwoPnt(u_h_g, w_h_g)
278 v_h_g = geompy.MakeVertexOnCurve(Edge_v_grd, 0.5)
279
280 geom_vert_grd.extend([y_h_g, x_h_g, z_h_g, u_h_g, w_h_g, v_h_g])
281
282 # 1.1.2 sommets internes :
283 Edge_haut_grd_trou = geompy.GetEdgesByLength(Face_haut, 0.147, 0.148)
284 y_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0)
285 z_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.2)
286 w_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.35)
287 v_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.5)
288 u_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.65)
289 x_h_g_t = geompy.MakeVertexOnCurve(Edge_haut_grd_trou, 0.8)
290
291 geom_vert_grd.extend([y_h_g_t, x_h_g_t, z_h_g_t, u_h_g_t, w_h_g_t, v_h_g_t])
292
293 # 1.2 face du bas :
294 # pour tous les vertex de la face du bas, on les crée par référence à ceux déjà crées (dans le meme ordre :
295 # sommets externes puis internes) :
296 geom_vert_grd_bas = [geompy.MakeVertexWithRef(vertex, 0.0, 0.0, -h) for vertex in geom_vert_grd]
297 geom_vert_grd.extend(geom_vert_grd_bas)
298
299
300 print("nombre vertex grand cylindre geom = ", len(geom_vert_grd))
301
302 # ajout des vertex de la géométrie à l'étude :
303 for num, vertex in enumerate(geom_vert_grd):
304 #    print "ajout de v_grd"+str(num)
305     geompy.addToStudy(vertex, "v_grd"+str(num))
306
307 # association :
308 set_association_from_cylindrical(mod_grd, geom_vert_grd)
309
310 # 2. petit cylindre :
311 geom_vert_pte = []
312 # 2.1 face du haut :
313 # 2.1.1 sommets externes :
314
315 # pour l'instant, la création des vertex de la geometrie se fait obligatoirement
316 # dans cet ordre :
317 v_h_p = geompy.MakeVertexOnSurface(Face_haut, 0, 0.5)
318
319 Edge_haut_pte = geompy.GetEdgeNearPoint(Bielle_geom, v_h_p)
320 w_h_p = geompy.MakeVertexOnCurve(Edge_haut_pte, 0)
321 u_h_p = geompy.MakeVertexOnCurve(Edge_haut_pte, 1)
322 x_h_p = geompy.MakeVertexOnCurve(Edge_haut_droite, 0)
323 z_h_p = geompy.MakeVertexOnCurve(Edge_haut_gauche, 1)
324
325 Edge_v_pte = geompy.MakeLineTwoPnt(x_h_p, z_h_p)
326 y_h_p = geompy.MakeVertexOnCurve(Edge_v_pte, 0.5)
327
328 geom_vert_pte.extend([y_h_p, x_h_p, z_h_p, u_h_p, w_h_p, v_h_p])
329
330 # 2.1.2 sommets internes :
331 Edge_haut_pte_trou = geompy.GetEdgesByLength(Face_haut, 0.094, 0.095)
332 y_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0)
333 z_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.2)
334 w_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.35)
335 v_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.5)
336 u_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.65)
337 x_h_p_t = geompy.MakeVertexOnCurve(Edge_haut_pte_trou, 0.8)
338
339 geom_vert_pte.extend([y_h_p_t, x_h_p_t, z_h_p_t, u_h_p_t, w_h_p_t, v_h_p_t])
340
341 # 2.2 face du bas :
342 # pour tous les vertex de la face du bas, on les crée par référence à ceux déjà crées (dans le meme ordre :
343 # sommets externes puis internes) :
344 geom_vert_pte_bas = [geompy.MakeVertexWithRef(vertex, 0.0, 0.0, -h) for vertex in geom_vert_pte]
345 geom_vert_pte.extend(geom_vert_pte_bas)
346
347 print("nombre vertex petit cylindre geom = ", len(geom_vert_pte))
348
349 # ajout des vertex de la géométrie à l'étude :
350 for num, vertex in enumerate(geom_vert_pte):
351 #    print "ajout de v_pte"+str(num)
352     geompy.addToStudy(vertex, "v_pte"+str(num))
353
354 # association :
355 set_association_from_cylindrical(mod_pte, geom_vert_pte)