Salome HOME
generalisation publication conditionnelle
[modules/smesh.git] / src / Tools / blocFissure / gmu / construitFissureGenerale.py
1 # -*- coding: utf-8 -*-
2
3 import logging
4 import salome
5 from geomsmesh import geompy
6 from geomsmesh import geomPublish
7 from geomsmesh import geomPublishInFather
8 import initLog
9 import GEOM
10 from geomsmesh import smesh
11 from salome.smesh import smeshBuilder
12 import SMESH
13 import math
14 import bisect
15
16 # from extractionOrientee import extractionOrientee
17 # from extractionOrienteeMulti import extractionOrienteeMulti
18 # from sortFaces import sortFaces
19 #from sortEdges import sortEdges
20 # from eliminateDoubles import eliminateDoubles
21 # from substractSubShapes import substractSubShapes
22 # from produitMixte import produitMixte
23 # from findWireEndVertices import findWireEndVertices
24 #from findWireIntermediateVertices import findWireIntermediateVertices
25 from orderEdgesFromWire import orderEdgesFromWire
26 # from getSubshapeIds import getSubshapeIds
27 from putName import putName
28 # from distance2 import distance2
29 from enleveDefaut import enleveDefaut
30 from shapeSurFissure import shapeSurFissure
31 from regroupeSainEtDefaut import RegroupeSainEtDefaut
32 from triedreBase import triedreBase
33 # from checkDecoupePartition import checkDecoupePartition
34 # from whichSide import whichSide
35 # from whichSideMulti import whichSideMulti
36 #from whichSideVertex import whichSideVertex
37 #from projettePointSurCourbe import projettePointSurCourbe
38 # from prolongeWire import prolongeWire
39 from restreintFaceFissure import restreintFaceFissure
40 from partitionneFissureParPipe import partitionneFissureParPipe
41 from construitPartitionsPeauFissure import construitPartitionsPeauFissure
42 from compoundFromList import compoundFromList
43 from identifieElementsGeometriquesPeau import identifieElementsGeometriquesPeau
44 from identifieFacesEdgesFissureExterne import identifieFacesEdgesFissureExterne
45 from calculePointsAxiauxPipe import calculePointsAxiauxPipe
46 from elimineExtremitesPipe import elimineExtremitesPipe
47 from construitEdgesRadialesDebouchantes import construitEdgesRadialesDebouchantes
48 from creePointsPipePeau import creePointsPipePeau
49 from ajustePointsEdgePipeFissure import ajustePointsEdgePipeFissure
50 from construitMaillagePipe import construitMaillagePipe
51 from mailleAretesEtJonction import mailleAretesEtJonction
52 from mailleFacesFissure import mailleFacesFissure
53 from mailleFacesPeau import mailleFacesPeau
54
55 # -----------------------------------------------------------------------------
56 # --- procédure complète fissure générale
57
58 def construitFissureGenerale(maillagesSains,
59                              shapesFissure, shapeFissureParams,
60                              maillageFissureParams, elementsDefaut, step=-1):
61   """
62   TODO: a completer
63   """
64   logging.info('start')
65   
66   shapeDefaut       = shapesFissure[0] # faces de fissure, débordant
67   fondFiss          = shapesFissure[4] # groupe d'edges de fond de fissure
68
69   rayonPipe = shapeFissureParams['rayonPipe']
70   if shapeFissureParams.has_key('lenSegPipe'):
71     lenSegPipe = shapeFissureParams['lenSegPipe']
72   else:
73     lenSegPipe = rayonPipe
74
75   nomRep            = maillageFissureParams['nomRep']
76   nomFicSain        = maillageFissureParams['nomFicSain']
77   nomFicFissure     = maillageFissureParams['nomFicFissure']
78
79   nbsegRad          = maillageFissureParams['nbsegRad']      # nombre de couches selon un rayon du pipe
80   nbsegCercle       = maillageFissureParams['nbsegCercle']   # nombre de secteur dans un cercle du pipe
81   areteFaceFissure  = maillageFissureParams['areteFaceFissure']
82
83   pointIn_x = 0.0
84   pointIn_y = 0.0
85   pointIn_z = 0.0
86   isPointInterne = False
87   if shapeFissureParams.has_key('pointIn_x'):
88     pointIn_x = shapeFissureParams['pointIn_x']
89     isPointInterne = True
90   if shapeFissureParams.has_key('pointIn_y'):
91     pointIn_y = shapeFissureParams['pointIn_y']
92     isPointInterne = True
93   if shapeFissureParams.has_key('pointIn_z'):
94     pointIn_z = shapeFissureParams['pointIn_z']
95     isPointInterne = True
96   if isPointInterne:
97     pointInterne = geompy.MakeVertex(pointIn_x, pointIn_y, pointIn_z)
98   else:
99     pointInterne = None
100
101   #fichierMaillageSain = nomRep + '/' + nomFicSain + '.med'
102   fichierMaillageFissure = nomRep + '/' + nomFicFissure + '.med'
103
104   # fillings des faces en peau
105   facesDefaut              = elementsDefaut[0]
106   #centresDefaut            = elementsDefaut[1]
107   #normalsDefaut            = elementsDefaut[2]
108   #extrusionsDefaut         = elementsDefaut[3]
109   dmoyen                   = elementsDefaut[4]
110   bordsPartages            = elementsDefaut[5]
111   #fillconts                = elementsDefaut[6]
112   #idFilToCont              = elementsDefaut[7]
113   maillageSain             = elementsDefaut[8]
114   internalBoundary         = elementsDefaut[9]
115   zoneDefaut               = elementsDefaut[10]
116   zoneDefaut_skin          = elementsDefaut[11]
117   zoneDefaut_internalFaces = elementsDefaut[12]
118   zoneDefaut_internalEdges = elementsDefaut[13]
119   #edgeFondExt              = elementsDefaut[14]
120   centreFondFiss           = elementsDefaut[15]
121   #tgtCentre                = elementsDefaut[16]
122
123   O, OX, OY, OZ = triedreBase()
124
125   # --- restriction de la face de fissure au domaine solide :
126   #     partition face fissure étendue par fillings, on garde la face interne
127   
128   facesPortFissure = restreintFaceFissure(shapeDefaut, facesDefaut, pointInterne)
129  
130   # --- pipe de fond de fissure, prolongé, partition face fissure par pipe
131   #     identification des edges communes pipe et face fissure
132   
133   (fissPipe, edgesPipeFiss, edgesFondFiss, wirePipeFiss, wireFondFiss) = partitionneFissureParPipe(shapesFissure, elementsDefaut, rayonPipe)
134   edgesFondFiss, edgesIdByOrientation = orderEdgesFromWire(wireFondFiss)
135   for i,edge in enumerate(edgesFondFiss):
136     geomPublishInFather(initLog.debug, wireFondFiss, edge, "edgeFondFiss%d"%i)
137   
138   # --- peau et face de fissure
139   #
140   # --- partition peau défaut - face de fissure prolongée - wire de fond de fissure prolongée
141   #     il peut y avoir plusieurs faces externes, dont certaines sont découpées par la fissure
142   #     liste de faces externes : facesDefaut
143   #     liste de partitions face externe - fissure : partitionPeauFissFond (None quand pas d'intersection)
144
145   partitionsPeauFissFond = construitPartitionsPeauFissure(facesDefaut, fissPipe)
146     
147   # --- arêtes vives détectées (dans quadranglesToShapeNoCorner
148   #                             et quadranglesToShapeWithCorner)
149     
150   aretesVivesC = compoundFromList(bordsPartages, "areteVive")
151   aretesVivesCoupees = []  # ensembles des arêtes vives identifiées sur les faces de peau dans l'itération sur partitionsPeauFissFond
152    
153   # --- inventaire des faces de peau coupées par la fissure
154   #     pour chaque face de peau : 0, 1 ou 2 faces débouchante du fond de fissure
155   #                                0, 1 ou plus edges de la face de fissure externe au pipe
156   
157   nbFacesFilling = len(partitionsPeauFissFond)
158   
159   ptEdgeFond = [ []  for i in range(nbFacesFilling)] # pour chaque face [points edge fond de fissure aux débouchés du pipe]
160   fsPipePeau = [ []  for i in range(nbFacesFilling)] # pour chaque face [faces du pipe débouchantes]
161   edRadFPiPo = [ []  for i in range(nbFacesFilling)] # pour chaque face [edge radiale des faces du pipe débouchantes ]
162   fsFissuExt = [ []  for i in range(nbFacesFilling)] # pour chaque face [faces de fissure externes au pipe]
163   edFisExtPe = [ []  for i in range(nbFacesFilling)] # pour chaque face [edge en peau des faces de fissure externes (pas subshape facePeau)]
164   edFisExtPi = [ []  for i in range(nbFacesFilling)] # pour chaque face [edge commun au pipe des faces de fissure externes]
165   facesPeaux = [None for i in range(nbFacesFilling)] # pour chaque face : la face de peau finale a mailler (percée des faces débouchantes)
166   edCircPeau = [ []  for i in range(nbFacesFilling)] # pour chaque face de peau : [subshape edge circulaire aux débouchés du pipe]
167   ptCircPeau = [ []  for i in range(nbFacesFilling)] # pour chaque face de peau : [subshape point sur edge circulaire aux débouchés du pipe]
168   gpedgeBord = [None for i in range(nbFacesFilling)] # pour chaque face de peau : groupe subshape des edges aux bords liés à la partie saine
169   gpedgeVifs = [None for i in range(nbFacesFilling)] # pour chaque face de peau : groupes subshape des edges aux arêtes vives entre fillings
170   edFissPeau = [ []  for i in range(nbFacesFilling)] # pour chaque face de peau : [subshape edge en peau des faces de fissure externes]
171   ptFisExtPi = [ []  for i in range(nbFacesFilling)] # pour chaque face de peau : [point commun edFissPeau edCircPeau]
172   
173   for ifil, partitionPeauFissFond in enumerate(partitionsPeauFissFond):
174     if partitionPeauFissFond is not None:
175       dataPPFF,aretesVivesCoupees = identifieElementsGeometriquesPeau(ifil, partitionPeauFissFond, edgesPipeFiss,
176                                                                       edgesFondFiss, wireFondFiss, aretesVivesC,
177                                                                       facesDefaut, centreFondFiss, rayonPipe,
178                                                                       aretesVivesCoupees)      
179       ptEdgeFond[ifil] = dataPPFF['endsEdgeFond']
180       fsPipePeau[ifil] = dataPPFF['facesPipePeau']
181       edRadFPiPo[ifil] = dataPPFF['edgeRadFacePipePeau']
182       fsFissuExt[ifil] = dataPPFF['facesFissExt']
183       edFisExtPe[ifil] = dataPPFF['edgesFissExtPeau']
184       edFisExtPi[ifil] = dataPPFF['edgesFissExtPipe']
185       facesPeaux[ifil] = dataPPFF['facePeau']
186       edCircPeau[ifil] = dataPPFF['edgesCircPeau']
187       ptCircPeau[ifil] = dataPPFF['verticesCircPeau']
188       gpedgeBord[ifil] = dataPPFF['groupEdgesBordPeau']
189       gpedgeVifs[ifil] = dataPPFF['bordsVifs']
190       edFissPeau[ifil] = dataPPFF['edgesFissurePeau']
191       ptFisExtPi[ifil] = dataPPFF['verticesPipePeau']
192
193   facesPipePeau = []
194   edgeRadFacePipePeau = []
195   for ifil in range(nbFacesFilling):
196     facesPipePeau += fsPipePeau[ifil]
197     edgeRadFacePipePeau += edRadFPiPo[ifil]
198   
199   for i, avc in enumerate(aretesVivesCoupees):
200     name = "areteViveCoupee%d"%i
201     geomPublish(initLog.debug, avc, name)
202   
203   # --- identification des faces et edges de fissure externe pour maillage
204   
205   (faceFissureExterne, edgesPipeFissureExterneC,
206     wirePipeFissureExterne, edgesPeauFissureExterneC) = identifieFacesEdgesFissureExterne(fsFissuExt, edFisExtPe,
207                                                                                           edFisExtPi, edgesPipeFiss)
208
209   # --- preparation maillage du pipe :
210   #     - détections des points a respecter : jonction des edges/faces constituant la face de fissure externe au pipe
211   #     - points sur les edges de fond de fissure et edges pipe/face fissure,
212   #     - vecteurs tangents au fond de fissure (normal au disque maillé)
213   
214   (centres, gptsdisks, raydisks) = calculePointsAxiauxPipe(edgesFondFiss, edgesIdByOrientation, facesDefaut, 
215                                                            centreFondFiss, wireFondFiss, wirePipeFiss,
216                                                            lenSegPipe, rayonPipe, nbsegCercle, nbsegRad)
217    
218   # --- recherche des points en trop (externes au volume à remailler)
219   #     - on associe chaque extrémité du pipe à une face filling 
220   #     - on part des disques aux extrémités du pipe
221   #     - pour chaque disque, on prend les vertices de géométrie,
222   #       on marque leur position relative à la face.
223   #     - on s'arrete quand tous les noeuds sont dedans
224   
225   (idFillingFromBout, idisklim, idiskout) = elimineExtremitesPipe(ptEdgeFond, facesDefaut, centres, gptsdisks, nbsegCercle)
226
227   # --- construction des listes d'edges radiales sur chaque extrémité débouchante
228   
229   (listEdges, idFacesDebouchantes) = construitEdgesRadialesDebouchantes(idisklim, idiskout, gptsdisks, raydisks,
230                                                                         facesPipePeau, edgeRadFacePipePeau, nbsegCercle)
231     
232   # --- création des points du maillage du pipe sur la face de peau
233   
234   (gptsdisks, idisklim) = creePointsPipePeau(listEdges, idFacesDebouchantes, idFillingFromBout,
235                                              ptEdgeFond, ptFisExtPi, edCircPeau, gptsdisks, idisklim, nbsegRad)
236   
237   # --- ajustement precis des points sur edgesPipeFissureExterneC
238   
239   gptsdisks = ajustePointsEdgePipeFissure(edgesPipeFissureExterneC, wirePipeFissureExterne, gptsdisks, idisklim)
240     
241    # --- maillage effectif du pipe
242
243   (meshPipe, meshPipeGroups, edgesCircPipeGroup) = construitMaillagePipe(gptsdisks, idisklim, nbsegCercle, nbsegRad)
244   
245   # --- edges de bord, faces défaut à respecter
246   
247   (internalBoundary, bordsLibres, grpAretesVives) = mailleAretesEtJonction(internalBoundary, aretesVivesCoupees, dmoyen)
248
249   # --- maillage faces de fissure
250   
251   (meshFaceFiss, grpFaceFissureExterne, 
252    grpEdgesPeauFissureExterne, grpEdgesPipeFissureExterne) = mailleFacesFissure(faceFissureExterne, edgesPipeFissureExterneC, edgesPeauFissureExterneC,
253                                                                                 meshPipeGroups, areteFaceFissure, rayonPipe, nbsegRad)
254
255   # --- maillage faces de peau
256   
257   meshesFacesPeau = mailleFacesPeau(partitionsPeauFissFond, idFillingFromBout, facesDefaut,
258                                     facesPeaux, edCircPeau, ptCircPeau, gpedgeBord, gpedgeVifs, edFissPeau, 
259                                     bordsLibres, grpEdgesPeauFissureExterne, grpAretesVives,
260                                     edgesCircPipeGroup, dmoyen, rayonPipe, nbsegRad)
261
262   # --- regroupement des maillages du défaut
263
264   listMeshes = [internalBoundary.GetMesh(),
265                 meshPipe.GetMesh(),
266                 meshFaceFiss.GetMesh()]
267   for mp in meshesFacesPeau:
268     listMeshes.append(mp.GetMesh())
269
270   meshBoiteDefaut = smesh.Concatenate(listMeshes, 1, 1, 1e-05,False)
271   # pour aider l'algo hexa-tetra à ne pas mettre de pyramides à l'exterieur des volumes repliés sur eux-mêmes
272   # on désigne les faces de peau en quadrangles par le groupe "skinFaces"
273   group_faceFissOutPipe = None
274   group_faceFissInPipe = None
275   groups = meshBoiteDefaut.GetGroups()
276   for grp in groups:
277     if grp.GetType() == SMESH.FACE:
278       if grp.GetName() == "fisOutPi":
279         group_faceFissOutPipe = grp
280       elif grp.GetName() == "fisInPi":
281         group_faceFissInPipe = grp
282
283   # le maillage NETGEN ne passe pas toujours ==> utiliser GHS3D
284   distene=True
285   if distene:
286     algo3d = meshBoiteDefaut.Tetrahedron(algo=smeshBuilder.GHS3D)
287   else:
288     algo3d = meshBoiteDefaut.Tetrahedron(algo=smeshBuilder.NETGEN)
289     hypo3d = algo3d.MaxElementVolume(1000.0)
290   putName(algo3d.GetSubMesh(), "boiteDefaut")
291   putName(algo3d, "algo3d_boiteDefaut")
292   isDone = meshBoiteDefaut.Compute()
293   putName(meshBoiteDefaut, "boiteDefaut")
294   logging.info("meshBoiteDefaut fini")
295   
296   faceFissure = meshBoiteDefaut.GetMesh().UnionListOfGroups( [ group_faceFissOutPipe, group_faceFissInPipe ], 'FACE1' )
297   maillageSain = enleveDefaut(maillageSain, zoneDefaut, zoneDefaut_skin,
298                               zoneDefaut_internalFaces, zoneDefaut_internalEdges)
299   putName(maillageSain, nomFicSain+"_coupe")
300   extrusionFaceFissure, normfiss = shapeSurFissure(facesPortFissure)
301   maillageComplet = RegroupeSainEtDefaut(maillageSain, meshBoiteDefaut,
302                                          None, None, 'COMPLET', normfiss)
303
304   logging.info("conversion quadratique")
305   maillageComplet.ConvertToQuadratic( 1 )
306   logging.info("groupes")
307   groups = maillageComplet.GetGroups()
308   grps = [ grp for grp in groups if grp.GetName() == 'FONDFISS']
309   fond = maillageComplet.GetMesh().CreateDimGroup( grps, SMESH.NODE, 'FONDFISS' )
310
311   logging.info("réorientation face de fissure FACE1")
312   grps = [ grp for grp in groups if grp.GetName() == 'FACE1']
313   nb = maillageComplet.Reorient2D( grps[0], normfiss, grps[0].GetID(1))
314
315   logging.info("réorientation face de fissure FACE2")
316   plansim = geompy.MakePlane(O, normfiss, 10000)
317   fissnorm = geompy.MakeMirrorByPlane(normfiss, plansim)
318   grps = [ grp for grp in groups if grp.GetName() == 'FACE2']
319   nb = maillageComplet.Reorient2D( grps[0], fissnorm, grps[0].GetID(1))
320   fond = maillageComplet.GetMesh().CreateDimGroup( grps, SMESH.NODE, 'FACE2' )
321
322   logging.info("export maillage fini")
323   maillageComplet.ExportMED( fichierMaillageFissure, 0, SMESH.MED_V2_2, 1 )
324   putName(maillageComplet, nomFicFissure)
325   logging.info("fichier maillage fissure %s", fichierMaillageFissure)
326
327   if salome.sg.hasDesktop():
328     salome.sg.updateObjBrowser(1)
329
330   logging.info("maillage fissure fini")
331   
332   return maillageComplet