Salome HOME
3d611e7ea7e8027015c5d26976a2d217fc2cb13d
[modules/hydro.git] / doc / salome / examples / h030_editNonHydroMesh.py
1 # -*- coding: utf-8 -*-
2
3 import os
4 HYDRO_SAMPLES = os.path.join( os.environ["HYDRO_ROOT_DIR"], "bin/salome/test/HYDRO")
5 HYDRO_TEST_RESOURCES = "/home/paul/testsHydro" #os.environ("HYDRO_TEST_RESOURCES")
6
7 import tempfile
8 tmpdir = tempfile.mkdtemp()
9 print("tmpdir=",tmpdir)
10
11 # --- generated resources
12
13 origFileMesh = os.path.join(HYDRO_TEST_RESOURCES, 'garonne_2.med')
14
15 # ----------------------------------------------------------------------------------
16 # --- domain extension
17
18 import sys
19 import salome
20
21 salome.salome_init()
22
23 from salome.hydrotools.shapesGroups import freeBordersGroup, exploreEdgeGroups, fitShapePointsToMesh
24
25 offsetX = 430000.
26 offsetY = 6350000.
27
28 from salome.hydrotools.changeCoords import changeCoords
29
30 origFileMeshTrans = os.path.join(tmpdir, 'garonne_2_trs.med')
31 changeCoords(origFileMesh, origFileMeshTrans, 2154, 2154, offsetX, offsetY, 0, 0)
32
33 from salome.hydrotools.cutMesh import cutMesh
34
35 cutFileMesh = os.path.join(tmpdir, 'garonne_2_cut.med')
36 meshFile = cutMesh(origFileMeshTrans,
37                    os.path.join(HYDRO_SAMPLES, 'zoneNouvelleDigue.shp'),
38                    cutFileMesh, offsetX, offsetY)
39
40 ficMeshOut = os.path.join(tmpdir, "garonne_2_cut_brd.med")
41 fileMeshBrd = freeBordersGroup(cutFileMesh, ficMeshOut)
42 exploreEdgeGroups(fileMeshBrd, "", offsetX, offsetY)
43
44 #----------------------
45 # --- HYDRO
46 #----------------------
47
48 from HYDROPy import *
49 from PyQt5.QtCore import *
50 from PyQt5.QtGui import *
51
52 from salome.hydrotools.hydroGeoMeshUtils import importPolylines, importBathymetry, createImmersibleZone, mergePolylines, getChildrenInStudy
53
54 hydro_doc = HYDROData_Document.Document()
55 hydro_doc.SetLocalCS( offsetX, offsetY )
56
57 limites_original = importPolylines(hydro_doc, os.path.join(tmpdir, "garonne_2_cut_brd_FreeBorders.shp"), 'garonne_2_cut_brd_FreeBorders', False, 4)
58 [nouvelle_digue] = importPolylines(hydro_doc, os.path.join(HYDRO_SAMPLES, "nouvelleDigue.shp"), 'nouvelleDigue_PolyXY', True, 4)
59
60 Cloud_02 = importBathymetry(hydro_doc, "Cloud_02", HYDRO_SAMPLES)
61
62 domaine_nouveau = createImmersibleZone(hydro_doc, "domaine_nouveau", limites_original[2], Cloud_02, True, 0)
63
64 Profile_1 = hydro_doc.CreateObject( KIND_PROFILE )
65 Profile_1.SetName( "Profile_1" )
66 profile_points = [ gp_XY( -30, -10 ),
67                    gp_XY( -15, 5 ),
68                    gp_XY( 0, 6 ),
69                    gp_XY( 15, 5 ),
70                    gp_XY( 30, -10 ) ];
71 Profile_1.SetParametricPoints( profile_points )
72 Profile_1.Update()
73
74 Polyline3D_1_Profile_1 = hydro_doc.CreateObject( KIND_PROFILE )
75 Polyline3D_1_Profile_1.SetName( "Polyline3D_1_Profile_1" )
76 profile_points = [ gp_XY( 0, 19.63 ),
77                    gp_XY( 495.678, 20.18 ),
78                    gp_XY( 1116.92, 20.39 ),
79                    gp_XY( 1635.79, 19.66 ),
80                    gp_XY( 2040.12, 20.1 ),
81                    gp_XY( 2719.6, 20.76 ),
82                    gp_XY( 3184.38, 21.1 ),
83                    gp_XY( 4149.72, 21.47 ),
84                    gp_XY( 4546.55, 26.79 ) ];
85 Polyline3D_1_Profile_1.SetParametricPoints( profile_points )
86 Polyline3D_1_Profile_1.Update()
87
88 Polyline3D_1 = hydro_doc.CreateObject( KIND_POLYLINE )
89 Polyline3D_1.SetName( "Polyline3D_1" )
90 Polyline3D_1.SetPolylineXY( nouvelle_digue )
91 Polyline3D_1.SetChildProfileUZ( Polyline3D_1_Profile_1.GetProfileUZ() )
92 Polyline3D_1.SetAltitudeObject( Cloud_02 )
93 Polyline3D_1.Update()
94
95 Digue_1 = hydro_doc.CreateObject( KIND_DIGUE )
96 Digue_1.SetName( "Digue_1" )
97 Digue_1.SetZLevel( 5 )
98 Digue_1.SetGuideLine( Polyline3D_1 )
99 Digue_1.SetProfileMode( True )
100 Digue_1.SetProfile( Profile_1 )
101 Digue_1.SetEquiDistance( 30 )
102 Digue_1.Update()
103
104 # Calculation case
105 domaineNouveau = hydro_doc.CreateObject( KIND_CALCULATION )
106 domaineNouveau.SetName( "domaineNouveau" )
107
108 domaineNouveau.SetAssignmentMode( HYDROData_CalculationCase.MANUAL )
109 domaineNouveau.AddGeometryObject( Digue_1 )
110 domaineNouveau.AddGeometryObject( domaine_nouveau )
111
112 case_geom_group = Digue_1.GetGroup( 2 )
113 domaineNouveau.AddGeometryGroup( case_geom_group )
114 case_geom_group = Digue_1.GetGroup( 0 )
115 domaineNouveau.AddGeometryGroup( case_geom_group )
116 case_geom_group = Digue_1.GetGroup( 3 )
117 domaineNouveau.AddGeometryGroup( case_geom_group )
118 case_geom_group = Digue_1.GetGroup( 1 )
119 domaineNouveau.AddGeometryGroup( case_geom_group )
120 case_geom_group = domaine_nouveau.GetGroup( 0 )
121 domaineNouveau.AddGeometryGroup( case_geom_group )
122
123 domaineNouveau.SetBoundaryPolyline( limites_original[2] )
124
125 # Start the algorithm of the partition and assignment
126 domaineNouveau.Update()
127 domaineNouveau_Reg_1 = hydro_doc.FindObjectByName( "domaineNouveau_Reg_1" )
128 domaineNouveau_Zone_1 = hydro_doc.FindObjectByName( "domaineNouveau_Zone_1" )
129 domaineNouveau_Zone_1.SetMergeType( HYDROData_Zone.Merge_ZMAX )
130 domaineNouveau_Zone_1.SetColor( QColor( 28, 168, 228 ))
131 domaineNouveau_Reg_1.AddZone( domaineNouveau_Zone_1 )
132 domaineNouveau_Reg_2 = hydro_doc.FindObjectByName( "domaineNouveau_Reg_2" )
133 domaineNouveau_Zone_2 = hydro_doc.FindObjectByName( "domaineNouveau_Zone_2" )
134 domaineNouveau_Zone_2.SetColor( QColor( 28, 51, 228 ))
135 domaineNouveau_Reg_2.AddZone( domaineNouveau_Zone_2 )
136 domaineNouveau_Reg_1.SetName( "domaineNouveau_Reg_1" )
137 domaineNouveau_Reg_2.SetName( "domaineNouveau_Reg_2" )
138
139 # Export of the calculation case
140 domaineNouveau_entry = domaineNouveau.Export()
141
142 ##----------------------
143 ## --- Geometry
144 ##----------------------
145
146 import GEOM
147 from salome.geom import geomBuilder
148 import math
149 import SALOMEDS
150
151 from salome.hydrotools.hydroGeoMeshUtils import getChildrenInStudy
152
153 geompy = geomBuilder.New()
154
155 print ("Entry:", domaineNouveau_entry)
156 HYDRO_domaineNouveau = salome.IDToObject( str( domaineNouveau_entry ) )
157 print ("Geom shape:", HYDRO_domaineNouveau)
158 print ("Geom shape name:", HYDRO_domaineNouveau.GetName())
159
160 #[reg_new] = geompy.SubShapeAll(HYDRO_domaineNouveau, geompy.ShapeType["FACE"])
161 children = getChildrenInStudy(HYDRO_domaineNouveau)
162 sub_digue = children['domaineNouveau_Reg_1']
163 sub_Reg_2 = children['domaineNouveau_Reg_2']
164 sub_Digue_1_Left_Bank = children['domaineNouveau_Digue_1_Left_Bank']
165 sub_Digue_1_Outlet = children['domaineNouveau_Digue_1_Outlet']
166 sub_Digue_1_Right_Bank = children['domaineNouveau_Digue_1_Right_Bank']
167 sub_domaine_nouveau_Outer = children['domaineNouveau_domaine_nouveau_Outer']
168 sub_Digue_1_Inlet = children['domaineNouveau_Digue_1_Inlet']
169
170 if salome.sg.hasDesktop():
171   salome.sg.updateObjBrowser()
172
173 #----------------------
174 #--- Meshing
175 #----------------------
176
177 import  SMESH, SALOMEDS
178 from salome.smesh import smeshBuilder
179 from salome.hydrotools.controls import controlMeshStats, controlSubMeshStats
180
181 smesh = smeshBuilder.New()
182
183 #--- algorithms and hypothesis
184 domaineRemaille = smesh.Mesh(HYDRO_domaineNouveau)
185
186 NETGEN_2D = domaineRemaille.Triangle(algo=smeshBuilder.NETGEN_1D2D)
187 NETGEN_2D_Parameters = NETGEN_2D.Parameters()
188 NETGEN_2D_Parameters.SetMaxSize( 200 )
189 NETGEN_2D_Parameters.SetSecondOrder( 0 )
190 NETGEN_2D_Parameters.SetOptimize( 1 )
191 NETGEN_2D_Parameters.SetFineness( 4 )
192 NETGEN_2D_Parameters.SetMinSize( 5 )
193 NETGEN_2D_Parameters.SetUseSurfaceCurvature( 1 )
194 NETGEN_2D_Parameters.SetFuseEdges( 1 )
195 NETGEN_2D_Parameters.SetQuadAllowed( 0 )
196
197 Regular_1D = domaineRemaille.Segment(geom=sub_Digue_1_Outlet)
198 Number_of_Segments_1 = Regular_1D.NumberOfSegments(4)
199 Regular_1D_1 = domaineRemaille.Segment(geom=sub_Digue_1_Inlet)
200 status = domaineRemaille.AddHypothesis(Number_of_Segments_1,sub_Digue_1_Inlet)
201
202 Regular_1D_2 = domaineRemaille.Segment(geom=sub_Digue_1_Left_Bank)
203 Local_Length_1 = Regular_1D_2.LocalLength(50,None,1e-07)
204 Regular_1D_3 = domaineRemaille.Segment(geom=sub_Digue_1_Right_Bank)
205 status = domaineRemaille.AddHypothesis(Local_Length_1,sub_Digue_1_Right_Bank)
206 # Regular_1D_4 = domaineRemaille.Segment(geom=sub_digue)
207 # status = domaineRemaille.AddHypothesis(Local_Length_1,sub_digue)
208 QuadFromMedialAxis_1D2D = domaineRemaille.Quadrangle(algo=smeshBuilder.QUAD_MA_PROJ,geom=sub_digue)
209
210 ([origMeshBrd], status) = smesh.CreateMeshesFromMED(fileMeshBrd)
211 FreeBorders = origMeshBrd.GetGroupByName("FreeBorders")
212 Import_1D = domaineRemaille.UseExisting1DElements(geom=sub_domaine_nouveau_Outer)
213 Source_Edges_1 = Import_1D.SourceEdges( FreeBorders ,1,1)
214
215 isDone = domaineRemaille.Compute()
216 isDone = domaineRemaille.SplitQuadObject( domaineRemaille, 1 )
217
218 controlMeshStats(domaineRemaille, 5179, 769, 10144)
219
220 if salome.sg.hasDesktop():
221   salome.sg.updateObjBrowser()