Salome HOME
8a10ddade8bc981ed02fc16a7b42731815b094e3
[plugins/blsurfplugin.git] / tests / test_periodicity_precad.py
1 # -*- coding: utf-8 -*-
2
3 import salome
4 import math
5
6 import GEOM
7 from salome.geom import geomBuilder
8 geompy = geomBuilder.New(salome.myStudy)
9
10 simple = False
11
12 r = 10
13 dist = 10
14
15 p1 = geompy.MakeVertex(0., 0., 0.)
16 p2 = geompy.MakeVertex(100., 100., 100.)
17 box = geompy.MakeBoxTwoPnt(p1, p2)
18 geompy.addToStudy(box, "box")
19
20 p3 = geompy.MakeVertex(25., 5., 25.)
21 sphere1 = geompy.MakeSpherePntR(p3, 15.)
22 geompy.addToStudy(sphere1, "sphere1")
23
24 sphere1_trans = geompy.MakeTranslation(sphere1, 0, 100, 0)
25 geompy.addToStudy(sphere1_trans, "sphere1_trans")
26
27 sphere1_trans = geompy.MakeTranslation(sphere1, 0, 100, 0)
28 geompy.addToStudy(sphere1_trans, "sphere1_trans")
29
30 p4 = geompy.MakeVertex(5, 50, 90)
31 sphere2 = geompy.MakeSpherePntR(p4, 20.)
32
33 sphere2_trans = geompy.MakeTranslation(sphere2, 100, 0, 0)
34 geompy.addToStudy(sphere2_trans, "sphere2_trans")
35
36 sphere2_trans2 = geompy.MakeTranslation(sphere2, 0, 0, -100)
37 geompy.addToStudy(sphere2_trans2, "sphere2_trans2")
38
39 sphere2_trans3 = geompy.MakeTranslation(sphere2, 100, 0, -100)
40 geompy.addToStudy(sphere2_trans3, "sphere2_trans3")
41
42 if simple:
43     part = box
44 else:
45     part = geompy.MakePartition([box], [sphere1, sphere1_trans, sphere2, sphere2_trans, sphere2_trans2, sphere2_trans3])
46 geompy.addToStudy(part, "part")
47
48 Vx = geompy.MakeVectorDXDYDZ(1, 0, 0)
49 Vy = geompy.MakeVectorDXDYDZ(0, 1, 0)
50 Vz = geompy.MakeVectorDXDYDZ(0, 0, 1)
51
52 left_faces = geompy.GetShapesOnPlane(part, geompy.ShapeType["FACE"], Vy, GEOM.ST_ON)
53 left = geompy.CreateGroup(part, geompy.ShapeType["FACE"])
54 geompy.UnionList(left, left_faces)
55 geompy.addToStudyInFather(part, left, "left")
56
57 right_faces = geompy.GetShapesOnPlaneWithLocation(part, geompy.ShapeType["FACE"], Vy, p2, GEOM.ST_ON)
58 right = geompy.CreateGroup(part, geompy.ShapeType["FACE"])
59 geompy.UnionList(right, right_faces)
60 geompy.addToStudyInFather(part, right, "right")
61
62 back_faces = geompy.GetShapesOnPlane(part, geompy.ShapeType["FACE"], Vx, GEOM.ST_ON)
63 back = geompy.CreateGroup(part, geompy.ShapeType["FACE"])
64 geompy.UnionList(back, back_faces)
65 geompy.addToStudyInFather(part, back, "back")
66
67 front_faces = geompy.GetShapesOnPlaneWithLocation(part, geompy.ShapeType["FACE"], Vx, p2, GEOM.ST_ON)
68 front = geompy.CreateGroup(part, geompy.ShapeType["FACE"])
69 geompy.UnionList(front, front_faces)
70 geompy.addToStudyInFather(part, front, "front")
71
72 bottom_faces = geompy.GetShapesOnPlane(part, geompy.ShapeType["FACE"], Vz, GEOM.ST_ON)
73 bottom = geompy.CreateGroup(part, geompy.ShapeType["FACE"])
74 geompy.UnionList(bottom, bottom_faces)
75 geompy.addToStudyInFather(part, bottom, "bottom")
76
77 top_faces = geompy.GetShapesOnPlaneWithLocation(part, geompy.ShapeType["FACE"], Vz, p2, GEOM.ST_ON)
78 top = geompy.CreateGroup(part, geompy.ShapeType["FACE"])
79 geompy.UnionList(top, top_faces)
80 geompy.addToStudyInFather(part, top, "top")
81
82 sources = geompy.CreateGroup(part, geompy.ShapeType["FACE"])
83 geompy.UnionList(sources, left_faces)
84 geompy.UnionList(sources, back_faces)
85 geompy.UnionList(sources, top_faces)
86 geompy.addToStudyInFather(part, sources, "sources")
87
88 # Mesh
89 # ====
90
91 import SMESH
92 from salome.smesh import smeshBuilder
93 smesh = smeshBuilder.New(salome.myStudy)
94
95 Mesh = smesh.Mesh(part, "Mesh")
96
97 algo2d = Mesh.Triangle(algo=smeshBuilder.BLSURF)
98 algo2d.SetGeometricMesh( 1 )
99 algo2d.SetAngleMesh( 4 )
100 algo2d.SetPhySize( 8 )
101 algo2d.SetVerbosity(1)
102
103 # Periodicity
104 #algo2d.SetPreCADOptionValue("periodic_tolerance", "1e-2")
105 algo2d.AddPreCadFacesPeriodicity(left, right)
106 algo2d.AddPreCadFacesPeriodicity(front, back)
107 algo2d.AddPreCadFacesPeriodicity(bottom, top)
108
109 gr_left = Mesh.Group(left)
110 gr_right = Mesh.Group(right)
111 gr_front = Mesh.Group(front)
112 gr_back = Mesh.Group(back)
113 gr_bottom = Mesh.Group(bottom)
114 gr_top = Mesh.Group(top)
115
116 Mesh.Compute()
117
118 left_translated = Mesh.TranslateObjectMakeMesh( gr_left, SMESH.DirStruct( SMESH.PointStruct ( 0, 100, 0 )), 0, 'left_translated' )
119 front_translated = Mesh.TranslateObjectMakeMesh( gr_front, SMESH.DirStruct( SMESH.PointStruct ( -100, 0, 0 )), 0, 'front_translated' )
120 bottom_translated = Mesh.TranslateObjectMakeMesh( gr_bottom, SMESH.DirStruct( SMESH.PointStruct ( 0, 0, 100 )), 0, 'bottom_translated' )
121
122 def checkProjection(gr, mesh_translated, tol=1e-7):
123     name = gr.GetName() + "_" + mesh_translated.GetName().split("_")[0]
124     mesh_source = smesh.CopyMesh(gr, gr.GetName())
125     mesh_check = smesh.Concatenate([mesh_source.GetMesh(), mesh_translated.GetMesh()], 0, name=name)
126     ll_coincident_nodes = mesh_check.FindCoincidentNodes(tol)
127     coincident_nodes = [item for sublist in ll_coincident_nodes for item in sublist]
128     mesh_check.MakeGroupByIds("coincident_nodes", SMESH.NODE, coincident_nodes)
129     mesh_nodes = mesh_check.GetNodesId()
130     if len(ll_coincident_nodes) != mesh_translated.NbNodes():
131         non_coincident_nodes = list(set(mesh_nodes) - set(coincident_nodes))
132         mesh_check.MakeGroupByIds("non_coincident_nodes", SMESH.NODE, non_coincident_nodes)
133         raise Exception("Projection failed for %s"%name)
134         
135 checkProjection(gr_right, left_translated)
136 checkProjection(gr_back, front_translated)
137 checkProjection(gr_top, bottom_translated)
138
139 salome.sg.updateObjBrowser(0)
140