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