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