Salome HOME
0020623: EDF 1209 SMESH: Load script/execfile add the objects in the wrong study
[modules/smesh.git] / src / SMESH_SWIG / ex13_hole1partial.py
1 #  -*- coding: iso-8859-1 -*-
2 #  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
3 #
4 #  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
5 #  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 #
7 #  This library is free software; you can redistribute it and/or
8 #  modify it under the terms of the GNU Lesser General Public
9 #  License as published by the Free Software Foundation; either
10 #  version 2.1 of the License.
11 #
12 #  This library is distributed in the hope that it will be useful,
13 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
14 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 #  Lesser General Public License for more details.
16 #
17 #  You should have received a copy of the GNU Lesser General Public
18 #  License along with this library; if not, write to the Free Software
19 #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
20 #
21 #  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 #
23 # ==================================
24 #
25 from geompy import *
26
27 import smesh
28
29 # Geometry
30 # ========
31
32 # With hexahedral, build a box partially holed by a not centered cylinder with a thickness
33
34 # Values
35 # ------
36
37 box_dx = 1000
38 box_dy =  900
39 box_dz =  800
40
41 cyl_x      = 500
42 cyl_y      = 300
43 cyl_dz     = 600
44 cyl_radius = 150
45 cyl_thick  =  30
46
47 # Triangular face
48 # ---------------
49
50 def triangle(p1, p2, p3):
51     l = []
52     l.append(MakeEdge(p1, p2))
53     l.append(MakeEdge(p2, p3))
54     l.append(MakeEdge(p3, p1))
55     w = MakeWire(l)
56     return MakeFace(w, 1)
57
58 # The holed part
59 # ==============
60
61 # Vertex of the holed part
62 # ------------------------
63
64 hole_point_11 = MakeVertex(0     , 0     , 0)
65 hole_point_21 = MakeVertex(box_dx, 0     , 0)
66 hole_point_12 = MakeVertex(0     , box_dy, 0)
67 hole_point_22 = MakeVertex(box_dx, box_dy, 0)
68
69 hole_center   = MakeVertex(cyl_x, cyl_y, 0)
70
71 # Faces of the holed part
72 # -----------------------
73
74 hole_face_1 = triangle(hole_point_11, hole_point_21, hole_center)
75 hole_face_2 = triangle(hole_point_21, hole_point_22, hole_center)
76 hole_face_3 = triangle(hole_point_12, hole_point_22, hole_center)
77 hole_face_4 = triangle(hole_point_11, hole_point_12, hole_center)
78
79 # Solids of the holed part
80 # ------------------------
81
82 cyl_dir = MakeVectorDXDYDZ(0, 0, 1)
83
84 hole_solid_1 = MakePrismVecH(hole_face_1, cyl_dir, cyl_dz)
85 hole_solid_2 = MakePrismVecH(hole_face_2, cyl_dir, cyl_dz)
86 hole_solid_3 = MakePrismVecH(hole_face_3, cyl_dir, cyl_dz)
87 hole_solid_4 = MakePrismVecH(hole_face_4, cyl_dir, cyl_dz)
88
89 hole_internal = MakeCylinder(hole_center, cyl_dir, cyl_radius          , cyl_dz)
90 hole_external = MakeCylinder(hole_center, cyl_dir, cyl_radius+cyl_thick, cyl_dz)
91 hole_median   = MakeCut(hole_external, hole_internal)
92
93 # Boolean operations
94 # ------------------
95
96 blocks = []
97
98 blocks.append(   MakeCut(hole_solid_1, hole_external))
99 blocks.append(MakeCommon(hole_solid_1, hole_median  ))
100
101 blocks.append(   MakeCut(hole_solid_2, hole_external))
102 blocks.append(MakeCommon(hole_solid_2, hole_median  ))
103
104 blocks.append(   MakeCut(hole_solid_3, hole_external))
105 blocks.append(MakeCommon(hole_solid_3, hole_median  ))
106
107 blocks.append(   MakeCut(hole_solid_4, hole_external))
108 blocks.append(MakeCommon(hole_solid_4, hole_median  ))
109
110 # The full part
111 # =============
112
113 # Vertex of the full part
114 # -----------------------
115
116 full_point_11 = MakeVertex(0     , 0     , cyl_dz)
117 full_point_21 = MakeVertex(box_dx, 0     , cyl_dz)
118 full_point_12 = MakeVertex(0     , box_dy, cyl_dz)
119 full_point_22 = MakeVertex(box_dx, box_dy, cyl_dz)
120
121 full_center = MakeVertex(cyl_x, cyl_y, cyl_dz)
122
123 # Faces of the full part
124 # ----------------------
125
126 full_face_1 = triangle(full_point_11, full_point_21, full_center)
127 full_face_2 = triangle(full_point_21, full_point_22, full_center)
128 full_face_3 = triangle(full_point_12, full_point_22, full_center)
129 full_face_4 = triangle(full_point_11, full_point_12, full_center)
130
131 # Solids of the full part
132 # ------------------------
133
134 full_dz = box_dz - cyl_dz
135
136 full_solid_1 = MakePrismVecH(full_face_1, cyl_dir, full_dz)
137 full_solid_2 = MakePrismVecH(full_face_2, cyl_dir, full_dz)
138 full_solid_3 = MakePrismVecH(full_face_3, cyl_dir, full_dz)
139 full_solid_4 = MakePrismVecH(full_face_4, cyl_dir, full_dz)
140
141 full_internal = MakeCylinder(full_center, cyl_dir, cyl_radius          , full_dz)
142 full_external = MakeCylinder(full_center, cyl_dir, cyl_radius+cyl_thick, full_dz)
143 full_median   = MakeCut(full_external, full_internal)
144
145 # Boolean operations
146 # ------------------
147
148 full = []
149
150 full.append(   MakeCut(full_solid_1, full_external))
151 full.append(MakeCommon(full_solid_1, full_median))
152
153 full.append(   MakeCut(full_solid_2, full_external))
154 full.append(MakeCommon(full_solid_2, full_median ))
155
156 full.append(   MakeCut(full_solid_3, full_external))
157 full.append(MakeCommon(full_solid_3, full_median))
158
159 full.append(   MakeCut(full_solid_4, full_external))
160 full.append(MakeCommon(full_solid_4, full_median))
161
162 # Filling the hole
163 # ----------------
164
165 box_d = cyl_radius/3
166
167 x = cyl_x-box_d
168 y = x * cyl_y / cyl_x
169 box_point_11 = MakeVertex(x, y, cyl_dz)
170
171 x = cyl_x+box_d
172 y = (box_dx - x) * cyl_y / (box_dx - cyl_x)
173 box_point_12 = MakeVertex(x, y, cyl_dz)
174
175 x = cyl_x-box_d
176 y = box_dy - x * (box_dy - cyl_y) / cyl_x
177 box_point_21 = MakeVertex(x, y, cyl_dz)
178
179 x = cyl_x+box_d
180 y = box_dy - (box_dx - x) * (box_dy - cyl_y) / (box_dx - cyl_x)
181 box_point_22 = MakeVertex(x, y, cyl_dz)
182
183 box_face = MakeQuad4Vertices(box_point_11, box_point_12, box_point_21, box_point_22)
184
185 box = MakePrismVecH(box_face, cyl_dir, full_dz)
186
187 full.append(box)
188
189 full.append(MakeCut(MakeCommon(full_solid_1, full_internal), box))
190 full.append(MakeCut(MakeCommon(full_solid_2, full_internal), box))
191 full.append(MakeCut(MakeCommon(full_solid_3, full_internal), box))
192 full.append(MakeCut(MakeCommon(full_solid_4, full_internal), box))
193
194 # Cut the cylinder thikness
195 # -------------------------
196
197 full_plan = MakePlane(MakeVertex(0, 0, cyl_dz+cyl_thick), cyl_dir, 5000)
198
199 full_parts = MakePartition(full, [full_plan], [], [], ShapeType["SOLID"])
200
201 # Geometry result
202 # ---------------
203
204 blocks.append(full_parts)
205
206 piece_cpd = MakeCompound(blocks)
207
208 piece_ok = RemoveExtraEdges(piece_cpd)
209
210 piece = MakeGlueFaces(piece_ok, 1.e-3)
211
212 piece_id = addToStudy(piece, "ex13_hole1partial")
213
214 # Meshing
215 # =======
216
217 smesh.SetCurrentStudy(salome.myStudy)
218
219 # Create a mesh
220 # -------------
221
222 hexa = smesh.Mesh(piece, "ex13_hole1partial:hexa")
223
224 algo = hexa.Segment()
225 algo.NumberOfSegments(2)
226
227 hexa.Quadrangle()
228
229 hexa.Hexahedron()
230
231 # Local hypothesis
232 # ----------------
233
234 def local(x, y, z, d):
235     edge = GetEdgeNearPoint(piece, MakeVertex(x, y, z))
236     algo = hexa.Segment(edge)
237     algo.NumberOfSegments(d)
238     algo.Propagation()
239
240 local(0, 0, 100, 40)
241 local(0, 0, 700, 15)
242
243 local(100, 0, 0, 20)
244 local(0, 100, 0, 20)
245
246 local(100, 100, 0, 25)
247
248 d = cyl_radius-3*cyl_thick
249 local(cyl_x+d, cyl_y+d, box_dz, 10)
250
251 # Compute the mesh
252 # ----------------
253
254 hexa.Compute()