Salome HOME
Correction for hydro_test
[modules/hydro.git] / src / HYDROTools / cutMesh.py
1 #!/usr/bin/env python
2
3 import os
4 import sys
5 import salome
6
7 salome.salome_init()
8
9 from HYDROPy import *
10
11 def cutMesh(meshFileIn, polyFile, meshFileOut = "", offsetX=0, offsetY=0):
12     """
13     In a given MED mesh, remove faces and edges contained in a polygon (shapefile). Save the result in a new file.
14     parameters:
15     meshFileIn: full path of input MED file. Coordinates should be without an origin offset of coordinates.
16     polyFile: a shapefile giving a single polygon for cut (should be in the same coordinate system as the mesh, without an origin offset of coordinates.
17     meshFileout: full path of output MED file (default="" : when "", output file is suffixed with "_cut.med"
18     offsetX: local X origin for cut operation and output
19     offsetY: local Y origin for cut operation and output
20     return:
21     meshFileout
22     """
23     hydro_doc = HYDROData_Document.Document()
24
25     # --- coordonnées locales
26
27     hydro_doc.SetLocalCS( offsetX, offsetY )
28
29     # --- polygone decoupe
30
31     a = os.path.splitext(polyFile)
32     polyName = os.path.basename(a[0])
33     poly = HYDROData_PolylineXY.ImportShapesFromFile(polyFile)
34     #poly = hydro_doc.FindObjectByName(polyName + '_PolyXY_0')
35
36     # --- zone immersible
37
38     zoneImmersible = hydro_doc.CreateObject( KIND_IMMERSIBLE_ZONE )
39     zoneImmersible.SetName( "zoneImmersible" )
40     zoneImmersible.SetPolyline( poly[0] )
41     zoneImmersible.Update()
42
43     # --- cas de calcul = une face simple sur le polygone
44
45     casCalcul = hydro_doc.CreateObject( KIND_CALCULATION )
46     casCalcul.SetName( "casCalcul" )
47     casCalcul.SetAssignmentMode( HYDROData_CalculationCase.AUTOMATIC )
48     casCalcul.AddGeometryObject( zoneImmersible )
49     case_geom_group = zoneImmersible.GetGroup( 0 )
50     casCalcul.AddGeometryGroup( case_geom_group )
51     casCalcul.SetBoundaryPolyline( poly[0] )
52     casCalcul.Update()
53
54     # --- export geom
55
56     casCalcul_entry = casCalcul.Export()
57     print("casCalcul_entry", casCalcul_entry)
58
59     import GEOM
60     from salome.geom import geomBuilder
61     geompy = geomBuilder.New()
62
63     geomObj = salome.IDToObject(str(casCalcul_entry))
64
65     # --- decoupe maillage dans SMESH
66
67     import  SMESH, SALOMEDS
68     from salome.smesh import smeshBuilder
69
70     # --- chargement maillage, changement de repère
71
72     smesh = smeshBuilder.New()
73     ([Mesh], status) = smesh.CreateMeshesFromMED(meshFileIn)
74     Mesh.TranslateObject( Mesh, [ -offsetX, -offsetY, 0 ], 0 )
75
76     # --- groupes des faces et des edges contenues dans le polygone de découpe
77
78     aCriteria = []
79     aCriterion = smesh.GetCriterion(SMESH.FACE,SMESH.FT_BelongToGeom,SMESH.FT_Undefined, geomObj)
80     aCriteria.append(aCriterion)
81     aFilter = smesh.GetFilterFromCriteria(aCriteria)
82     aFilter.SetMesh(Mesh.GetMesh())
83     decoupeFaces = Mesh.GroupOnFilter( SMESH.FACE, 'decoupeFaces', aFilter )
84
85     aCriteria = []
86     aCriterion = smesh.GetCriterion(SMESH.EDGE,SMESH.FT_BelongToGeom,SMESH.FT_Undefined, geomObj)
87     aCriteria.append(aCriterion)
88     aFilter = smesh.GetFilterFromCriteria(aCriteria)
89     aFilter.SetMesh(Mesh.GetMesh())
90     decoupeEdges = Mesh.GroupOnFilter( SMESH.EDGE, 'decoupeEdges', aFilter )
91
92     # --- suppression des groupes et de leurs mailles
93
94     Mesh.RemoveGroupWithContents( decoupeFaces )
95     Mesh.RemoveGroupWithContents( decoupeEdges )
96
97     # --- regeneration des edges de bord manquantes
98
99     nbAdded, Mesh, _NoneGroup = Mesh.MakeBoundaryElements( SMESH.BND_1DFROM2D, '', '', 0, [])
100
101     # --- enregistrement MED du maillage découpé
102
103     if meshFileOut == "":
104         a = os.path.splitext(meshFileIn)
105         smesh.SetName(Mesh, os.path.basename(a[0]))
106         meshFileOut = a[0] + '_cut' + a[1]
107
108     Mesh.ExportMED(meshFileOut,auto_groups=0,minor=40,overwrite=1,meshPart=None,autoDimension=1)
109
110     if salome.sg.hasDesktop():
111         salome.sg.updateObjBrowser()
112
113     return meshFileOut