Salome HOME
9bb9a937bdf3aec973ae4252dce1033bf5b05801
[modules/smesh.git] / src / Tools / blocFissure / gmu / construitFissureGenerale.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2021  EDF R&D
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20 """procédure complète de construction d'une fissure générale"""
21
22 import logging
23
24 from . import initLog
25
26 import salome
27 from salome.smesh import smeshBuilder
28 import GEOM
29 import SMESH
30
31 from .geomsmesh import geompy
32 from .geomsmesh import geomPublishInFather
33 from .geomsmesh import smesh
34
35 from .orderEdgesFromWire import orderEdgesFromWire
36 from .restreintFaceFissure import restreintFaceFissure
37 from .partitionneFissureParPipe import partitionneFissureParPipe
38 from .construitPartitionsPeauFissure import construitPartitionsPeauFissure
39 from .compoundFromList import compoundFromList
40 from .identifieFacesEdgesFissureExterne import identifieFacesEdgesFissureExterne
41 from .calculePointsAxiauxPipe import calculePointsAxiauxPipe
42 from .elimineExtremitesPipe import elimineExtremitesPipe
43 from .construitEdgesRadialesDebouchantes import construitEdgesRadialesDebouchantes
44 from .creePointsPipePeau import creePointsPipePeau
45 from .ajustePointsEdgePipeFissure import ajustePointsEdgePipeFissure
46 from .construitMaillagePipe import construitMaillagePipe
47 from .mailleAretesEtJonction import mailleAretesEtJonction
48 from .mailleFacesFissure import mailleFacesFissure
49 from .mailleFacesPeau import mailleFacesPeau
50
51 from .construitFissureGenerale_a import construitFissureGenerale_a
52 from .construitFissureGenerale_b import construitFissureGenerale_b
53 from .construitFissureGenerale_c import construitFissureGenerale_c
54
55 # -----------------------------------------------------------------------------
56
57 def construitFissureGenerale(shapesFissure, shapeFissureParams, \
58                              maillageFissureParams, elementsDefaut, \
59                              step=-1, mailleur="MeshGems", nro_cas=None):
60   """procédure complète fissure générale"""
61   logging.info('start')
62   logging.info("Usage du mailleur %s pour le cas n°%d", mailleur, nro_cas)
63
64   shapeDefaut       = shapesFissure[0] # faces de fissure, débordant
65
66   rayonPipe = shapeFissureParams['rayonPipe']
67   if 'lenSegPipe' in shapeFissureParams:
68     lenSegPipe = shapeFissureParams['lenSegPipe']
69   else:
70     lenSegPipe = rayonPipe
71
72   nbsegRad          = maillageFissureParams['nbsegRad']      # nombre de couches selon un rayon du pipe
73   nbsegCercle       = maillageFissureParams['nbsegCercle']   # nombre de secteur dans un cercle du pipe
74   areteFaceFissure  = maillageFissureParams['areteFaceFissure']
75   lgAretesVives     = 0
76   if 'aretesVives' in maillageFissureParams:
77     lgAretesVives   = maillageFissureParams['aretesVives']
78
79 # Point interne
80   pointInterne = construitFissureGenerale_a (geompy, shapeFissureParams)
81
82   # fillings des faces en peau
83   facesDefaut              = elementsDefaut[0]
84   #centresDefaut            = elementsDefaut[1]
85   #normalsDefaut            = elementsDefaut[2]
86   #extrusionsDefaut         = elementsDefaut[3]
87   dmoyen                   = elementsDefaut[4]
88   bordsPartages            = elementsDefaut[5]
89   #fillconts                = elementsDefaut[6]
90   #idFilToCont              = elementsDefaut[7]
91   maillageSain             = elementsDefaut[8]
92   internalBoundary         = elementsDefaut[9]
93   zoneDefaut               = elementsDefaut[10]
94   zoneDefaut_skin          = elementsDefaut[11]
95   zoneDefaut_internalFaces = elementsDefaut[12]
96   zoneDefaut_internalEdges = elementsDefaut[13]
97   #edgeFondExt              = elementsDefaut[14]
98   centreFondFiss           = elementsDefaut[15]
99   #tgtCentre                = elementsDefaut[16]
100   if lgAretesVives == 0:
101     lgAretesVives = dmoyen
102
103   # --- restriction de la face de fissure au domaine solide :
104   #     partition face fissure étendue par fillings, on garde la face interne
105
106   facesPortFissure = restreintFaceFissure(shapeDefaut, facesDefaut, pointInterne, \
107                                           nro_cas)
108
109   # --- pipe de fond de fissure, prolongé, partition face fissure par pipe
110   #     identification des edges communes pipe et face fissure
111
112   (fissPipe, edgesPipeFiss, edgesFondFiss, wirePipeFiss, wireFondFiss) = \
113                           partitionneFissureParPipe(shapesFissure, elementsDefaut, rayonPipe, \
114                                                     nro_cas)
115   edgesFondFiss, edgesIdByOrientation = orderEdgesFromWire(wireFondFiss)
116
117   for i_aux, edge in enumerate(edgesFondFiss):
118     geomPublishInFather(initLog.debug, wireFondFiss, edge, "edgeFondFiss{}".format(i_aux), nro_cas)
119
120   # --- peau et face de fissure
121   #
122   # --- partition peau défaut - face de fissure prolongée - wire de fond de fissure prolongée
123   #     il peut y avoir plusieurs faces externes, dont certaines sont découpées par la fissure
124   #     liste de faces externes : facesDefaut
125   #     liste de partitions face externe - fissure : partitionPeauFissFond (None quand pas d'intersection)
126
127   partitionsPeauFissFond = construitPartitionsPeauFissure(facesDefaut, fissPipe)
128
129   # --- arêtes vives détectées (dans quadranglesToShapeNoCorner
130   #                             et quadranglesToShapeWithCorner)
131
132   aretesVivesC = compoundFromList(bordsPartages, "areteVive")
133   aretesVivesCoupees = list()  # ensemble des arêtes vives identifiées sur les faces de peau dans l'itération sur partitionsPeauFissFond
134
135   # --- inventaire des faces de peau coupées par la fissure
136
137   ptEdgeFond, fsFissuExt, edFisExtPe, edFisExtPi, \
138     facesPeaux, edCircPeau, ptCircPeau, gpedgeBord, gpedgeVifs, edFissPeau, ptFisExtPi, \
139     edgeRadFacePipePeau, facesPipePeau = \
140     construitFissureGenerale_b( partitionsPeauFissFond, \
141                                 edgesPipeFiss, edgesFondFiss, wireFondFiss, aretesVivesC, \
142                                 facesDefaut, centreFondFiss, rayonPipe, aretesVivesCoupees, \
143                                 nro_cas )
144
145   # --- identification des faces et edges de fissure externe pour maillage
146
147   (faceFissureExterne, edgesPipeFissureExterneC, wirePipeFissureExterne, edgesPeauFissureExterneC) = \
148       identifieFacesEdgesFissureExterne(fsFissuExt, edFisExtPe, edFisExtPi, edgesPipeFiss, \
149                                         nro_cas)
150
151   # --- preparation maillage du pipe :
152   #     - détections des points a respecter : jonction des edges/faces constituant la face de fissure externe au pipe
153   #     - points sur les edges de fond de fissure et edges pipe/face fissure,
154   #     - vecteurs tangents au fond de fissure (normal au disque maillé)
155
156   (centres, gptsdisks, raydisks) = calculePointsAxiauxPipe (edgesFondFiss, edgesIdByOrientation, facesDefaut, \
157                                                             centreFondFiss, wireFondFiss, wirePipeFiss, \
158                                                             lenSegPipe, rayonPipe, nbsegCercle, nbsegRad, \
159                                                             nro_cas)
160
161   # --- recherche des points en trop (externes au volume à remailler)
162   #     - on associe chaque extrémité du pipe à une face filling
163   #     - on part des disques aux extrémités du pipe
164   #     - pour chaque disque, on prend les vertices de géométrie,
165   #       on marque leur position relative à la face.
166   #     - on s'arrete quand tous les noeuds sont dedans
167
168   (idFillingFromBout, idisklim, idiskout) = elimineExtremitesPipe(ptEdgeFond, facesDefaut, centres, gptsdisks, nbsegCercle)
169
170   # --- construction des listes d'edges radiales sur chaque extrémité débouchante
171
172   (listEdges, idFacesDebouchantes) = construitEdgesRadialesDebouchantes(idisklim, idiskout, gptsdisks, raydisks, \
173                                                                         facesPipePeau, edgeRadFacePipePeau, nbsegCercle)
174
175   # --- création des points du maillage du pipe sur la face de peau
176
177   (gptsdisks, idisklim) = creePointsPipePeau(listEdges, idFacesDebouchantes, idFillingFromBout, \
178                                              ptEdgeFond, ptFisExtPi, edCircPeau, gptsdisks, idisklim, nbsegRad)
179
180   # --- ajustement precis des points sur edgesPipeFissureExterneC
181
182   gptsdisks = ajustePointsEdgePipeFissure(edgesPipeFissureExterneC, wirePipeFissureExterne, gptsdisks, idisklim)
183
184    # --- maillage effectif du pipe
185
186   (meshPipe, meshPipeGroups, edgesCircPipeGroup) =  \
187       construitMaillagePipe(gptsdisks, idisklim, nbsegCercle, nbsegRad, \
188                              nro_cas)
189
190   # --- edges de bord, faces défaut à respecter
191
192   (internalBoundary, bordsLibres, grpAretesVives) =  \
193       mailleAretesEtJonction(internalBoundary, aretesVivesCoupees, lgAretesVives, \
194                              nro_cas)
195
196   # --- maillage faces de fissure
197
198   (meshFaceFiss, _, grpEdgesPeauFissureExterne, _) = \
199       mailleFacesFissure(faceFissureExterne, \
200                          edgesPipeFissureExterneC, edgesPeauFissureExterneC, \
201                          meshPipeGroups, areteFaceFissure, rayonPipe, nbsegRad, \
202                          mailleur, nro_cas)
203
204   # --- maillage faces de peau
205
206   meshesFacesPeau = mailleFacesPeau(partitionsPeauFissFond, idFillingFromBout, facesDefaut, \
207                                     facesPeaux, edCircPeau, ptCircPeau, gpedgeBord, gpedgeVifs, edFissPeau, \
208                                     bordsLibres, grpEdgesPeauFissureExterne, grpAretesVives, \
209                                     edgesCircPipeGroup, dmoyen, rayonPipe, nbsegRad, \
210                                     mailleur, nro_cas)
211
212   # --- regroupement des maillages du défaut
213
214   listMeshes = [internalBoundary.GetMesh(), meshPipe.GetMesh(), meshFaceFiss.GetMesh()]
215   for mfpeau in meshesFacesPeau:
216     listMeshes.append(mfpeau.GetMesh())
217
218   meshBoiteDefaut = smesh.Concatenate(listMeshes, 1, 1, 1e-05,False)
219
220 # Maillage complet
221   maillageComplet = construitFissureGenerale_c( maillageSain, meshBoiteDefaut, \
222                                                 zoneDefaut, zoneDefaut_skin, zoneDefaut_internalFaces, zoneDefaut_internalEdges, \
223                                                 facesPortFissure, \
224                                                 maillageFissureParams, \
225                                                 mailleur, nro_cas )
226
227   if salome.sg.hasDesktop():
228     salome.sg.updateObjBrowser()
229
230   logging.info("maillage fissure fini")
231
232   return maillageComplet