1 # -*- coding: utf-8 -*-
4 from geomsmesh import geompy
6 # -----------------------------------------------------------------------------
7 # --- calcul de la position d'une shape par rapport à une face (dessus, dessous, sur la surface même)
9 def whichSideMulti(facerefs, ifil, obj, centre, tol = 1.e-3):
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
18 logging.debug('start')
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
26 point = geompy.MakeVertexOnCurve(obj, 0.5)
27 vertices.append(point)
29 edges = geompy.ExtractShapes(obj, geompy.ShapeType["EDGE"], False)
31 point = geompy.MakeVertexOnCurve(anEdge, 0.5)
32 vertices.append(point)
37 for vertex in vertices:
39 for i, face in enumerate(facerefs):
40 distance = geompy.MinDistance(vertex, face)
41 logging.debug(" distance %s", distance)
43 if geompy.MinDistance(vertex, centre) > tol:
44 line = geompy.MakeLineTwoPnt(vertex, centre)
46 side = 1 # le centre est inside...
48 part = geompy.MakePartition([line], [face], [], [], geompy.ShapeType["EDGE"], 0, [], 0)
49 nbpts = geompy.NbShapes(part,geompy.ShapeType["VERTEX"])
55 pass # peut-être inside, tester les autres faces
58 nbOnRef +=1 # le point est sur la face de référence, on continue avec les autres points
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):
67 if side == 0 and nbOnRef < len(vertices):
69 logging.debug(" side %s", side)