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