Salome HOME
Merge branch 'gni/evolution'
[modules/smesh.git] / src / Tools / blocFissure / gmu / identifieElementsDebouchants.py
index 4f6de333ce60a3a9fb6f3cc2e5976e4d2bcc4d20..b30dd00ca5533b6524e615258b3955aaffcf32b0 100644 (file)
@@ -1,35 +1,56 @@
 # -*- 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
+#
 
 import logging
 import math
 
-from geomsmesh import geompy
+from .geomsmesh import geompy
+from .geomsmesh import geomPublish
+from .geomsmesh import geomPublishInFather
+from . import initLog
+import traceback
+from .fissError import fissError
 
-from produitMixte import produitMixte
-from whichSide import whichSide
-  
-def identifieElementsDebouchants(ifil, facesDefaut, partitionPeauFissFond,
-                                edgesFondIn, edgesFondFiss, wireFondFiss,
-                                aretesVivesC, fillingFaceExterne,
-                                edgesPipeIn, verticesPipePeau, rayonPipe,
+from .produitMixte import produitMixte
+from .whichSide import whichSide
+
+def identifieElementsDebouchants(ifil, facesDefaut, partitionPeauFissFond, \
+                                edgesFondIn, edgesFondFiss, wireFondFiss, \
+                                aretesVivesC, fillingFaceExterne, \
+                                edgesPipeIn, verticesPipePeau, rayonPipe, \
                                 facesInside, facesOnside):
-  """
-  elements débouchants (intersection pipe et peau), indexés selon les edges du fond de fissure (edgesFondIn)
-  """
-  
+  """elements débouchants (intersection pipe et peau), indexés selon les edges du fond de fissure (edgesFondIn)"""
+
   logging.info('start')
-  verticesEdgesFondIn = [] # les points du fond de fissure au débouché du pipe sur la peau (indice de edgesFondIn)
-  pipexts = []             # les segments de pipe associés au points de fond de fissure débouchants (même indice)
-  cercles = []             # les cercles de generation des pipes débouchant (même indice)
-  facesFissExt = []        # les faces de la fissure externe associés au points de fond de fissure débouchants (même indice)
-  edgesFissExtPeau = []    # edges des faces de fissure externe sur la peau (même indice)
-  edgesFissExtPipe = []    # edges des faces de fissure externe sur le pipe (même indice)
+
+  verticesEdgesFondIn = list() # les points du fond de fissure au débouché du pipe sur la peau (indice de edgesFondIn)
+  pipexts = list()             # les segments de pipe associés au points de fond de fissure débouchants (même indice)
+  cercles = list()             # les cercles de generation des pipes débouchant (même indice)
+  facesFissExt = list()        # les faces de la fissure externe associés au points de fond de fissure débouchants (même indice)
+  edgesFissExtPeau = list()    # edges des faces de fissure externe sur la peau (même indice)
+  edgesFissExtPipe = list()    # edges des faces de fissure externe sur le pipe (même indice)
 
   #logging.debug("edgesFondIn %s", edgesFondIn)
   for iedf, edge in enumerate(edgesFondIn):
     name = "edgeFondIn%d"%iedf
-    geompy.addToStudyInFather(partitionPeauFissFond, edge, name)
+    geomPublishInFather(initLog.debug, partitionPeauFissFond, edge, name)
     dist = [ geompy.MinDistance(pt, edge) for pt in verticesPipePeau]
     ptPeau = verticesPipePeau[dist.index(min(dist))] # le point de verticesPipePeau a distance minimale de l'edge
     [u, PointOnEdge, EdgeInWireIndex]  = geompy.MakeProjectionOnWire(ptPeau, wireFondFiss)
@@ -37,14 +58,14 @@ def identifieElementsDebouchants(ifil, facesDefaut, partitionPeauFissFond,
     localEdgeInFondFiss = edgesFondFiss[EdgeInWireIndex]
     centre = PointOnEdge
     centre2 = geompy.MakeVertexOnCurve(localEdgeInFondFiss, u)
-    geompy.addToStudyInFather(partitionPeauFissFond, centre2, "centre2_%d"%iedf)
+    geomPublishInFather(initLog.debug, partitionPeauFissFond, centre2, "centre2_%d"%iedf)
     verticesEdgesFondIn.append(centre)
     name = "verticeEdgesFondIn%d"%iedf
-    geompy.addToStudyInFather(partitionPeauFissFond, centre, name)
+    geomPublishInFather(initLog.debug, partitionPeauFissFond, centre, name)
     norm = geompy.MakeTangentOnCurve(localEdgeInFondFiss, u)
-    geompy.addToStudyInFather(partitionPeauFissFond, centre, "norm%d"%iedf)
+    geomPublishInFather(initLog.debug, partitionPeauFissFond, centre, "norm%d"%iedf)
     cercle = geompy.MakeCircle(centre, norm, rayonPipe)
-    geompy.addToStudyInFather(partitionPeauFissFond, cercle, "cerclorig%d"%iedf)
+    geomPublishInFather(initLog.debug, partitionPeauFissFond, cercle, "cerclorig%d"%iedf)
     [vertex] = geompy.ExtractShapes(cercle, geompy.ShapeType["VERTEX"], False)
     vec1 = geompy.MakeVector(centre, vertex)
     vec2 = geompy.MakeVector(centre, ptPeau)
@@ -55,8 +76,8 @@ def identifieElementsDebouchants(ifil, facesDefaut, partitionPeauFissFond,
     #   La partition filling / pipe reconstruit échoue.
     #   - Si on partitionne le filling avec un simple pipe obtenu par extrusion droite du cercle,
     #     cela donne un point en trop sur le cercle.
-    #   - Si on prend une vraie surface plane (pas un filling), on peut faire la partition avec 
-    #     les pipes reconstruits              
+    #   - Si on prend une vraie surface plane (pas un filling), on peut faire la partition avec
+    #     les pipes reconstruits
     logging.debug("angle=%s", angle)
     #if abs(angle) > 1.e-7:
     sommetAxe = geompy.MakeTranslationVector(centre, norm)
@@ -66,7 +87,7 @@ def identifieElementsDebouchants(ifil, facesDefaut, partitionPeauFissFond,
     else:
       cercle = geompy.MakeRotation(cercle, norm, -angle + math.pi)
     name = "cercle%d"%iedf
-    geompy.addToStudyInFather(partitionPeauFissFond, cercle, name)
+    geomPublishInFather(initLog.debug,partitionPeauFissFond, cercle, name)
     cercles.append(cercle)
 
     # --- estimation de la longueur du pipe necessaire de part et d'autre du point de sortie
@@ -79,39 +100,45 @@ def identifieElementsDebouchants(ifil, facesDefaut, partitionPeauFissFond,
     locPt1 = geompy.MakeVertexOnCurve(localEdgeInFondFiss, 1.0)
     sidePt0 = whichSide(faceTestPeau, locPt0)
     sidePt1 = whichSide(faceTestPeau, locPt1)
-    logging.debug("position centre cercle: %s, extremité edge u0: %s, u1: %s", sideCentre, sidePt0, sidePt1) 
+    logging.debug("position centre cercle: %s, extremité edge u0: %s, u1: %s", sideCentre, sidePt0, sidePt1)
     normFace = geompy.GetNormal(faceTestPeau, ptPeau)
     inclPipe = abs(geompy.GetAngleRadians(norm, normFace))
     lgp = max(rayonPipe/2., abs(3*rayonPipe*math.tan(inclPipe)))
     logging.debug("angle inclinaison Pipe en sortie: %s degres, lgp: %s", inclPipe*180/math.pi, lgp)
-    
+
     # --- position des points extremite du pipe sur l'edge debouchante
     #     il faut la distance curviligne ofp du point central par rapport à une extrémité de l'edge débouchante
-    locEdgePart = geompy.MakePartition([localEdgeInFondFiss],[centre], [], [], geompy.ShapeType["EDGE"], 0, [], 0)
+    locEdgePart = geompy.MakePartition([localEdgeInFondFiss],[centre], list(), list(), geompy.ShapeType["EDGE"], 0, list(), 0)
     edgesLoc = geompy.ExtractShapes(locEdgePart, geompy.ShapeType["EDGE"], False)
     edgesLocSorted =[(geompy.MinDistance(edge, locPt0), kk, edge) for kk, edge in enumerate(edgesLoc)]
     edgesLocSorted.sort()
-    ofp = geompy.BasicProperties(edgesLocSorted[0][2])[0] # distance curviligne centre locPt0
+    try:
+      ofp = geompy.BasicProperties(edgesLocSorted[0][2])[0] # distance curviligne centre locPt0
+    except:
+      texte = "Identification des éléments au débouché du pipe sur la face externe impossible. "
+      texte += "Cause possible : la ligne de fond de fissure comprend un point géométrique coincidant avec la face externe. "
+      texte += "La ligne de fond de fissure doit déboucher franchement de la face externe, et ne doit pas être coupée au niveau de la face."
+      raise fissError(traceback.extract_stack(),texte)
     logging.debug("distance curviligne centre extremite0: %s", ofp)
     p1 = geompy.MakeVertexOnCurveByLength(localEdgeInFondFiss, ofp +lgp, locPt0)
     p2 = geompy.MakeVertexOnCurveByLength(localEdgeInFondFiss, ofp -lgp, locPt0)
-    geompy.addToStudyInFather(wireFondFiss, p1, "p1_%d"%iedf)
-    geompy.addToStudyInFather(wireFondFiss, p2, "p2_%d"%iedf)
+    geomPublishInFather(initLog.debug, wireFondFiss, p1, "p1_%d"%iedf)
+    geomPublishInFather(initLog.debug, wireFondFiss, p2, "p2_%d"%iedf)
 
-    edgePart = geompy.MakePartition([localEdgeInFondFiss], [p1,p2], [], [], geompy.ShapeType["EDGE"], 0, [], 0)
+    edgePart = geompy.MakePartition([localEdgeInFondFiss], [p1,p2], list(), list(), geompy.ShapeType["EDGE"], 0, list(), 0)
     edps = geompy.ExtractShapes(edgePart, geompy.ShapeType["EDGE"], True)
     for edp in edps:
       if geompy.MinDistance(centre, edp) < 1.e-3:
         pipext = geompy.MakePipe(cercle, edp)
         name = "pipeExt%d"%iedf
-        geompy.addToStudyInFather(partitionPeauFissFond, pipext, name)
+        geomPublishInFather(initLog.debug, partitionPeauFissFond, pipext, name)
         pipexts.append(pipext)
 
     for ifa, face in enumerate(facesInside):
       logging.debug("recherche edges communes entre une face inside et (faces onside, edges pipe et fond débouchante)")
-      edgesPeauFis = []
-      edgesPipeFis = []
-      edgesPipeFnd = []
+      edgesPeauFis = list()
+      edgesPipeFis = list()
+      edgesPipeFnd = list()
       try:
         edgesPeauFis = geompy.GetSharedShapesMulti([geompy.MakeCompound(facesOnside), face], geompy.ShapeType["EDGE"])
         logging.debug("    faces onside %s",edgesPeauFis)
@@ -129,7 +156,7 @@ def identifieElementsDebouchants(ifil, facesDefaut, partitionPeauFissFond,
           logging.debug("    face %s inside ajoutée", ifa)
           facesFissExt.append(face)
           name="faceFissExt%d"%iedf
-          geompy.addToStudyInFather(partitionPeauFissFond, face, name)
+          geomPublishInFather(initLog.debug, partitionPeauFissFond, face, name)
           dist = 1.
           for ipe, edpe in enumerate(edgesPeauFis):
             for ipi, edpi in enumerate(edgesPipeFis):
@@ -137,12 +164,12 @@ def identifieElementsDebouchants(ifil, facesDefaut, partitionPeauFissFond,
               if dist < 1.e-3:
                 edgesFissExtPeau.append(edpe)
                 name="edgesFissExtPeau%d"%iedf
-                geompy.addToStudyInFather(partitionPeauFissFond, edpe, name)
+                geomPublishInFather(initLog.debug, partitionPeauFissFond, edpe, name)
                 edgesFissExtPipe.append(edpi)
                 name="edgesFissExtPipe%d"%iedf
-                geompy.addToStudyInFather(partitionPeauFissFond, edpi, name)
+                geomPublishInFather(initLog.debug, partitionPeauFissFond, edpi, name)
                 break
             if dist < 1.e-3:
               break
 
-  return (verticesEdgesFondIn, pipexts, cercles, facesFissExt, edgesFissExtPeau, edgesFissExtPipe)
\ No newline at end of file
+  return (verticesEdgesFondIn, pipexts, cercles, facesFissExt, edgesFissExtPeau, edgesFissExtPipe)