Salome HOME
Merge branch 'hydro/imps_2015' into V7_dev
[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 geomsmesh import geomPublish
7 from geomsmesh import geomPublishInFather
8 import initLog
9 from projettePointSurCourbe import projettePointSurCourbe
10
11 def creePointsPipePeau(listEdges, idFacesDebouchantes, idFillingFromBout,
12                        ptEdgeFond, ptFisExtPi, edCircPeau, gptsdisks, idisklim, nbsegRad):
13   """
14   création des points du maillage du pipe sur la face de peau
15   """
16   logging.info('start')
17   
18   for i, edges in enumerate(listEdges):
19     idf = idFacesDebouchantes[i] # indice de face débouchante (facesPipePeau)
20     if idf >= 0:
21       gptdsk = []
22       if idf > 0: # idf vaut 0 ou 1
23         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)
24       centre = ptEdgeFond[idFillingFromBout[i]][idf]
25       name = "centre%d"%idf
26       geomPublish(initLog.debug, centre, name)
27       vertPipePeau = ptFisExtPi[idFillingFromBout[i]][idf]
28       geomPublishInFather(initLog.debug, centre, vertPipePeau, "vertPipePeau")
29       grpsEdgesCirc = edCircPeau[idFillingFromBout[i]] # liste de groupes
30       edgesCirc = []
31       for grpEdgesCirc in grpsEdgesCirc:
32         edgesCirc += geompy.ExtractShapes(grpEdgesCirc, geompy.ShapeType["EDGE"], False)
33       for k, edge in enumerate(edges):
34         extrems = geompy.ExtractShapes(edge, geompy.ShapeType["VERTEX"], True)
35         if geompy.MinDistance(centre, extrems[0]) < geompy.MinDistance(centre, extrems[1]):
36           bout = extrems[1]
37         else:
38           bout = extrems[0]
39         # ajustement du point extrémité (bout) sur l'edge circulaire en face de peau
40         logging.debug("edgesCirc: %s", edgesCirc)
41         distEdgeCirc = [(geompy.MinDistance(bout, edgeCirc), k2, edgeCirc) for k2, edgeCirc in enumerate(edgesCirc)]
42         distEdgeCirc.sort()
43         logging.debug("distEdgeCirc: %s", distEdgeCirc)
44         u = projettePointSurCourbe(bout, distEdgeCirc[0][2])
45         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.
46           extrCircs = geompy.ExtractShapes(distEdgeCirc[0][2], geompy.ShapeType["VERTEX"], True)
47           if geompy.MinDistance(bout, extrCircs[0]) < geompy.MinDistance(bout, extrCircs[1]):
48             bout = extrCircs[0]
49           else:
50             bout = extrCircs[1]
51         else:
52           bout = geompy.MakeVertexOnCurve(distEdgeCirc[0][2], u)
53         name ="bout%d"%k
54         geomPublishInFather(initLog.debug, centre, bout, name)
55         # enregistrement des points dans la structure
56         points = []
57         for j in range(nbsegRad +1):
58           u = j/float(nbsegRad)
59           points.append(geompy.MakeVertexOnCurve(edge, u))
60         if geompy.MinDistance(bout, points[0]) < geompy.MinDistance(centre, points[0]):
61           points.reverse()
62         points[0] = centre
63         points[-1] = bout
64         gptdsk.append(points)
65       if i == 0:
66         gptsdisks[idisklim[0] -1] = gptdsk
67         idisklim[0] = idisklim[0] -1
68       else:
69         gptsdisks[idisklim[1] +1] = gptdsk
70         idisklim[1] = idisklim[1] +1
71         
72   return (gptsdisks, idisklim)