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