1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2023 EDF
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"""
28 from .geomsmesh import geompy
29 from .geomsmesh import geomPublishInFather
30 from .geomsmesh import smesh
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 from .putName import putName
49 from .construitFissureGenerale_a import construitFissureGenerale_a
50 from .construitFissureGenerale_b import construitFissureGenerale_b
51 from .construitFissureGenerale_c import construitFissureGenerale_c
53 # -----------------------------------------------------------------------------
55 def construitFissureGenerale(shapesFissure, shapeFissureParams, \
56 maillageFissureParams, elementsDefaut, \
57 mailleur="MeshGems", nro_cas=None):
58 """procédure complète fissure générale"""
60 logging.info("Usage du mailleur %s pour le cas n°%s", mailleur, nro_cas)
62 shapeDefaut = shapesFissure[0] # faces de fissure, débordant
64 rayonPipe = shapeFissureParams['rayonPipe']
65 if 'lenSegPipe' in shapeFissureParams:
66 lenSegPipe = shapeFissureParams['lenSegPipe']
68 lenSegPipe = rayonPipe
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']
74 if 'aretesVives' in maillageFissureParams:
75 lgAretesVives = maillageFissureParams['aretesVives']
78 pointInterne = construitFissureGenerale_a (geompy, shapeFissureParams)
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
101 # --- restriction de la face de fissure au domaine solide :
102 # partition face fissure étendue par fillings, on garde la face interne
104 facesPortFissure = restreintFaceFissure(shapeDefaut, facesDefaut, pointInterne, \
107 # --- pipe de fond de fissure, prolongé, partition face fissure par pipe
108 # identification des edges communes pipe et face fissure
110 (fissPipe, edgesPipeFiss, edgesFondFiss, wirePipeFiss, wireFondFiss) = \
111 partitionneFissureParPipe(shapesFissure, elementsDefaut, rayonPipe, \
113 edgesFondFiss, edgesIdByOrientation = orderEdgesFromWire(wireFondFiss)
115 for i_aux, edge in enumerate(edgesFondFiss):
116 geomPublishInFather(initLog.debug, wireFondFiss, edge, "edgeFondFiss{}".format(i_aux), nro_cas)
118 # --- peau et face de fissure
120 # --- partition peau défaut - face de fissure prolongée - wire de fond de fissure prolongée
121 # il peut y avoir plusieurs faces externes, dont certaines sont découpées par la fissure
122 # liste de faces externes : facesDefaut
123 # liste de partitions face externe - fissure : partitionPeauFissFond (None quand pas d'intersection)
125 partitionsPeauFissFond = construitPartitionsPeauFissure(facesDefaut, fissPipe)
127 # --- arêtes vives détectées (dans quadranglesToShapeNoCorner
128 # et quadranglesToShapeWithCorner)
130 aretesVivesC = compoundFromList(bordsPartages, "areteVive")
131 aretesVivesCoupees = list() # ensemble des arêtes vives identifiées sur les faces de peau dans l'itération sur partitionsPeauFissFond
133 # --- inventaire des faces de peau coupées par la fissure
135 ptEdgeFond, fsFissuExt, edFisExtPe, edFisExtPi, facesPeaux, edCircPeau, \
136 gpedgeBord, gpedgeVifs, edFissPeau, ptFisExtPi, \
137 edgeRadFacePipePeau, facesPipePeau = \
138 construitFissureGenerale_b( partitionsPeauFissFond, \
139 edgesPipeFiss, edgesFondFiss, wireFondFiss, aretesVivesC, \
140 facesDefaut, centreFondFiss, rayonPipe, aretesVivesCoupees, \
143 # --- identification des faces et edges de fissure externe pour maillage
145 (faceFissureExterne, edgesPipeFissureExterneC, wirePipeFissureExterne, edgesPeauFissureExterneC) = \
146 identifieFacesEdgesFissureExterne(fsFissuExt, edFisExtPe, edFisExtPi, edgesPipeFiss, \
149 # --- préparation maillage du pipe :
150 # - détections des points a respecter : jonction des edges/faces constituant la face de fissure externe au pipe
151 # - points sur les edges de fond de fissure et edges pipe/face fissure,
152 # - vecteurs tangents au fond de fissure (normal au disque maillé)
154 (centres, gptsdisks, raydisks) = calculePointsAxiauxPipe (edgesFondFiss, edgesIdByOrientation, facesDefaut, \
155 centreFondFiss, wireFondFiss, wirePipeFiss, \
156 lenSegPipe, rayonPipe, nbsegCercle, nbsegRad, \
159 # --- recherche des points en trop (externes au volume à remailler)
160 # - on associe chaque extrémité du pipe à une face filling
161 # - on part des disques aux extrémités du pipe
162 # - pour chaque disque, on prend les vertices de géométrie on marque leur position relative à la face.
163 # - on s'arrete quand tous les noeuds sont dedans
165 (idFillingFromBout, idisklim, idiskout) = elimineExtremitesPipe(ptEdgeFond, facesDefaut, centres, gptsdisks, nbsegCercle)
167 # --- construction des listes d'edges radiales sur chaque extrémité débouchante
169 (listEdges, idFacesDebouchantes) = construitEdgesRadialesDebouchantes(idisklim, idiskout, gptsdisks, raydisks, \
170 facesPipePeau, edgeRadFacePipePeau, nbsegCercle)
172 # --- création des points du maillage du pipe sur la face de peau
174 gptsdisks = creePointsPipePeau(listEdges, idFacesDebouchantes, idFillingFromBout, \
175 ptEdgeFond, ptFisExtPi, edCircPeau, gptsdisks, idisklim, nbsegRad)
177 # --- ajustement precis des points sur edgesPipeFissureExterneC
179 gptsdisks = ajustePointsEdgePipeFissure(edgesPipeFissureExterneC, wirePipeFissureExterne, gptsdisks, idisklim)
181 # --- maillage effectif du pipe
183 (meshPipe, edgeFaceFissGroup, edgesCircPipeGroup) = \
184 construitMaillagePipe(gptsdisks, idisklim, nbsegCercle, nbsegRad, \
187 # --- edges de bord, faces défaut à respecter
189 (internalBoundary, bordsLibres, grpAretesVives) = \
190 mailleAretesEtJonction(internalBoundary, aretesVivesCoupees, lgAretesVives, \
193 # --- maillage faces de fissure
195 (meshFaceFiss, _, grpEdgesPeauFissureExterne, _) = \
196 mailleFacesFissure(faceFissureExterne, \
197 edgesPipeFissureExterneC, edgesPeauFissureExterneC, \
198 edgeFaceFissGroup, areteFaceFissure, rayonPipe, nbsegRad, \
201 # --- maillage faces de peau
203 meshesFacesPeau = mailleFacesPeau(partitionsPeauFissFond, idFillingFromBout, facesDefaut, \
204 facesPeaux, edCircPeau, gpedgeBord, gpedgeVifs, edFissPeau, \
205 bordsLibres, grpEdgesPeauFissureExterne, grpAretesVives, \
206 edgesCircPipeGroup, dmoyen, rayonPipe, nbsegRad, \
209 # --- regroupement des maillages du défaut
211 listMeshes = [internalBoundary.GetMesh(), meshPipe.GetMesh(), meshFaceFiss.GetMesh()]
212 for mfpeau in meshesFacesPeau:
213 listMeshes.append(mfpeau.GetMesh())
215 # Attention à la précision... 1.e-5 est trop exigeant. Il faudrait mettre une valeur en cohérence avec les tailles de mailles.
216 meshBoiteDefaut = smesh.Concatenate(listMeshes, 1, 1, 1.e-04)
217 putName(meshBoiteDefaut, "boiteDefaut", i_pref=nro_cas)
220 maillageComplet = construitFissureGenerale_c( maillageSain, meshBoiteDefaut, \
221 zoneDefaut, zoneDefaut_skin, zoneDefaut_internalFaces, zoneDefaut_internalEdges, \
223 maillageFissureParams, \
226 if salome.sg.hasDesktop():
227 salome.sg.updateObjBrowser()
229 logging.info("maillage fissure fini")
231 return maillageComplet