X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FTools%2FblocFissure%2Fgmu%2FconstruitFissureGenerale.py;h=3f48bebac29f611922083c5e5e984d933de3c14f;hp=84ef19835f8d9694893ec5133c757e362d6f1c20;hb=d9f4b53e489dd5857db264ede6acded7b076c9f1;hpb=0068dfdcb1ee619cb96d637e7384d6e341e71cff diff --git a/src/Tools/blocFissure/gmu/construitFissureGenerale.py b/src/Tools/blocFissure/gmu/construitFissureGenerale.py index 84ef19835..3f48bebac 100644 --- a/src/Tools/blocFissure/gmu/construitFissureGenerale.py +++ b/src/Tools/blocFissure/gmu/construitFissureGenerale.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Copyright (C) 2014-2020 EDF R&D +# Copyright (C) 2014-2022 EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -17,51 +17,23 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # - -import os +"""procédure complète de construction d'une fissure générale""" import logging + +from . import initLog + import salome + from .geomsmesh import geompy -from .geomsmesh import geomPublish from .geomsmesh import geomPublishInFather -from . import initLog -import GEOM from .geomsmesh import smesh -from salome.smesh import smeshBuilder -import SMESH -import math -import bisect -import traceback - -# from extractionOrientee import extractionOrientee -# from extractionOrienteeMulti import extractionOrienteeMulti -# from sortFaces import sortFaces -#from sortEdges import sortEdges -# from eliminateDoubles import eliminateDoubles -# from substractSubShapes import substractSubShapes -# from produitMixte import produitMixte -# from findWireEndVertices import findWireEndVertices -#from findWireIntermediateVertices import findWireIntermediateVertices + from .orderEdgesFromWire import orderEdgesFromWire -# from getSubshapeIds import getSubshapeIds -from .putName import putName -# from distance2 import distance2 -from .enleveDefaut import enleveDefaut -from .shapeSurFissure import shapeSurFissure -from .regroupeSainEtDefaut import RegroupeSainEtDefaut -from .triedreBase import triedreBase -# from checkDecoupePartition import checkDecoupePartition -# from whichSide import whichSide -# from whichSideMulti import whichSideMulti -#from whichSideVertex import whichSideVertex -#from projettePointSurCourbe import projettePointSurCourbe -# from prolongeWire import prolongeWire from .restreintFaceFissure import restreintFaceFissure from .partitionneFissureParPipe import partitionneFissureParPipe from .construitPartitionsPeauFissure import construitPartitionsPeauFissure from .compoundFromList import compoundFromList -from .identifieElementsGeometriquesPeau import identifieElementsGeometriquesPeau from .identifieFacesEdgesFissureExterne import identifieFacesEdgesFissureExterne from .calculePointsAxiauxPipe import calculePointsAxiauxPipe from .elimineExtremitesPipe import elimineExtremitesPipe @@ -72,21 +44,22 @@ from .construitMaillagePipe import construitMaillagePipe from .mailleAretesEtJonction import mailleAretesEtJonction from .mailleFacesFissure import mailleFacesFissure from .mailleFacesPeau import mailleFacesPeau -from .fissError import fissError +from .putName import putName + +from .construitFissureGenerale_a import construitFissureGenerale_a +from .construitFissureGenerale_b import construitFissureGenerale_b +from .construitFissureGenerale_c import construitFissureGenerale_c # ----------------------------------------------------------------------------- -# --- procédure complète fissure générale - -def construitFissureGenerale(maillagesSains, - shapesFissure, shapeFissureParams, - maillageFissureParams, elementsDefaut, step=-1): - """ - TODO: a completer - """ + +def construitFissureGenerale(shapesFissure, shapeFissureParams, \ + maillageFissureParams, elementsDefaut, \ + mailleur="MeshGems", nro_cas=None): + """procédure complète fissure générale""" logging.info('start') + logging.info("Usage du mailleur %s pour le cas n°%s", mailleur, nro_cas) shapeDefaut = shapesFissure[0] # faces de fissure, débordant - fondFiss = shapesFissure[4] # groupe d'edges de fond de fissure rayonPipe = shapeFissureParams['rayonPipe'] if 'lenSegPipe' in shapeFissureParams: @@ -94,10 +67,6 @@ def construitFissureGenerale(maillagesSains, else: lenSegPipe = rayonPipe - nomRep = maillageFissureParams['nomRep'] - nomFicSain = maillageFissureParams['nomFicSain'] - nomFicFissure = maillageFissureParams['nomFicFissure'] - nbsegRad = maillageFissureParams['nbsegRad'] # nombre de couches selon un rayon du pipe nbsegCercle = maillageFissureParams['nbsegCercle'] # nombre de secteur dans un cercle du pipe areteFaceFissure = maillageFissureParams['areteFaceFissure'] @@ -105,25 +74,8 @@ def construitFissureGenerale(maillagesSains, if 'aretesVives' in maillageFissureParams: lgAretesVives = maillageFissureParams['aretesVives'] - pointIn_x = 0.0 - pointIn_y = 0.0 - pointIn_z = 0.0 - isPointInterne = False - if 'pointIn_x' in shapeFissureParams: - pointIn_x = shapeFissureParams['pointIn_x'] - isPointInterne = True - if 'pointIn_y' in shapeFissureParams: - pointIn_y = shapeFissureParams['pointIn_y'] - isPointInterne = True - if 'pointIn_z' in shapeFissureParams: - pointIn_z = shapeFissureParams['pointIn_z'] - isPointInterne = True - if isPointInterne: - pointInterne = geompy.MakeVertex(pointIn_x, pointIn_y, pointIn_z) - else: - pointInterne = None - - fichierMaillageFissure = os.path.join (nomRep , '{}.med'.format(nomFicFissure)) +# Point interne + pointInterne = construitFissureGenerale_a (geompy, shapeFissureParams) # fillings des faces en peau facesDefaut = elementsDefaut[0] @@ -146,22 +98,22 @@ def construitFissureGenerale(maillagesSains, if lgAretesVives == 0: lgAretesVives = dmoyen - - O, OX, OY, OZ = triedreBase() - # --- restriction de la face de fissure au domaine solide : # partition face fissure étendue par fillings, on garde la face interne - facesPortFissure = restreintFaceFissure(shapeDefaut, facesDefaut, pointInterne) + facesPortFissure = restreintFaceFissure(shapeDefaut, facesDefaut, pointInterne, \ + nro_cas) # --- pipe de fond de fissure, prolongé, partition face fissure par pipe # identification des edges communes pipe et face fissure - (fissPipe, edgesPipeFiss, edgesFondFiss, wirePipeFiss, wireFondFiss) = partitionneFissureParPipe(shapesFissure, elementsDefaut, rayonPipe) + (fissPipe, edgesPipeFiss, edgesFondFiss, wirePipeFiss, wireFondFiss) = \ + partitionneFissureParPipe(shapesFissure, elementsDefaut, rayonPipe, \ + nro_cas) edgesFondFiss, edgesIdByOrientation = orderEdgesFromWire(wireFondFiss) - for i,edge in enumerate(edgesFondFiss): - geomPublishInFather(initLog.debug, wireFondFiss, edge, "edgeFondFiss%d"%i) + for i_aux, edge in enumerate(edgesFondFiss): + geomPublishInFather(initLog.debug, wireFondFiss, edge, "edgeFondFiss{}".format(i_aux), nro_cas) # --- peau et face de fissure # @@ -176,92 +128,51 @@ def construitFissureGenerale(maillagesSains, # et quadranglesToShapeWithCorner) aretesVivesC = compoundFromList(bordsPartages, "areteVive") - aretesVivesCoupees = list() # ensembles des arêtes vives identifiées sur les faces de peau dans l'itération sur partitionsPeauFissFond + aretesVivesCoupees = list() # ensemble des arêtes vives identifiées sur les faces de peau dans l'itération sur partitionsPeauFissFond # --- inventaire des faces de peau coupées par la fissure - # pour chaque face de peau : 0, 1 ou 2 faces débouchante du fond de fissure - # 0, 1 ou plus edges de la face de fissure externe au pipe - - nbFacesFilling = len(partitionsPeauFissFond) - texte = "nbFacesFilling : {} ".format(nbFacesFilling) - logging.info(texte) - - ptEdgeFond = [ list() for i in range(nbFacesFilling)] # pour chaque face [points edge fond de fissure aux débouchés du pipe] - fsPipePeau = [ list() for i in range(nbFacesFilling)] # pour chaque face [faces du pipe débouchantes] - edRadFPiPo = [ list() for i in range(nbFacesFilling)] # pour chaque face [edge radiale des faces du pipe débouchantes ] - fsFissuExt = [ list() for i in range(nbFacesFilling)] # pour chaque face [faces de fissure externes au pipe] - edFisExtPe = [ list() for i in range(nbFacesFilling)] # pour chaque face [edge en peau des faces de fissure externes (pas subshape facePeau)] - edFisExtPi = [ list() for i in range(nbFacesFilling)] # pour chaque face [edge commun au pipe des faces de fissure externes] - facesPeaux = [None for i in range(nbFacesFilling)] # pour chaque face : la face de peau finale a mailler (percée des faces débouchantes) - edCircPeau = [ list() for i in range(nbFacesFilling)] # pour chaque face de peau : [subshape edge circulaire aux débouchés du pipe] - ptCircPeau = [ list() for i in range(nbFacesFilling)] # pour chaque face de peau : [subshape point sur edge circulaire aux débouchés du pipe] - gpedgeBord = [None for i in range(nbFacesFilling)] # pour chaque face de peau : groupe subshape des edges aux bords liés à la partie saine - gpedgeVifs = [None for i in range(nbFacesFilling)] # pour chaque face de peau : groupes subshape des edges aux arêtes vives entre fillings - edFissPeau = [ list() for i in range(nbFacesFilling)] # pour chaque face de peau : [subshape edge en peau des faces de fissure externes] - ptFisExtPi = [ list() for i in range(nbFacesFilling)] # pour chaque face de peau : [point commun edFissPeau edCircPeau] - - for ifil, partitionPeauFissFond in enumerate(partitionsPeauFissFond): - if partitionPeauFissFond is not None: - dataPPFF,aretesVivesCoupees = identifieElementsGeometriquesPeau(ifil, partitionPeauFissFond, edgesPipeFiss, - edgesFondFiss, wireFondFiss, aretesVivesC, - facesDefaut, centreFondFiss, rayonPipe, - aretesVivesCoupees) - ptEdgeFond[ifil] = dataPPFF['endsEdgeFond'] - fsPipePeau[ifil] = dataPPFF['facesPipePeau'] - edRadFPiPo[ifil] = dataPPFF['edgeRadFacePipePeau'] - fsFissuExt[ifil] = dataPPFF['facesFissExt'] - edFisExtPe[ifil] = dataPPFF['edgesFissExtPeau'] - edFisExtPi[ifil] = dataPPFF['edgesFissExtPipe'] - facesPeaux[ifil] = dataPPFF['facePeau'] - edCircPeau[ifil] = dataPPFF['edgesCircPeau'] - ptCircPeau[ifil] = dataPPFF['verticesCircPeau'] - gpedgeBord[ifil] = dataPPFF['groupEdgesBordPeau'] - gpedgeVifs[ifil] = dataPPFF['bordsVifs'] - edFissPeau[ifil] = dataPPFF['edgesFissurePeau'] - ptFisExtPi[ifil] = dataPPFF['verticesPipePeau'] - - facesPipePeau = list() - edgeRadFacePipePeau = list() - for ifil in range(nbFacesFilling): - facesPipePeau += fsPipePeau[ifil] - edgeRadFacePipePeau += edRadFPiPo[ifil] - - for i, avc in enumerate(aretesVivesCoupees): - name = "areteViveCoupee%d"%i - geomPublish(initLog.debug, avc, name) + + ptEdgeFond, fsFissuExt, edFisExtPe, edFisExtPi, facesPeaux, edCircPeau, \ + gpedgeBord, gpedgeVifs, edFissPeau, ptFisExtPi, \ + edgeRadFacePipePeau, facesPipePeau = \ + construitFissureGenerale_b( partitionsPeauFissFond, \ + edgesPipeFiss, edgesFondFiss, wireFondFiss, aretesVivesC, \ + facesDefaut, centreFondFiss, rayonPipe, aretesVivesCoupees, \ + nro_cas ) # --- identification des faces et edges de fissure externe pour maillage (faceFissureExterne, edgesPipeFissureExterneC, wirePipeFissureExterne, edgesPeauFissureExterneC) = \ - identifieFacesEdgesFissureExterne(fsFissuExt, edFisExtPe, edFisExtPi, edgesPipeFiss) + identifieFacesEdgesFissureExterne(fsFissuExt, edFisExtPe, edFisExtPi, edgesPipeFiss, \ + nro_cas) - # --- preparation maillage du pipe : + # --- préparation maillage du pipe : # - détections des points a respecter : jonction des edges/faces constituant la face de fissure externe au pipe # - points sur les edges de fond de fissure et edges pipe/face fissure, # - vecteurs tangents au fond de fissure (normal au disque maillé) - (centres, gptsdisks, raydisks) = calculePointsAxiauxPipe(edgesFondFiss, edgesIdByOrientation, facesDefaut, - centreFondFiss, wireFondFiss, wirePipeFiss, - lenSegPipe, rayonPipe, nbsegCercle, nbsegRad) + (centres, gptsdisks, raydisks) = calculePointsAxiauxPipe (edgesFondFiss, edgesIdByOrientation, facesDefaut, \ + centreFondFiss, wireFondFiss, wirePipeFiss, \ + lenSegPipe, rayonPipe, nbsegCercle, nbsegRad, \ + nro_cas) # --- recherche des points en trop (externes au volume à remailler) # - on associe chaque extrémité du pipe à une face filling # - on part des disques aux extrémités du pipe - # - pour chaque disque, on prend les vertices de géométrie, - # on marque leur position relative à la face. + # - pour chaque disque, on prend les vertices de géométrie on marque leur position relative à la face. # - on s'arrete quand tous les noeuds sont dedans (idFillingFromBout, idisklim, idiskout) = elimineExtremitesPipe(ptEdgeFond, facesDefaut, centres, gptsdisks, nbsegCercle) # --- construction des listes d'edges radiales sur chaque extrémité débouchante - (listEdges, idFacesDebouchantes) = construitEdgesRadialesDebouchantes(idisklim, idiskout, gptsdisks, raydisks, + (listEdges, idFacesDebouchantes) = construitEdgesRadialesDebouchantes(idisklim, idiskout, gptsdisks, raydisks, \ facesPipePeau, edgeRadFacePipePeau, nbsegCercle) # --- création des points du maillage du pipe sur la face de peau - (gptsdisks, idisklim) = creePointsPipePeau(listEdges, idFacesDebouchantes, idFillingFromBout, - ptEdgeFond, ptFisExtPi, edCircPeau, gptsdisks, idisklim, nbsegRad) + gptsdisks = creePointsPipePeau(listEdges, idFacesDebouchantes, idFillingFromBout, \ + ptEdgeFond, ptFisExtPi, edCircPeau, gptsdisks, idisklim, nbsegRad) # --- ajustement precis des points sur edgesPipeFissureExterneC @@ -269,96 +180,48 @@ def construitFissureGenerale(maillagesSains, # --- maillage effectif du pipe - (meshPipe, meshPipeGroups, edgesCircPipeGroup) = construitMaillagePipe(gptsdisks, idisklim, nbsegCercle, nbsegRad) + (meshPipe, edgeFaceFissGroup, edgesCircPipeGroup) = \ + construitMaillagePipe(gptsdisks, idisklim, nbsegCercle, nbsegRad, \ + nro_cas) # --- edges de bord, faces défaut à respecter - (internalBoundary, bordsLibres, grpAretesVives) = mailleAretesEtJonction(internalBoundary, aretesVivesCoupees, lgAretesVives) + (internalBoundary, bordsLibres, grpAretesVives) = \ + mailleAretesEtJonction(internalBoundary, aretesVivesCoupees, lgAretesVives, \ + nro_cas) # --- maillage faces de fissure - (meshFaceFiss, grpFaceFissureExterne, - grpEdgesPeauFissureExterne, grpEdgesPipeFissureExterne) = mailleFacesFissure(faceFissureExterne, edgesPipeFissureExterneC, edgesPeauFissureExterneC, - meshPipeGroups, areteFaceFissure, rayonPipe, nbsegRad) + (meshFaceFiss, _, grpEdgesPeauFissureExterne, _) = \ + mailleFacesFissure(faceFissureExterne, \ + edgesPipeFissureExterneC, edgesPeauFissureExterneC, \ + edgeFaceFissGroup, areteFaceFissure, rayonPipe, nbsegRad, \ + mailleur, nro_cas) # --- maillage faces de peau - meshesFacesPeau = mailleFacesPeau(partitionsPeauFissFond, idFillingFromBout, facesDefaut, - facesPeaux, edCircPeau, ptCircPeau, gpedgeBord, gpedgeVifs, edFissPeau, - bordsLibres, grpEdgesPeauFissureExterne, grpAretesVives, - edgesCircPipeGroup, dmoyen, rayonPipe, nbsegRad) + meshesFacesPeau = mailleFacesPeau(partitionsPeauFissFond, idFillingFromBout, facesDefaut, \ + facesPeaux, edCircPeau, gpedgeBord, gpedgeVifs, edFissPeau, \ + bordsLibres, grpEdgesPeauFissureExterne, grpAretesVives, \ + edgesCircPipeGroup, dmoyen, rayonPipe, nbsegRad, \ + mailleur, nro_cas) # --- regroupement des maillages du défaut - listMeshes = [internalBoundary.GetMesh(), - meshPipe.GetMesh(), - meshFaceFiss.GetMesh()] - for mp in meshesFacesPeau: - listMeshes.append(mp.GetMesh()) - - meshBoiteDefaut = smesh.Concatenate(listMeshes, 1, 1, 1e-05,False) - # pour aider l'algo hexa-tetra à ne pas mettre de pyramides à l'exterieur des volumes repliés sur eux-mêmes - # on désigne les faces de peau en quadrangles par le groupe "skinFaces" - group_faceFissOutPipe = None - group_faceFissInPipe = None - groups = meshBoiteDefaut.GetGroups() - for grp in groups: - if grp.GetType() == SMESH.FACE: - if grp.GetName() == "fisOutPi": - group_faceFissOutPipe = grp - elif grp.GetName() == "fisInPi": - group_faceFissInPipe = grp - - # le maillage NETGEN ne passe pas toujours ==> utiliser GHS3D - distene=True - if distene: - algo3d = meshBoiteDefaut.Tetrahedron(algo=smeshBuilder.GHS3D) - else: - algo3d = meshBoiteDefaut.Tetrahedron(algo=smeshBuilder.NETGEN) - hypo3d = algo3d.MaxElementVolume(1000.0) - putName(algo3d.GetSubMesh(), "boiteDefaut") - putName(algo3d, "algo3d_boiteDefaut") - putName(meshBoiteDefaut, "boiteDefaut") - is_done = meshBoiteDefaut.Compute() - text = "meshBoiteDefaut.Compute" - if is_done: - logging.info(text+" OK") - else: - text = "Erreur au calcul du maillage.\n" + text - logging.info(text) - raise Exception(text) - - faceFissure = meshBoiteDefaut.GetMesh().UnionListOfGroups( [ group_faceFissOutPipe, group_faceFissInPipe ], \ - 'FACE1' ) - maillageSain = enleveDefaut(maillageSain, zoneDefaut, zoneDefaut_skin, - zoneDefaut_internalFaces, zoneDefaut_internalEdges) - putName(maillageSain, nomFicSain+"_coupe") - _, normfiss = shapeSurFissure(facesPortFissure) - maillageComplet = RegroupeSainEtDefaut(maillageSain, meshBoiteDefaut, \ - None, None, 'COMPLET', normfiss) - - logging.info("conversion quadratique") - maillageComplet.ConvertToQuadratic( 1 ) - logging.info("groupes") - groups = maillageComplet.GetGroups() - grps = [ grp for grp in groups if grp.GetName() == 'FONDFISS'] - fond = maillageComplet.GetMesh().CreateDimGroup( grps, SMESH.NODE, 'FONDFISS' ) - - logging.info("réorientation face de fissure FACE1") - grps = [ grp for grp in groups if grp.GetName() == 'FACE1'] - nb = maillageComplet.Reorient2D( grps[0], normfiss, grps[0].GetID(1)) - - logging.info("réorientation face de fissure FACE2") - plansim = geompy.MakePlane(O, normfiss, 10000) - fissnorm = geompy.MakeMirrorByPlane(normfiss, plansim) - grps = [ grp for grp in groups if grp.GetName() == 'FACE2'] - nb = maillageComplet.Reorient2D( grps[0], fissnorm, grps[0].GetID(1)) - fond = maillageComplet.GetMesh().CreateDimGroup( grps, SMESH.NODE, 'FACE2' ) - - logging.info("export maillage fini") - maillageComplet.ExportMED(fichierMaillageFissure) - putName(maillageComplet, nomFicFissure) - logging.info("fichier maillage fissure %s", fichierMaillageFissure) + listMeshes = [internalBoundary.GetMesh(), meshPipe.GetMesh(), meshFaceFiss.GetMesh()] + for mfpeau in meshesFacesPeau: + listMeshes.append(mfpeau.GetMesh()) + + # Attention à la précision... 1.e-5 est trop exigeant. Il faudrait mettre une valeur en cohérence avec les tailles de mailles. + meshBoiteDefaut = smesh.Concatenate(listMeshes, 1, 1, 1.e-04) + putName(meshBoiteDefaut, "boiteDefaut", i_pref=nro_cas) + +# Maillage complet + maillageComplet = construitFissureGenerale_c( maillageSain, meshBoiteDefaut, \ + zoneDefaut, zoneDefaut_skin, zoneDefaut_internalFaces, zoneDefaut_internalEdges, \ + facesPortFissure, \ + maillageFissureParams, \ + mailleur, nro_cas ) if salome.sg.hasDesktop(): salome.sg.updateObjBrowser()