Salome HOME
PR: add blocFissure plugin
[modules/smesh.git] / src / Tools / blocFissure / gmu / getCentreFondFiss.py
diff --git a/src/Tools/blocFissure/gmu/getCentreFondFiss.py b/src/Tools/blocFissure/gmu/getCentreFondFiss.py
new file mode 100644 (file)
index 0000000..6c04d36
--- /dev/null
@@ -0,0 +1,77 @@
+# -*- coding: utf-8 -*-
+
+import logging
+from geomsmesh import geompy
+import bisect
+
+publie = False
+
+def getCentreFondFiss(shapesFissure):
+  """
+  identification du centre de fond de fissure,
+  transformation fond de fissure en edge unique (seulement pour la procédure insereFissureGenerale).
+  On distingue le cas d'utilisation de la procédure insereFissureLongue par le nombre d'éléments de shapesFissure.
+  """
+  global publie
+  logging.debug("start")
+  
+  fondFiss          = shapesFissure[4] # groupe d'edges de fond de fissure
+  if len(shapesFissure) == 6:          # procédure insereFissureGenerale, et edge fond de fissure fournie explicitement
+    edgeFondExt     = shapesFissure[5]
+  else:
+    edgeFondExt     = None
+  
+  if len(shapesFissure) > 6:           # procédure insereFissureLongue (fissure plane, plusieurs edges sur le fond de fissure)
+    centreFondFiss = shapesFissure[1]
+    tgtCentre = None
+  else:                                # procédure insereFissureGenerale, détermination edge unique et milieu de l'edge
+    if geompy.NumberOfEdges(fondFiss) > 1:
+      if geompy.NbShapes(fondFiss, geompy.ShapeType["WIRE"]) > 0: # wire
+        aWire = fondFiss
+      else:                                                       # compound
+        edges = geompy.ExtractShapes(fondFiss, geompy.ShapeType["EDGE"], False)
+        aWire = geompy.MakeWire(edges, 1e-07)
+    else:
+      edgeFondExt = fondFiss
+      aWire = geompy.MakeWire([fondFiss], 1e-07)
+    if not publie:
+      geompy.addToStudy(aWire, "wireFondFissExt")
+        
+    lgWire = geompy.BasicProperties(aWire)[0]
+    edges = geompy.ExtractShapes(aWire, geompy.ShapeType["EDGE"], True)
+    lgEdges = [geompy.BasicProperties(ed)[0] for ed in edges]
+    lgSumEd =[sum(lgEdges[0:i+1]) for i in range(len(lgEdges))]
+    iedr = bisect.bisect_left(lgSumEd, lgWire/2.0)
+    iedg = iedr -1
+    if iedg < 0:
+      lgOnEdge = lgWire/2.0
+    else:
+      lgOnEdge = lgWire/2.0 - lgSumEd[iedg]
+    logging.debug("lgsumEdges %s", lgSumEd)
+    logging.debug("id edge: %s, lgOnEdge: %s, lgEdge: %s",iedr, lgOnEdge, lgEdges[iedr])
+    if iedr > 0: # il y a une edge avant celle du milieu
+      if geompy.MinDistance(edges[iedr-1], geompy.MakeVertexOnCurve(edges[iedr], 0.0 )) < 1.e-3: # edge orientée croissante 
+        centreFondFiss = geompy.MakeVertexOnCurve(edges[iedr], lgOnEdge/lgEdges[iedr])
+      else:
+        centreFondFiss = geompy.MakeVertexOnCurve(edges[iedr], 1.0 - lgOnEdge/lgEdges[iedr])
+    elif iedr < len(edges)-1: # il y a une edge après celle du milieu
+      if geompy.MinDistance(edges[iedr+1], geompy.MakeVertexOnCurve(edges[iedr], 1.0 )) < 1.e-3: # edge orientée croissante
+        centreFondFiss = geompy.MakeVertexOnCurve(edges[iedr], lgOnEdge/lgEdges[iedr])
+      else:
+        centreFondFiss = geompy.MakeVertexOnCurve(edges[iedr], 1.0 - lgOnEdge/lgEdges[iedr])
+    else: # on ne sait pas comment est orientée l'edge unique, mais ça n'a pas d'importance
+      centreFondFiss = geompy.MakeVertexOnCurve(edges[iedr], lgOnEdge/lgEdges[iedr])
+    geompy.addToStudyInFather(aWire, centreFondFiss, "centreFondFiss")
+    tgtCentre = geompy.MakeTangentOnCurve(edges[iedr], lgOnEdge/ lgEdges[iedr])
+    
+    if edgeFondExt is None: # fond de fissure non fourni explicitement sous forme d'edge
+      try:
+        edgeFondExt = geompy.MakeEdgeWire(aWire, 0.0005, 1e-07)
+      except:
+        logging.debug("erreur MakeEdgeWire sur fond de fissure, on fait sans")
+        edgeFondExt = None
+    if not publie and edgeFondExt is not None:
+      geompy.addToStudy(edgeFondExt, "edgeFondExt")
+  
+  publie = True
+  return edgeFondExt, centreFondFiss, tgtCentre