Salome HOME
debug
[modules/smesh.git] / src / Tools / blocFissure / gmu / whichSideMulti.py
1 # -*- coding: utf-8 -*-
2
3 import logging
4 from geomsmesh import geompy
5
6 # -----------------------------------------------------------------------------
7 # --- calcul de la position d'une shape par rapport à une face (dessus, dessous, sur la surface même)
8
9 def whichSideMulti(facerefs, ifil, obj, centre, tol = 1.e-3):
10   """
11   Position d'un objet par rapport a un ensemble de faces (non nécessairement planes).
12   Ces faces délimitent partiellement un volume, le point "centre" est supposé dans le volume
13   L'objet est supposé situé entierement d'un coté des faces,
14   ou appartenant totalement à une face (objets traversants non pris en compte)
15   renvoie 1 si 'objet est dedans (inside),
16   -1 dehors (outside), 0 si il est sur une face d'index ifil
17   """
18   logging.debug('start')
19   side = 0
20   logging.debug("shape info %s", geompy.ShapeInfo(obj))
21   nbEdges = geompy.NbShapes(obj, geompy.ShapeType["EDGE"]) # --- attention ! pour une seule edge presente, renvoie 2
22   logging.debug("   nbEdges %s", nbEdges)
23   vertices = geompy.ExtractShapes(obj, geompy.ShapeType["VERTEX"], False)
24   if nbEdges > 0 : # --- edges
25     if nbEdges <= 2:
26       point = geompy.MakeVertexOnCurve(obj, 0.5)
27       vertices.append(point)
28     else:
29       edges = geompy.ExtractShapes(obj, geompy.ShapeType["EDGE"], False)
30       for anEdge in edges:
31         point = geompy.MakeVertexOnCurve(anEdge, 0.5)
32         vertices.append(point)
33   else: # --- vertices
34     vertices = [obj]
35   nbOnRef = 0
36   nbOnOther = 0
37   for vertex in vertices:
38     nbMiss = 0
39     for i, face in enumerate(facerefs):
40       distance = geompy.MinDistance(vertex, face)
41       logging.debug("    distance %s", distance)
42       if distance > tol:
43         if geompy.MinDistance(vertex, centre) > tol:
44           line = geompy.MakeLineTwoPnt(vertex, centre)
45         else :
46           side = 1       # le centre est inside...
47           break
48         part = geompy.MakePartition([line], [face], [], [], geompy.ShapeType["EDGE"], 0, [], 0)
49         nbpts = geompy.NbShapes(part,geompy.ShapeType["VERTEX"])
50         if nbpts > 2:
51           side = -1      # outside
52           break
53         else:
54           nbMiss += 1
55           pass           # peut-être inside, tester les autres faces
56       else:
57         if i == ifil:
58           nbOnRef +=1    # le point est sur la face de référence, on continue avec les autres points
59           break
60         else:
61           nbOnOther += 1 # le point est sur une autre face, mais il peut aussi être sur la face de référence...
62           pass           # on peut tester les autres faces
63     if nbMiss == len(facerefs):
64       side = 1 # inside
65     if side != 0:
66       break
67   if side == 0 and nbOnRef < len(vertices):
68     side = 1   # inside  
69   logging.debug("  side %s", side)
70   return side
71