Salome HOME
debug
[modules/smesh.git] / src / Tools / blocFissure / gmu / elimineExtremitesPipe.py
1 # -*- coding: utf-8 -*-
2
3 import logging
4
5 from geomsmesh import geompy
6 from whichSideVertex import whichSideVertex
7
8 def elimineExtremitesPipe(ptEdgeFond, facesDefaut, centres, gptsdisks, nbsegCercle):
9   """
10   recherche des points en trop (externes au volume à remailler)
11   - on associe chaque extrémité du pipe à une face filling 
12   - on part des disques aux extrémités du pipe
13   - pour chaque disque, on prend les vertices de géométrie,
14     on marque leur position relative à la face.
15   - on s'arrete quand tous les noeuds sont dedans
16   """
17   
18   logging.info('start')
19
20   pt0 = centres[0]
21   pt1 = centres[-1]
22   idFillingFromBout = [None, None]                 # contiendra l'index du filling pour les extrémités 0 et 1
23   nbFacesFilling = len(ptEdgeFond)
24   for ifil in range(nbFacesFilling):
25     for ipt, pt in enumerate(ptEdgeFond[ifil]): # il y a un ou deux points débouchant sur cette face
26       if geompy.MinDistance(pt,pt0) < geompy.MinDistance(pt,pt1): # TODO: trouver plus fiable pour les cas tordus...
27         idFillingFromBout[0] = ifil
28       else: 
29         idFillingFromBout[1] = ifil
30   logging.debug("association bouts du pipe - faces de filling: %s", idFillingFromBout)
31      
32   logging.debug("recherche des disques de noeuds complètement internes")
33   idisklim = [] # indices des premier et dernier disques internes
34   idiskout = [] # indices des premier et dernier disques externes
35   for bout in range(2):
36     if bout == 0:
37       idisk = -1
38       inc = 1
39       numout = -1
40     else:
41       idisk = len(gptsdisks)
42       inc = -1
43       numout = len(gptsdisks)
44     inside = False
45     outside = True
46     while not inside:
47       idisk = idisk + inc
48       logging.debug("examen disque %s", idisk)
49       gptdsk = gptsdisks[idisk]
50       inside = True
51       for k in range(nbsegCercle):
52         points = gptdsk[k]
53         for j, pt in enumerate(points):
54           side = whichSideVertex(facesDefaut[idFillingFromBout[bout]], pt)
55           if side < 0:
56             if outside: # premier point detecté dedans
57               outside = False
58               numout = idisk -inc # le disque précédent était dehors
59           else:
60             inside = False # ce point est dehors              
61         if not inside and not outside:
62           break
63     idisklim.append(idisk)  # premier et dernier disques internes
64     idiskout.append(numout) # premier et dernier disques externes
65     
66   return (idFillingFromBout, idisklim, idiskout)