Salome HOME
PR: add blocFissure plugin
[modules/smesh.git] / src / Tools / blocFissure / gmu / partitionBlocDefaut.py
diff --git a/src/Tools/blocFissure/gmu/partitionBlocDefaut.py b/src/Tools/blocFissure/gmu/partitionBlocDefaut.py
new file mode 100644 (file)
index 0000000..4016c9a
--- /dev/null
@@ -0,0 +1,160 @@
+# -*- coding: utf-8 -*-
+
+import logging
+from geomsmesh import geompy
+
+# -----------------------------------------------------------------------------
+# --- partition du bloc defaut par generatrice, tore et plan fissure
+
+def partitionBlocDefaut(volDefaut, facesDefaut, gener, pipe,
+                        facefis, ellipsoide):
+  """
+  Partition du bloc defaut par la generatrice de l'ellipse,
+  le tore elliptique, la face plane de fissure
+  @param volDefaut : le bloc defaut
+  @param gener : la generatrice de l'ellipse, positionnée dans l'espace
+  @param pipe : le tore partitionné par le plan de fissure, positionné
+  dans l'espace
+  @param facefis : la face plane de la fissure, positionnée dans l'espace
+  @return (volDefautPart, blocp, tore, faceFissure), le bloc partitionné,
+  les sous shapes issues de la partition
+  (le bloc moins le tore, la generatrice, le tore, la face de fissure)
+  """
+  logging.info("start")
+
+  volDefautPart = geompy.MakePartition([volDefaut], [pipe, facefis, ellipsoide], [], [], geompy.ShapeType["SOLID"], 0, [], 1)
+  blocp = geompy.GetInPlaceByHistory(volDefautPart, volDefaut)
+  #gencnt = geompy.GetInPlaceByHistory(volDefautPart, gener)
+  tore = geompy.GetInPlaceByHistory(volDefautPart, pipe)
+  faceFissure = geompy.GetInPlaceByHistory(volDefautPart, facefis)
+  #ellipsoidep =geompy.GetInPlaceByHistory(volDefautPart, ellipsoide)
+
+  geompy.addToStudy( volDefautPart, 'volDefautPart' )
+  geompy.addToStudyInFather( volDefautPart, tore, 'tore' )
+  geompy.addToStudyInFather( volDefautPart, faceFissure, 'FACE1' )
+  #geompy.addToStudyInFather( volDefautPart, gencnt, 'generatrice' )
+
+  solids = geompy.ExtractShapes(blocp, geompy.ShapeType["SOLID"], True)
+  vols = []
+  for i in range(len(solids)):
+    props = geompy.BasicProperties(solids[i])
+    vols.append(props[2])
+  maxvol = max(vols)
+  imaxvol = vols.index(maxvol)
+  blocp = solids[imaxvol]
+  vols[imaxvol] = 0
+  maxvol = max(vols)
+  imaxvol = vols.index(maxvol)
+  ellipsoidep = solids[imaxvol]
+
+  geompy.addToStudyInFather( volDefautPart, blocp, 'bloc' )
+  geompy.addToStudyInFather( volDefautPart, ellipsoidep, 'ellipsoide' )
+
+  sharedFaces = geompy.GetSharedShapesMulti([blocp, ellipsoidep], geompy.ShapeType["FACE"])
+  for i in range(len(sharedFaces)):
+    name = "faceCommuneEllipsoideBloc_%d"%i
+    geompy.addToStudyInFather(blocp, sharedFaces[i], name)
+
+  #sharedEdges = geompy.GetSharedShapesMulti([blocp, ellipsoidep], geompy.ShapeType["EDGE"])
+  allSharedEdges = geompy.GetSharedShapesMulti([blocp, ellipsoidep], geompy.ShapeType["EDGE"])
+  sharedEdges = []
+  for i in range(len(allSharedEdges)):
+    if geompy.NbShapes(allSharedEdges[i], geompy.ShapeType["VERTEX"]) > 1: # edge non degeneree
+      sharedEdges.append(allSharedEdges[i])
+  for i in range(len(sharedEdges)):
+    name = "edgeCommuneEllipsoideBloc_%d"%i
+    geompy.addToStudyInFather(blocp, sharedEdges[i], name)
+
+  facesExternes = []
+  facesExtBloc = []
+  facesExtElli = []
+  faces = geompy.ExtractShapes(facesDefaut, geompy.ShapeType["FACE"], True)
+  if len(faces) == 0:
+    faces = [facesDefaut]
+  for i in range(len(faces)):
+    faceExt = geompy.GetInPlace(ellipsoidep, faces[i])
+    if faceExt is not None:
+      name = "faceExterne_e%d"%i
+      geompy.addToStudyInFather(ellipsoidep, faceExt, name)
+      facesExternes.append(faceExt)
+      facesExtElli.append(faceExt)
+
+    faceExt = geompy.GetInPlace(blocp, faces[i])
+    if faceExt is not None:
+      name = "faceExterne_b%d"%i
+      geompy.addToStudyInFather(blocp, faceExt, name)
+      facesExternes.append(faceExt)
+      facesExtBloc.append(faceExt)
+    else:
+      logging.info("  recherche faces externes par GetShapesOnShape")
+      vertex = geompy.MakeVertexOnSurface(faces[i], 0.5, 0.5)
+      normal = geompy.GetNormal(faces[i], vertex)
+      extrusionFace = geompy.MakePrismVecH(faces[i], normal, 1)
+      #extrusionFace = geompy.MakePrismVecH2Ways(faces[i], normal, 0.1)
+      #extrusionFace = geompy.MakeScaleTransform(extrusionFace, vertex, 1.01)
+      name = "extrusionFace_b%d"%i
+      geompy.addToStudyInFather(blocp, extrusionFace, name)
+      #facesExt = geompy.GetShapesOnShape(extrusionFace, blocp, geompy.ShapeType["FACE"], GEOM.ST_ONIN)
+      facesExt = geompy.GetShapesOnShape(extrusionFace, blocp, geompy.ShapeType["FACE"], GEOM.ST_ON)
+      for j in range(len(facesExt)):
+        name = "faceExterne_b%d_%d"%(i,j)
+        geompy.addToStudyInFather(blocp, facesExt[j], name)
+        facesExternes.append(facesExt[j])
+        facesExtBloc.append(facesExt[j])
+
+  if len(facesExtBloc) < len(faces): # toutes les faces externes du bloc n'ont pas été trouvées. TODO eliminer les detections  multiples
+    logging.info("  recherche faces externes par aretes partagees avec faces externes ellipsoide")
+    facesBloc = geompy.ExtractShapes(blocp, geompy.ShapeType["FACE"], True)
+    for i in range(len(facesBloc)):
+      notOnEllipsoide = True
+      for j in range(len(sharedFaces)): # eliminer les faces communes avec l'ellipsoide
+        if facesBloc[i].IsSame(sharedFaces[j]):
+          notOnEllipsoide = False
+          break
+      if notOnEllipsoide:
+        for j in range(len(facesExtElli)): # les faces recherchees ont une ou plusieurs edge communes avec la ou les faces externes de l'ellipsoide
+          allSharedEdges = []
+          try:
+            allSharedEdges += geompy.GetSharedShapesMulti([facesBloc[i], facesExtElli[j]], geompy.ShapeType["EDGE"])
+          except:
+            pass
+          if len(allSharedEdges) > 0:
+            name = "faceExterne_b%d_%d"%(i,j)
+            geompy.addToStudyInFather(blocp, facesBloc[i], name)
+            facesExternes.append(facesBloc[i])
+            facesExtBloc.append(facesBloc[i])
+
+  aretesInternes = []
+  for i in range(len(facesExternes)):
+    for j in range(i+1,len(facesExternes)):
+      shared = []
+      try:
+        shared += geompy.GetSharedShapesMulti([facesExternes[i], facesExternes[j]], geompy.ShapeType["EDGE"])
+      except:
+        logging.info("no shared edges in %s,%s",i,j)
+      else:
+        aretesInternes += shared
+  for i in range(len(aretesInternes)):
+    name = "aretesInternes_%d"%i
+    geompy.addToStudyInFather(blocp, aretesInternes[i], name)
+
+  edgesBords = []
+  for faceExtB in facesExtBloc:
+    edges = geompy.ExtractShapes(faceExtB, geompy.ShapeType["EDGE"], True)
+    for i in range(len(edges)):
+      isInterne = False
+      for j in range(len(aretesInternes)):
+        if edges[i].IsSame(aretesInternes[j]):
+          isInterne = True
+          break
+      if not isInterne:
+        edgesBords.append(edges[i])
+        name = "edgeBord%d"%i
+        geompy.addToStudyInFather(blocp,edges[i] , name)
+  group = None
+  if len(edgesBords) > 0:
+    group = geompy.CreateGroup(blocp, geompy.ShapeType["EDGE"])
+    geompy.UnionList(group, edgesBords)
+  edgesBords = group
+
+  return volDefautPart, blocp, tore, faceFissure, facesExternes, facesExtBloc, facesExtElli, aretesInternes, ellipsoidep, sharedFaces, sharedEdges, edgesBords