Salome HOME
essai formalisation niveaux de debug
[modules/smesh.git] / src / Tools / blocFissure / gmu / identifieFacesPeau.py
1 # -*- coding: utf-8 -*-
2
3 import logging
4
5 from geomsmesh import geompy
6
7 from sortFaces import sortFaces
8 from extractionOrientee import extractionOrientee
9
10 def identifieFacesPeau(ifil, verticesPipePeau, facesOnside, wireFondFiss,
11                        verticesEdgesFondIn, pipexts, cercles,
12                        fillingFaceExterne, centreFondFiss):
13   """
14   inventaire des faces de peau : face de peau percée du pipe, extrémités du pipe
15   La partition avec le pipe peut créer un vertex (et un edge) de trop sur le cercle projeté,
16   quand le cercle est très proche de la face.
17   dans ce cas, la projection du cercle sur la face suivie d'une partition permet
18   d'éviter le point en trop
19   """
20   logging.info('start')
21    
22   facesAndFond = facesOnside
23   facesAndFond.append(wireFondFiss)
24   try:
25     partitionPeauByPipe = geompy.MakePartition(facesAndFond, pipexts, [], [], geompy.ShapeType["FACE"], 0, [], 1)
26   except:
27     logging.debug("probleme partition face pipe, contournement avec MakeSection")
28     sections = []
29     for pipext in pipexts:
30       sections.append(geompy.MakeSection(facesOnside[0], pipext))
31     partitionPeauByPipe = geompy.MakePartition(facesAndFond, sections, [], [], geompy.ShapeType["FACE"], 0, [], 1)
32     
33   # contrôle edge en trop sur edges circulaires
34   if len(verticesPipePeau) > 0: # --- au moins une extrémité du pipe sur cette face de peau
35     edgeEnTrop = []
36     outilPart = pipexts
37     facesPeau = geompy.ExtractShapes(partitionPeauByPipe, geompy.ShapeType["FACE"], False)
38     facesPeauSorted, minsur, maxsurf = sortFaces(facesPeau)
39     for i, face in enumerate(facesPeauSorted[:-1]): # on ne teste que la ou les petites faces "circulaires"
40       nbv = geompy.NumberOfEdges(face)
41       logging.debug("nombre d'edges sur face circulaire: %s", nbv)
42       if nbv > 3:
43         edgeEnTrop.append(True) # TODO : distinguer les cas avec deux faces circulaires dont l'une est correcte
44       else:
45         edgeEnTrop.append(False)
46     refaire = sum(edgeEnTrop)
47     if refaire > 0:
48       dc = [(geompy.MinDistance(verticesEdgesFondIn[0], fac), i)  for i, fac in enumerate(facesPeauSorted[:-1])]
49       dc.sort()
50       logging.debug("dc sorted: %s", dc)
51       i0 = dc[0][1] # indice de facesPeauSorted qui correspond à verticesEdgesFondIn[0], donc 0 pour cercles
52       direct = (i0 == 0)
53       for i, bad in enumerate(edgeEnTrop):
54         if direct:
55           j = i
56         else:
57           j = 1-i
58         if bad:
59           outilPart[j] = geompy.MakeProjection(cercles[j],facesOnside[0])
60         pass
61       partitionPeauByPipe = geompy.MakePartition(facesAndFond, outilPart, [], [], geompy.ShapeType["FACE"], 0, [], 1)
62       pass
63       
64   name="partitionPeauByPipe%d"%ifil
65   geompy.addToStudy(partitionPeauByPipe, name)
66   [edgesPeauFondIn, edgesPeauFondOut, edgesPeauFondOn] = extractionOrientee(fillingFaceExterne, partitionPeauByPipe, centreFondFiss, "EDGE", 1.e-3)
67   [facesPeauFondIn, facesPeauFondOut, facesPeauFondOn] = extractionOrientee(fillingFaceExterne, partitionPeauByPipe, centreFondFiss, "FACE", 1.e-3)
68     
69   if len(verticesPipePeau) > 0: # --- au moins une extrémité du pipe sur cette face de peau
70     facesPeauSorted, minsur, maxsurf = sortFaces(facesPeauFondOn)
71     facePeau = facesPeauSorted[-1] # la plus grande face
72   else:
73     facePeau =geompy.MakePartition(facesPeauFondOn, [], [], [], geompy.ShapeType["FACE"], 0, [], 1)
74     facesPeauSorted = [facePeau]
75   name="facePeau%d"%ifil
76   geompy.addToStudy(facePeau, name)
77
78   return (facePeau, facesPeauSorted, edgesPeauFondIn)