Salome HOME
correct previous integration (Porting to Python 2.6)
[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 # Create a mesh
218 # -------------
219
220 hexa = smesh.Mesh(piece, "ex13_hole1partial:hexa")
221
222 algo = hexa.Segment()
223 algo.NumberOfSegments(2)
224
225 hexa.Quadrangle()
226
227 hexa.Hexahedron()
228
229 # Local hypothesis
230 # ----------------
231
232 def local(x, y, z, d):
233     edge = GetEdgeNearPoint(piece, MakeVertex(x, y, z))
234     algo = hexa.Segment(edge)
235     algo.NumberOfSegments(d)
236     algo.Propagation()
237
238 local(0, 0, 100, 40)
239 local(0, 0, 700, 15)
240
241 local(100, 0, 0, 20)
242 local(0, 100, 0, 20)
243
244 local(100, 100, 0, 25)
245
246 d = cyl_radius-3*cyl_thick
247 local(cyl_x+d, cyl_y+d, box_dz, 10)
248
249 # Compute the mesh
250 # ----------------
251
252 hexa.Compute()