11 def cutMesh(meshFileIn, polyFile, meshFileOut = "", offsetX=0, offsetY=0):
13 In a given MED mesh, remove faces and edges contained in a polygon (shapefile). Save the result in a new file.
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
23 hydro_doc = HYDROData_Document.Document()
25 # --- coordonnées locales
27 hydro_doc.SetLocalCS( offsetX, offsetY )
29 # --- polygone decoupe
31 a = os.path.splitext(polyFile)
32 polyName = os.path.basename(a[0])
33 HYDROData_PolylineXY.ImportShapesFromFile(polyFile)
34 poly = hydro_doc.FindObjectByName(polyName + '_PolyXY_0')
38 zoneImmersible = hydro_doc.CreateObject( KIND_IMMERSIBLE_ZONE )
39 zoneImmersible.SetName( "zoneImmersible" )
40 zoneImmersible.SetPolyline( poly )
41 zoneImmersible.Update()
43 # --- cas de calcul = une face simple sur le polygone
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 )
56 casCalcul_entry = casCalcul.Export()
57 print("casCalcul_entry", casCalcul_entry)
60 from salome.geom import geomBuilder
61 geompy = geomBuilder.New()
63 geomObj = salome.IDToObject(str(casCalcul_entry))
65 # --- decoupe maillage dans SMESH
67 import SMESH, SALOMEDS
68 from salome.smesh import smeshBuilder
70 # --- chargement maillage, changement de repère
72 smesh = smeshBuilder.New()
73 ([Mesh], status) = smesh.CreateMeshesFromMED(meshFileIn)
74 Mesh.TranslateObject( Mesh, [ -offsetX, -offsetY, 0 ], 0 )
76 # --- groupes des faces et des edges contenues dans le polygone de découpe
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 )
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 )
92 # --- suppression des groupes et de leurs mailles
94 Mesh.RemoveGroupWithContents( decoupeFaces )
95 Mesh.RemoveGroupWithContents( decoupeEdges )
97 # --- regeneration des edges de bord manquantes
99 nbAdded, Mesh, _NoneGroup = Mesh.MakeBoundaryElements( SMESH.BND_1DFROM2D, '', '', 0, [])
101 # --- enregistrement MED du maillage découpé
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]
108 Mesh.ExportMED(meshFileOut,auto_groups=0,minor=40,overwrite=1,meshPart=None,autoDimension=1)
110 if salome.sg.hasDesktop():
111 salome.sg.updateObjBrowser()