1 # -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2020 CEA/DEN, EDF R&D, OPEN CASCADE
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 # =======================================
22 # Procedure that take a triangulation and split all triangles in 4 others triangles
27 from salome.geom import geomBuilder
28 geompy = geomBuilder.New()
30 import SMESH, SALOMEDS
31 from salome.smesh import smeshBuilder
32 smesh = smeshBuilder.New()
39 tmpDir = os.getenv('SALOME_TMP_DIR', '/tmp')
40 print("Output directory:", tmpDir)
42 # Path for ".med" files
43 path = os.path.join( tmpDir, "ex29_%s_" % os.getenv('USER','unknown'))
45 # Name of the shape and the mesh
48 # Add a node and needed edges
49 # ---------------------------
51 def node(m, f, n1, n2, lnv):
52 x1, y1, z1 = m.GetNodeXYZ(n1)
53 x2, y2, z2 = m.GetNodeXYZ(n2)
59 i = m.AddNode(x, y, z)
61 in1 = m.GetShapeID(n1)
62 in2 = m.GetShapeID(n2)
64 if (in1==f) or (in2==f):
65 m.SetNodeOnFace(i, f, 0, 0)
68 e1 = m.AddEdge([ n1, i ])
69 e2 = m.AddEdge([ i , n2 ])
76 m.SetMeshElementOnShape(e1, e)
77 m.SetMeshElementOnShape(e2, e)
78 m.SetNodeOnEdge(i, e, 0)
82 # Add a triangle and associate to the CAD face
83 # --------------------------------------------
85 def triangle(m, f, n1, n2, n3):
86 i = m.AddFace([ n1, n2, n3 ])
87 m.SetMeshElementOnShape(i, f)
89 # Split all triangles in 4 triangles
90 # ----------------------------------
92 def SplitTrianglesIn4(m):
94 triangles = m.GetElementsByType(SMESH.FACE)
97 m.RemoveElements(m.GetElementsByType(SMESH.EDGE))
99 # Get the list of nodes (ids) associated with the CAD vertices
102 for v in geompy.SubShapeAll(shape, geompy.ShapeType["VERTEX"]):
103 lnv = lnv + m.GetSubMeshNodesId(v, True)
105 # Split every triangle
107 noeud_1, noeud_2, noeud_3 = m.GetElemNodes(t)
109 face = m.GetShapeIDForElem(t)
111 noeud_12 = node(m, face, noeud_1, noeud_2, lnv)
112 noeud_23 = node(m, face, noeud_2, noeud_3, lnv)
113 noeud_13 = node(m, face, noeud_1, noeud_3, lnv)
115 triangle(m, face, noeud_1 , noeud_12, noeud_13)
116 triangle(m, face, noeud_2 , noeud_23, noeud_12)
117 triangle(m, face, noeud_3 , noeud_13, noeud_23)
118 triangle(m, face, noeud_12, noeud_23, noeud_13)
120 # Remove all initial triangles
121 m.RemoveElements(triangles)
123 # Merge all identical nodes
124 m.MergeNodes(m.FindCoincidentNodes(0.0001))
129 x0 = 0.0 ; y0 = 0.0 ; z0 = 0.0
130 x1 = 1.0 ; y1 = 0.0 ; z1 = 0.0
131 x2 = 1.0 ; y2 = 1.0 ; z2 = 0.0
132 x3 = 0.0 ; y3 = 1.0 ; z3 = 0.0
134 P0 = geompy.MakeVertex(x0, y0, z0)
135 P1 = geompy.MakeVertex(x1, y1, z1)
136 P2 = geompy.MakeVertex(x2, y2, z2)
137 P3 = geompy.MakeVertex(x3, y3, z3)
139 square = geompy.MakeQuad4Vertices(P0, P1, P2, P3)
140 geompy.addToStudy(square, name)
142 # Refine edges and create group of mesh
143 # -------------------------------------
145 def refine(m, p1, p2, n, k, name):
148 g = geompy.CreateGroup(s, geompy.ShapeType["EDGE"])
149 e = geompy.GetEdge(s, p1, p2)
150 i = geompy.GetSubShapeID(s, e)
151 geompy.AddObject(g, i)
155 a.NumberOfSegments(n, k)
160 MyMesh = smesh.Mesh(square)
162 refine(MyMesh, P1, P2, 8, 7, "Droite")
163 refine(MyMesh, P3, P0, 9, 10, "Gauche")
164 refine(MyMesh, P0, P1, 7, 9, "Bas" )
165 refine(MyMesh, P2, P3, 12, 14, "Haut" )
167 algo2D = MyMesh.Triangle()
168 algo2D.MaxElementArea(0.07)
172 MyMesh.ExportMED(path+"110_triangles.med", 0)
177 MyMesh.MoveNode( 37, 0.05 , 0.368967 , 0 )
178 MyMesh.MoveNode( 38, 0.34 , 0.0762294, 0 )
179 MyMesh.MoveNode( 40, 0.8 , 0.42 , 0 )
180 MyMesh.MoveNode( 42, 0.702662, 0.74 , 0 )
181 MyMesh.MoveNode( 46, 0.4 , 0.374656 , 0 )
182 MyMesh.MoveNode( 47, 0.13 , 0.63 , 0 )
183 MyMesh.MoveNode( 49, 0.222187, 0.3 , 0 )
184 MyMesh.MoveNode( 54, 0.557791, 0.05 , 0 )
185 MyMesh.MoveNode( 55, 0.7 , 0.2 , 0 )
186 MyMesh.MoveNode( 56, 0.73 , 0.52 , 0 )
187 MyMesh.MoveNode( 58, 0.313071, 0.31 , 0 )
188 MyMesh.MoveNode( 59, 0.8 , 0.56 , 0 )
189 MyMesh.MoveNode( 62, 0.592703, 0.95 , 0 )
190 MyMesh.MoveNode( 63, 0.28 , 0.5 , 0 )
191 MyMesh.MoveNode( 65, 0.49 , 0.93 , 0 )
192 MyMesh.MoveNode( 68, 0.501038, 0.65 , 0 )
193 MyMesh.MoveNode( 69, 0.37 , 0.63 , 0 )
194 MyMesh.MoveNode( 70, 0.597025, 0.52 , 0 )
195 MyMesh.MoveNode( 72, 0.899 , 0.878589 , 0 )
196 MyMesh.MoveNode( 73, 0.92 , 0.85 , 0 )
197 MyMesh.MoveNode( 74, 0.820851, 0.75 , 0 )
200 MyMesh.ExportMED(path+"110_triangles_2.med", 0)
202 # First mesh refining
203 # -------------------
205 SplitTrianglesIn4(MyMesh)
207 NbCells2 = NbCells1*4
208 print(("Mesh with "+str(NbCells2)+" cells computed."))
210 MyMesh.ExportMED(path+str(NbCells2)+"_triangles.med", 0)
212 # Second mesh refining
213 # --------------------
215 SplitTrianglesIn4(MyMesh)
217 NbCells3 = NbCells2*4
218 print(("Mesh with "+str(NbCells3)+" cells computed."))
220 MyMesh.ExportMED(path+str(NbCells3)+"_triangles.med",0)
222 # Third mesh refining
223 # -------------------
225 SplitTrianglesIn4(MyMesh)
227 NbCells4 = NbCells3*4
228 print(("Mesh with "+str(NbCells4)+" cells computed."))
230 MyMesh.ExportMED(path+str(NbCells4)+"_triangles.med", 0)
232 # Update the object browser
233 # -------------------------
235 salome.sg.updateObjBrowser()