Salome HOME
Mise à niveau python
[modules/smesh.git] / src / Tools / blocFissure / gmu / insereFissureLongue_b.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2021  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 """procédure complète de construction d'une fissure longue"""
21
22 import logging
23
24 import salome
25 from salome.smesh import smeshBuilder
26 import SMESH
27
28 from .geomsmesh import geompy
29 from .geomsmesh import geomPublish
30 from .geomsmesh import geomPublishInFather
31 from .geomsmesh import smesh
32
33 from . import initLog
34
35 from .extractionOrientee import extractionOrientee
36 from .sortEdges import sortEdges
37 from .produitMixte import produitMixte
38 from .findWireEndVertices import findWireEndVertices
39 from .getSubshapeIds import getSubshapeIds
40
41 # -----------------------------------------------------------------------------
42
43 def insereFissureLongue_b(edgesInside, centreFondFiss, tangentFondFiss, \
44                           planfiss, planBord1, planBord2, \
45                           facePeau, verticesOutCercles, verticesEdgePeauFiss, \
46                           fillingFaceExterne, rayonPipe, \
47                           internalBoundary):
48   """procedure complete fissure longue"""
49   logging.info('start')
50
51   # -----------------------------------------------------------------------------
52   # --- pipe de fond de fissure
53
54   wireFondFiss = geompy.MakeWire(edgesInside, 1e-07)
55
56   disque = geompy.MakeDiskPntVecR(centreFondFiss, tangentFondFiss, rayonPipe)
57   [vertex] = geompy.ExtractShapes(disque, geompy.ShapeType["VERTEX"], False)
58   vertproj = geompy.MakeProjection(vertex, planfiss)
59   vec1 = geompy.MakeVector(centreFondFiss, vertex)
60   try:
61     # si centreFondFiss et vertproj sont proches: exception. Angle = +- 90°
62     vec2 = geompy.MakeVector(centreFondFiss, vertproj)
63     angle = geompy.GetAngleRadians(vec1, vec2)
64   except:
65     # on utilise la projection du centre sur la peau pour avoir un vecteur non nul
66     vertproj = geompy.MakeProjection(centreFondFiss, facePeau)
67     vec2 = geompy.MakeVector(centreFondFiss, vertproj)
68     angle = geompy.GetAngleRadians(vec1, vec2)
69   sommetAxe = geompy.MakeTranslationVector(centreFondFiss, tangentFondFiss)
70   if ( produitMixte(centreFondFiss, vertex, vertproj, sommetAxe) > 0 ):
71     disque = geompy.MakeRotation(disque, tangentFondFiss, angle)
72   else:
73     disque = geompy.MakeRotation(disque, tangentFondFiss, -angle)
74   [vertexReference] = geompy.ExtractShapes(disque, geompy.ShapeType["VERTEX"], False)
75
76   pipeFondFiss = geompy.MakePipe(disque, wireFondFiss)
77   pipeFondFiss = geompy.MakePartition([pipeFondFiss], [planfiss, wireFondFiss, planBord1, planBord2], list(), list(), geompy.ShapeType["SOLID"], 0, list(), 0)
78   #pipe = geompy.MakePipe(disque, WirePorteFondFissure)
79   #pipe = geompy.MakePartition([pipe],[fillingFaceExterne], list(), list(), geompy.ShapeType["SOLID"], 0, list(), 0)
80   #pipes = geompy.ExtractShapes(pipe, geompy.ShapeType["SOLID"], False)
81   #pipesSorted, volmin, volmax = sortSolids(pipes)
82   #pipeFondFiss = pipesSorted[-1]
83   #pipeFondFiss = geompy.MakePartition([pipeFondFiss], [planfiss, wireFondFiss, planBord1, planBord2], list(), list(), geompy.ShapeType["SOLID"], 0, list(), 0)
84
85   geomPublish(initLog.debug,  disque, 'disque')
86   geomPublish(initLog.debug,  wireFondFiss, 'wireFondFiss')
87   geomPublish(initLog.debug,  pipeFondFiss, 'pipeFondFiss')
88
89   VerticesEndFondFiss, _ = findWireEndVertices(wireFondFiss)
90   for i_aux, vertex in enumerate(VerticesEndFondFiss):
91     name = "vertexEndFondFiss_{}".format(i_aux)
92     geomPublishInFather(initLog.debug,wireFondFiss, vertex, name)
93   VerticesEndPipeFiss = list()
94   for vertex in VerticesEndFondFiss:
95     VerticesEndPipeFiss.append(geompy.GetInPlace(pipeFondFiss, vertex))
96   for i_aux, vertex in enumerate(VerticesEndPipeFiss):
97     name = "vertexEndPipeFiss_{}".format(i_aux)
98     geomPublishInFather(initLog.debug,pipeFondFiss, vertex, name)
99
100   geomPublishInFather(initLog.debug,pipeFondFiss, VerticesEndPipeFiss[0], "PFOR")
101   geomPublishInFather(initLog.debug,pipeFondFiss, VerticesEndPipeFiss[1], "PFEX")
102   if ( geompy.MinDistance(VerticesEndPipeFiss[0], verticesOutCercles[0]) > geompy.MinDistance(VerticesEndPipeFiss[0], verticesOutCercles[1]) ):
103     aux = verticesOutCercles[0]
104     verticesOutCercles[0] = verticesOutCercles[1]
105     verticesOutCercles[1] = aux
106   geomPublishInFather(initLog.debug,facePeau, verticesOutCercles[0], "THOR")
107   geomPublishInFather(initLog.debug,facePeau, verticesOutCercles[1], "THEX")
108
109   [_, _, facesPipeOnside] = extractionOrientee(fillingFaceExterne, pipeFondFiss, centreFondFiss, "FACE", 0.1, "pipe_bord_")
110   [_, _, edgesPipeOnside] = extractionOrientee(fillingFaceExterne, pipeFondFiss, centreFondFiss, "EDGE", 0.1, "pipe_bord_")
111   disqueInt1 = geompy.GetInPlaceByHistory(pipeFondFiss, planBord1)
112   disqueInt2 = geompy.GetInPlaceByHistory(pipeFondFiss, planBord2)
113   disques = facesPipeOnside + [disqueInt1, disqueInt2]
114   edgesDiskInt = geompy.ExtractShapes(disqueInt1, geompy.ShapeType["EDGE"], False)
115   edgesDiskInt = edgesDiskInt +geompy.ExtractShapes(disqueInt2, geompy.ShapeType["EDGE"], False)
116   edgesSorted, _, _ = sortEdges(edgesDiskInt) # 4 rayons, 2 demi cercles
117
118   centre = geompy.MakeVertexOnSurface(planfiss, 0.5, 0.5)
119   refpoint = geompy.MakeTranslationVector(centre, geompy.GetNormal(planfiss,centre))
120   geomPublish(initLog.debug, refpoint, 'refpoint')
121   [_, _, facesPipeOnplan] = extractionOrientee(planfiss, pipeFondFiss, refpoint, "FACE", 0.1, "pipe_plan_")
122   [_, _, edgesPipeOnplan] = extractionOrientee(planfiss, pipeFondFiss, refpoint, "EDGE", 0.1, "pipe_plan_")
123
124   # --- rayon disques = (edgesPipeOnside inter edgesPipeOnplan) + rayons disque internes
125   #     demi cercles  = edgesPipeOnside moins edgesPipeOnplan + demi cercles disque internes
126   #     generatrices  = edgesPipeOnplan moins rayon disques (3 grandes et 6 petites)
127   edgesIdPipeOnside = getSubshapeIds(pipeFondFiss, edgesPipeOnside)
128   edgesIdPipeOnplan = getSubshapeIds(pipeFondFiss, edgesPipeOnplan)
129   rayons = list()
130   demiCercles = list()
131   for i, edgeId in enumerate(edgesIdPipeOnside):
132     if edgeId in edgesIdPipeOnplan:
133       rayons.append(edgesPipeOnside[i])
134     else:
135       demiCercles.append(edgesPipeOnside[i])
136   demiCerclesExternes = demiCercles
137   rayons = rayons + edgesSorted[:4]            # les 4 plus petits sont les rayons
138   demiCercles = demiCercles  + edgesSorted[4:] # les suivants sont les arcs de cercle
139   rayonsId = getSubshapeIds(pipeFondFiss, rayons)
140   generatrices = list()
141   for i, edgeId in enumerate(edgesIdPipeOnplan):
142     if edgeId not in rayonsId:
143       generatrices.append(edgesPipeOnplan[i])
144
145   # --- generatrices en contact avec la face fissure externe au pipe
146   generFiss = list()
147   for edge in generatrices:
148     distance = geompy.MinDistance(vertexReference, edge)
149     logging.debug("distance %s", distance)
150     if distance < 1.e-5:
151       generFiss.append(edge)
152       break
153   for edge in generatrices:
154     distance = geompy.MinDistance(generFiss[0], edge)
155     logging.debug("distance %s", distance)
156     if distance < 1.e-5:
157       generFiss.append(edge)
158   groupGenerFiss = geompy.CreateGroup(pipeFondFiss, geompy.ShapeType["EDGE"])
159   geompy.UnionList(groupGenerFiss, generFiss)
160   geomPublishInFather(initLog.debug,pipeFondFiss, groupGenerFiss, "GenFiss")
161
162   # --- demi cercles externes regroupés
163   groupsDemiCerclesPipe = list()
164   for i, vertex in enumerate(verticesEdgePeauFiss):
165     demis = list()
166     for edge in demiCerclesExternes:
167       if geompy.MinDistance(vertex, edge) < 0.1:
168         demis.append(edge)
169     group = geompy.CreateGroup(pipeFondFiss, geompy.ShapeType["EDGE"])
170     geompy.UnionList(group, demis)
171     name = "Cercle%d"%i
172     geomPublishInFather(initLog.debug,pipeFondFiss, group , name)
173     groupsDemiCerclesPipe.append(group)
174
175   # --- faces fissure dans le pipe
176
177   facesFissinPipe = list()
178   generFissId = getSubshapeIds(pipeFondFiss, generFiss)
179   logging.debug("generatrice fissure %s", generFissId)
180   for face in facesPipeOnplan:
181     edges =geompy.ExtractShapes(face, geompy.ShapeType["EDGE"], False)
182     edgesId = getSubshapeIds(pipeFondFiss, edges)
183     logging.debug("  edges %s", edgesId)
184     for i,edgeId in enumerate(edgesId):
185       if edgeId in generFissId:
186         logging.debug("face found")
187         facesFissinPipe.append(face)
188         name = "faceFissInPipe_%d"%i
189         geomPublishInFather(initLog.debug,pipeFondFiss, face, name)
190         break
191   groupFaceFissInPipe = geompy.CreateGroup(pipeFondFiss, geompy.ShapeType["FACE"])
192   geompy.UnionList(groupFaceFissInPipe, facesFissinPipe)
193   name = "FaceFissInPipe"
194   geomPublishInFather(initLog.debug,pipeFondFiss, groupFaceFissInPipe , name)
195
196   # --- edges de fond de fissure
197
198   edgesFondFiss = list()
199   for i, edge in enumerate(edgesInside):
200     anEdge = geompy.GetInPlace(pipeFondFiss, edge)
201     logging.debug("  edge %s ", anEdge)
202     edgesFondFiss.append(anEdge)
203     name ="edgeFondFissure_%d"%i
204     geomPublishInFather(initLog.debug,pipeFondFiss, anEdge, name)
205   groupEdgeFondFiss = geompy.CreateGroup(pipeFondFiss, geompy.ShapeType["EDGE"])
206   geompy.UnionList(groupEdgeFondFiss, edgesFondFiss)
207   name = "FONDFISS"
208   geomPublishInFather(initLog.debug,pipeFondFiss, groupEdgeFondFiss , name)
209
210   # -------------------------------------------------------------------------
211   # --- maillage
212
213   # --- edges de bord face defaut à respecter
214
215   _ = smesh.CreateFilterManager()
216   _, internalBoundary, _ = internalBoundary.MakeBoundaryElements( SMESH.BND_1DFROM2D, '', '', 0, [  ])
217   criteres = list()
218   un_critere = smesh.GetCriterion(SMESH.EDGE,SMESH.FT_FreeBorders,SMESH.FT_Undefined,0)
219   criteres.append(un_critere)
220   filtre = smesh.GetFilterFromCriteria(criteres)
221   bordsLibres = internalBoundary.MakeGroupByFilter( 'bords', filtre )
222   smesh.SetName(bordsLibres, 'bordsLibres')
223
224   # --- pour aider l'algo hexa-tetra a ne pas mettre de pyramides a l'exterieur des volumes replies sur eux-memes
225   #     on designe les faces de peau en quadrangles par le groupe "skinFaces"
226
227   skinFaces = internalBoundary.CreateEmptyGroup( SMESH.FACE, 'skinFaces' )
228   _ = skinFaces.AddFrom( internalBoundary.GetMesh() )
229
230   # --- maillage pipe fond fissure
231
232   return pipeFondFiss, disques, rayons, \
233           demiCercles, generatrices, \
234           VerticesEndPipeFiss, bordsLibres, \
235           groupFaceFissInPipe, groupEdgeFondFiss, groupsDemiCerclesPipe, groupGenerFiss