Salome HOME
Copyright update 2020
[modules/smesh.git] / src / Tools / blocFissure / gmu / creePointsPipePeau.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2020  EDF R&D
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20
21 import logging
22
23 from .geomsmesh import geompy
24 from .geomsmesh import geomPublish
25 from .geomsmesh import geomPublishInFather
26 from . import initLog
27 from .projettePointSurCourbe import projettePointSurCourbe
28
29 def creePointsPipePeau(listEdges, idFacesDebouchantes, idFillingFromBout,
30                        ptEdgeFond, ptFisExtPi, edCircPeau, gptsdisks, idisklim, nbsegRad):
31   """
32   création des points du maillage du pipe sur la face de peau
33   """
34   logging.info('start')
35   
36   for i, edges in enumerate(listEdges):
37     idf = idFacesDebouchantes[i] # indice de face débouchante (facesPipePeau)
38     if idf >= 0:
39       gptdsk = []
40       if idf > 0: # idf vaut 0 ou 1
41         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)
42       centre = ptEdgeFond[idFillingFromBout[i]][idf]
43       name = "centre%d"%idf
44       geomPublish(initLog.debug, centre, name)
45       vertPipePeau = ptFisExtPi[idFillingFromBout[i]][idf]
46       geomPublishInFather(initLog.debug, centre, vertPipePeau, "vertPipePeau")
47       grpsEdgesCirc = edCircPeau[idFillingFromBout[i]] # liste de groupes
48       edgesCirc = []
49       for grpEdgesCirc in grpsEdgesCirc:
50         edgesCirc += geompy.ExtractShapes(grpEdgesCirc, geompy.ShapeType["EDGE"], False)
51       for k, edge in enumerate(edges):
52         extrems = geompy.ExtractShapes(edge, geompy.ShapeType["VERTEX"], True)
53         if geompy.MinDistance(centre, extrems[0]) < geompy.MinDistance(centre, extrems[1]):
54           bout = extrems[1]
55         else:
56           bout = extrems[0]
57         # ajustement du point extrémité (bout) sur l'edge circulaire en face de peau
58         logging.debug("edgesCirc: %s", edgesCirc)
59         distEdgeCirc = [(geompy.MinDistance(bout, edgeCirc), k2, edgeCirc) for k2, edgeCirc in enumerate(edgesCirc)]
60         distEdgeCirc.sort()
61         logging.debug("distEdgeCirc: %s", distEdgeCirc)
62         u = projettePointSurCourbe(bout, distEdgeCirc[0][2])
63         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.
64           extrCircs = geompy.ExtractShapes(distEdgeCirc[0][2], geompy.ShapeType["VERTEX"], True)
65           if geompy.MinDistance(bout, extrCircs[0]) < geompy.MinDistance(bout, extrCircs[1]):
66             bout = extrCircs[0]
67           else:
68             bout = extrCircs[1]
69         else:
70           bout = geompy.MakeVertexOnCurve(distEdgeCirc[0][2], u)
71         name ="bout%d"%k
72         geomPublishInFather(initLog.debug, centre, bout, name)
73         # enregistrement des points dans la structure
74         points = []
75         for j in range(nbsegRad +1):
76           u = j/float(nbsegRad)
77           points.append(geompy.MakeVertexOnCurve(edge, u))
78         if geompy.MinDistance(bout, points[0]) < geompy.MinDistance(centre, points[0]):
79           points.reverse()
80         points[0] = centre
81         points[-1] = bout
82         gptdsk.append(points)
83       if i == 0:
84         gptsdisks[idisklim[0] -1] = gptdsk
85         idisklim[0] = idisklim[0] -1
86       else:
87         gptsdisks[idisklim[1] +1] = gptdsk
88         idisklim[1] = idisklim[1] +1
89         
90   return (gptsdisks, idisklim)