1 # -*- coding: latin-1 -*-
2 # Copyright (C) 2009-2016 CEA/DEN, EDF R&D
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.
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.
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
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 # Francis KLOSS : 2012 : CEA-Saclay, DEN, DM2S, SFME, LGLS, F-91191 Gif-sur-Yvette, France
22 # ========================================================================================
26 geompy = hexablock.geompy
28 # Charger la geometrie
29 # ====================
31 nom = "troisCylindres"
33 piece = geompy.ImportBREP(nom+".brep")
35 # Selectionner des sous-parties de la geometrie
36 # ---------------------------------------------
38 sommets = geompy.SubShapeAllSortedCentres(piece, geompy.ShapeType["VERTEX"])
39 aretes = geompy.SubShapeAllSortedCentres(piece, geompy.ShapeType["EDGE" ])
41 moy_b_x, moy_b_y, moy_b_z = geompy.PointCoordinates(sommets[14])
42 moy_p_x, moy_p_y, moy_p_z = geompy.PointCoordinates(sommets[ 6])
43 moy_g_x, moy_g_y, moy_g_z = geompy.PointCoordinates(sommets[ 3])
45 grand0, grand_xb, grand_yb, grand_zb, grand1, grand2, grand3, grand_rayon = geompy.KindOfShape(aretes[ 0])
46 grand4, grand_xh, grand_yh, grand_zh, grand5, grand6, grand7, grand8 = geompy.KindOfShape(aretes[ 1])
48 moyen0, moyen_x , moyen_y , moyen_z , moyen1, moyen2, moyen3, moyen_rayon = geompy.KindOfShape(aretes[20])
50 petit0, petit_xb, petit_yb, petit_zb, petit1, petit2, petit3, petit_rayon = geompy.KindOfShape(aretes[12])
51 petit4, petit_xh, petit_yh, petit_zh, petit5, petit6, petit7, petit8 = geompy.KindOfShape(aretes[13])
53 # Construire le modele de bloc
54 # ============================
56 doc = hexablock.addDocument(nom)
58 ### doc.addShape(piece,nom)
60 # Construire le grand cylindre
61 # ----------------------------
63 grand_base = doc.addVertex(grand_xb, grand_yb, grand_zb)
64 grand_oppo = doc.addVertex(grand_xh, grand_yh, grand_zh)
66 grand_dir = doc.addVectorVertices(grand_base, grand_oppo)
68 grand_hauteur = grand_dir.getNorm()
70 ### grand_cylindre = doc.addCylinder(grand_base, grand_dir, grand_rayon, grand_hauteur)
72 # Construire le moyen cylindre cote grand
73 # ---------------------------------------
78 moy_g_base_x = moy_p_x + (moy_g_x-moy_p_x)*moy_g_r1 + moyen_x - moy_b_x
79 moy_g_base_y = moy_p_y + (moy_g_y-moy_p_y)*moy_g_r1 + moyen_y - moy_b_y
80 moy_g_base_z = moy_p_z + (moy_g_z-moy_p_z)*moy_g_r1 + moyen_z - moy_b_z
82 moy_g_base = doc.addVertex(moy_g_base_x, moy_g_base_y, moy_g_base_z)
83 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 )
85 moy_g_dir = doc.addVectorVertices(moy_g_base, moy_g_oppo)
87 moy_g_hauteur = moy_g_dir.getNorm()
89 ### moy_g_cylindre = doc.addCylinder(moy_g_base, moy_g_dir, moyen_rayon, moy_g_hauteur)
91 # Construire le moyen cylindre cote petit
92 # ---------------------------------------
96 moy_p_base = doc.addVertex(moyen_x, moyen_y, moyen_z)
97 moy_b_base = doc.addVertex(moy_b_x, moy_b_y, moy_b_z)
98 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 )
100 moy_p_dir = doc.addVectorVertices(moy_b_base, moy_p_oppo)
102 moy_p_hauteur = moy_p_dir.getNorm()*1.2
104 ### moy_p_cylindre = doc.addCylinder(moy_p_base, moy_p_dir, moyen_rayon, moy_p_hauteur)
106 # Construire le petit cylindre
107 # ----------------------------
109 petit_base = doc.addVertex(petit_xb, petit_yb, petit_zb)
110 petit_oppo = doc.addVertex(petit_xh, petit_yh, petit_zh)
112 petit_dir = doc.addVectorVertices(petit_base, petit_oppo)
114 petit_hauteur = petit_dir.getNorm()
116 ### petit_cylindre = doc.addCylinder(petit_base, petit_dir, petit_rayon, petit_hauteur)
118 # Construire le T et la X
119 # -----------------------
121 en_te = doc.makeCylinders (grand_base, grand_dir, grand_rayon, grand_hauteur,
122 moy_g_base, moy_g_dir, moyen_rayon, moy_g_hauteur)
126 croix = doc.makeCylinders (moy_p_base, moy_p_dir, moyen_rayon, moy_p_hauteur,
127 petit_base, petit_dir, petit_rayon, petit_hauteur)
131 # Relier le T et la X
132 # -------------------
140 qstart = croix.getQuadIJ (CYL_BIG, 0,0,CYL_KMAX)
141 ## qstart.setColor(5)
142 croix_quads = [qstart]
144 for nj in range (CYL_JMAX) :
145 quad = croix.getQuadIJ (CYL_BIG, 1,nj, CYL_KMAX)
147 croix_quads.append (quad)
149 qdest = en_te.getQuadIJ (CYL_SMALL, 0,0,0)
152 va1 = qstart.getVertex (0)
153 va2 = qstart.getVertex (1)
155 vb1 = qdest.nearestVertex (va1)
156 vb2 = qdest.nearestVertex (va2)
158 prisme = doc.joinQuadsUni (croix_quads, qdest, va1,vb1,va2,vb2, 1)
164 # Mailler le modele de bloc avec association
165 # ------------------------------------------
167 doc.addLaws(10, True)
169 law = doc.addLaw("Uniform", 4)
170 for j in range(doc.countPropagation()):
171 propa = doc.getPropagation(j)
174 doc.save("troisCylindres")
175 doc.setName("troisCylindres")
176 doc.saveVtk("troisCylindres1.vtk")
177 hexablock.addToStudy(doc)
179 blocs = hexablock.mesh(doc, dim=3)
181 muv, mue, muq, muh = hexablock.dump(doc, blocs)