Salome HOME
Update of CheckDone
[modules/smesh.git] / src / Tools / blocFissure / gmu / creeZoneDefautMaillage.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2021  EDF R&D
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20 """Zone de defaut extraite du maillage"""
21
22 import logging
23 import math
24 import traceback
25
26 from .geomsmesh import geompy
27 from .distance2 import distance2
28 from .fissError import fissError
29
30 # -----------------------------------------------------------------------------
31
32 def creeZoneDefautMaillage(maillagesSains, shapeDefaut, tailleDefaut,
33                            nomZones, coordsNoeudsFissure):
34   """Identification de la zone à remailler, opérations sur le maillage de l'objet sain.
35
36   La zone à remailler est définie à partir d'un objet géométrique
37   ou à partir d'un jeu de points et d'une distance d'influence.
38   @param maillagesSains : (le maillage de l'objet initial, booleen isHexa)
39   @param shapeDefaut : objet géométrique représentant la fissure
40   (selon les cas, un point central, ou une shape plus complexe, dont on ne garde que les vertices)
41   @param tailleDefaut : distance d'influence définissant la zone à remailler:
42   tous les éléments du maillage initial qui pénètrent dans cette zone
43   sont détectés
44   @param nomZones : préfixe des noms de groupes créés dans le maillage initial. S'il y a un groupe de noeuds
45   @coordsNoeudsFissure : jeu de points donné par une liste (x1,y1,z1, x2,y2,z2, ...)
46   @return (origShapes, verticesShapes, dmoyen) liste id subShapes, listes noeuds de bord, longueur arête moyenne bord
47   """
48   logging.info("start")
49   texte = "distance d'influence (tailleDefaut) = {}".format(tailleDefaut)
50   logging.debug(texte)
51   #print ("  shapeDefaut : {}".format(shapeDefaut))
52   #print ("  nomZones : {}".format(nomZones))
53
54   maillageSain = maillagesSains[0]
55   #isHexa = maillagesSains[1]
56   lists = maillageSain.CreateHoleSkin(tailleDefaut, shapeDefaut, nomZones, coordsNoeudsFissure)
57
58   #print("lists = {}".format(lists))
59
60   trace = True
61   origShapes = list()
62   verticesShapes = list()
63
64   cumul = 0. # somme des distances carrées entre points ordonnés (taille des arêtes)
65   nbar = 0     # nombre d'arêtes évaluées
66
67   for aList in lists:
68     aShape = aList[0]
69     origShapes.append(aShape)
70     vertices = list()
71     xyz0 = maillageSain.GetNodeXYZ(aList[1])
72     ###vertices.append(geompy.MakeVertex(xyz0[0], xyz0[1], xyz0[2])) pourquoi pas le premier ?
73     #print ("  node 0 {} : {}".format(aList[1],xyz0))
74     #print (xyz0)
75     for node in aList[2:]:
76       xyz = maillageSain.GetNodeXYZ(node)
77       #print ("  node {} : {}".format(node,xyz))
78       cumul += distance2(xyz, xyz0)
79       xyz0 = xyz
80       #logging.debug("    node %s %s", node, xyz)
81       vertices.append(geompy.MakeVertex(xyz[0], xyz[1], xyz[2]))
82     nbar += len(aList) - 2
83     verticesShapes.append(vertices)
84   #print ("nbar = {}".format(nbar))
85   #print ("cumul = {}".format(cumul))
86
87   if (nbar == 0):
88     texte = "La zone à remailler n'est pas détectée correctement.<br>"
89     texte += "Cause possible :<ul>"
90     texte += "<li>La distance d'influence est trop petite. "
91     texte += "L'ordre de grandeur minimal correspond à la taille des mailles du maillage sain dans la zone à remailler.</li></ul>"
92     raise fissError(traceback.extract_stack(),texte)
93
94   dmoyen = math.sqrt(cumul/float(nbar)) # ~ taille de l'arête moyenne du maillage global
95
96   return origShapes, verticesShapes, dmoyen