Salome HOME
Simplification de insereFissureLongue
[modules/smesh.git] / src / Tools / blocFissure / gmu / insereFissureLongue.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 os
22
23 import logging
24 import salome
25 from .geomsmesh import geompy
26 from .geomsmesh import geomPublish
27 from .geomsmesh import geomPublishInFather
28 from . import initLog
29 from .geomsmesh import smesh
30 from salome.smesh import smeshBuilder
31 import SMESH
32 import math
33
34 from .extractionOrientee import extractionOrientee
35 from .sortFaces import sortFaces
36 from .sortEdges import sortEdges
37 from .eliminateDoubles import eliminateDoubles
38 from .substractSubShapes import substractSubShapes
39 from .produitMixte import produitMixte
40 from .findWireEndVertices import findWireEndVertices
41 from .getSubshapeIds import getSubshapeIds
42 from .putName import putName
43 from .distance2 import distance2
44 from .enleveDefaut import enleveDefaut
45 from .shapeSurFissure import shapeSurFissure
46 from .regroupeSainEtDefaut import RegroupeSainEtDefaut
47 from .triedreBase import triedreBase
48
49 # -----------------------------------------------------------------------------
50 # --- procedure complete fissure longue
51
52 def insereFissureLongue(geometriesSaines, maillagesSains,
53                         shapesFissure, shapeFissureParams,
54                         maillageFissureParams, elementsDefaut, step=-1):
55   """
56   TODO: a completer
57   """
58   logging.info('start')
59
60   #geometrieSaine    = geometriesSaines[0]
61   #maillageSain      = maillagesSains[0]
62   #isHexa            = maillagesSains[1]
63   shapeDefaut       = shapesFissure[0] # face de fissure, debordant
64   #tailleDefaut      = shapesFissure[2]
65   wiretube          = shapesFissure[4] # wire fond de fissure, debordant
66   planfiss          = shapesFissure[7] # plan de fissure
67   pipefiss          = shapesFissure[8] # pipe, debordant
68
69   profondeur  = shapeFissureParams['profondeur']
70   rayonPipe   = profondeur/4.0
71
72   nomRep            = maillageFissureParams['nomRep']
73   nomFicSain        = maillageFissureParams['nomFicSain']
74   nomFicFissure     = maillageFissureParams['nomFicFissure']
75
76   #nbsegExt          = maillageFissureParams['nbsegExt']      # 5
77   #nbsegGen          = maillageFissureParams['nbsegGen']      # 25
78   #nbsegRad          = maillageFissureParams['nbsegRad']      # 5
79   #scaleRad          = maillageFissureParams['scaleRad']      # 4
80   #nbsegCercle       = maillageFissureParams['nbsegCercle']   # 6
81   #nbsegFis          = maillageFissureParams['nbsegFis']      # 20
82   #lensegEllipsoide  = maillageFissureParams['lensegEllipso'] # 1.0
83
84   #fichierMaillageSain = os.path.join(nomRep, '{}.med'.format(nomFicSain))
85   fichierMaillageFissure = os.path.join(nomRep, '{}.med'.format(nomFicFissure))
86
87   facesDefaut              = elementsDefaut[0]
88   #centreDefaut             = elementsDefaut[1]
89   #normalDefaut             = elementsDefaut[2]
90   #extrusionDefaut          = elementsDefaut[3]
91   #dmoyen                   = elementsDefaut[4]
92   #bordsPartages            = elementsDefaut[5]
93   #fillconts                = elementsDefaut[6]
94   #idFilToCont              = elementsDefaut[7]
95   maillageSain             = elementsDefaut[8]
96   internalBoundary         = elementsDefaut[9]
97   zoneDefaut               = elementsDefaut[10]
98   zoneDefaut_skin          = elementsDefaut[11]
99   zoneDefaut_internalFaces = elementsDefaut[12]
100   zoneDefaut_internalEdges = elementsDefaut[13]
101
102   facePorteFissure =  shapeDefaut
103   WirePorteFondFissure = wiretube
104   fillingFaceExterne = facesDefaut[0]
105   logging.debug("fillingFaceExterne %s", fillingFaceExterne)
106   geomPublish(initLog.debug, fillingFaceExterne, "fillingFaceExterne")
107   edgesFilling = geompy.ExtractShapes(fillingFaceExterne, geompy.ShapeType["EDGE"], False)
108
109   O, OX, OY, OZ = triedreBase()
110
111   # -----------------------------------------------------------------------------
112   # --- peau et face de fissure
113
114   # --- partition peau defaut - face de fissure prolongee - wire de fond de fissure prolongée
115   partitionPeauFissFond = geompy.MakePartition([facePorteFissure, WirePorteFondFissure, fillingFaceExterne], list(), list(), list(), geompy.ShapeType["FACE"], 0, list(), 0)
116   geomPublish(initLog.debug,  partitionPeauFissFond, 'partitionPeauFissFond' )
117
118   edges = geompy.ExtractShapes(WirePorteFondFissure, geompy.ShapeType["EDGE"], False)
119
120   lgmax = 0
121   imax = 0
122   for i, edge in enumerate(edges):
123     props = geompy.BasicProperties(edge)
124     lg = props[0]
125     if lg > lgmax:
126       lgmax = lg
127       imax = i
128   edgemax = edges[imax]
129   geomPublish(initLog.debug, edgemax, 'edgemax')
130   centreFondFiss = geompy.MakeVertexOnCurve(edgemax, 0.5)
131   geomPublish(initLog.debug, centreFondFiss, 'centreFondFiss')
132   tangentFondFiss = geompy.MakeTangentOnCurve(edgemax, 0.5)
133   geomPublish(initLog.debug, tangentFondFiss, 'tangentFondFiss')
134
135   bord1FondFiss = geompy.MakeVertexOnCurve(edgemax, 0.0)
136   geomPublish(initLog.debug, bord1FondFiss, 'bord1FondFiss')
137   tangentBord1FondFiss = geompy.MakeTangentOnCurve(edgemax, 0.0)
138   geomPublish(initLog.debug, tangentBord1FondFiss, 'tangentBord1FondFiss')
139
140   bord2FondFiss = geompy.MakeVertexOnCurve(edgemax, 1.0)
141   geomPublish(initLog.debug, bord2FondFiss, 'bord2FondFiss')
142   tangentBord2FondFiss = geompy.MakeTangentOnCurve(edgemax, 1.0)
143   geomPublish(initLog.debug, tangentBord2FondFiss, 'tangentBord2FondFiss')
144
145   planBord1 = geompy.MakePlane(bord1FondFiss, tangentBord1FondFiss, 3*rayonPipe)
146   planBord2 = geompy.MakePlane(bord2FondFiss, tangentBord2FondFiss, 3*rayonPipe)
147   geomPublish(initLog.debug, planBord1, 'planBord1')
148   geomPublish(initLog.debug, planBord2, 'planBord2')
149
150   [edgesInside, edgesOutside, edgesOnside] = extractionOrientee(fillingFaceExterne, partitionPeauFissFond, centreFondFiss, "EDGE", 1.e-3)
151   [facesInside, facesOutside, facesOnside] = extractionOrientee(fillingFaceExterne, partitionPeauFissFond, centreFondFiss, "FACE", 1.e-3)
152
153   # --- partition peau -face fissure - pipe fond de fissure prolongé
154   partitionPeauFissByPipe = geompy.MakePartition([facesInside[0], facesOnside[0]], [pipefiss], list(), list(), geompy.ShapeType["FACE"], 0, list(), 0)
155   geomPublish(initLog.debug,  partitionPeauFissByPipe, 'partitionPeauFissByPipe' )
156
157   # --- identification face de peau
158   [facesPeauFissInside, facesPeauFissOutside, facesPeauFissOnside] = extractionOrientee(fillingFaceExterne, partitionPeauFissByPipe, centreFondFiss, "FACE", 0.1, "peauFiss_bord_")
159   facesPeauSorted, minsur, maxsurf = sortFaces(facesPeauFissOnside) # 4 demi disques, une grande face
160   facePeau = facesPeauSorted[-1] # la plus grande face
161   geomPublishInFather(initLog.debug,partitionPeauFissByPipe, facePeau, "facePeau")
162
163   # --- identification edges de bord face peau
164   edgesBords = list()
165   for i, edge in enumerate(edgesFilling):
166     edgepeau = geompy.GetInPlace(facePeau, edge)
167     edgesBords.append(edgepeau)
168   groupEdgesBordPeau = geompy.CreateGroup(facePeau, geompy.ShapeType["EDGE"])
169   geompy.UnionList(groupEdgesBordPeau, edgesBords)
170   geomPublishInFather(initLog.debug,facePeau, groupEdgesBordPeau , "EdgesBords")
171
172   # --- identification face fissure externe au pipe et edge commune peau fissure
173   for face in facesPeauFissInside:
174     try:
175       sharedEdges = geompy.GetSharedShapesMulti([facePeau, face], geompy.ShapeType["EDGE"])
176       if sharedEdges is not None:
177         faceFiss = face
178         edgePeauFiss = sharedEdges[0]
179         geomPublishInFather(initLog.debug,partitionPeauFissByPipe, faceFiss, "faceFiss")
180         geomPublishInFather(initLog.debug,faceFiss, edgePeauFiss, "edgePeauFiss")
181         geomPublishInFather(initLog.debug,facePeau, edgePeauFiss, "edgePeauFiss")
182         break
183     except:
184       pass
185   verticesEdgePeauFiss = geompy.ExtractShapes(edgePeauFiss, geompy.ShapeType["VERTEX"], False)
186
187   # --- identification edges demi cercle dans face de peau
188   edgesFacePeau = geompy.ExtractShapes(facePeau, geompy.ShapeType["EDGE"], False)
189   edgesFacePeauSorted, minlg, maxlg = sortEdges(edgesFacePeau)
190   demiCerclesPeau = edgesFacePeauSorted[0:4]
191   verticesDemiCerclesPeau = list()
192   for i, edge in enumerate(demiCerclesPeau):
193     name = "demiCerclePeau_%d"%i
194     geomPublishInFather(initLog.debug,facePeau, edge, name)
195     verticesDemiCerclesPeau += geompy.ExtractShapes(edge, geompy.ShapeType["VERTEX"], False)
196   verticesDemiCerclesPeau = eliminateDoubles(facePeau, verticesDemiCerclesPeau)
197   for i, vertex in enumerate(verticesDemiCerclesPeau):
198     name = "verticesDemiCerclesPeau_%d"%i
199     geomPublishInFather(initLog.debug,facePeau, vertex, name)
200   verticesOutCercles = substractSubShapes(facePeau, verticesDemiCerclesPeau, verticesEdgePeauFiss)
201   for i, vertex in enumerate(verticesOutCercles):
202     name = "verticesOutCercles_%d"%i
203     geomPublishInFather(initLog.debug,facePeau, vertex, name)
204
205   # --- demi cercles  regroupés
206   groupsDemiCerclesPeau = list()
207   for i, vertex in enumerate(verticesEdgePeauFiss):
208     demis = list()
209     for edge in demiCerclesPeau:
210       if geompy.MinDistance(vertex, edge) < 1.e-5:
211         demis.append(edge)
212     group = geompy.CreateGroup(facePeau, geompy.ShapeType["EDGE"])
213     geompy.UnionList(group, demis)
214     name = "Cercle%d"%i
215     geomPublishInFather(initLog.debug,facePeau, group , name)
216     groupsDemiCerclesPeau.append(group)
217
218   # --- identification edges commune pipe face fissure externe au pipe
219   edgePeauFissId = geompy.GetSubShapeID(partitionPeauFissByPipe, edgePeauFiss)
220   edgesFaceFiss = geompy.ExtractShapes(faceFiss, geompy.ShapeType["EDGE"], False)
221   edgesFaceFissPipe = list()
222   for edge in edgesFaceFiss:
223     if geompy.GetSubShapeID(partitionPeauFissByPipe, edge) != edgePeauFissId:
224       edgesFaceFissPipe.append(edge)
225       name = "edgeFaceFissPipe_%d"%len(edgesFaceFissPipe)
226       geomPublishInFather(initLog.debug,faceFiss, edge, name)
227   groupEdgesFaceFissPipe = geompy.CreateGroup(faceFiss, geompy.ShapeType["EDGE"])
228   geompy.UnionList(groupEdgesFaceFissPipe, edgesFaceFissPipe)
229   geomPublishInFather(initLog.debug,faceFiss, groupEdgesFaceFissPipe, "edgesFaceFissPipe")
230
231   # -----------------------------------------------------------------------------
232   # --- pipe de fond de fissure
233
234   wireFondFiss = geompy.MakeWire(edgesInside, 1e-07)
235
236   disque = geompy.MakeDiskPntVecR(centreFondFiss, tangentFondFiss, rayonPipe)
237   [vertex] = geompy.ExtractShapes(disque, geompy.ShapeType["VERTEX"], False)
238   vertproj = geompy.MakeProjection(vertex, planfiss)
239   vec1 = geompy.MakeVector(centreFondFiss, vertex)
240   try:
241     # si centreFondFiss et vertproj sont proches: exception. Angle = +- 90°
242     vec2 = geompy.MakeVector(centreFondFiss, vertproj)
243     angle = geompy.GetAngleRadians(vec1, vec2)
244   except:
245     # on utilise la projection du centre sur la peau pour avoir un vecteur non nul
246     vertproj = geompy.MakeProjection(centreFondFiss, facePeau)
247     vec2 = geompy.MakeVector(centreFondFiss, vertproj)
248     angle = geompy.GetAngleRadians(vec1, vec2)
249   sommetAxe = geompy.MakeTranslationVector(centreFondFiss, tangentFondFiss)
250   pm = produitMixte(centreFondFiss, vertex, vertproj, sommetAxe)
251   if pm > 0:
252     disque = geompy.MakeRotation(disque, tangentFondFiss, angle)
253   else:
254     disque = geompy.MakeRotation(disque, tangentFondFiss, -angle)
255   [vertexReference] = geompy.ExtractShapes(disque, geompy.ShapeType["VERTEX"], False)
256
257   pipeFondFiss = geompy.MakePipe(disque, wireFondFiss)
258   pipeFondFiss = geompy.MakePartition([pipeFondFiss], [planfiss, wireFondFiss, planBord1, planBord2], list(), list(), geompy.ShapeType["SOLID"], 0, list(), 0)
259   #pipe = geompy.MakePipe(disque, WirePorteFondFissure)
260   #pipe = geompy.MakePartition([pipe],[fillingFaceExterne], list(), list(), geompy.ShapeType["SOLID"], 0, list(), 0)
261   #pipes = geompy.ExtractShapes(pipe, geompy.ShapeType["SOLID"], False)
262   #pipesSorted, volmin, volmax = sortSolids(pipes)
263   #pipeFondFiss = pipesSorted[-1]
264   #pipeFondFiss = geompy.MakePartition([pipeFondFiss], [planfiss, wireFondFiss, planBord1, planBord2], list(), list(), geompy.ShapeType["SOLID"], 0, list(), 0)
265
266   geomPublish(initLog.debug,  disque, 'disque')
267   geomPublish(initLog.debug,  wireFondFiss, 'wireFondFiss')
268   geomPublish(initLog.debug,  pipeFondFiss, 'pipeFondFiss')
269
270   VerticesEndFondFiss = findWireEndVertices(wireFondFiss)
271   for i, v in enumerate(VerticesEndFondFiss):
272     name = "vertexEndFondFiss_%d"%i
273     geomPublishInFather(initLog.debug,wireFondFiss, v, name)
274   VerticesEndPipeFiss = list()
275   for v in VerticesEndFondFiss:
276     VerticesEndPipeFiss.append(geompy.GetInPlace(pipeFondFiss, v))
277   for i, v in enumerate(VerticesEndPipeFiss):
278     name = "vertexEndPipeFiss_%d"%i
279     geomPublishInFather(initLog.debug,pipeFondFiss, v, name)
280
281   geomPublishInFather(initLog.debug,pipeFondFiss, VerticesEndPipeFiss[0], "PFOR")
282   geomPublishInFather(initLog.debug,pipeFondFiss, VerticesEndPipeFiss[1], "PFEX")
283   if geompy.MinDistance(VerticesEndPipeFiss[0], verticesOutCercles[0]) > geompy.MinDistance(VerticesEndPipeFiss[0], verticesOutCercles[1]):
284     a = verticesOutCercles[0]
285     verticesOutCercles[0] = verticesOutCercles[1]
286     verticesOutCercles[1] = a
287   geomPublishInFather(initLog.debug,facePeau, verticesOutCercles[0], "THOR")
288   geomPublishInFather(initLog.debug,facePeau, verticesOutCercles[1], "THEX")
289
290   [facesPipeInside, facesPipeOutside, facesPipeOnside] = extractionOrientee(fillingFaceExterne, pipeFondFiss, centreFondFiss, "FACE", 0.1, "pipe_bord_")
291   [edgesPipeInside, edgesPipeOutside, edgesPipeOnside] = extractionOrientee(fillingFaceExterne, pipeFondFiss, centreFondFiss, "EDGE", 0.1, "pipe_bord_")
292   disqueInt1 = geompy.GetInPlaceByHistory(pipeFondFiss, planBord1)
293   disqueInt2 = geompy.GetInPlaceByHistory(pipeFondFiss, planBord2)
294   disques = facesPipeOnside + [disqueInt1, disqueInt2]
295   edgesDiskInt = geompy.ExtractShapes(disqueInt1, geompy.ShapeType["EDGE"], False)
296   edgesDiskInt = edgesDiskInt +geompy.ExtractShapes(disqueInt2, geompy.ShapeType["EDGE"], False)
297   edgesSorted, minlg, maxlg = sortEdges(edgesDiskInt) # 4 rayons, 2 demi cercles
298
299   centre = geompy.MakeVertexOnSurface(planfiss, 0.5, 0.5)
300   refpoint = geompy.MakeTranslationVector(centre, geompy.GetNormal(planfiss,centre))
301   geomPublish(initLog.debug, refpoint, 'refpoint')
302   [facesPipeInplan, facesPipeOutplan, facesPipeOnplan] = extractionOrientee(planfiss, pipeFondFiss, refpoint, "FACE", 0.1, "pipe_plan_")
303   [edgesPipeInplan, edgesPipeOutplan, edgesPipeOnplan] = extractionOrientee(planfiss, pipeFondFiss, refpoint, "EDGE", 0.1, "pipe_plan_")
304
305   # --- rayon disques = (edgesPipeOnside inter edgesPipeOnplan) + rayons disque internes
306   #     demi cercles  = edgesPipeOnside moins edgesPipeOnplan + demi cercles disque internes
307   #     generatrices  = edgesPipeOnplan moins rayon disques (3 grandes et 6 petites)
308   edgesIdPipeOnside = getSubshapeIds(pipeFondFiss, edgesPipeOnside)
309   edgesIdPipeOnplan = getSubshapeIds(pipeFondFiss, edgesPipeOnplan)
310   rayons = list()
311   demiCercles = list()
312   for i, edgeId in enumerate(edgesIdPipeOnside):
313     if edgeId in edgesIdPipeOnplan:
314       rayons.append(edgesPipeOnside[i])
315     else:
316       demiCercles.append(edgesPipeOnside[i])
317   demiCerclesExternes = demiCercles
318   rayons = rayons + edgesSorted[:4]            # les 4 plus petits sont les rayons
319   demiCercles = demiCercles  + edgesSorted[4:] # les suivants sont les arcs de cercle
320   rayonsId = getSubshapeIds(pipeFondFiss, rayons)
321   generatrices = list()
322   for i, edgeId in enumerate(edgesIdPipeOnplan):
323     if edgeId not in rayonsId:
324       generatrices.append(edgesPipeOnplan[i])
325
326   # --- generatrices en contact avec la face fissure externe au pipe
327   generFiss = list()
328   for edge in generatrices:
329     distance = geompy.MinDistance(vertexReference, edge)
330     logging.debug("distance %s", distance)
331     if distance < 1.e-5:
332       generFiss.append(edge)
333       break
334   for edge in generatrices:
335     distance = geompy.MinDistance(generFiss[0], edge)
336     logging.debug("distance %s", distance)
337     if distance < 1.e-5:
338       generFiss.append(edge)
339   groupGenerFiss = geompy.CreateGroup(pipeFondFiss, geompy.ShapeType["EDGE"])
340   geompy.UnionList(groupGenerFiss, generFiss)
341   geomPublishInFather(initLog.debug,pipeFondFiss, groupGenerFiss, "GenFiss")
342
343   # --- demi cercles externes regroupés
344   groupsDemiCerclesPipe = list()
345   for i, vertex in enumerate(verticesEdgePeauFiss):
346     demis = list()
347     for edge in demiCerclesExternes:
348       if geompy.MinDistance(vertex, edge) < 0.1:
349         demis.append(edge)
350     group = geompy.CreateGroup(pipeFondFiss, geompy.ShapeType["EDGE"])
351     geompy.UnionList(group, demis)
352     name = "Cercle%d"%i
353     geomPublishInFather(initLog.debug,pipeFondFiss, group , name)
354     groupsDemiCerclesPipe.append(group)
355
356   # --- faces fissure dans le pipe
357
358   facesFissinPipe = list()
359   generFissId = getSubshapeIds(pipeFondFiss, generFiss)
360   logging.debug("generatrice fissure %s", generFissId)
361   for face in facesPipeOnplan:
362     edges =geompy.ExtractShapes(face, geompy.ShapeType["EDGE"], False)
363     edgesId = getSubshapeIds(pipeFondFiss, edges)
364     logging.debug("  edges %s", edgesId)
365     for i,edgeId in enumerate(edgesId):
366       if edgeId in generFissId:
367         logging.debug("face found")
368         facesFissinPipe.append(face)
369         name = "faceFissInPipe_%d"%i
370         geomPublishInFather(initLog.debug,pipeFondFiss, face, name)
371         break
372   groupFaceFissInPipe = geompy.CreateGroup(pipeFondFiss, geompy.ShapeType["FACE"])
373   geompy.UnionList(groupFaceFissInPipe, facesFissinPipe)
374   name = "FaceFissInPipe"
375   geomPublishInFather(initLog.debug,pipeFondFiss, groupFaceFissInPipe , name)
376
377   # --- edges de fond de fissure
378
379   edgesFondFiss = list()
380   for i, edge in enumerate(edgesInside):
381     anEdge = geompy.GetInPlace(pipeFondFiss, edge)
382     logging.debug("  edge %s ", anEdge)
383     edgesFondFiss.append(anEdge)
384     name ="edgeFondFissure_%d"%i
385     geomPublishInFather(initLog.debug,pipeFondFiss, anEdge, name)
386   groupEdgeFondFiss = geompy.CreateGroup(pipeFondFiss, geompy.ShapeType["EDGE"])
387   geompy.UnionList(groupEdgeFondFiss, edgesFondFiss)
388   name = "FONDFISS"
389   geomPublishInFather(initLog.debug,pipeFondFiss, groupEdgeFondFiss , name)
390
391   # -------------------------------------------------------------------------
392   # --- maillage
393
394   # --- edges de bord face defaut à respecter
395
396   aFilterManager = smesh.CreateFilterManager()
397   nbAdded, internalBoundary, _NoneGroup = internalBoundary.MakeBoundaryElements( SMESH.BND_1DFROM2D, '', '', 0, [  ])
398   criteres = list()
399   unCritere = smesh.GetCriterion(SMESH.EDGE,SMESH.FT_FreeBorders,SMESH.FT_Undefined,0)
400   criteres.append(unCritere)
401   filtre = smesh.GetFilterFromCriteria(criteres)
402   bordsLibres = internalBoundary.MakeGroupByFilter( 'bords', filtre )
403   smesh.SetName(bordsLibres, 'bordsLibres')
404
405   # --- pour aider l'algo hexa-tetra a ne pas mettre de pyramides a l'exterieur des volumes replies sur eux-memes
406   #     on designe les faces de peau en quadrangles par le groupe "skinFaces"
407
408   skinFaces = internalBoundary.CreateEmptyGroup( SMESH.FACE, 'skinFaces' )
409   nbAdd = skinFaces.AddFrom( internalBoundary.GetMesh() )
410
411   # --- maillage pipe fond fissure
412
413   meshFondFiss, groups_demiCercles, group_generFiss, nbSegGenLong, nbSegGenBout = \
414             insereFissureLongue_a (pipeFondFiss, disques, rayons, demiCercles, demiCerclesPeau, generatrices, \
415             VerticesEndPipeFiss, verticesEdgePeauFiss, \
416             groupFaceFissInPipe, groupEdgeFondFiss, groupsDemiCerclesPipe, groupGenerFiss, \
417             profondeur, rayonPipe, distance2)
418
419   # --- maillage face de peau
420
421   meshFacePeau, groupEdgesPeauFiss = \
422             insereFissureLongue_b (facePeau, edgePeauFiss, groupEdgesBordPeau, bordsLibres, \
423             groupsDemiCerclesPeau, groups_demiCercles, verticesOutCercles, \
424             nbSegGenLong, nbSegGenBout, profondeur)
425
426   # --- maillage face de fissure
427
428   meshFaceFiss = \
429             insereFissureLongue_c (faceFiss, groupEdgesPeauFiss, edgePeauFiss, group_generFiss, groupEdgesFaceFissPipe, \
430             profondeur, rayonPipe)
431
432   # --- maillage meshBoiteDefaut
433
434   distene=True
435   meshBoiteDefaut, group_faceFissInPipe, group_faceFissOutPipe = \
436             insereFissureLongue_d (internalBoundary, meshFondFiss, meshFacePeau, meshFaceFiss, \
437             distene)
438
439
440   groups = maillageSain.GetGroups()
441   grps1 = [ grp for grp in groups if grp.GetName() == 'P1']
442   grps2 = [ grp for grp in groups if grp.GetName() == 'P2']
443   coords1 = maillageSain.GetNodeXYZ(grps1[0].GetID(1))
444   coords2 = maillageSain.GetNodeXYZ(grps2[0].GetID(1))
445   logging.info("coords1 %s, coords2 %s",coords1, coords2)
446
447   faceFissure = meshBoiteDefaut.GetMesh().UnionListOfGroups( [ group_faceFissOutPipe, group_faceFissInPipe ], 'FACE1' )
448   maillageSain = enleveDefaut(maillageSain, zoneDefaut, zoneDefaut_skin, zoneDefaut_internalFaces, zoneDefaut_internalEdges)
449   putName(maillageSain, nomFicSain+"_coupe")
450   extrusionFaceFissure, normfiss = shapeSurFissure(facePorteFissure)
451   maillageComplet = RegroupeSainEtDefaut(maillageSain, meshBoiteDefaut, extrusionFaceFissure, facePorteFissure, 'COUDE')
452
453   groups = maillageComplet.GetGroups()
454   grps1 = [ grp for grp in groups if grp.GetName() == 'P1']
455   grps2 = [ grp for grp in groups if grp.GetName() == 'P2']
456   nodeid1 = maillageComplet.AddNode(coords1[0], coords1[1], coords1[2])
457   nodeid2 = maillageComplet.AddNode(coords2[0], coords2[1], coords2[2])
458   grps1[0].Add([nodeid1])
459   grps2[0].Add([nodeid2])
460   ma0d1 = maillageComplet.Add0DElement(nodeid1)
461   ma0d2 = maillageComplet.Add0DElement(nodeid2)
462   grpma0d1 = maillageComplet.CreateEmptyGroup( SMESH.ELEM0D, 'P1' )
463   nbAdd = grpma0d1.Add( [ma0d1] )
464   grpma0d2 = maillageComplet.CreateEmptyGroup( SMESH.ELEM0D, 'P2' )
465   nbAdd = grpma0d2.Add( [ma0d2] )
466
467 #  grps = [ grp for grp in groups if grp.GetName() == 'affectedEdges']
468 #  grps[0].SetName('affEdges')
469 #  grps = [ grp for grp in groups if grp.GetName() == 'affectedFaces']
470 #  grps[0].SetName('affFaces')
471 #  grps = [ grp for grp in groups if grp.GetName() == 'affectedVolumes']
472 #  grps[0].SetName('affVols')
473
474   maillageComplet.ConvertToQuadratic( 1 )
475   grps = [ grp for grp in groups if grp.GetName() == 'FONDFISS']
476   fond = maillageComplet.GetMesh().CreateDimGroup( grps, SMESH.NODE, 'FONDFISS' )
477
478   grps = [ grp for grp in groups if grp.GetName() == 'FACE1']
479   nb = maillageComplet.Reorient2D( grps[0], normfiss, grps[0].GetID(1))
480
481   plansim = geompy.MakePlane(O, normfiss, 10000)
482   fissnorm = geompy.MakeMirrorByPlane(normfiss, plansim)
483   grps = [ grp for grp in groups if grp.GetName() == 'FACE2']
484   nb = maillageComplet.Reorient2D( grps[0], fissnorm, grps[0].GetID(1))
485   #isDone = maillageComplet.ReorientObject( grps[0] )
486   fond = maillageComplet.GetMesh().CreateDimGroup( grps, SMESH.NODE, 'FACE2' )
487
488   maillageComplet.ExportMED(fichierMaillageFissure)
489   putName(maillageComplet, nomFicFissure)
490   logging.info("fichier maillage fissure %s", fichierMaillageFissure)
491
492   if salome.sg.hasDesktop():
493     salome.sg.updateObjBrowser()
494
495   return  maillageComplet