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