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