]> SALOME platform Git repositories - modules/smesh.git/commitdiff
Salome HOME
Découpage de claculePointsAxiauxPipe
authorGERALD NICOLAS <D68518@dsp0864451.atlas.edf.fr>
Thu, 15 Apr 2021 13:40:06 +0000 (15:40 +0200)
committerGERALD NICOLAS <D68518@dsp0864451.atlas.edf.fr>
Thu, 15 Apr 2021 13:40:06 +0000 (15:40 +0200)
src/Tools/blocFissure/gmu/CMakeLists.txt
src/Tools/blocFissure/gmu/calculePointsAxiauxPipe.py
src/Tools/blocFissure/gmu/calculePointsAxiauxPipe_a.py [new file with mode: 0644]
src/Tools/blocFissure/gmu/calculePointsAxiauxPipe_b.py [new file with mode: 0644]
src/Tools/blocFissure/gmu/calculePointsAxiauxPipe_c.py [new file with mode: 0644]
src/Tools/blocFissure/gmu/creePointsPipePeau.py

index 8fdcb3a6d05dccb4344731f73eda581eaff184dc..dfd9fc2470faa2b66d772635711db32b558ef171 100644 (file)
@@ -25,6 +25,9 @@ SET(plugin_SCRIPTS
   ajustePointsEdgePipeFissure.py
   blocDefaut.py
   calculePointsAxiauxPipe.py
+  calculePointsAxiauxPipe_a.py
+  calculePointsAxiauxPipe_b.py
+  calculePointsAxiauxPipe_c.py
   casStandard.py
   checkDecoupePartition.py
   commonSubShapes.py
index f67262afca3cc67f6e56c7597f092bdc90efebc4..5fdc48fb1302f12f72af086be39415a2907b62b6 100644 (file)
 """Préparation maillage du pipe"""
 
 import logging
-import math
 
-from .geomsmesh import geompy
-from .geomsmesh import smesh
+from .calculePointsAxiauxPipe_a import calculePointsAxiauxPipe_a
+from .calculePointsAxiauxPipe_b import calculePointsAxiauxPipe_b
+from .calculePointsAxiauxPipe_c import calculePointsAxiauxPipe_c
 
-from .putName import putName
-
-def calculePointsAxiauxPipe(edgesFondFiss, edgesIdByOrientation, facesDefaut,
-                            centreFondFiss, wireFondFiss, wirePipeFiss,
+def calculePointsAxiauxPipe(edgesFondFiss, edgesIdByOrientation, facesDefaut, \
+                            centreFondFiss, wireFondFiss, wirePipeFiss, \
                             lenSegPipe, rayonPipe, nbsegCercle, nbsegRad, \
                             nro_cas=None):
   """Préparation maillage du pipe :
 
-  - détections des points a respecter : jonction des edges/faces constituant
-    la face de fissure externe au 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é)
   """
@@ -42,117 +39,19 @@ def calculePointsAxiauxPipe(edgesFondFiss, edgesIdByOrientation, facesDefaut,
   logging.info('start')
   logging.info("Pour le cas n°%s", nro_cas)
 
-  # --- option de maillage selon le rayon de courbure du fond de fissure
-  lenEdgeFondExt = 0
-  for edff in edgesFondFiss:
-    lenEdgeFondExt += geompy.BasicProperties(edff)[0]
-
-  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
-  texte = "==> deflexion: {}, lgmin: {}, lgmax: {}".format(deflexion, lgmin, lgmax)
-  logging.info(texte)
-
-  meshFondExt = smesh.Mesh(wireFondFiss)
-  putName(meshFondExt, "wireFondFiss", i_pref=nro_cas)
-  algo1d = meshFondExt.Segment()
-  hypo1d = algo1d.Adaptive(lgmin, lgmax, deflexion) # a ajuster selon la profondeur de la fissure
-  putName(algo1d.GetSubMesh(), "wireFondFiss", i_pref=nro_cas)
-  putName(algo1d, "algo1d_wireFondFiss", i_pref=nro_cas)
-  putName(hypo1d, "hypo1d_wireFondFiss", i_pref=nro_cas)
-
-  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)
-    #logging.debug("nodeId %s, coords %s", nodeId, str(xyz))
-    point = geompy.MakeVertex(xyz[0], xyz[1], xyz[2])
-    parametre, _, EdgeInWireIndex = geompy.MakeProjectionOnWire(point, wireFondFiss) # parametre compris entre 0 et 1
-    edgeOrder = edgesIdByOrientation[EdgeInWireIndex]
-    ptGSdic[(edgeOrder, EdgeInWireIndex, parametre)] = point
-    #logging.debug("nodeId %s, parametre %s", nodeId, str(parametre))
-  usort = sorted(ptGSdic)
-  logging.debug("nombre de points obtenus par deflexion %s",len(usort))
+  # --- Maillage selon le rayon de courbure du fond de fissure
 
-  centres = list()
-  origins = list()
-  normals = list()
-  for edu in usort:
-    vertcx = ptGSdic[edu]
-    norm = geompy.MakeTangentOnCurve(edgesFondFiss[edu[1]], edu[2])
-    plan = geompy.MakePlane(vertcx, norm, 3.*rayonPipe)
-    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:
-        if geompy.MinDistance(point, vertcx) < 1.1*rayonPipe: # les quatre coins sont plus loin
-          vertpx = point
-          break
-      centres.append(vertcx)
-      origins.append(vertpx)
-      normals.append(norm)
-#      name = "vertcx%d"%i
-#      geompy.addToStudyInFather(wireFondFiss, vertcx, name)
-#      name = "vertpx%d"%i
-#      geompy.addToStudyInFather(wireFondFiss, vertpx, name)
-#      name = "plan%d"%i
-#      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)
-
-  # -----------------------------------------------------------------------
+  meshFondFiss = calculePointsAxiauxPipe_a(facesDefaut, centreFondFiss, wireFondFiss, \
+                                           lenSegPipe, \
+                                           nro_cas)
   # --- points géométriques
 
-  gptsdisks = list() # vertices géométrie de tous les disques
-  raydisks = [list() for _ in range(nbsegCercle)]
-  for indice, centres_i in enumerate(centres): # boucle sur les disques
-    gptdsk = list() # vertices géométrie d'un disque
-    vertcx = centres_i
-    vertpx = origins[indice]
-    normal = normals[indice]
-    vec1 = geompy.MakeVector(vertcx, vertpx)
-
-    points = [vertcx] # les points du rayon de référence
-    dist_0 = rayonPipe/float(nbsegRad)
-    for j_aux in range(nbsegRad):
-      point = geompy.MakeTranslationVectorDistance(vertcx, vec1, float(j_aux+1)*dist_0)
-      points.append(point)
-    gptdsk.append(points)
-    point = geompy.MakeTranslationVectorDistance(vertcx, vec1, 1.5*rayonPipe)
-    rayon = geompy.MakeLineTwoPnt(vertcx, point)
-    raydisks[0].append(rayon)
-
-    angle_0 = 2.*math.pi/float(nbsegCercle)
-    for k_aux in range(nbsegCercle-1):
-      angle = float(k_aux+1)*angle_0
-      pts = [vertcx] # les points d'un rayon obtenu par rotation
-      for j_aux in range(nbsegRad):
-        point = geompy.MakeRotation(points[j_aux+1], normal, angle)
-        pts.append(point)
-      gptdsk.append(pts)
-      ray = geompy.MakeRotation(rayon, normal, angle)
-      raydisks[k_aux+1].append(ray)
+  centres, origins, normals = calculePointsAxiauxPipe_b(meshFondFiss, \
+                                                        edgesFondFiss, edgesIdByOrientation, \
+                                                        wireFondFiss, wirePipeFiss, \
+                                                        rayonPipe)
 
-    gptsdisks.append(gptdsk)
+  gptsdisks, raydisks = calculePointsAxiauxPipe_c(centres, origins, normals, \
+                                                  rayonPipe, nbsegCercle, nbsegRad)
 
   return (centres, gptsdisks, raydisks)
diff --git a/src/Tools/blocFissure/gmu/calculePointsAxiauxPipe_a.py b/src/Tools/blocFissure/gmu/calculePointsAxiauxPipe_a.py
new file mode 100644 (file)
index 0000000..a0e07a1
--- /dev/null
@@ -0,0 +1,73 @@
+# -*- coding: utf-8 -*-
+# 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
+# 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
+#
+"""Maillage selon le rayon de courbure du fond de fissure"""
+
+import logging
+import math
+
+from .geomsmesh import geompy
+from .geomsmesh import smesh
+
+from .putName import putName
+
+def calculePointsAxiauxPipe_a(facesDefaut, centreFondFiss, wireFondFiss, \
+                              lenSegPipe, \
+                              nro_cas=None):
+  """Maillage selon le rayon de courbure du fond de fissure"""
+
+  logging.info('start')
+
+  # Rayon de courbure maximal
+  disfond = list()
+  for filling in facesDefaut:
+    disfond.append(geompy.MinDistance(centreFondFiss, filling))
+  disfond.sort()
+
+  texte = "rcourb: {}, lenSegPipe: {}".format(disfond[0], lenSegPipe)
+  logging.info(texte)
+
+  # Maillage 1D
+  lgmin = lenSegPipe*0.25
+  lgmax = lenSegPipe*1.5
+  # la déflexion ets la distance maximale entre une arête du maillage et la courbe support
+  nbSegQuart = 5 # on veut 5 segments min sur un quart de cercle
+  alpha = math.pi/(4*nbSegQuart)
+  deflexion = disfond[0]*(1.0 -math.cos(alpha))
+  texte = "==> lgmin: {}, lgmax: {}, deflexion: {}".format(deflexion, lgmin, lgmax)
+  logging.info(texte)
+
+  meshFondFiss = smesh.Mesh(wireFondFiss)
+  putName(meshFondFiss, "wireFondFiss", i_pref=nro_cas)
+  algo1d = meshFondFiss.Segment()
+  hypo1d = algo1d.Adaptive(lgmin, lgmax, deflexion) # a ajuster selon la profondeur de la fissure
+  putName(algo1d.GetSubMesh(), "wireFondFiss", i_pref=nro_cas)
+  putName(algo1d, "algo1d_wireFondFiss", i_pref=nro_cas)
+  putName(hypo1d, "hypo1d_wireFondFiss", i_pref=nro_cas)
+
+  is_done = meshFondFiss.Compute()
+  text = "calculePointsAxiauxPipe meshFondFiss.Compute"
+  if is_done:
+    logging.info(text)
+  else:
+    text = "Erreur au calcul du maillage.\n" + text
+    logging.info(text)
+    raise Exception(text)
+
+  return meshFondFiss
diff --git a/src/Tools/blocFissure/gmu/calculePointsAxiauxPipe_b.py b/src/Tools/blocFissure/gmu/calculePointsAxiauxPipe_b.py
new file mode 100644 (file)
index 0000000..3aa8c08
--- /dev/null
@@ -0,0 +1,75 @@
+# -*- coding: utf-8 -*-
+# 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
+# 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
+#
+"""Préparation maillage du pipe"""
+
+import logging
+
+from .geomsmesh import geompy
+from .geomsmesh import geomPublishInFather
+
+from . import initLog
+
+def calculePointsAxiauxPipe_b(meshFondFiss, \
+                              edgesFondFiss, edgesIdByOrientation, \
+                              wireFondFiss, wirePipeFiss, \
+                              rayonPipe):
+  """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é)
+  """
+
+  logging.info('start')
+
+  ptGSdic = dict() # dictionnaire [paramètre sur la courbe] --> point géométrique
+  allNodeIds = meshFondFiss.GetNodesId()
+  for nodeId in allNodeIds:
+    xyz = meshFondFiss.GetNodeXYZ(nodeId)
+    #logging.debug("nodeId %s, coords %s", nodeId, str(xyz))
+    point = geompy.MakeVertex(xyz[0], xyz[1], xyz[2])
+    parametre, _, EdgeInWireIndex = geompy.MakeProjectionOnWire(point, wireFondFiss) # parametre compris entre 0 et 1
+    edgeOrder = edgesIdByOrientation[EdgeInWireIndex]
+    ptGSdic[(edgeOrder, EdgeInWireIndex, parametre)] = point
+    #logging.debug("nodeId %s, parametre %s", nodeId, str(parametre))
+  usort = sorted(ptGSdic)
+  logging.debug("nombre de points obtenus par deflexion : %s",len(usort))
+
+  centres = list()
+  origins = list()
+  normals = list()
+  for i_aux, edu in enumerate(usort):
+    vertcx = ptGSdic[edu]
+    geomPublishInFather(initLog.debug, wireFondFiss, vertcx, "vertcx_{}".format(i_aux))
+    norm = geompy.MakeTangentOnCurve(edgesFondFiss[edu[1]], edu[2])
+    plan = geompy.MakePlane(vertcx, norm, 3.*rayonPipe)
+    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:
+        if geompy.MinDistance(point, vertcx) < 1.1*rayonPipe: # les quatre coins sont plus loin
+          vertpx = point
+          geomPublishInFather(initLog.debug, wireFondFiss, vertpx, "vertpx_{}".format(i_aux))
+          break
+      centres.append(vertcx)
+      origins.append(vertpx)
+      normals.append(norm)
+
+  return centres, origins, normals
diff --git a/src/Tools/blocFissure/gmu/calculePointsAxiauxPipe_c.py b/src/Tools/blocFissure/gmu/calculePointsAxiauxPipe_c.py
new file mode 100644 (file)
index 0000000..1828989
--- /dev/null
@@ -0,0 +1,76 @@
+# -*- coding: utf-8 -*-
+# 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
+# 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
+#
+"""Préparation maillage du pipe"""
+
+import logging
+import math
+
+from .geomsmesh import geompy
+
+def calculePointsAxiauxPipe_c(centres, origins, normals, \
+                              rayonPipe, nbsegCercle, nbsegRad):
+  """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é)
+  """
+
+  logging.info('start')
+  logging.debug("nbsegCercle = %d, nbsegRad = %d", nbsegCercle, nbsegRad)
+
+  # -----------------------------------------------------------------------
+  # --- points géométriques
+
+  gptsdisks = list() # vertices géométrie de tous les disques
+  raydisks = [list() for _ in range(nbsegCercle)]
+
+# boucle sur les disques
+  for indice, centres_i in enumerate(centres):
+    gptdsk = list() # vertices géométrie d'un disque
+    vertcx = centres_i
+    vertpx = origins[indice]
+    normal = normals[indice]
+    vec1 = geompy.MakeVector(vertcx, vertpx)
+
+    points = [vertcx] # les points du rayon de référence
+    dist_0 = rayonPipe/float(nbsegRad)
+    for j_aux in range(nbsegRad):
+      point = geompy.MakeTranslationVectorDistance(vertcx, vec1, float(j_aux+1)*dist_0)
+      points.append(point)
+    gptdsk.append(points)
+    point = geompy.MakeTranslationVectorDistance(vertcx, vec1, 1.5*rayonPipe)
+    rayon = geompy.MakeLineTwoPnt(vertcx, point)
+    raydisks[0].append(rayon)
+
+    angle_0 = 2.*math.pi/float(nbsegCercle)
+    for k_aux in range(nbsegCercle-1):
+      angle = float(k_aux+1)*angle_0
+      pts = [vertcx] # les points d'un rayon obtenu par rotation
+      for j_aux in range(nbsegRad):
+        point = geompy.MakeRotation(points[j_aux+1], normal, angle)
+        pts.append(point)
+      gptdsk.append(pts)
+      ray = geompy.MakeRotation(rayon, normal, angle)
+      raydisks[k_aux+1].append(ray)
+
+    gptsdisks.append(gptdsk)
+
+  return gptsdisks, raydisks
index 7936be3c7fb66bb5dbb1e9bb3d242516ac0101d7..5d967dffbb715cc085eb1013e49f9fbb1a377d61 100644 (file)
@@ -72,7 +72,7 @@ def creePointsPipePeau(listEdges, idFacesDebouchantes, idFillingFromBout,
             bout = extrCircs[1]
         else:
           bout = geompy.MakeVertexOnCurve(distEdgeCirc[0][2], dist)
-        name = "bout_{}";format(i_aux)
+        name = "bout_{}".format(i_aux)
         geomPublishInFather(initLog.debug, centre, bout, name)
         # enregistrement des points dans la structure
         points = list()