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
29 from .geomsmesh import geompy
30 from .geomsmesh import geomPublishInFather
31 from .geomsmesh import smesh
33 from .orderEdgesFromWire import orderEdgesFromWire
34 from .restreintFaceFissure import restreintFaceFissure
35 from .partitionneFissureParPipe import partitionneFissureParPipe
36 from .construitPartitionsPeauFissure import construitPartitionsPeauFissure
37 from .compoundFromList import compoundFromList
38 from .identifieFacesEdgesFissureExterne import identifieFacesEdgesFissureExterne
39 from .calculePointsAxiauxPipe import calculePointsAxiauxPipe
40 from .elimineExtremitesPipe import elimineExtremitesPipe
41 from .construitEdgesRadialesDebouchantes import construitEdgesRadialesDebouchantes
42 from .creePointsPipePeau import creePointsPipePeau
43 from .ajustePointsEdgePipeFissure import ajustePointsEdgePipeFissure
44 from .construitMaillagePipe import construitMaillagePipe
45 from .mailleAretesEtJonction import mailleAretesEtJonction
46 from .mailleFacesFissure import mailleFacesFissure
47 from .mailleFacesPeau import mailleFacesPeau
48 from .putName import putName
50 from .construitFissureGenerale_a import construitFissureGenerale_a
51 from .construitFissureGenerale_b import construitFissureGenerale_b
52 from .construitFissureGenerale_c import construitFissureGenerale_c
54 # -----------------------------------------------------------------------------
56 def construitFissureGenerale(shapesFissure, shapeFissureParams, \
57 maillageFissureParams, elementsDefaut, \
58 mailleur="MeshGems", nro_cas=None):
59 """procédure complète fissure générale"""
61 logging.info("Usage du mailleur %s pour le cas n°%s", mailleur, nro_cas)
63 shapeDefaut = shapesFissure[0] # faces de fissure, débordant
65 rayonPipe = shapeFissureParams['rayonPipe']
66 if 'lenSegPipe' in shapeFissureParams:
67 lenSegPipe = shapeFissureParams['lenSegPipe']
69 lenSegPipe = rayonPipe
71 nbsegRad = maillageFissureParams['nbsegRad'] # nombre de couches selon un rayon du pipe
72 nbsegCercle = maillageFissureParams['nbsegCercle'] # nombre de secteur dans un cercle du pipe
73 areteFaceFissure = maillageFissureParams['areteFaceFissure']
75 if 'aretesVives' in maillageFissureParams:
76 lgAretesVives = maillageFissureParams['aretesVives']
79 pointInterne = construitFissureGenerale_a (geompy, shapeFissureParams)
81 # fillings des faces en peau
82 facesDefaut = elementsDefaut[0]
83 #centresDefaut = elementsDefaut[1]
84 #normalsDefaut = elementsDefaut[2]
85 #extrusionsDefaut = elementsDefaut[3]
86 dmoyen = elementsDefaut[4]
87 bordsPartages = elementsDefaut[5]
88 #fillconts = elementsDefaut[6]
89 #idFilToCont = elementsDefaut[7]
90 maillageSain = elementsDefaut[8]
91 internalBoundary = elementsDefaut[9]
92 zoneDefaut = elementsDefaut[10]
93 zoneDefaut_skin = elementsDefaut[11]
94 zoneDefaut_internalFaces = elementsDefaut[12]
95 zoneDefaut_internalEdges = elementsDefaut[13]
96 #edgeFondExt = elementsDefaut[14]
97 centreFondFiss = elementsDefaut[15]
98 #tgtCentre = elementsDefaut[16]
99 if lgAretesVives == 0:
100 lgAretesVives = dmoyen
102 # --- restriction de la face de fissure au domaine solide :
103 # partition face fissure étendue par fillings, on garde la face interne
105 facesPortFissure = restreintFaceFissure(shapeDefaut, facesDefaut, pointInterne, \
108 # --- pipe de fond de fissure, prolongé, partition face fissure par pipe
109 # identification des edges communes pipe et face fissure
111 (fissPipe, edgesPipeFiss, edgesFondFiss, wirePipeFiss, wireFondFiss) = \
112 partitionneFissureParPipe(shapesFissure, elementsDefaut, rayonPipe, \
114 edgesFondFiss, edgesIdByOrientation = orderEdgesFromWire(wireFondFiss)
116 for i_aux, edge in enumerate(edgesFondFiss):
117 geomPublishInFather(initLog.debug, wireFondFiss, edge, "edgeFondFiss{}".format(i_aux), nro_cas)
119 # --- peau et face de fissure
121 # --- partition peau défaut - face de fissure prolongée - wire de fond de fissure prolongée
122 # il peut y avoir plusieurs faces externes, dont certaines sont découpées par la fissure
123 # liste de faces externes : facesDefaut
124 # liste de partitions face externe - fissure : partitionPeauFissFond (None quand pas d'intersection)
126 partitionsPeauFissFond = construitPartitionsPeauFissure(facesDefaut, fissPipe)
128 # --- arêtes vives détectées (dans quadranglesToShapeNoCorner
129 # et quadranglesToShapeWithCorner)
131 aretesVivesC = compoundFromList(bordsPartages, "areteVive")
132 aretesVivesCoupees = list() # ensemble des arêtes vives identifiées sur les faces de peau dans l'itération sur partitionsPeauFissFond
134 # --- inventaire des faces de peau coupées par la fissure
136 ptEdgeFond, fsFissuExt, edFisExtPe, edFisExtPi, \
137 facesPeaux, edCircPeau, ptCircPeau, gpedgeBord, gpedgeVifs, edFissPeau, ptFisExtPi, \
138 edgeRadFacePipePeau, facesPipePeau = \
139 construitFissureGenerale_b( partitionsPeauFissFond, \
140 edgesPipeFiss, edgesFondFiss, wireFondFiss, aretesVivesC, \
141 facesDefaut, centreFondFiss, rayonPipe, aretesVivesCoupees, \
144 # --- identification des faces et edges de fissure externe pour maillage
146 (faceFissureExterne, edgesPipeFissureExterneC, wirePipeFissureExterne, edgesPeauFissureExterneC) = \
147 identifieFacesEdgesFissureExterne(fsFissuExt, edFisExtPe, edFisExtPi, edgesPipeFiss, \
150 # --- préparation maillage du pipe :
151 # - détections des points a respecter : jonction des edges/faces constituant la face de fissure externe au pipe
152 # - points sur les edges de fond de fissure et edges pipe/face fissure,
153 # - vecteurs tangents au fond de fissure (normal au disque maillé)
155 (centres, gptsdisks, raydisks) = calculePointsAxiauxPipe (edgesFondFiss, edgesIdByOrientation, facesDefaut, \
156 centreFondFiss, wireFondFiss, wirePipeFiss, \
157 lenSegPipe, rayonPipe, nbsegCercle, nbsegRad, \
160 # --- recherche des points en trop (externes au volume à remailler)
161 # - on associe chaque extrémité du pipe à une face filling
162 # - on part des disques aux extrémités du pipe
163 # - pour chaque disque, on prend les vertices de géométrie,
164 # on marque leur position relative à la face.
165 # - on s'arrete quand tous les noeuds sont dedans
167 (idFillingFromBout, idisklim, idiskout) = elimineExtremitesPipe(ptEdgeFond, facesDefaut, centres, gptsdisks, nbsegCercle)
169 # --- construction des listes d'edges radiales sur chaque extrémité débouchante
171 (listEdges, idFacesDebouchantes) = construitEdgesRadialesDebouchantes(idisklim, idiskout, gptsdisks, raydisks, \
172 facesPipePeau, edgeRadFacePipePeau, nbsegCercle)
174 # --- création des points du maillage du pipe sur la face de peau
176 (gptsdisks, idisklim) = creePointsPipePeau(listEdges, idFacesDebouchantes, idFillingFromBout, \
177 ptEdgeFond, ptFisExtPi, edCircPeau, gptsdisks, idisklim, nbsegRad)
179 # --- ajustement precis des points sur edgesPipeFissureExterneC
181 gptsdisks = ajustePointsEdgePipeFissure(edgesPipeFissureExterneC, wirePipeFissureExterne, gptsdisks, idisklim)
183 # --- maillage effectif du pipe
185 (meshPipe, meshPipeGroups, edgesCircPipeGroup) = \
186 construitMaillagePipe(gptsdisks, idisklim, nbsegCercle, nbsegRad, \
189 # --- edges de bord, faces défaut à respecter
191 (internalBoundary, bordsLibres, grpAretesVives) = \
192 mailleAretesEtJonction(internalBoundary, aretesVivesCoupees, lgAretesVives, \
195 # --- maillage faces de fissure
197 (meshFaceFiss, _, grpEdgesPeauFissureExterne, _) = \
198 mailleFacesFissure(faceFissureExterne, \
199 edgesPipeFissureExterneC, edgesPeauFissureExterneC, \
200 meshPipeGroups, areteFaceFissure, rayonPipe, nbsegRad, \
203 # --- maillage faces de peau
205 meshesFacesPeau = mailleFacesPeau(partitionsPeauFissFond, idFillingFromBout, facesDefaut, \
206 facesPeaux, edCircPeau, ptCircPeau, gpedgeBord, gpedgeVifs, edFissPeau, \
207 bordsLibres, grpEdgesPeauFissureExterne, grpAretesVives, \
208 edgesCircPipeGroup, dmoyen, rayonPipe, nbsegRad, \
211 # --- regroupement des maillages du défaut
213 listMeshes = [internalBoundary.GetMesh(), meshPipe.GetMesh(), meshFaceFiss.GetMesh()]
214 for mfpeau in meshesFacesPeau:
215 listMeshes.append(mfpeau.GetMesh())
217 # Attention à la précision... 1.e-5 est trop exigeant. Il faudrait mettre une valeur en cohérence avec les tailles de mailles.
218 meshBoiteDefaut = smesh.Concatenate(listMeshes, 1, 1, 1.e-04)
219 putName(meshBoiteDefaut, "boiteDefaut", i_pref=nro_cas)
222 maillageComplet = construitFissureGenerale_c( maillageSain, meshBoiteDefaut, \
223 zoneDefaut, zoneDefaut_skin, zoneDefaut_internalFaces, zoneDefaut_internalEdges, \
225 maillageFissureParams, \
228 if salome.sg.hasDesktop():
229 salome.sg.updateObjBrowser()
231 logging.info("maillage fissure fini")
233 return maillageComplet