X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FTools%2FblocFissure%2Fgmu%2FcalculePointsAxiauxPipe.py;h=466007a5f39e58cb73e2de20e379678e02618d39;hp=2dd1a9fc4d3c61f7416c21e74f470da06255028d;hb=b24a2d1b7692bdb21cf037b026e0273ba547cef4;hpb=0fc0831670e27a5611b941c52dc152fd63964515 diff --git a/src/Tools/blocFissure/gmu/calculePointsAxiauxPipe.py b/src/Tools/blocFissure/gmu/calculePointsAxiauxPipe.py index 2dd1a9fc4..466007a5f 100644 --- a/src/Tools/blocFissure/gmu/calculePointsAxiauxPipe.py +++ b/src/Tools/blocFissure/gmu/calculePointsAxiauxPipe.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Copyright (C) 2014-2020 EDF R&D +# Copyright (C) 2014-2021 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 @@ -23,43 +23,54 @@ import math from .geomsmesh import geompy from .geomsmesh import smesh - -def calculePointsAxiauxPipe(edgesFondFiss, edgesIdByOrientation, facesDefaut, + +def calculePointsAxiauxPipe(edgesFondFiss, edgesIdByOrientation, facesDefaut, centreFondFiss, wireFondFiss, wirePipeFiss, lenSegPipe, rayonPipe, nbsegCercle, nbsegRad): - """ - preparation maillage du pipe : + """preparation 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é) + - vecteurs tangents au fond de fissure (normal au disque maillé) """ - + logging.info('start') - # --- option de maillage selon le rayon de courbure du fond de fissure + # --- option de maillage selon le rayon de courbure du fond de fissure lenEdgeFondExt = 0 for edff in edgesFondFiss: lenEdgeFondExt += geompy.BasicProperties(edff)[0] - - disfond = [] + + disfond = list() for filling in facesDefaut: disfond.append(geompy.MinDistance(centreFondFiss, filling)) disfond.sort() rcourb = disfond[0] + texte = "rcourb: {}, lenEdgeFondExt: {}, lenSegPipe: {}".format(rcourb, lenEdgeFondExt, lenSegPipe) + logging.info(texte) nbSegQuart = 5 # on veut 5 segments min sur un quart de cercle alpha = math.pi/(4*nbSegQuart) deflexion = rcourb*(1.0 -math.cos(alpha)) lgmin = lenSegPipe*0.25 - lgmax = lenSegPipe*1.5 - logging.debug("rcourb: %s, lenFond:%s, deflexion: %s, lgmin: %s, lgmax: %s", rcourb, lenEdgeFondExt, deflexion, lgmin, lgmax) + lgmax = lenSegPipe*1.5 + texte = "==> deflexion: {}, lgmin: {}, lgmax: {}".format(deflexion, lgmin, lgmax) + logging.info(texte) meshFondExt = smesh.Mesh(wireFondFiss) algo1d = meshFondExt.Segment() hypo1d = algo1d.Adaptive(lgmin, lgmax, deflexion) # a ajuster selon la profondeur de la fissure - isDone = meshFondExt.Compute() - - ptGSdic = {} # dictionnaire [paramètre sur la courbe] --> point géométrique + + is_done = meshFondExt.Compute() + text = "calculePointsAxiauxPipe meshFondExt.Compute" + if is_done: + logging.info(text) + else: + text = "Erreur au calcul du maillage.\n" + text + logging.info(text) + raise Exception(text) + + ptGSdic = dict() # dictionnaire [paramètre sur la courbe] --> point géométrique allNodeIds = meshFondExt.GetNodesId() for nodeId in allNodeIds: xyz = meshFondExt.GetNodeXYZ(nodeId) @@ -69,19 +80,19 @@ def calculePointsAxiauxPipe(edgesFondFiss, edgesIdByOrientation, facesDefaut, edgeOrder = edgesIdByOrientation[EdgeInWireIndex] ptGSdic[(edgeOrder, EdgeInWireIndex, u)] = pt #logging.debug("nodeId %s, u %s", nodeId, str(u)) - usort = sorted(ptGSdic) + usort = sorted(ptGSdic) logging.debug("nombre de points obtenus par deflexion %s",len(usort)) - - centres = [] - origins = [] - normals = [] + + centres = list() + origins = list() + normals = list() for edu in usort: ied = edu[1] u = edu[2] vertcx = ptGSdic[edu] norm = geompy.MakeTangentOnCurve(edgesFondFiss[ied], u) plan = geompy.MakePlane(vertcx, norm, 3*rayonPipe) - part = geompy.MakePartition([plan], [wirePipeFiss], [], [], geompy.ShapeType["VERTEX"], 0, [], 0) + part = geompy.MakePartition([plan], [wirePipeFiss], list(), list(), geompy.ShapeType["VERTEX"], 0, list(), 0) liste = geompy.ExtractShapes(part, geompy.ShapeType["VERTEX"], True) if len(liste) == 5: # 4 coins du plan plus intersection recherchée for point in liste: @@ -99,21 +110,21 @@ def calculePointsAxiauxPipe(edgesFondFiss, edgesIdByOrientation, facesDefaut, # geompy.addToStudyInFather(wireFondFiss, plan, name) # --- maillage du pipe étendu, sans tenir compte de l'intersection avec la face de peau - + logging.debug("nbsegCercle %s", nbsegCercle) - + # ----------------------------------------------------------------------- # --- points géométriques - - gptsdisks = [] # vertices géométrie de tous les disques - raydisks = [[] for i in range(nbsegCercle)] - for i in range(len(centres)): # boucle sur les disques - gptdsk = [] # vertices géométrie d'un disque - vertcx = centres[i] + + gptsdisks = list() # vertices géométrie de tous les disques + raydisks = [list() for i in range(nbsegCercle)] + for i, centres_i in enumerate(centres): # boucle sur les disques + gptdsk = list() # vertices géométrie d'un disque + vertcx = centres_i vertpx = origins[i] normal = normals[i] vec1 = geompy.MakeVector(vertcx, vertpx) - + points = [vertcx] # les points du rayon de référence for j in range(nbsegRad): pt = geompy.MakeTranslationVectorDistance(vertcx, vec1, (j+1)*float(rayonPipe)/nbsegRad) @@ -122,7 +133,7 @@ def calculePointsAxiauxPipe(edgesFondFiss, edgesIdByOrientation, facesDefaut, pt = geompy.MakeTranslationVectorDistance(vertcx, vec1, 1.5*rayonPipe) rayon = geompy.MakeLineTwoPnt(vertcx, pt) raydisks[0].append(rayon) - + for k in range(nbsegCercle-1): angle = (k+1)*2*math.pi/nbsegCercle pts = [vertcx] # les points d'un rayon obtenu par rotation @@ -132,7 +143,7 @@ def calculePointsAxiauxPipe(edgesFondFiss, edgesIdByOrientation, facesDefaut, gptdsk.append(pts) ray = geompy.MakeRotation(rayon, normal, angle) raydisks[k+1].append(ray) - + gptsdisks.append(gptdsk) - + return (centres, gptsdisks, raydisks)