1 # -*- coding: latin-1 -*-
\r
2 # Copyright (C) 2009-2012 CEA/DEN, EDF R&D
\r
4 # This library is free software; you can redistribute it and/or
\r
5 # modify it under the terms of the GNU Lesser General Public
\r
6 # License as published by the Free Software Foundation; either
\r
7 # version 2.1 of the License.
\r
9 # This library is distributed in the hope that it will be useful,
\r
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
\r
12 # Lesser General Public License for more details.
\r
14 # You should have received a copy of the GNU Lesser General Public
\r
15 # License along with this library; if not, write to the Free Software
\r
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
\r
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
\r
21 # Francis KLOSS : 2012 : CEA-Saclay, DEN, DM2S, SFME, LGLS, F-91191 Gif-sur-Yvette, France
\r
22 # ========================================================================================
\r
27 # Charger la geometrie
\r
28 # ====================
\r
30 nom = "troisCylindres"
\r
32 piece = geompy.ImportBREP(nom+".brep")
\r
34 # Selectionner des sous-parties de la geometrie
\r
35 # ---------------------------------------------
\r
37 sommets = geompy.SubShapeAllSortedCentres(piece, geompy.ShapeType["VERTEX"])
\r
38 aretes = geompy.SubShapeAllSortedCentres(piece, geompy.ShapeType["EDGE" ])
\r
40 moy_b_x, moy_b_y, moy_b_z = geompy.PointCoordinates(sommets[14])
\r
41 moy_p_x, moy_p_y, moy_p_z = geompy.PointCoordinates(sommets[ 6])
\r
42 moy_g_x, moy_g_y, moy_g_z = geompy.PointCoordinates(sommets[ 3])
\r
44 grand0, grand_xb, grand_yb, grand_zb, grand1, grand2, grand3, grand_rayon = geompy.KindOfShape(aretes[ 0])
\r
45 grand4, grand_xh, grand_yh, grand_zh, grand5, grand6, grand7, grand8 = geompy.KindOfShape(aretes[ 1])
\r
47 moyen0, moyen_x , moyen_y , moyen_z , moyen1, moyen2, moyen3, moyen_rayon = geompy.KindOfShape(aretes[20])
\r
49 petit0, petit_xb, petit_yb, petit_zb, petit1, petit2, petit3, petit_rayon = geompy.KindOfShape(aretes[12])
\r
50 petit4, petit_xh, petit_yh, petit_zh, petit5, petit6, petit7, petit8 = geompy.KindOfShape(aretes[13])
\r
52 # Construire le modele de bloc
\r
53 # ============================
\r
55 doc = hexablock.addDocument(nom)
\r
57 doc.addShape(piece,nom)
\r
59 # Construire le grand cylindre
\r
60 # ----------------------------
\r
62 grand_base = doc.addVertex(grand_xb, grand_yb, grand_zb)
\r
63 grand_oppo = doc.addVertex(grand_xh, grand_yh, grand_zh)
\r
65 grand_dir = doc.addVectorVertices(grand_base, grand_oppo)
\r
67 grand_hauteur = grand_dir.getNorm()
\r
69 grand_cylindre = doc.addCylinder(grand_base, grand_dir, grand_rayon, grand_hauteur)
\r
71 # Construire le moyen cylindre cote grand
\r
72 # ---------------------------------------
\r
77 moy_g_base_x = moy_p_x + (moy_g_x-moy_p_x)*moy_g_r1 + moyen_x - moy_b_x
\r
78 moy_g_base_y = moy_p_y + (moy_g_y-moy_p_y)*moy_g_r1 + moyen_y - moy_b_y
\r
79 moy_g_base_z = moy_p_z + (moy_g_z-moy_p_z)*moy_g_r1 + moyen_z - moy_b_z
\r
81 moy_g_base = doc.addVertex(moy_g_base_x, moy_g_base_y, moy_g_base_z)
\r
82 moy_g_oppo = doc.addVertex( (grand_xh+grand_xb) * moy_g_r2, (grand_yh+grand_yb) * moy_g_r2, (grand_zh+grand_zb) * moy_g_r2 )
\r
84 moy_g_dir = doc.addVectorVertices(moy_g_base, moy_g_oppo)
\r
86 moy_g_hauteur = moy_g_dir.getNorm()
\r
88 moy_g_cylindre = doc.addCylinder(moy_g_base, moy_g_dir, moyen_rayon, moy_g_hauteur)
\r
90 # Construire le moyen cylindre cote petit
\r
91 # ---------------------------------------
\r
95 moy_p_base = doc.addVertex(moyen_x, moyen_y, moyen_z)
\r
96 moy_b_base = doc.addVertex(moy_b_x, moy_b_y, moy_b_z)
\r
97 moy_p_oppo = doc.addVertex( moy_p_x+(moy_g_x-moy_p_x) * moy_p_r, moy_p_y+(moy_g_y-moy_p_y) * moy_p_r, moy_p_z+(moy_g_z-moy_p_z) * moy_p_r )
\r
99 moy_p_dir = doc.addVectorVertices(moy_b_base, moy_p_oppo)
\r
101 moy_p_hauteur = moy_p_dir.getNorm()
\r
103 moy_p_cylindre = doc.addCylinder(moy_p_base, moy_p_dir, moyen_rayon, moy_p_hauteur)
\r
105 # Construire le petit cylindre
\r
106 # ----------------------------
\r
108 petit_base = doc.addVertex(petit_xb, petit_yb, petit_zb)
\r
109 petit_oppo = doc.addVertex(petit_xh, petit_yh, petit_zh)
\r
111 petit_dir = doc.addVectorVertices(petit_base, petit_oppo)
\r
113 petit_hauteur = petit_dir.getNorm()
\r
115 petit_cylindre = doc.addCylinder(petit_base, petit_dir, petit_rayon, petit_hauteur)
\r
117 # Construire le T et la X
\r
118 # -----------------------
\r
120 en_te = doc.makeCylinders(grand_cylindre, moy_g_cylindre)
\r
121 croix = doc.makeCylinders(moy_p_cylindre, petit_cylindre)
\r
123 # Relier le T et la X
\r
124 # -------------------
\r
128 for i in xrange(1, -1, -1):
\r
129 for j in xrange( [hexablock.CV_MAXI_INT, hexablock.CV_MAXI_EXT][i] ):
\r
130 quad = croix.getQuadIJ(hexablock.CYL_BIG, i, j, hexablock.CYL_BIG_SLICES)
\r
131 croix_quads.append(quad)
\r
133 en_te_q = en_te.getQuadIJ(hexablock.CYL_SMALL, 1, hexablock.V_N, 0)
\r
135 en_te_v0 = en_te.getVertexIJK(hexablock.CYL_SMALL, 2, hexablock.V_N , 0)
\r
136 en_te_v1 = en_te.getVertexIJK(hexablock.CYL_SMALL, 2, hexablock.V_NW, 0)
\r
138 croix_v0 = croix.getVertexIJK(hexablock.CYL_BIG, 2, hexablock.V_E , hexablock.CYL_BIG_SLICES)
\r
139 croix_v1 = croix.getVertexIJK(hexablock.CYL_BIG, 2, hexablock.V_NE, hexablock.CYL_BIG_SLICES)
\r
141 prisme = doc.joinQuads(croix_quads, en_te_q, croix_v0, en_te_v0, croix_v1, en_te_v1, 1)
\r
146 # fkl: comme pour la tuyauterie: associer pour le prisme (sauf si item 142 et 146 de Taches.ods)
\r
148 # Mailler le modele de bloc
\r
149 # =========================
\r
151 # Definir 5 groupes de faces
\r
152 # --------------------------
\r
154 groupe_grand_a = doc.addQuadGroup("Grand_A")
\r
155 groupe_grand_b = doc.addQuadGroup("Grand_B")
\r
156 groupe_moyen_f = doc.addQuadGroup("Moyen")
\r
157 groupe_petit_a = doc.addQuadGroup("Petit_A")
\r
158 groupe_petit_b = doc.addQuadGroup("Petit_B")
\r
160 for i in xrange(2):
\r
161 for j in xrange( [hexablock.CV_MAXI_INT, hexablock.CV_MAXI_EXT][i] ):
\r
162 quad = en_te.getQuadIJ(hexablock.CYL_BIG , i, j, 0)
\r
163 groupe_grand_a.addElement(quad)
\r
165 quad = en_te.getQuadIJ(hexablock.CYL_BIG , i, j, hexablock.CYL_BIG_SLICES)
\r
166 groupe_grand_b.addElement(quad)
\r
168 quad = croix.getQuadIJ(hexablock.CYL_BIG , i, j, 0)
\r
169 groupe_moyen_f.addElement(quad)
\r
171 quad = croix.getQuadIJ(hexablock.CYL_SMALL, i, j, 0)
\r
172 groupe_petit_a.addElement(quad)
\r
174 quad = croix.getQuadIJ(hexablock.CYL_SMALL, i, j, hexablock.CYL_SMALL_SLICES)
\r
175 groupe_petit_b.addElement(quad)
\r
177 # Definir 3 groupes de volumes
\r
178 # ----------------------------
\r
180 groupe_grand = doc.addHexaGroup("Grand")
\r
181 groupe_moyen = doc.addHexaGroup("Moyen")
\r
182 groupe_petit = doc.addHexaGroup("Petit")
\r
184 for i in xrange( doc.countUsedHexa() ):
\r
185 h = doc.getUsedHexa(i)
\r
186 groupe_moyen.addElement(h)
\r
188 for i in xrange(2):
\r
189 for j in xrange( [hexablock.CV_MAXI_INT, hexablock.CV_MAXI_EXT][i] ):
\r
190 for k in [ 0, hexablock.CYL_BIG_SLICES-1 ]:
\r
191 h = en_te.getHexaIJK(hexablock.CYL_BIG, i, j, k)
\r
192 groupe_grand.addElement(h)
\r
193 groupe_moyen.removeElement(h)
\r
195 for k in [0, hexablock.CYL_SMALL_SLICES-1 ]:
\r
196 h = croix.getHexaIJK(hexablock.CYL_SMALL, i, j, k)
\r
197 groupe_petit.addElement(h)
\r
198 groupe_moyen.removeElement(h)
\r
200 # Mailler le modele de bloc avec association
\r
201 # ------------------------------------------
\r
203 ########## hexablock.addLaws(doc, 10, True) Ne marche pas
\r
205 law = doc.addLaw("Uniform", 4)
\r
206 for j in range(doc.countPropagation()):
\r
207 propa = doc.getPropagation(j)
\r
210 doc.save("troisCylindres_v5")
\r
211 doc.setName("troisCylindres_v5")
\r
212 hexablock.addToStudy(doc)
\r
214 blocs = hexablock.mesh(doc, dim=3)
\r
216 muv, mue, muq, muh = hexablock.dump(doc, blocs)
\r