Salome HOME
Add full-quadrangles support, available since MeshGems v2.5
[plugins/blsurfplugin.git] / tests / test_periodicity_with_points_2D_precad.py
1 # -*- coding: iso-8859-1 -*-
2
3 import sys
4 import salome
5
6 ###
7 ### GEOM component
8 ###
9
10 import math
11
12 import GEOM
13 from salome.geom import geomBuilder
14 geompy = geomBuilder.New(salome.myStudy)
15
16 O = geompy.MakeVertex(0, 0, 0)
17 OX = geompy.MakeVectorDXDYDZ(1, 0, 0)
18 OY = geompy.MakeVectorDXDYDZ(0, 1, 0)
19 OZ = geompy.MakeVectorDXDYDZ(0, 0, 1)
20 Face_1 = geompy.MakeFaceHW(10, 10, 1)
21 geomObj_1 = geompy.MakeMarker(0, 0, 0, 1, 0, 0, 0, 1, 0)
22 Sketch_1 = geompy.MakeSketcherOnPlane("Sketcher:F -2.5209155082703 -1.4416453838348:TT -1.1105282306671 -2.9872753620148:TT 0.76354801654816 -2.3303825855255:TT 1.9614112377167 -3.0838770866394:TT 3.8354876041412 -1.2677619457245:TT 4.2218952178955 0.644955098629:TT 3.2751967906952 2.5576722621918:TT 0.58966463804245 3.5430111885071:TT -3.7380990982056 3.2338852882385:TT -4.433632850647 0.85747921466827:WW", Face_1 )
23 vertices = geompy.ExtractShapes(Sketch_1, geompy.ShapeType["VERTEX"], True)
24 Curve_1 = geompy.MakeInterpol(vertices, True, True)
25
26 part = geompy.MakePartition([Face_1], [Curve_1], Limit=geompy.ShapeType["FACE"])
27 geompy.addToStudy(part, "part")
28
29 Vx = geompy.MakeVectorDXDYDZ(1, 0, 0)
30 Vy = geompy.MakeVectorDXDYDZ(0, 1, 0)
31 Vz = geompy.MakeVectorDXDYDZ(0, 0, 1)
32
33 p1 = geompy.MakeVertex(-5, -5, 0)
34 p2 = geompy.MakeVertex(5, 5, 0)
35 left_edges = geompy.GetShapesOnPlaneWithLocation(part, geompy.ShapeType["EDGE"], Vx, p1, GEOM.ST_ON)
36 left = geompy.CreateGroup(part, geompy.ShapeType["EDGE"])
37 geompy.UnionList(left, left_edges)
38 geompy.addToStudyInFather(part, left, "left")
39
40 right_edges = geompy.GetShapesOnPlaneWithLocation(part, geompy.ShapeType["EDGE"], Vx, p2, GEOM.ST_ON)
41 right = geompy.CreateGroup(part, geompy.ShapeType["EDGE"])
42 geompy.UnionList(right, right_edges)
43 geompy.addToStudyInFather(part, right, "right")
44
45 bottom_edges = geompy.GetShapesOnPlaneWithLocation(part, geompy.ShapeType["EDGE"], Vy, p1, GEOM.ST_ON)
46 bottom = geompy.CreateGroup(part, geompy.ShapeType["EDGE"])
47 geompy.UnionList(bottom, bottom_edges)
48 geompy.addToStudyInFather(part, bottom, "bottom")
49
50 top_edges = geompy.GetShapesOnPlaneWithLocation(part, geompy.ShapeType["EDGE"], Vy, p2, GEOM.ST_ON)
51 top = geompy.CreateGroup(part, geompy.ShapeType["EDGE"])
52 geompy.UnionList(top, top_edges)
53 geompy.addToStudyInFather(part, top, "top")
54
55 source_face = geompy.GetFaceNearPoint(part, p1)
56 geompy.addToStudyInFather(part, source_face, "source_face")
57
58 p_bas_gauche = geompy.MakeVertex(-5, -5, 0)
59 geompy.addToStudy(p_bas_gauche, "p_bas_gauche")
60 p_bas_mil = geompy.MakeVertex(0, -4, 0)
61 geompy.addToStudy(p_bas_mil, "p_bas_mil")
62 p_bas_droite = geompy.MakeVertex(5, -5, 0)
63 geompy.addToStudy(p_bas_droite, "p_bas_droite")
64 p_haut_gauche = geompy.MakeVertex(-5, 5, 0)
65 geompy.addToStudy(p_haut_gauche, "p_haut_gauche")
66 p_haut_mil = geompy.MakeVertex(0, 6, 0)
67 geompy.addToStudy(p_haut_mil, "p_haut_mil")
68 p_haut_droite = geompy.MakeVertex(5, 5, 0)
69 geompy.addToStudy(p_haut_droite, "p_haut_droite")
70
71 # Mesh
72 # ====
73
74 import SMESH
75 from salome.smesh import smeshBuilder
76 smesh = smeshBuilder.New(salome.myStudy)
77
78 Mesh = smesh.Mesh(part, "Mesh")
79
80 algo2d = Mesh.Triangle(algo=smeshBuilder.MG_CADSurf)
81 algo2d.SetGeometricMesh( 1 )
82 algo2d.SetAngleMesh( 4 )
83 algo2d.SetPhySize( 8 )
84 #algo2d.SetGradation(1.05)
85
86 # Periodicity
87 #algo2d.SetVerbosity(10)
88 algo2d.SetPreCADOptionValue("periodic_tolerance", "1e-2")
89 algo2d.AddPreCadEdgesPeriodicity(bottom, top, [p_bas_gauche, p_bas_mil, p_bas_droite], [p_haut_gauche, p_haut_mil, p_haut_droite])
90
91 # debug
92 #algo2d.SetOptionValue( 'debug', '1' )
93 #algo2d.SetPreCADOptionValue( 'debug', '1' )
94
95 Mesh.Compute()
96
97 gr_left = Mesh.Group(left)
98 gr_right = Mesh.Group(right)
99 gr_bottom = Mesh.Group(bottom)
100 gr_top = Mesh.Group(top)
101
102 Mesh.Compute()
103
104 left_translated = Mesh.TranslateObjectMakeMesh( gr_left, SMESH.DirStruct( SMESH.PointStruct ( 10, 0, 0 )), 0, 'left_translated' )
105 bottom_translated = Mesh.TranslateObjectMakeMesh( gr_bottom, SMESH.DirStruct( SMESH.PointStruct ( 0, 10, 0 )), 0, 'bottom_translated' )
106
107 def checkProjection(gr, mesh_translated, tol=1e-7):
108     name = gr.GetName() + "_" + mesh_translated.GetName().split("_")[0]
109     mesh_source = smesh.CopyMesh(gr, gr.GetName())
110     mesh_check = smesh.Concatenate([mesh_source.GetMesh(), mesh_translated.GetMesh()], 0, name=name)
111     ll_coincident_nodes = mesh_check.FindCoincidentNodes(tol)
112     coincident_nodes = [item for sublist in ll_coincident_nodes for item in sublist]
113     mesh_check.MakeGroupByIds("coincident_nodes", SMESH.NODE, coincident_nodes)
114     mesh_nodes = mesh_check.GetNodesId()
115     if len(ll_coincident_nodes) != mesh_translated.NbNodes():
116         non_coincident_nodes = list(set(mesh_nodes) - set(coincident_nodes))
117         mesh_check.MakeGroupByIds("non_coincident_nodes", SMESH.NODE, non_coincident_nodes)
118         raise Exception("Projection failed for %s"%name)
119         
120 checkProjection(gr_top, bottom_translated)
121
122 if salome.sg.hasDesktop():
123   salome.sg.updateObjBrowser(True)
124   
125