X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FTools%2FblocFissure%2Fgmu%2FquadranglesToShape.py;h=cf88edf56f8b17311bc4321eb524a5fecdb9696a;hp=b9facb652fe7dcd83eea7aeac10d572d3a46219f;hb=499f29d24922cec66e41b41a0039a954993bc6df;hpb=f6e2eed4240c426f1e65b40d1bd7e8d109a4d4b5 diff --git a/src/Tools/blocFissure/gmu/quadranglesToShape.py b/src/Tools/blocFissure/gmu/quadranglesToShape.py index b9facb652..cf88edf56 100644 --- a/src/Tools/blocFissure/gmu/quadranglesToShape.py +++ b/src/Tools/blocFissure/gmu/quadranglesToShape.py @@ -1,19 +1,40 @@ # -*- coding: utf-8 -*- +# 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 +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +"""Remarque : cette focntion n'est jamais appelée ????""" import logging -from geomsmesh import geompy -from geomsmesh import geomPublish -from geomsmesh import geomPublishInFather -import initLog -import GEOM import math import numpy as np +import GEOM + +from .geomsmesh import geompy +from .geomsmesh import geomPublish +from .geomsmesh import geomPublishInFather + +from . import initLog + def mydot(a): + """produit scalaire""" return np.dot(a,a) -# ----------------------------------------------------------------------------- -# --- groupe de quadrangles de face transformé en face géométrique par filling def quadranglesToShape(meshQuad, shapeFissureParams, centreFondFiss): """ @@ -29,18 +50,18 @@ def quadranglesToShape(meshQuad, shapeFissureParams, centreFondFiss): logging.info("start") isVecteurDefaut = False - if shapeFissureParams.has_key('vecteurDefaut'): + if 'vecteurDefaut' in shapeFissureParams: isVecteurDefaut = True vecteurDefaut = shapeFissureParams['vecteurDefaut'] - fillings = [] # les faces reconstituées, découpées selon les arêtes vives - noeuds_bords = [] # - bords_Partages = [] # contient a la fin les courbes correspondant aux arêtes vives - fillconts = [] # les faces reconstituées, sans découpage selon les arêtes vives - idFilToCont = [] # index face découpée vers face sans découpe + fillings = list() # les faces reconstituées, découpées selon les arêtes vives + noeuds_bords = list() # + bords_Partages = list() # contient a la fin les courbes correspondant aux arêtes vives + fillconts = list() # les faces reconstituées, sans découpage selon les arêtes vives + idFilToCont = list() # index face découpée vers face sans découpe iface = 0 # index face découpée icont = 0 # index face continue - + allNodeIds = meshQuad.GetNodesId() while len(allNodeIds): nodeIds = allNodeIds @@ -49,13 +70,13 @@ def quadranglesToShape(meshQuad, shapeFissureParams, centreFondFiss): if len(elems) == 1: # un coin: un noeud, un element quadrangle elem = elems[0] - break; + break idStart = idNode # le noeud de coin elemStart = elem # l'élément quadrangle au coin xyz = meshQuad.GetNodeXYZ(idStart) logging.debug("idStart %s, coords %s", idStart, str(xyz)) - - nodelines =[] # on va constituer une liste de lignes de points + + nodelines = list() # on va constituer une liste de lignes de points nextLine = True ligneFinale = False while nextLine: @@ -69,8 +90,8 @@ def quadranglesToShape(meshQuad, shapeFissureParams, centreFondFiss): agauche = True ligneIncomplete = True # on commence une ligne de points debutLigne = True - nodeline = [] - elemline = [] + nodeline = list() + elemline = list() while ligneIncomplete: # compléter la ligne de points nodeline.append(idNode) allNodeIds.remove(idNode) @@ -130,10 +151,10 @@ def quadranglesToShape(meshQuad, shapeFissureParams, centreFondFiss): logging.debug("nodeline %s", nodeline) logging.debug("elemline %s", elemline) nodelines.append(nodeline) - + # on a constitué une liste de lignes de points connexes - logging.debug("dimensions [%s, %s]", len(nodelines), len(nodeline)) - + logging.debug("dimensions [%s, %s]", len(nodelines), len(nodeline)) + # stockage des coordonnées dans un tableau numpy mat = np.zeros((len(nodelines), len(nodeline), 3)) for i, ligne in enumerate(nodelines): @@ -141,7 +162,7 @@ def quadranglesToShape(meshQuad, shapeFissureParams, centreFondFiss): mat[i,j] = meshQuad.GetNodeXYZ(nodeId) logging.debug("matrice de coordonnées: \n%s",mat) logging.debug("dimensions %s", mat.shape) - + # recherche d'angles supérieurs a un seuil sur une ligne : angle entre deux vecteurs successifs cosmin = math.cos(math.pi/4.) # TODO: angle reference en paramètre vecx = mat[:, 1:, :] - mat[:, :-1, :] # vecteurs selon direction "x" @@ -153,7 +174,7 @@ def quadranglesToShape(meshQuad, shapeFissureParams, centreFondFiss): h = e/(np.sqrt(f*g)) # cosinus ruptureX = h < cosmin # True si angle > reference logging.debug("matrice de rupture X: \n%s",ruptureX) - rupX = filter(lambda x: np.prod(ruptureX[:,x]), range(len(nodeline)-2)) + rupX = [x for x in range(len(nodeline)-2) if np.prod(ruptureX[:,x])] logging.debug("colonnes de rupture: %s",rupX) # recherche d'angles supérieurs a un seuil sur une colonne : angle entre deux vecteurs successifs vecy = mat[ 1:, :, :] - mat[:-1, :, :] # vecteurs selon direction "y" @@ -165,14 +186,14 @@ def quadranglesToShape(meshQuad, shapeFissureParams, centreFondFiss): h = e/(np.sqrt(f*g)) # cosinus ruptureY = h < cosmin # True si angle > reference logging.debug("matrice de rupture Y: \n%s",ruptureY) - rupY = filter(lambda x: np.prod(ruptureY[x, :]), range(len(nodelines)-2)) + rupY = [x for x in range(len(nodelines)-2) if np.prod(ruptureY[x, :])] logging.debug("lignes de rupture: %s",rupY) if (len(rupX)*len(rupY)) > 0: - logging.critical("""Cas non traité: présence d'angles vifs dans 2 directions, + logging.critical("""Cas non traité: présence d'angles vifs dans 2 directions, lors de la reconstitution des faces géométriques dans la zone remaillée""") - - mats = [] - bordsPartages = [] + + mats = list() + bordsPartages = list() if (len(rupX)> 0): rupX.append(mat.shape[1]-1) for i, index in enumerate(rupX): @@ -202,8 +223,8 @@ def quadranglesToShape(meshQuad, shapeFissureParams, centreFondFiss): else: mats.append(mat) bordsPartages.append([0,0]) # les indices différents de 0 correspondent à des bords partagés - - curvconts = [] + + curvconts = list() for nmat, amat in enumerate(mats): logging.debug("dimensions matrice %s: %s", nmat, amat.shape) nbLignes = amat.shape[1] # pas de rupture, ou rupture selon des colonnes: on transpose @@ -211,13 +232,13 @@ def quadranglesToShape(meshQuad, shapeFissureParams, centreFondFiss): if len(rupY) > 0 : # rupture selon des lignes: pas de transposition nbLignes = amat.shape[0] nbCols = amat.shape[1] - curves = [] - noeudsBords = [] + curves = list() + noeudsBords = list() for i in range(4): noeudsBords.append([]) k = 0 for i in range(nbLignes): - nodeList = [] + nodeList = list() for j in range(nbCols): #logging.debug("point[%s,%s] = (%s, %s, %s)",i,j,amat[i,j,0], amat[i,j,1], amat[i,j,2]) if len(rupY) > 0 : # pas de transposition @@ -245,7 +266,7 @@ def quadranglesToShape(meshQuad, shapeFissureParams, centreFondFiss): curve = geompy.MakeInterpol(nodeList, False, False) #name = "curve_%d"%i #geomPublish(initLog.debug, curve, name ) - if len(curvconts) == 0 or len(curves) > 0: # éliminer les doublons de la surface sans découpe + if len(curvconts) == 0 or len(curves) > 0: # éliminer les doublons de la surface sans découpe curvconts.append(nodeList) curves.append(curve) if bordsPartages[nmat][0] : @@ -264,27 +285,27 @@ def quadranglesToShape(meshQuad, shapeFissureParams, centreFondFiss): if centreFondFiss is not None: logging.debug("orientation filling a l'aide du centre de fond de fissure") vecteurDefaut = geompy.MakeVector(centreFondFiss, vertex) - + if not isVecteurDefaut: pointIn_x = 0.0 pointIn_y = 0.0 pointIn_z = 0.0 pointExplicite = False - if shapeFissureParams.has_key('pointIn_x'): + if 'pointIn_x' in shapeFissureParams: pointExplicite = True pointIn_x = shapeFissureParams['pointIn_x'] - if shapeFissureParams.has_key('pointIn_y'): + if 'pointIn_y' in shapeFissureParams: pointExplicite = True pointIn_y = shapeFissureParams['pointIn_y'] - if shapeFissureParams.has_key('pointIn_z'): + if 'pointIn_z' in shapeFissureParams: pointExplicite = True pointIn_z = shapeFissureParams['pointIn_z'] if pointExplicite: cdg = geompy.MakeVertex(pointIn_x, pointIn_y, pointIn_z) logging.debug("orientation filling par point intérieur %s", (pointIn_x, pointIn_y, pointIn_z)) vecteurDefaut = geompy.MakeVector(cdg, vertex) - - if shapeFissureParams.has_key('convexe'): + + if 'convexe' in shapeFissureParams: isConvexe = shapeFissureParams['convexe'] logging.debug("orientation filling par indication de convexité %s", isConvexe) cdg = geompy.MakeCDG(filling) @@ -292,7 +313,7 @@ def quadranglesToShape(meshQuad, shapeFissureParams, centreFondFiss): vecteurDefaut = geompy.MakeVector(cdg, vertex) else: vecteurDefaut = geompy.MakeVector(vertex, cdg) - + if vecteurDefaut is not None: geomPublish(initLog.debug, normal, "normFillOrig%d"%iface) geomPublish(initLog.debug, vecteurDefaut, "fromInterieur%d"%iface) @@ -305,14 +326,14 @@ def quadranglesToShape(meshQuad, shapeFissureParams, centreFondFiss): noeuds_bords.append(noeudsBords) idFilToCont.append(icont) bords_Partages += bordsPartages - pass # --- loop on mats + # --- loop on mats # --- reconstruction des faces continues à partir des listes de noeuds # les courbes doivent suivre la courbure pour éviter les oscillations if icont == iface - 1: # pas de découpe, on garde la même face fillcont = fillings[-1] else: nbLignes = len(curvconts[0]) - curves = [] + curves = list() for i in range(nbLignes): nodes = [curvconts[j][i] for j in range(len(curvconts))] curve = geompy.MakeInterpol(nodes, False, False) @@ -320,7 +341,7 @@ def quadranglesToShape(meshQuad, shapeFissureParams, centreFondFiss): fillcont = geompy.MakeFilling(geompy.MakeCompound(curves), 2, 5, 0.0001, 0.0001, 0, GEOM.FOM_Default, True) geomPublish(initLog.debug, fillcont, "filcont%d"%icont ) fillconts.append(fillcont) - icont = icont+1 - pass # --- loop while there are remaining nodes - + icont = icont+1 + # --- loop while there are remaining nodes + return fillings, noeuds_bords, bords_Partages, fillconts, idFilToCont