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