Salome HOME
Merge branch 'hydro/imps_2015' into V7_dev
[modules/smesh.git] / src / Tools / blocFissure / gmu / getCentreFondFiss.py
1 # -*- coding: utf-8 -*-
2
3 import logging
4 from geomsmesh import geompy
5 from geomsmesh import geomPublish
6 from geomsmesh import geomPublishInFather
7 import initLog
8 import bisect
9
10 publie = False
11
12 def getCentreFondFiss(shapesFissure):
13   """
14   identification du centre de fond de fissure,
15   transformation fond de fissure en edge unique (seulement pour la procédure construitFissureGenerale).
16   On distingue le cas d'utilisation de la procédure insereFissureLongue par le nombre d'éléments de shapesFissure.
17   """
18   global publie
19   logging.debug("start")
20   
21   fondFiss          = shapesFissure[4] # groupe d'edges de fond de fissure
22   if len(shapesFissure) == 6:          # procédure construitFissureGenerale, et edge fond de fissure fournie explicitement
23     edgeFondExt     = shapesFissure[5]
24   else:
25     edgeFondExt     = None
26   
27   if len(shapesFissure) > 6:           # procédure insereFissureLongue (fissure plane, plusieurs edges sur le fond de fissure)
28     centreFondFiss = shapesFissure[1]
29     tgtCentre = None
30   else:                                # procédure construitFissureGenerale, détermination edge unique et milieu de l'edge
31     if geompy.NumberOfEdges(fondFiss) > 1:
32       if geompy.NbShapes(fondFiss, geompy.ShapeType["WIRE"]) > 0: # wire
33         aWire = fondFiss
34       else:                                                       # compound
35         edges = geompy.ExtractShapes(fondFiss, geompy.ShapeType["EDGE"], False)
36         aWire = geompy.MakeWire(edges, 1e-07)
37     else:
38       edgeFondExt = fondFiss
39       aWire = geompy.MakeWire([fondFiss], 1e-07)
40     if not publie:
41       geomPublish(initLog.debug, aWire, "wireFondFissExt")
42         
43     lgWire = geompy.BasicProperties(aWire)[0]
44     edges = geompy.ExtractShapes(aWire, geompy.ShapeType["EDGE"], True)
45     lgEdges = [geompy.BasicProperties(ed)[0] for ed in edges]
46     lgSumEd =[sum(lgEdges[0:i+1]) for i in range(len(lgEdges))]
47     iedr = bisect.bisect_left(lgSumEd, lgWire/2.0)
48     iedg = iedr -1
49     if iedg < 0:
50       lgOnEdge = lgWire/2.0
51     else:
52       lgOnEdge = lgWire/2.0 - lgSumEd[iedg]
53     logging.debug("lgsumEdges %s", lgSumEd)
54     logging.debug("id edge: %s, lgOnEdge: %s, lgEdge: %s",iedr, lgOnEdge, lgEdges[iedr])
55     if iedr > 0: # il y a une edge avant celle du milieu
56       if geompy.MinDistance(edges[iedr-1], geompy.MakeVertexOnCurve(edges[iedr], 0.0 )) < 1.e-3: # edge orientée croissante 
57         centreFondFiss = geompy.MakeVertexOnCurve(edges[iedr], lgOnEdge/lgEdges[iedr])
58       else:
59         centreFondFiss = geompy.MakeVertexOnCurve(edges[iedr], 1.0 - lgOnEdge/lgEdges[iedr])
60     elif iedr < len(edges)-1: # il y a une edge après celle du milieu
61       if geompy.MinDistance(edges[iedr+1], geompy.MakeVertexOnCurve(edges[iedr], 1.0 )) < 1.e-3: # edge orientée croissante
62         centreFondFiss = geompy.MakeVertexOnCurve(edges[iedr], lgOnEdge/lgEdges[iedr])
63       else:
64         centreFondFiss = geompy.MakeVertexOnCurve(edges[iedr], 1.0 - lgOnEdge/lgEdges[iedr])
65     else: # on ne sait pas comment est orientée l'edge unique, mais ça n'a pas d'importance
66       centreFondFiss = geompy.MakeVertexOnCurve(edges[iedr], lgOnEdge/lgEdges[iedr])
67     geomPublishInFather(initLog.debug,aWire, centreFondFiss, "centreFondFiss")
68     tgtCentre = geompy.MakeTangentOnCurve(edges[iedr], lgOnEdge/ lgEdges[iedr])
69     
70     if edgeFondExt is None: # fond de fissure non fourni explicitement sous forme d'edge
71       try:
72         edgeFondExt = geompy.MakeEdgeWire(aWire, 0.0005, 1e-07)
73       except:
74         logging.debug("erreur MakeEdgeWire sur fond de fissure, on fait sans")
75         edgeFondExt = None
76     if not publie and edgeFondExt is not None:
77       geomPublish(initLog.debug, edgeFondExt, "edgeFondExt")
78   
79   publie = True
80   return edgeFondExt, centreFondFiss, tgtCentre