1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2021 EDF R&D
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.
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.
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
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 """procédure complète de construction d'une fissure générale"""
27 from salome.smesh import smeshBuilder
31 from .geomsmesh import geompy
32 from .geomsmesh import geomPublishInFather
33 from .geomsmesh import smesh
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 from .putName import putName
52 from .construitFissureGenerale_a import construitFissureGenerale_a
53 from .construitFissureGenerale_b import construitFissureGenerale_b
54 from .construitFissureGenerale_c import construitFissureGenerale_c
56 # -----------------------------------------------------------------------------
58 def construitFissureGenerale(shapesFissure, shapeFissureParams, \
59 maillageFissureParams, elementsDefaut, \
60 step=-1, mailleur="MeshGems", nro_cas=None):
61 """procédure complète fissure générale"""
63 logging.info("Usage du mailleur %s pour le cas n°%s", mailleur, nro_cas)
65 shapeDefaut = shapesFissure[0] # faces de fissure, débordant
67 rayonPipe = shapeFissureParams['rayonPipe']
68 if 'lenSegPipe' in shapeFissureParams:
69 lenSegPipe = shapeFissureParams['lenSegPipe']
71 lenSegPipe = rayonPipe
73 nbsegRad = maillageFissureParams['nbsegRad'] # nombre de couches selon un rayon du pipe
74 nbsegCercle = maillageFissureParams['nbsegCercle'] # nombre de secteur dans un cercle du pipe
75 areteFaceFissure = maillageFissureParams['areteFaceFissure']
77 if 'aretesVives' in maillageFissureParams:
78 lgAretesVives = maillageFissureParams['aretesVives']
81 pointInterne = construitFissureGenerale_a (geompy, shapeFissureParams)
83 # fillings des faces en peau
84 facesDefaut = elementsDefaut[0]
85 #centresDefaut = elementsDefaut[1]
86 #normalsDefaut = elementsDefaut[2]
87 #extrusionsDefaut = elementsDefaut[3]
88 dmoyen = elementsDefaut[4]
89 bordsPartages = elementsDefaut[5]
90 #fillconts = elementsDefaut[6]
91 #idFilToCont = elementsDefaut[7]
92 maillageSain = elementsDefaut[8]
93 internalBoundary = elementsDefaut[9]
94 zoneDefaut = elementsDefaut[10]
95 zoneDefaut_skin = elementsDefaut[11]
96 zoneDefaut_internalFaces = elementsDefaut[12]
97 zoneDefaut_internalEdges = elementsDefaut[13]
98 #edgeFondExt = elementsDefaut[14]
99 centreFondFiss = elementsDefaut[15]
100 #tgtCentre = elementsDefaut[16]
101 if lgAretesVives == 0:
102 lgAretesVives = dmoyen
104 # --- restriction de la face de fissure au domaine solide :
105 # partition face fissure étendue par fillings, on garde la face interne
107 facesPortFissure = restreintFaceFissure(shapeDefaut, facesDefaut, pointInterne, \
110 # --- pipe de fond de fissure, prolongé, partition face fissure par pipe
111 # identification des edges communes pipe et face fissure
113 (fissPipe, edgesPipeFiss, edgesFondFiss, wirePipeFiss, wireFondFiss) = \
114 partitionneFissureParPipe(shapesFissure, elementsDefaut, rayonPipe, \
116 edgesFondFiss, edgesIdByOrientation = orderEdgesFromWire(wireFondFiss)
118 for i_aux, edge in enumerate(edgesFondFiss):
119 geomPublishInFather(initLog.debug, wireFondFiss, edge, "edgeFondFiss{}".format(i_aux), nro_cas)
121 # --- peau et face de fissure
123 # --- partition peau défaut - face de fissure prolongée - wire de fond de fissure prolongée
124 # il peut y avoir plusieurs faces externes, dont certaines sont découpées par la fissure
125 # liste de faces externes : facesDefaut
126 # liste de partitions face externe - fissure : partitionPeauFissFond (None quand pas d'intersection)
128 partitionsPeauFissFond = construitPartitionsPeauFissure(facesDefaut, fissPipe)
130 # --- arêtes vives détectées (dans quadranglesToShapeNoCorner
131 # et quadranglesToShapeWithCorner)
133 aretesVivesC = compoundFromList(bordsPartages, "areteVive")
134 aretesVivesCoupees = list() # ensemble des arêtes vives identifiées sur les faces de peau dans l'itération sur partitionsPeauFissFond
136 # --- inventaire des faces de peau coupées par la fissure
138 ptEdgeFond, fsFissuExt, edFisExtPe, edFisExtPi, \
139 facesPeaux, edCircPeau, ptCircPeau, gpedgeBord, gpedgeVifs, edFissPeau, ptFisExtPi, \
140 edgeRadFacePipePeau, facesPipePeau = \
141 construitFissureGenerale_b( partitionsPeauFissFond, \
142 edgesPipeFiss, edgesFondFiss, wireFondFiss, aretesVivesC, \
143 facesDefaut, centreFondFiss, rayonPipe, aretesVivesCoupees, \
146 # --- identification des faces et edges de fissure externe pour maillage
148 (faceFissureExterne, edgesPipeFissureExterneC, wirePipeFissureExterne, edgesPeauFissureExterneC) = \
149 identifieFacesEdgesFissureExterne(fsFissuExt, edFisExtPe, edFisExtPi, edgesPipeFiss, \
152 # --- préparation maillage du pipe :
153 # - détections des points a respecter : jonction des edges/faces constituant la face de fissure externe au pipe
154 # - points sur les edges de fond de fissure et edges pipe/face fissure,
155 # - vecteurs tangents au fond de fissure (normal au disque maillé)
157 (centres, gptsdisks, raydisks) = calculePointsAxiauxPipe (edgesFondFiss, edgesIdByOrientation, facesDefaut, \
158 centreFondFiss, wireFondFiss, wirePipeFiss, \
159 lenSegPipe, rayonPipe, nbsegCercle, nbsegRad, \
162 # --- recherche des points en trop (externes au volume à remailler)
163 # - on associe chaque extrémité du pipe à une face filling
164 # - on part des disques aux extrémités du pipe
165 # - pour chaque disque, on prend les vertices de géométrie,
166 # on marque leur position relative à la face.
167 # - on s'arrete quand tous les noeuds sont dedans
169 (idFillingFromBout, idisklim, idiskout) = elimineExtremitesPipe(ptEdgeFond, facesDefaut, centres, gptsdisks, nbsegCercle)
171 # --- construction des listes d'edges radiales sur chaque extrémité débouchante
173 (listEdges, idFacesDebouchantes) = construitEdgesRadialesDebouchantes(idisklim, idiskout, gptsdisks, raydisks, \
174 facesPipePeau, edgeRadFacePipePeau, nbsegCercle)
176 # --- création des points du maillage du pipe sur la face de peau
178 (gptsdisks, idisklim) = creePointsPipePeau(listEdges, idFacesDebouchantes, idFillingFromBout, \
179 ptEdgeFond, ptFisExtPi, edCircPeau, gptsdisks, idisklim, nbsegRad)
181 # --- ajustement precis des points sur edgesPipeFissureExterneC
183 gptsdisks = ajustePointsEdgePipeFissure(edgesPipeFissureExterneC, wirePipeFissureExterne, gptsdisks, idisklim)
185 # --- maillage effectif du pipe
187 (meshPipe, meshPipeGroups, edgesCircPipeGroup) = \
188 construitMaillagePipe(gptsdisks, idisklim, nbsegCercle, nbsegRad, \
191 # --- edges de bord, faces défaut à respecter
193 (internalBoundary, bordsLibres, grpAretesVives) = \
194 mailleAretesEtJonction(internalBoundary, aretesVivesCoupees, lgAretesVives, \
197 # --- maillage faces de fissure
199 (meshFaceFiss, _, grpEdgesPeauFissureExterne, _) = \
200 mailleFacesFissure(faceFissureExterne, \
201 edgesPipeFissureExterneC, edgesPeauFissureExterneC, \
202 meshPipeGroups, areteFaceFissure, rayonPipe, nbsegRad, \
205 # --- maillage faces de peau
207 meshesFacesPeau = mailleFacesPeau(partitionsPeauFissFond, idFillingFromBout, facesDefaut, \
208 facesPeaux, edCircPeau, ptCircPeau, gpedgeBord, gpedgeVifs, edFissPeau, \
209 bordsLibres, grpEdgesPeauFissureExterne, grpAretesVives, \
210 edgesCircPipeGroup, dmoyen, rayonPipe, nbsegRad, \
213 # --- regroupement des maillages du défaut
215 listMeshes = [internalBoundary.GetMesh(), meshPipe.GetMesh(), meshFaceFiss.GetMesh()]
216 for mfpeau in meshesFacesPeau:
217 listMeshes.append(mfpeau.GetMesh())
219 # Attention à la précision... 1.e-5 est trop exigeant. Il faudrait mettre une valeur en cohérence avec les tailles de mailles.
220 meshBoiteDefaut = smesh.Concatenate(listMeshes, 1, 1, 1.e-04)
221 putName(meshBoiteDefaut, "boiteDefaut", i_pref=nro_cas)
224 maillageComplet = construitFissureGenerale_c( maillageSain, meshBoiteDefaut, \
225 zoneDefaut, zoneDefaut_skin, zoneDefaut_internalFaces, zoneDefaut_internalEdges, \
227 maillageFissureParams, \
230 if salome.sg.hasDesktop():
231 salome.sg.updateObjBrowser()
233 logging.info("maillage fissure fini")
235 return maillageComplet