Salome HOME
Merge branch 'master' into pra/blocFissure
[modules/smesh.git] / src / Tools / blocFissure / gmu / creePointsPipePeau.py
1 # -*- coding: utf-8 -*-
2
3 import logging
4
5 from geomsmesh import geompy
6 from projettePointSurCourbe import projettePointSurCourbe
7
8 def creePointsPipePeau(listEdges, idFacesDebouchantes, idFillingFromBout,
9                        ptEdgeFond, ptFisExtPi, edCircPeau, gptsdisks, idisklim, nbsegRad):
10   """
11   création des points du maillage du pipe sur la face de peau
12   """
13   logging.info('start')
14   
15   for i, edges in enumerate(listEdges):
16     idf = idFacesDebouchantes[i] # indice de face débouchante (facesPipePeau)
17     if idf >= 0:
18       gptdsk = []
19       if idf > 0: # idf vaut 0 ou 1
20         idf = -1  # si idf vaut 1, on prend le dernier élément de la liste (1 ou 2 extrémités débouchent sur la face)
21       centre = ptEdgeFond[idFillingFromBout[i]][idf]
22       name = "centre%d"%idf
23       geompy.addToStudy(centre, name)
24       vertPipePeau = ptFisExtPi[idFillingFromBout[i]][idf]
25       geompy.addToStudyInFather(centre, vertPipePeau, "vertPipePeau")
26       grpsEdgesCirc = edCircPeau[idFillingFromBout[i]] # liste de groupes
27       edgesCirc = []
28       for grpEdgesCirc in grpsEdgesCirc:
29         edgesCirc += geompy.ExtractShapes(grpEdgesCirc, geompy.ShapeType["EDGE"], False)
30       for k, edge in enumerate(edges):
31         extrems = geompy.ExtractShapes(edge, geompy.ShapeType["VERTEX"], True)
32         if geompy.MinDistance(centre, extrems[0]) < geompy.MinDistance(centre, extrems[1]):
33           bout = extrems[1]
34         else:
35           bout = extrems[0]
36         # ajustement du point extrémité (bout) sur l'edge circulaire en face de peau
37         logging.debug("edgesCirc: %s", edgesCirc)
38         distEdgeCirc = [(geompy.MinDistance(bout, edgeCirc), k2, edgeCirc) for k2, edgeCirc in enumerate(edgesCirc)]
39         distEdgeCirc.sort()
40         logging.debug("distEdgeCirc: %s", distEdgeCirc)
41         u = projettePointSurCourbe(bout, distEdgeCirc[0][2])
42         if (abs(u) < 0.02) or (abs(1-u) < 0.02): # les points très proches d'une extrémité doivent y être mis précisément.
43           extrCircs = geompy.ExtractShapes(distEdgeCirc[0][2], geompy.ShapeType["VERTEX"], True)
44           if geompy.MinDistance(bout, extrCircs[0]) < geompy.MinDistance(bout, extrCircs[1]):
45             bout = extrCircs[0]
46           else:
47             bout = extrCircs[1]
48         else:
49           bout = geompy.MakeVertexOnCurve(distEdgeCirc[0][2], u)
50         name ="bout%d"%k
51         geompy.addToStudyInFather(centre, bout, name)
52         # enregistrement des points dans la structure
53         points = []
54         for j in range(nbsegRad +1):
55           u = j/float(nbsegRad)
56           points.append(geompy.MakeVertexOnCurve(edge, u))
57         if geompy.MinDistance(bout, points[0]) < geompy.MinDistance(centre, points[0]):
58           points.reverse()
59         points[0] = centre
60         points[-1] = bout
61         gptdsk.append(points)
62       if i == 0:
63         gptsdisks[idisklim[0] -1] = gptdsk
64         idisklim[0] = idisklim[0] -1
65       else:
66         gptsdisks[idisklim[1] +1] = gptdsk
67         idisklim[1] = idisklim[1] +1
68         
69   return (gptsdisks, idisklim)