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