1 # -*- coding: utf-8 -*-
5 from geomsmesh import geompy
6 from geomsmesh import geomPublish
7 from geomsmesh import geomPublishInFather
10 from geomsmesh import smesh
11 from salome.smesh import smeshBuilder
16 # from extractionOrientee import extractionOrientee
17 # from extractionOrienteeMulti import extractionOrienteeMulti
18 # from sortFaces import sortFaces
19 #from sortEdges import sortEdges
20 # from eliminateDoubles import eliminateDoubles
21 # from substractSubShapes import substractSubShapes
22 # from produitMixte import produitMixte
23 # from findWireEndVertices import findWireEndVertices
24 #from findWireIntermediateVertices import findWireIntermediateVertices
25 from orderEdgesFromWire import orderEdgesFromWire
26 # from getSubshapeIds import getSubshapeIds
27 from putName import putName
28 # from distance2 import distance2
29 from enleveDefaut import enleveDefaut
30 from shapeSurFissure import shapeSurFissure
31 from regroupeSainEtDefaut import RegroupeSainEtDefaut
32 from triedreBase import triedreBase
33 # from checkDecoupePartition import checkDecoupePartition
34 # from whichSide import whichSide
35 # from whichSideMulti import whichSideMulti
36 #from whichSideVertex import whichSideVertex
37 #from projettePointSurCourbe import projettePointSurCourbe
38 # from prolongeWire import prolongeWire
39 from restreintFaceFissure import restreintFaceFissure
40 from partitionneFissureParPipe import partitionneFissureParPipe
41 from construitPartitionsPeauFissure import construitPartitionsPeauFissure
42 from compoundFromList import compoundFromList
43 from identifieElementsGeometriquesPeau import identifieElementsGeometriquesPeau
44 from identifieFacesEdgesFissureExterne import identifieFacesEdgesFissureExterne
45 from calculePointsAxiauxPipe import calculePointsAxiauxPipe
46 from elimineExtremitesPipe import elimineExtremitesPipe
47 from construitEdgesRadialesDebouchantes import construitEdgesRadialesDebouchantes
48 from creePointsPipePeau import creePointsPipePeau
49 from ajustePointsEdgePipeFissure import ajustePointsEdgePipeFissure
50 from construitMaillagePipe import construitMaillagePipe
51 from mailleAretesEtJonction import mailleAretesEtJonction
52 from mailleFacesFissure import mailleFacesFissure
53 from mailleFacesPeau import mailleFacesPeau
55 # -----------------------------------------------------------------------------
56 # --- procédure complète fissure générale
58 def construitFissureGenerale(maillagesSains,
59 shapesFissure, shapeFissureParams,
60 maillageFissureParams, elementsDefaut, step=-1):
66 shapeDefaut = shapesFissure[0] # faces de fissure, débordant
67 fondFiss = shapesFissure[4] # groupe d'edges de fond de fissure
69 rayonPipe = shapeFissureParams['rayonPipe']
70 if shapeFissureParams.has_key('lenSegPipe'):
71 lenSegPipe = shapeFissureParams['lenSegPipe']
73 lenSegPipe = rayonPipe
75 nomRep = maillageFissureParams['nomRep']
76 nomFicSain = maillageFissureParams['nomFicSain']
77 nomFicFissure = maillageFissureParams['nomFicFissure']
79 nbsegRad = maillageFissureParams['nbsegRad'] # nombre de couches selon un rayon du pipe
80 nbsegCercle = maillageFissureParams['nbsegCercle'] # nombre de secteur dans un cercle du pipe
81 areteFaceFissure = maillageFissureParams['areteFaceFissure']
86 isPointInterne = False
87 if shapeFissureParams.has_key('pointIn_x'):
88 pointIn_x = shapeFissureParams['pointIn_x']
90 if shapeFissureParams.has_key('pointIn_y'):
91 pointIn_y = shapeFissureParams['pointIn_y']
93 if shapeFissureParams.has_key('pointIn_z'):
94 pointIn_z = shapeFissureParams['pointIn_z']
97 pointInterne = geompy.MakeVertex(pointIn_x, pointIn_y, pointIn_z)
101 #fichierMaillageSain = nomRep + '/' + nomFicSain + '.med'
102 fichierMaillageFissure = nomRep + '/' + nomFicFissure + '.med'
104 # fillings des faces en peau
105 facesDefaut = elementsDefaut[0]
106 #centresDefaut = elementsDefaut[1]
107 #normalsDefaut = elementsDefaut[2]
108 #extrusionsDefaut = elementsDefaut[3]
109 dmoyen = elementsDefaut[4]
110 bordsPartages = elementsDefaut[5]
111 #fillconts = elementsDefaut[6]
112 #idFilToCont = elementsDefaut[7]
113 maillageSain = elementsDefaut[8]
114 internalBoundary = elementsDefaut[9]
115 zoneDefaut = elementsDefaut[10]
116 zoneDefaut_skin = elementsDefaut[11]
117 zoneDefaut_internalFaces = elementsDefaut[12]
118 zoneDefaut_internalEdges = elementsDefaut[13]
119 #edgeFondExt = elementsDefaut[14]
120 centreFondFiss = elementsDefaut[15]
121 #tgtCentre = elementsDefaut[16]
123 O, OX, OY, OZ = triedreBase()
125 # --- restriction de la face de fissure au domaine solide :
126 # partition face fissure étendue par fillings, on garde la face interne
128 facesPortFissure = restreintFaceFissure(shapeDefaut, facesDefaut, pointInterne)
130 # --- pipe de fond de fissure, prolongé, partition face fissure par pipe
131 # identification des edges communes pipe et face fissure
133 (fissPipe, edgesPipeFiss, edgesFondFiss, wirePipeFiss, wireFondFiss) = partitionneFissureParPipe(shapesFissure, elementsDefaut, rayonPipe)
134 edgesFondFiss, edgesIdByOrientation = orderEdgesFromWire(wireFondFiss)
135 for i,edge in enumerate(edgesFondFiss):
136 geomPublishInFather(initLog.debug, wireFondFiss, edge, "edgeFondFiss%d"%i)
138 # --- peau et face de fissure
140 # --- partition peau défaut - face de fissure prolongée - wire de fond de fissure prolongée
141 # il peut y avoir plusieurs faces externes, dont certaines sont découpées par la fissure
142 # liste de faces externes : facesDefaut
143 # liste de partitions face externe - fissure : partitionPeauFissFond (None quand pas d'intersection)
145 partitionsPeauFissFond = construitPartitionsPeauFissure(facesDefaut, fissPipe)
147 # --- arêtes vives détectées (dans quadranglesToShapeNoCorner
148 # et quadranglesToShapeWithCorner)
150 aretesVivesC = compoundFromList(bordsPartages, "areteVive")
151 aretesVivesCoupees = [] # ensembles des arêtes vives identifiées sur les faces de peau dans l'itération sur partitionsPeauFissFond
153 # --- inventaire des faces de peau coupées par la fissure
154 # pour chaque face de peau : 0, 1 ou 2 faces débouchante du fond de fissure
155 # 0, 1 ou plus edges de la face de fissure externe au pipe
157 nbFacesFilling = len(partitionsPeauFissFond)
159 ptEdgeFond = [ [] for i in range(nbFacesFilling)] # pour chaque face [points edge fond de fissure aux débouchés du pipe]
160 fsPipePeau = [ [] for i in range(nbFacesFilling)] # pour chaque face [faces du pipe débouchantes]
161 edRadFPiPo = [ [] for i in range(nbFacesFilling)] # pour chaque face [edge radiale des faces du pipe débouchantes ]
162 fsFissuExt = [ [] for i in range(nbFacesFilling)] # pour chaque face [faces de fissure externes au pipe]
163 edFisExtPe = [ [] for i in range(nbFacesFilling)] # pour chaque face [edge en peau des faces de fissure externes (pas subshape facePeau)]
164 edFisExtPi = [ [] for i in range(nbFacesFilling)] # pour chaque face [edge commun au pipe des faces de fissure externes]
165 facesPeaux = [None for i in range(nbFacesFilling)] # pour chaque face : la face de peau finale a mailler (percée des faces débouchantes)
166 edCircPeau = [ [] for i in range(nbFacesFilling)] # pour chaque face de peau : [subshape edge circulaire aux débouchés du pipe]
167 ptCircPeau = [ [] for i in range(nbFacesFilling)] # pour chaque face de peau : [subshape point sur edge circulaire aux débouchés du pipe]
168 gpedgeBord = [None for i in range(nbFacesFilling)] # pour chaque face de peau : groupe subshape des edges aux bords liés à la partie saine
169 gpedgeVifs = [None for i in range(nbFacesFilling)] # pour chaque face de peau : groupes subshape des edges aux arêtes vives entre fillings
170 edFissPeau = [ [] for i in range(nbFacesFilling)] # pour chaque face de peau : [subshape edge en peau des faces de fissure externes]
171 ptFisExtPi = [ [] for i in range(nbFacesFilling)] # pour chaque face de peau : [point commun edFissPeau edCircPeau]
173 for ifil, partitionPeauFissFond in enumerate(partitionsPeauFissFond):
174 if partitionPeauFissFond is not None:
175 dataPPFF,aretesVivesCoupees = identifieElementsGeometriquesPeau(ifil, partitionPeauFissFond, edgesPipeFiss,
176 edgesFondFiss, wireFondFiss, aretesVivesC,
177 facesDefaut, centreFondFiss, rayonPipe,
179 ptEdgeFond[ifil] = dataPPFF['endsEdgeFond']
180 fsPipePeau[ifil] = dataPPFF['facesPipePeau']
181 edRadFPiPo[ifil] = dataPPFF['edgeRadFacePipePeau']
182 fsFissuExt[ifil] = dataPPFF['facesFissExt']
183 edFisExtPe[ifil] = dataPPFF['edgesFissExtPeau']
184 edFisExtPi[ifil] = dataPPFF['edgesFissExtPipe']
185 facesPeaux[ifil] = dataPPFF['facePeau']
186 edCircPeau[ifil] = dataPPFF['edgesCircPeau']
187 ptCircPeau[ifil] = dataPPFF['verticesCircPeau']
188 gpedgeBord[ifil] = dataPPFF['groupEdgesBordPeau']
189 gpedgeVifs[ifil] = dataPPFF['bordsVifs']
190 edFissPeau[ifil] = dataPPFF['edgesFissurePeau']
191 ptFisExtPi[ifil] = dataPPFF['verticesPipePeau']
194 edgeRadFacePipePeau = []
195 for ifil in range(nbFacesFilling):
196 facesPipePeau += fsPipePeau[ifil]
197 edgeRadFacePipePeau += edRadFPiPo[ifil]
199 for i, avc in enumerate(aretesVivesCoupees):
200 name = "areteViveCoupee%d"%i
201 geomPublish(initLog.debug, avc, name)
203 # --- identification des faces et edges de fissure externe pour maillage
205 (faceFissureExterne, edgesPipeFissureExterneC,
206 wirePipeFissureExterne, edgesPeauFissureExterneC) = identifieFacesEdgesFissureExterne(fsFissuExt, edFisExtPe,
207 edFisExtPi, edgesPipeFiss)
209 # --- preparation maillage du pipe :
210 # - détections des points a respecter : jonction des edges/faces constituant la face de fissure externe au pipe
211 # - points sur les edges de fond de fissure et edges pipe/face fissure,
212 # - vecteurs tangents au fond de fissure (normal au disque maillé)
214 (centres, gptsdisks, raydisks) = calculePointsAxiauxPipe(edgesFondFiss, edgesIdByOrientation, facesDefaut,
215 centreFondFiss, wireFondFiss, wirePipeFiss,
216 lenSegPipe, rayonPipe, nbsegCercle, nbsegRad)
218 # --- recherche des points en trop (externes au volume à remailler)
219 # - on associe chaque extrémité du pipe à une face filling
220 # - on part des disques aux extrémités du pipe
221 # - pour chaque disque, on prend les vertices de géométrie,
222 # on marque leur position relative à la face.
223 # - on s'arrete quand tous les noeuds sont dedans
225 (idFillingFromBout, idisklim, idiskout) = elimineExtremitesPipe(ptEdgeFond, facesDefaut, centres, gptsdisks, nbsegCercle)
227 # --- construction des listes d'edges radiales sur chaque extrémité débouchante
229 (listEdges, idFacesDebouchantes) = construitEdgesRadialesDebouchantes(idisklim, idiskout, gptsdisks, raydisks,
230 facesPipePeau, edgeRadFacePipePeau, nbsegCercle)
232 # --- création des points du maillage du pipe sur la face de peau
234 (gptsdisks, idisklim) = creePointsPipePeau(listEdges, idFacesDebouchantes, idFillingFromBout,
235 ptEdgeFond, ptFisExtPi, edCircPeau, gptsdisks, idisklim, nbsegRad)
237 # --- ajustement precis des points sur edgesPipeFissureExterneC
239 gptsdisks = ajustePointsEdgePipeFissure(edgesPipeFissureExterneC, wirePipeFissureExterne, gptsdisks, idisklim)
241 # --- maillage effectif du pipe
243 (meshPipe, meshPipeGroups, edgesCircPipeGroup) = construitMaillagePipe(gptsdisks, idisklim, nbsegCercle, nbsegRad)
245 # --- edges de bord, faces défaut à respecter
247 (internalBoundary, bordsLibres, grpAretesVives) = mailleAretesEtJonction(internalBoundary, aretesVivesCoupees, dmoyen)
249 # --- maillage faces de fissure
251 (meshFaceFiss, grpFaceFissureExterne,
252 grpEdgesPeauFissureExterne, grpEdgesPipeFissureExterne) = mailleFacesFissure(faceFissureExterne, edgesPipeFissureExterneC, edgesPeauFissureExterneC,
253 meshPipeGroups, areteFaceFissure, rayonPipe, nbsegRad)
255 # --- maillage faces de peau
257 meshesFacesPeau = mailleFacesPeau(partitionsPeauFissFond, idFillingFromBout, facesDefaut,
258 facesPeaux, edCircPeau, ptCircPeau, gpedgeBord, gpedgeVifs, edFissPeau,
259 bordsLibres, grpEdgesPeauFissureExterne, grpAretesVives,
260 edgesCircPipeGroup, dmoyen, rayonPipe, nbsegRad)
262 # --- regroupement des maillages du défaut
264 listMeshes = [internalBoundary.GetMesh(),
266 meshFaceFiss.GetMesh()]
267 for mp in meshesFacesPeau:
268 listMeshes.append(mp.GetMesh())
270 meshBoiteDefaut = smesh.Concatenate(listMeshes, 1, 1, 1e-05,False)
271 # pour aider l'algo hexa-tetra à ne pas mettre de pyramides à l'exterieur des volumes repliés sur eux-mêmes
272 # on désigne les faces de peau en quadrangles par le groupe "skinFaces"
273 group_faceFissOutPipe = None
274 group_faceFissInPipe = None
275 groups = meshBoiteDefaut.GetGroups()
277 if grp.GetType() == SMESH.FACE:
278 if grp.GetName() == "fisOutPi":
279 group_faceFissOutPipe = grp
280 elif grp.GetName() == "fisInPi":
281 group_faceFissInPipe = grp
283 # le maillage NETGEN ne passe pas toujours ==> utiliser GHS3D
286 algo3d = meshBoiteDefaut.Tetrahedron(algo=smeshBuilder.GHS3D)
288 algo3d = meshBoiteDefaut.Tetrahedron(algo=smeshBuilder.NETGEN)
289 hypo3d = algo3d.MaxElementVolume(1000.0)
290 putName(algo3d.GetSubMesh(), "boiteDefaut")
291 putName(algo3d, "algo3d_boiteDefaut")
292 isDone = meshBoiteDefaut.Compute()
293 putName(meshBoiteDefaut, "boiteDefaut")
294 logging.info("meshBoiteDefaut fini")
296 faceFissure = meshBoiteDefaut.GetMesh().UnionListOfGroups( [ group_faceFissOutPipe, group_faceFissInPipe ], 'FACE1' )
297 maillageSain = enleveDefaut(maillageSain, zoneDefaut, zoneDefaut_skin,
298 zoneDefaut_internalFaces, zoneDefaut_internalEdges)
299 putName(maillageSain, nomFicSain+"_coupe")
300 extrusionFaceFissure, normfiss = shapeSurFissure(facesPortFissure)
301 maillageComplet = RegroupeSainEtDefaut(maillageSain, meshBoiteDefaut,
302 None, None, 'COMPLET', normfiss)
304 logging.info("conversion quadratique")
305 maillageComplet.ConvertToQuadratic( 1 )
306 logging.info("groupes")
307 groups = maillageComplet.GetGroups()
308 grps = [ grp for grp in groups if grp.GetName() == 'FONDFISS']
309 fond = maillageComplet.GetMesh().CreateDimGroup( grps, SMESH.NODE, 'FONDFISS' )
311 logging.info("réorientation face de fissure FACE1")
312 grps = [ grp for grp in groups if grp.GetName() == 'FACE1']
313 nb = maillageComplet.Reorient2D( grps[0], normfiss, grps[0].GetID(1))
315 logging.info("réorientation face de fissure FACE2")
316 plansim = geompy.MakePlane(O, normfiss, 10000)
317 fissnorm = geompy.MakeMirrorByPlane(normfiss, plansim)
318 grps = [ grp for grp in groups if grp.GetName() == 'FACE2']
319 nb = maillageComplet.Reorient2D( grps[0], fissnorm, grps[0].GetID(1))
320 fond = maillageComplet.GetMesh().CreateDimGroup( grps, SMESH.NODE, 'FACE2' )
322 logging.info("export maillage fini")
323 maillageComplet.ExportMED( fichierMaillageFissure, 0, SMESH.MED_V2_2, 1 )
324 putName(maillageComplet, nomFicFissure)
325 logging.info("fichier maillage fissure %s", fichierMaillageFissure)
327 if salome.sg.hasDesktop():
328 salome.sg.updateObjBrowser(1)
330 logging.info("maillage fissure fini")
332 return maillageComplet