1 # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
3 # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 # This library is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU Lesser General Public
8 # License as published by the Free Software Foundation; either
9 # version 2.1 of the License.
11 # This library is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 # Lesser General Public License for more details.
16 # You should have received a copy of the GNU Lesser General Public
17 # License along with this library; if not, write to the Free Software
18 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 # GEOM GEOM_SWIG : binding of C++ implementaion with Python
23 # File : GEOM_Spanner.py
24 # Author : Julia DOROVSKIKH
27 # ! Please, if you edit this example file, update also
28 # ! GEOM_SRC/doc/salome/gui/GEOM/input/tui_test_spanner.doc
29 # ! as some sequences of symbols from this example are used during
30 # ! documentation generation to identify certain places of this file
31 ############# MakeSpanner #############
33 def MakeSpanner (geompy, math, isBlocksTest = 0, isMeshTest = 0, smesh = None):
41 BlocksOp = geompy.BlocksOp
43 ### Basic points and directions ###
45 p0 = geompy.MakeVertex(0., 0., 0.)
46 pth = geompy.MakeVertex(0., 0., th)
48 vx = geompy.MakeVectorDXDYDZ(1., 0., 0.)
49 vy = geompy.MakeVectorDXDYDZ(0., 1., 0.)
50 vz = geompy.MakeVectorDXDYDZ(0., 0., 1.)
52 vxy = geompy.MakeVectorDXDYDZ(1., 1., 0.)
56 p_10_0 = geompy.MakeVertex(10., 0., 0.)
57 p_10_25 = geompy.MakeVertex(10., 25., 0.)
58 p_0_35 = geompy.MakeVertex( 0., 35., 0.)
59 p_0_10 = geompy.MakeVertex( 0., 10., 0.)
61 Face11 = geompy.MakeQuad4Vertices(p_10_0, p_10_25, p_0_10, p_0_35);
62 id_face11 = geompy.addToStudy(Face11, "1 Face for Block 1")
64 Face12 = geompy.MakeTranslationTwoPoints(Face11, p0, pth)
65 id_face12 = geompy.addToStudy(Face12, "2 Face for Block 1")
67 Block1 = geompy.MakeHexa2Faces(Face11, Face12)
68 id_block1 = geompy.addToStudy(Block1, "Block 1")
72 p_15_0 = geompy.MakeVertex(15., 0., 0.)
73 p_15_20 = geompy.MakeVertex(15., 20., 0.)
75 Edge21 = geompy.MakeEdge(p_15_0, p_15_20)
76 id_edge21 = geompy.addToStudy(Edge21, "1 Edge for Block 2")
78 Edge22 = geompy.GetEdge(Block1, p_10_0, p_10_25)
79 id_edge22 = geompy.addToStudy(Edge22, "2 Edge for Block 2")
81 Face21 = geompy.MakeQuad2Edges(Edge21, Edge22);
82 id_face21 = geompy.addToStudy(Face21, "1 Face for Block 2")
84 Face22 = geompy.MakeTranslationTwoPoints(Face21, p0, pth)
85 id_face22 = geompy.addToStudy(Face22, "2 Face for Block 2")
87 Block2 = geompy.MakeHexa2Faces(Face21, Face22)
88 id_block2 = geompy.addToStudy(Block2, "Block 2")
92 p_15_10_1 = geompy.MakeVertex(15., 10., 1.)
94 Face31 = geompy.GetFaceNearPoint(Block2, p_15_10_1)
95 id_face31 = geompy.addToStudy(Face31, "1 Face for Block 3")
97 Prism1 = geompy.MakePrismVecH(Face31, vx, 5);
98 id_prism1 = geompy.addToStudy(Prism1, "Prism to be Block 3")
100 nbFaces = geompy.ShapesOp.NumberOfFaces(Prism1)
102 print "Prism 1 is a hexahedral solid"
104 print "Prism 1 is not a hexahedral solid"
106 Prism1_faces = geompy.SubShapeAllSorted(Prism1, geompy.ShapeType["FACE"])
108 for aFace in Prism1_faces:
109 name = geompy.SubShapeName(aFace, Prism1)
110 Id_Face = geompy.addToStudyInFather(Prism1, aFace, name)
113 Block3 = geompy.MakeHexa(Prism1_faces[0], Prism1_faces[1],
114 Prism1_faces[2], Prism1_faces[3],
115 Prism1_faces[4], Prism1_faces[5]);
116 id_block3 = geompy.addToStudy(Block3, "Block 3")
120 Face41 = geompy.GetOppositeFace(Block3, Face31)
121 id_face41 = geompy.addToStudy(Face41, "1 Face for Block 4")
123 p_25_5 = geompy.MakeVertex(25., 5., 0.)
124 p_25_20 = geompy.MakeVertex(25., 20., 0.)
126 Edge41 = geompy.MakeEdge(p_25_5, p_25_20)
127 id_edge41 = geompy.addToStudy(Edge41, "1 Edge for Block 4")
129 p_25_5_2 = geompy.MakeVertex(25., 5., th)
130 p_25_20_2 = geompy.MakeVertex(25., 20., th)
132 Edge42 = geompy.MakeEdge(p_25_5_2, p_25_20_2)
133 id_edge42 = geompy.addToStudy(Edge42, "2 Edge for Block 4")
135 Edge43 = geompy.MakeEdge(p_25_5, p_25_5_2)
136 id_edge43 = geompy.addToStudy(Edge43, "3 Edge for Block 4")
138 Edge44 = geompy.MakeEdge(p_25_20, p_25_20_2)
139 id_edge44 = geompy.addToStudy(Edge44, "4 Edge for Block 4")
141 Face42 = geompy.MakeQuad(Edge41, Edge42, Edge43, Edge44)
142 id_face42 = geompy.addToStudy(Face42, "2 Face for Block 4")
144 Block4 = geompy.MakeHexa2Faces(Face41, Face42)
145 id_block4 = geompy.addToStudy(Block4, "Block 4")
149 p_25_30 = geompy.MakeVertex(25., 30., 0.)
150 p_25_30_1 = geompy.MakeVertex(25., 30., 1)
151 axis_rot = geompy.MakeVector(p_25_30, p_25_30_1)
154 Face52 = geompy.MakeRotation(Face51, axis_rot, math.pi/2.)
155 id_face52 = geompy.addToStudy(Face52, "2 Face for Block 5")
157 Block5 = geompy.MakeHexa2Faces(Face51, Face52)
158 id_block5 = geompy.addToStudy(Block5, "Block 5")
160 ### Compound of blocks 1 - 4 ###
162 Comp1234 = geompy.MakeCompound([Block1, Block2, Block3, Block4])
163 Glue1234 = geompy.MakeGlueFaces(Comp1234, 1e-5)
164 id_glue1234 = geompy.addToStudy(Glue1234, "Glue 1234")
166 plane_mirror = geompy.MakePlane(p_25_30, vxy, 100.)
167 #id_plane_mirror = geompy.addToStudy(plane_mirror, "Plane for mirror")
169 Mirror1 = geompy.MakeMirrorByPlane(Glue1234, plane_mirror)
170 id_mirror1 = geompy.addToStudy(Mirror1, "Mirror 1")
172 ### The second end ###
174 p_18_0 = geompy.MakeVertex(18., 0., 0.)
175 p_20_0 = geompy.MakeVertex(20., 0., 0.)
176 p_40_0 = geompy.MakeVertex(40., 0., 0.)
178 Edge1s = geompy.MakeEdge(p_20_0, p_40_0)
179 id_edge1s = geompy.addToStudy(Edge1s, "1 Edge for Block 1s")
181 Edge2s = geompy.MakeRotation(Edge1s, vz, math.pi/12.)
182 id_edge2s = geompy.addToStudy(Edge2s, "2 Edge for Block 1s")
184 p_18_0_r = geompy.MakeRotation(p_18_0, vz, math.pi/24.)
185 p_20_0_r = geompy.MakeRotation(p_20_0, vz, math.pi/12.)
186 p_40_0_r = geompy.MakeRotation(p_40_0, vz, math.pi/12.)
188 Edge3s = geompy.MakeEdge(p_40_0, p_40_0_r)
189 id_edge3s = geompy.addToStudy(Edge3s, "3 Edge for Block 1s")
191 Edge4s = geompy.MakeArc(p_20_0, p_18_0_r, p_20_0_r)
192 id_edge4s = geompy.addToStudy(Edge4s, "4 Edge for Block 1s")
194 Face1s = geompy.MakeQuad(Edge1s, Edge2s, Edge3s, Edge4s)
195 id_face1s = geompy.addToStudy(Face1s, "1 Face for Block 1s")
197 Block1s = geompy.MakePrismVecH(Face1s, vz, th);
198 id_block1s = geompy.addToStudy(Block1s, "Block 1s")
200 p_30_0_1 = geompy.MakeVertex(30., 0., 1.)
202 Face2s = geompy.GetFaceNearPoint(Block1s, p_30_0_1)
203 id_face2s = geompy.addToStudy(Face2s, "2 Face of Block 1s")
205 f2s_ind = geompy.LocalOp.GetSubShapeIndex(Block1s, Face2s)
207 Block1s_tr1 = geompy.MakeMultiTransformation1D(Block1s, f2s_ind, 0, 24)
208 id_block1s_tr1 = geompy.addToStudy(Block1s_tr1, "Multi-transformed Block 1s")
210 p_60_150_0 = geompy.MakeVertex(60., -150., 0.)
211 Gear = geompy.MakeTranslationTwoPoints(Block1s_tr1, p0, p_60_150_0)
212 id_gear = geompy.addToStudy(Gear, "Gear")
214 ### Link two parts ###
216 ### Linking Block 1 ###
218 p_55_0_1 = geompy.MakeVertex(55., 0., 1.)
219 p_55_110_1 = geompy.MakeVertex(55., -110., 1.)
221 Face11l = geompy.GetFaceNearPoint(Block5, p_55_0_1)
222 id_face11l = geompy.addToStudy(Face11l, "1 Face for Linking Block 1")
224 Face12l = geompy.GetFaceNearPoint(Gear, p_55_110_1)
225 id_face12l = geompy.addToStudy(Face12l, "2 Face for Linking Block 1")
227 Block1l = geompy.MakeHexa2Faces(Face11l, Face12l)
228 id_block1l = geompy.addToStudy(Block1l, "Linking Block 1")
230 ### Linking Block 2 ###
232 p_25_0_1 = geompy.MakeVertex(25., 0., 1.)
233 p_45_110_1 = geompy.MakeVertex(45., -110., 1.)
235 Face21l = geompy.GetFaceNearPoint(Block4, p_25_0_1)
236 id_face21l = geompy.addToStudy(Face21l, "1 Face for Linking Block 2")
238 Face22l = geompy.GetFaceNearPoint(Gear, p_45_110_1)
239 id_face22l = geompy.addToStudy(Face22l, "2 Face for Linking Block 2")
241 Block2l = geompy.MakeHexa2Faces(Face21l, Face22l)
242 id_block2l = geompy.addToStudy(Block2l, "Linking Block 2")
244 ### Linking Block 3 ###
246 p_55_30_1 = geompy.MakeVertex(55., 30., 1.)
247 p_65_110_1 = geompy.MakeVertex(65., -110., 1.)
249 Face31l = geompy.GetFaceNearPoint(Mirror1, p_55_30_1)
250 id_face31l = geompy.addToStudy(Face31l, "1 Face for Linking Block 3")
252 Face32l = geompy.GetFaceNearPoint(Gear, p_65_110_1)
253 id_face32l = geompy.addToStudy(Face32l, "2 Face for Linking Block 3")
255 Block3l = geompy.MakeHexa2Faces(Face31l, Face32l)
256 id_block3l = geompy.addToStudy(Block3l, "Linking Block 3")
260 CompLB = geompy.MakeCompound([Block1l, Block2l, Block3l])
261 Handle = geompy.MakeGlueFaces(CompLB, 1e-5)
262 id_handle = geompy.addToStudy(Handle, "Handle")
264 Block1h = geompy.GetBlockNearPoint(Handle, p_45_110_1)
265 id_block1h = geompy.addToStudyInFather(Handle, Block1h, "Block 1 of Handle")
267 Block2h = geompy.GetBlockNearPoint(Handle, p_65_110_1)
268 id_block2h = geompy.addToStudyInFather(Handle, Block2h, "Block 2 of Handle")
270 Face11h = geompy.GetFaceByNormale(Block1h, vx)
271 id_face11h = geompy.addToStudyInFather(Block1h, Face11h, "Face 1")
273 Face12h = geompy.GetOppositeFace(Block1h, Face11h)
274 id_face12h = geompy.addToStudyInFather(Block1h, Face12h, "Face 2")
276 Face21h = geompy.GetFaceByNormale(Block2h, vx)
277 id_face21h = geompy.addToStudyInFather(Block2h, Face21h, "Face 1")
279 Face22h = geompy.GetOppositeFace(Block2h, Face21h)
280 id_face22h = geompy.addToStudyInFather(Block2h, Face22h, "Face 2")
282 Block3h = BlocksOp.GetBlockByParts(Handle, [Face11h, Face21h])
283 if BlocksOp.IsDone() == 0:
284 Block3h = BlocksOp.GetBlockByParts(Handle, [Face11h, Face22h])
285 if BlocksOp.IsDone() == 0:
286 Block3h = BlocksOp.GetBlockByParts(Handle, [Face12h, Face21h])
287 if BlocksOp.IsDone() == 0:
288 Block3h = BlocksOp.GetBlockByParts(Handle, [Face12h, Face22h])
289 if BlocksOp.IsDone() == 0:
290 print "ERROR: BlocksOp.GetBlockByParts() failed : ", BlocksOp.GetErrorCode()
292 id_block3h = geompy.addToStudyInFather(Handle, Block3h, "Block 3 of Handle")
294 ### The whole shape ###
296 CompALL = geompy.MakeCompound([Glue1234, Block5, Mirror1, Handle, Gear])
297 Spanner = geompy.MakeGlueFaces(CompALL, 1e-5)
298 id_glueALL = geompy.addToStudy(Spanner, "The Spanner")
300 ### Check the Spanner ###
302 isCompOfBlocks6 = BlocksOp.CheckCompoundOfBlocks(Spanner)
303 if isCompOfBlocks6 == 0:
304 print "Spanner is not a compound of hexahedral solids"
306 print "Spanner is a compound of hexahedral solids"
308 if isBlocksTest == 1:
310 print "##################### Test More #####################"
312 ### Get Blocks 4 and 5 from the spanner ###
314 Face42_sp = geompy.GetFaceByEdges(Spanner, Edge41, Edge42)
315 id_face42_sp = geompy.addToStudyInFather(Spanner, Face42_sp, "Face 4_2")
317 Blocks_f4_sp = geompy.GetBlocksByParts(Spanner, [Face42_sp])
321 for aBlock in Blocks_f4_sp:
322 name = geompy.SubShapeName(aBlock, Spanner)
323 Id_block = geompy.addToStudyInFather(Spanner, aBlock, name)
325 f42_sp_ind = geompy.LocalOp.GetSubShapeIndex(aBlock, Face42_sp)
327 Face_5_horiz = geompy.GetFaceByNormale(aBlock, vz)
328 f_5_horiz_ind = geompy.LocalOp.GetSubShapeIndex(aBlock, Face_5_horiz)
333 MRot = geompy.MakeMultiTransformation2D(aBlock, f42_sp_ind, 0, 3, f_5_horiz_ind, 0, 5)
336 if is2Dok and MRot is not None:
338 p_z100 = geompy.MakeVertex(0., 0., 100.)
339 MRot_tr = geompy.MakeTranslationTwoPoints(MRot, p0, p_z100)
340 id_MRot_tr = geompy.addToStudy(MRot_tr, "Multi-rotated block 5")
343 print "2D Multi Transformation failed"
345 ### Get one face of the Gear ###
347 p_20_0_tr = geompy.MakeTranslationTwoPoints(p_20_0 , p0, p_60_150_0)
348 p_20_0_r_tr = geompy.MakeTranslationTwoPoints(p_20_0_r, p0, p_60_150_0)
349 p_40_0_tr = geompy.MakeTranslationTwoPoints(p_40_0 , p0, p_60_150_0)
350 p_40_0_r_tr = geompy.MakeTranslationTwoPoints(p_40_0_r, p0, p_60_150_0)
352 Face_g_1 = geompy.GetFaceByPoints(Gear, p_20_0_tr, p_20_0_r_tr, p_40_0_tr, p_40_0_r_tr)
353 id_face_g_1 = geompy.addToStudyInFather(Gear, Face_g_1, "Face of Gear by four points")
355 edgesNb = geompy.ShapesOp.NumberOfEdges(Face_g_1)
356 print "Face of Gear has ", edgesNb, " edges"
358 Face_g_1_tr = geompy.MakeTranslationTwoPoints(Face_g_1, p0, pth)
359 id_face_g_1_tr = geompy.addToStudyInFather(Gear, Face_g_1_tr, "Face of Gear by four points, translated")
361 ### equivalent of Block1s, but made as block
363 Block_new = geompy.MakeHexa2Faces(Face_g_1, Face_g_1_tr)
364 id_block_new = geompy.addToStudy(Block_new, "Block New")
366 if isMeshTest == 1 and smesh is not None:
368 print "##################### Build Mesh #####################"
371 # ---- add a middle block of spanner handle in study
373 p_45_0_1 = geompy.MakeVertex(45., 0., 1.)
374 BlockMh = geompy.GetBlockNearPoint(Spanner, p_45_0_1)
375 id_blockMh = geompy.addToStudyInFather(Spanner, BlockMh, "Middle Block of Spanner Handle")
377 # ---- add the top face of the middle block in study
379 FaceTop = geompy.GetFaceByNormale(BlockMh, vz)
380 id_facetop = geompy.addToStudyInFather(BlockMh, FaceTop, "Top Face")
382 # ---- add long edges of the top face in study
384 FaceTop_edges = geompy.SubShapeAllSorted(FaceTop, geompy.ShapeType["EDGE"])
385 Edge1 = FaceTop_edges[0]
386 Edge2 = FaceTop_edges[3]
387 Id_Edge1 = geompy.addToStudyInFather(FaceTop, Edge1, "Edge 1")
388 Id_Edge2 = geompy.addToStudyInFather(FaceTop, Edge2, "Edge 2")
390 print "-------------------------- Algorithm and Hypothesis"
392 print "---- Init a Mesh with the Spanner"
394 mesh = smesh.Mesh(Spanner, "Meshed Spanner")
396 print "-------------------------- add hypothesis to Spanner"
398 print "-------------------------- NumberOfSegments"
399 algoReg = mesh.Segment()
400 listHyp = algoReg.GetCompatibleHypothesis()
403 print algoReg.GetName()
404 print algoReg.GetId()
405 algoReg.SetName("Regular_1D")
408 hypNbSeg3 = algoReg.NumberOfSegments(3)
409 print hypNbSeg3.GetName()
410 print hypNbSeg3.GetId()
411 print hypNbSeg3.GetNumberOfSegments()
412 smesh.SetName(hypNbSeg3, "NumberOfSegments_3")
414 print "-------------------------- Quadrangle_2D"
416 algoQuad = mesh.Quadrangle()
417 listHyp = algoQuad.GetCompatibleHypothesis()
420 print algoQuad.GetName()
421 print algoQuad.GetId()
422 algoQuad.SetName("Quadrangle_2D")
424 print "-------------------------- add hypothesis to the Middle Block"
426 print "-------------------------- LocalLength"
427 algoRegMb = mesh.Segment(BlockMh)
428 hypLen1 = algoRegMb.LocalLength(10)
429 print hypLen1.GetName()
430 print hypLen1.GetId()
431 print hypLen1.GetLength()
432 smesh.SetName(hypLen1, "Local_Length_10")
434 print "-------------------------- add hypothesis to the long edges of the Top Face of the Middle Block"
436 algoRegE1 = mesh.Segment(Edge1)
437 hypPropE1 = algoRegE1.Propagation()
438 print hypPropE1.GetName()
439 print hypPropE1.GetId()
440 smesh.SetName(hypPropE1, "Propagation hypothesis")
441 smesh.SetName(algoRegE1.GetSubMesh(), "SubMesh Edge 1 of Top Face")
443 algoRegE2 = mesh.Segment(Edge2)
444 hypPropE2 = algoRegE2.Propagation()
445 print hypPropE2.GetName()
446 print hypPropE2.GetId()
447 smesh.SetName(hypPropE2, "Propagation hypothesis")
448 smesh.SetName(algoRegE2.GetSubMesh(), "SubMesh Edge 2 of Top Face")
450 print "-------------------------- compute the mesh"
453 print "Information about the Mesh:"
454 print "Number of nodes : ", mesh.NbNodes()
455 print "Number of edges : ", mesh.NbEdges()
456 print "Number of faces : ", mesh.NbFaces()
457 print "Number of triangles : ", mesh.NbTriangles()
458 print "Number of quadrangles : ", mesh.NbQuadrangles()
459 print "Number of volumes : ", mesh.NbVolumes()
460 print "Number of tetrahedrons: ", mesh.NbTetras()