Salome HOME
Merge branch 'master' into pra/blocFissure
[modules/smesh.git] / src / Tools / blocFissure / gmu / fusionMaillageAttributionDefaut.py
1 # -*- coding: utf-8 -*-
2 """
3 Created on Tue Jun 24 09:14:13 2014
4
5 @author: I48174 (Olivier HOAREAU)
6 """
7
8 import logging
9 from geomsmesh import geompy
10 from geomsmesh import smesh
11 import GEOM
12 import SMESH
13
14 from listOfExtraFunctions import createNewMeshesFromCorner
15 from listOfExtraFunctions import createLinesFromMesh
16
17 # -----------------------------------------------------------------------------
18 # --- groupe de quadrangles de face transformé en face géométrique par filling
19
20 def fusionMaillageDefaut(maillageSain, maillageDefautCible, maillageInterneCible, zoneDefaut_skin, shapeDefaut, listOfCorners):
21     """ """
22     # TODO: rédiger la docstring
23     
24     logging.info("start")
25     
26     facesNonCoupees = []
27     facesCoupees = []
28     maillagesNonCoupes = []
29     maillagesCoupes = []
30         
31     # On crée une liste contenant le maillage de chaque face.
32     listOfNewMeshes = createNewMeshesFromCorner(maillageDefautCible, listOfCorners)
33     
34     i = 0
35     while i < len(listOfNewMeshes):
36         lines = createLinesFromMesh(listOfNewMeshes[i])
37         setOfLines = []
38         for line in lines:
39             # On possède l'information 'ID' de chaque noeud composant chaque
40             # ligne de la face. A partir de l'ID, on crée un vertex. Un
41             # ensemble de vertices constitue une ligne. Un ensemble de lignes
42             # constitue la face.
43             tmpCoords = [maillageDefautCible.GetNodeXYZ(node) for node in line]
44             tmpPoints = [geompy.MakeVertex(val[0], val[1], val[2]) for val in tmpCoords]
45             line = geompy.MakeInterpol(tmpPoints, False, False)
46             setOfLines.append(line)
47         
48         # A partir des lignes de la face,
49         # on recrée un objet GEOM temporaire par filling.
50         filling = geompy.MakeFilling(geompy.MakeCompound(setOfLines), 2, 5, 0.0001, 0.0001, 0, GEOM.FOM_Default, True)
51         #logging.debug("face de filling")
52         #geompy.addToStudy(filling, 'filling_{0}'.format(i + 1))
53         
54         tmpPartition = geompy.MakePartition([filling], [shapeDefaut], [], [], geompy.ShapeType["FACE"], 0, [], 0)
55         tmpExplodeRef = geompy.ExtractShapes(filling, geompy.ShapeType["EDGE"], True)
56         tmpExplodeNum = geompy.ExtractShapes(tmpPartition, geompy.ShapeType["EDGE"], True)
57         if len(tmpExplodeRef) == len(tmpExplodeNum):
58             logging.debug("face de filling non coupee")
59             geompy.addToStudy(filling, "faceNonCoupee_{0}".format(i + 1))
60             facesNonCoupees.append(filling)
61             maillagesNonCoupes.append(listOfNewMeshes[i])
62         else:
63             logging.debug("face de filling coupee")
64             geompy.addToStudy(filling, "faceCoupee_{0}".format(i + 1))
65             facesCoupees.append(filling)
66             maillagesCoupes.append(listOfNewMeshes[i])
67         
68         i += 1
69     
70     listOfInternMeshes = [maillageInterneCible] + [msh.GetMesh() for msh in maillagesNonCoupes]
71     
72     newMaillageInterne = smesh.Concatenate(listOfInternMeshes, 1, 1, 1e-05, False)
73     
74     facesEnTrop = []
75     
76     criteres = [smesh.GetCriterion(SMESH.FACE, SMESH.FT_BelongToGenSurface, SMESH.FT_Undefined, face) for face in facesNonCoupees]
77     filtres = [smesh.GetFilterFromCriteria([critere]) for critere in criteres]
78     for i, filtre in enumerate(filtres):
79         filtre.SetMesh(maillageSain.GetMesh())
80         faceEnTrop = maillageSain.GroupOnFilter(SMESH.FACE, 'faceEnTrop_{0}'.format(i + 1), filtre)
81         facesEnTrop.append(faceEnTrop)
82     
83     newZoneDefaut_skin = maillageSain.GetMesh().CutListOfGroups([zoneDefaut_skin], facesEnTrop, 'newZoneDefaut_skin')
84     
85     smesh.SetName(newMaillageInterne, 'newInternalBoundary')
86         
87     return newZoneDefaut_skin, newMaillageInterne
88