Salome HOME
Ajout d'un préfix aux noms des objets SMESH - début
[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 import salome
24 from .geomsmesh import geompy
25 from .geomsmesh import geomPublishInFather
26 from . import initLog
27 import GEOM
28 from .geomsmesh import smesh
29 from salome.smesh import smeshBuilder
30 import SMESH
31
32 from .orderEdgesFromWire import orderEdgesFromWire
33 from .restreintFaceFissure import restreintFaceFissure
34 from .partitionneFissureParPipe import partitionneFissureParPipe
35 from .construitPartitionsPeauFissure import construitPartitionsPeauFissure
36 from .compoundFromList import compoundFromList
37 from .identifieFacesEdgesFissureExterne import identifieFacesEdgesFissureExterne
38 from .calculePointsAxiauxPipe import calculePointsAxiauxPipe
39 from .elimineExtremitesPipe import elimineExtremitesPipe
40 from .construitEdgesRadialesDebouchantes import construitEdgesRadialesDebouchantes
41 from .creePointsPipePeau import creePointsPipePeau
42 from .ajustePointsEdgePipeFissure import ajustePointsEdgePipeFissure
43 from .construitMaillagePipe import construitMaillagePipe
44 from .mailleAretesEtJonction import mailleAretesEtJonction
45 from .mailleFacesFissure import mailleFacesFissure
46 from .mailleFacesPeau import mailleFacesPeau
47
48 from .construitFissureGenerale_a import construitFissureGenerale_a
49 from .construitFissureGenerale_b import construitFissureGenerale_b
50 from .construitFissureGenerale_c import construitFissureGenerale_c
51
52 # -----------------------------------------------------------------------------
53
54 def construitFissureGenerale(shapesFissure, shapeFissureParams, \
55                              maillageFissureParams, elementsDefaut, \
56                              step=-1, mailleur="MeshGems", nro_cas=-1):
57   """procédure complète fissure générale"""
58   logging.info('start')
59   logging.info("Usage du mailleur %s", mailleur)
60   logging.info("pour le cas %d", nro_cas)
61
62   shapeDefaut       = shapesFissure[0] # faces de fissure, débordant
63
64   rayonPipe = shapeFissureParams['rayonPipe']
65   if 'lenSegPipe' in shapeFissureParams:
66     lenSegPipe = shapeFissureParams['lenSegPipe']
67   else:
68     lenSegPipe = rayonPipe
69
70   nbsegRad          = maillageFissureParams['nbsegRad']      # nombre de couches selon un rayon du pipe
71   nbsegCercle       = maillageFissureParams['nbsegCercle']   # nombre de secteur dans un cercle du pipe
72   areteFaceFissure  = maillageFissureParams['areteFaceFissure']
73   lgAretesVives     = 0
74   if 'aretesVives' in maillageFissureParams:
75     lgAretesVives   = maillageFissureParams['aretesVives']
76
77 # Point interne
78   pointInterne = construitFissureGenerale_a (geompy, shapeFissureParams)
79
80   # fillings des faces en peau
81   facesDefaut              = elementsDefaut[0]
82   #centresDefaut            = elementsDefaut[1]
83   #normalsDefaut            = elementsDefaut[2]
84   #extrusionsDefaut         = elementsDefaut[3]
85   dmoyen                   = elementsDefaut[4]
86   bordsPartages            = elementsDefaut[5]
87   #fillconts                = elementsDefaut[6]
88   #idFilToCont              = elementsDefaut[7]
89   maillageSain             = elementsDefaut[8]
90   internalBoundary         = elementsDefaut[9]
91   zoneDefaut               = elementsDefaut[10]
92   zoneDefaut_skin          = elementsDefaut[11]
93   zoneDefaut_internalFaces = elementsDefaut[12]
94   zoneDefaut_internalEdges = elementsDefaut[13]
95   #edgeFondExt              = elementsDefaut[14]
96   centreFondFiss           = elementsDefaut[15]
97   #tgtCentre                = elementsDefaut[16]
98   if lgAretesVives == 0:
99     lgAretesVives = dmoyen
100
101   # --- restriction de la face de fissure au domaine solide :
102   #     partition face fissure étendue par fillings, on garde la face interne
103
104   facesPortFissure = restreintFaceFissure(shapeDefaut, facesDefaut, pointInterne)
105
106   # --- pipe de fond de fissure, prolongé, partition face fissure par pipe
107   #     identification des edges communes pipe et face fissure
108
109   (fissPipe, edgesPipeFiss, edgesFondFiss, wirePipeFiss, wireFondFiss) = \
110                           partitionneFissureParPipe(shapesFissure, elementsDefaut, rayonPipe)
111   edgesFondFiss, edgesIdByOrientation = orderEdgesFromWire(wireFondFiss)
112
113   for i,edge in enumerate(edgesFondFiss):
114     geomPublishInFather(initLog.debug, wireFondFiss, edge, "edgeFondFiss%d"%i)
115
116   # --- peau et face de fissure
117   #
118   # --- partition peau défaut - face de fissure prolongée - wire de fond de fissure prolongée
119   #     il peut y avoir plusieurs faces externes, dont certaines sont découpées par la fissure
120   #     liste de faces externes : facesDefaut
121   #     liste de partitions face externe - fissure : partitionPeauFissFond (None quand pas d'intersection)
122
123   partitionsPeauFissFond = construitPartitionsPeauFissure(facesDefaut, fissPipe)
124
125   # --- arêtes vives détectées (dans quadranglesToShapeNoCorner
126   #                             et quadranglesToShapeWithCorner)
127
128   aretesVivesC = compoundFromList(bordsPartages, "areteVive")
129   aretesVivesCoupees = list()  # ensemble des arêtes vives identifiées sur les faces de peau dans l'itération sur partitionsPeauFissFond
130
131   # --- inventaire des faces de peau coupées par la fissure
132
133   ptEdgeFond, fsFissuExt, edFisExtPe, edFisExtPi, \
134     facesPeaux, edCircPeau, ptCircPeau, gpedgeBord, gpedgeVifs, edFissPeau, ptFisExtPi, \
135     edgeRadFacePipePeau, facesPipePeau = \
136     construitFissureGenerale_b( partitionsPeauFissFond, \
137                                 edgesPipeFiss, edgesFondFiss, wireFondFiss, aretesVivesC, \
138                                 facesDefaut, centreFondFiss, rayonPipe, aretesVivesCoupees )
139
140   # --- identification des faces et edges de fissure externe pour maillage
141
142   (faceFissureExterne, edgesPipeFissureExterneC, wirePipeFissureExterne, edgesPeauFissureExterneC) = \
143       identifieFacesEdgesFissureExterne(fsFissuExt, edFisExtPe, edFisExtPi, edgesPipeFiss)
144
145   # --- preparation maillage du pipe :
146   #     - détections des points a respecter : jonction des edges/faces constituant la face de fissure externe au pipe
147   #     - points sur les edges de fond de fissure et edges pipe/face fissure,
148   #     - vecteurs tangents au fond de fissure (normal au disque maillé)
149
150   (centres, gptsdisks, raydisks) = calculePointsAxiauxPipe(edgesFondFiss, edgesIdByOrientation, facesDefaut, \
151                                                            centreFondFiss, wireFondFiss, wirePipeFiss, \
152                                                            lenSegPipe, rayonPipe, nbsegCercle, nbsegRad)
153
154   # --- recherche des points en trop (externes au volume à remailler)
155   #     - on associe chaque extrémité du pipe à une face filling
156   #     - on part des disques aux extrémités du pipe
157   #     - pour chaque disque, on prend les vertices de géométrie,
158   #       on marque leur position relative à la face.
159   #     - on s'arrete quand tous les noeuds sont dedans
160
161   (idFillingFromBout, idisklim, idiskout) = elimineExtremitesPipe(ptEdgeFond, facesDefaut, centres, gptsdisks, nbsegCercle)
162
163   # --- construction des listes d'edges radiales sur chaque extrémité débouchante
164
165   (listEdges, idFacesDebouchantes) = construitEdgesRadialesDebouchantes(idisklim, idiskout, gptsdisks, raydisks, \
166                                                                         facesPipePeau, edgeRadFacePipePeau, nbsegCercle)
167
168   # --- création des points du maillage du pipe sur la face de peau
169
170   (gptsdisks, idisklim) = creePointsPipePeau(listEdges, idFacesDebouchantes, idFillingFromBout, \
171                                              ptEdgeFond, ptFisExtPi, edCircPeau, gptsdisks, idisklim, nbsegRad)
172
173   # --- ajustement precis des points sur edgesPipeFissureExterneC
174
175   gptsdisks = ajustePointsEdgePipeFissure(edgesPipeFissureExterneC, wirePipeFissureExterne, gptsdisks, idisklim)
176
177    # --- maillage effectif du pipe
178
179   (meshPipe, meshPipeGroups, edgesCircPipeGroup) = construitMaillagePipe(gptsdisks, idisklim, nbsegCercle, nbsegRad)
180
181   # --- edges de bord, faces défaut à respecter
182
183   (internalBoundary, bordsLibres, grpAretesVives) = mailleAretesEtJonction(internalBoundary, aretesVivesCoupees, lgAretesVives)
184
185   # --- maillage faces de fissure
186
187   (meshFaceFiss, _, grpEdgesPeauFissureExterne, _) = \
188       mailleFacesFissure(faceFissureExterne, \
189                          edgesPipeFissureExterneC, edgesPeauFissureExterneC, \
190                          meshPipeGroups, areteFaceFissure, rayonPipe, nbsegRad, \
191                          mailleur)
192
193   # --- maillage faces de peau
194
195   meshesFacesPeau = mailleFacesPeau(partitionsPeauFissFond, idFillingFromBout, facesDefaut, \
196                                     facesPeaux, edCircPeau, ptCircPeau, gpedgeBord, gpedgeVifs, edFissPeau, \
197                                     bordsLibres, grpEdgesPeauFissureExterne, grpAretesVives, \
198                                     edgesCircPipeGroup, dmoyen, rayonPipe, nbsegRad, \
199                                     mailleur, nro_cas)
200
201   # --- regroupement des maillages du défaut
202
203   listMeshes = [internalBoundary.GetMesh(), meshPipe.GetMesh(), meshFaceFiss.GetMesh()]
204   for mfpeau in meshesFacesPeau:
205     listMeshes.append(mfpeau.GetMesh())
206
207   meshBoiteDefaut = smesh.Concatenate(listMeshes, 1, 1, 1e-05,False)
208
209 # Maillage complet
210   maillageComplet = construitFissureGenerale_c( maillageSain, meshBoiteDefaut, \
211                                                 zoneDefaut, zoneDefaut_skin, zoneDefaut_internalFaces, zoneDefaut_internalEdges, \
212                                                 facesPortFissure, \
213                                                 maillageFissureParams, \
214                                                 mailleur )
215
216   if salome.sg.hasDesktop():
217     salome.sg.updateObjBrowser()
218
219   logging.info("maillage fissure fini")
220
221   return maillageComplet