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 # -----------------------------------------------------------------------------
50 # --- procedure complete fissure longue
52 def insereFissureLongue(geometriesSaines, maillagesSains,
53 shapesFissure, shapeFissureParams,
54 maillageFissureParams, elementsDefaut, step=-1):
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
69 profondeur = shapeFissureParams['profondeur']
70 rayonPipe = profondeur/4.0
72 nomRep = maillageFissureParams['nomRep']
73 nomFicSain = maillageFissureParams['nomFicSain']
74 nomFicFissure = maillageFissureParams['nomFicFissure']
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
84 #fichierMaillageSain = os.path.join(nomRep, '{}.med'.format(nomFicSain))
85 fichierMaillageFissure = os.path.join(nomRep, '{}.med'.format(nomFicFissure))
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]
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)
109 O, OX, OY, OZ = triedreBase()
111 # -----------------------------------------------------------------------------
112 # --- peau et face de fissure
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' )
118 edges = geompy.ExtractShapes(WirePorteFondFissure, geompy.ShapeType["EDGE"], False)
122 for i, edge in enumerate(edges):
123 props = geompy.BasicProperties(edge)
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')
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')
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')
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')
150 [edgesInside, edgesOutside, edgesOnside] = extractionOrientee(fillingFaceExterne, partitionPeauFissFond, centreFondFiss, "EDGE", 1.e-3)
151 [facesInside, facesOutside, facesOnside] = extractionOrientee(fillingFaceExterne, partitionPeauFissFond, centreFondFiss, "FACE", 1.e-3)
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' )
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")
163 # --- identification edges de bord face peau
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")
172 # --- identification face fissure externe au pipe et edge commune peau fissure
173 for face in facesPeauFissInside:
175 sharedEdges = geompy.GetSharedShapesMulti([facePeau, face], geompy.ShapeType["EDGE"])
176 if sharedEdges is not None:
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")
185 verticesEdgePeauFiss = geompy.ExtractShapes(edgePeauFiss, geompy.ShapeType["VERTEX"], False)
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)
205 # --- demi cercles regroupés
206 groupsDemiCerclesPeau = list()
207 for i, vertex in enumerate(verticesEdgePeauFiss):
209 for edge in demiCerclesPeau:
210 if geompy.MinDistance(vertex, edge) < 1.e-5:
212 group = geompy.CreateGroup(facePeau, geompy.ShapeType["EDGE"])
213 geompy.UnionList(group, demis)
215 geomPublishInFather(initLog.debug,facePeau, group , name)
216 groupsDemiCerclesPeau.append(group)
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")
231 # -----------------------------------------------------------------------------
232 # --- pipe de fond de fissure
234 wireFondFiss = geompy.MakeWire(edgesInside, 1e-07)
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)
241 # si centreFondFiss et vertproj sont proches: exception. Angle = +- 90°
242 vec2 = geompy.MakeVector(centreFondFiss, vertproj)
243 angle = geompy.GetAngleRadians(vec1, vec2)
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)
252 disque = geompy.MakeRotation(disque, tangentFondFiss, angle)
254 disque = geompy.MakeRotation(disque, tangentFondFiss, -angle)
255 [vertexReference] = geompy.ExtractShapes(disque, geompy.ShapeType["VERTEX"], False)
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)
266 geomPublish(initLog.debug, disque, 'disque')
267 geomPublish(initLog.debug, wireFondFiss, 'wireFondFiss')
268 geomPublish(initLog.debug, pipeFondFiss, 'pipeFondFiss')
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)
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")
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
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_")
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)
312 for i, edgeId in enumerate(edgesIdPipeOnside):
313 if edgeId in edgesIdPipeOnplan:
314 rayons.append(edgesPipeOnside[i])
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])
326 # --- generatrices en contact avec la face fissure externe au pipe
328 for edge in generatrices:
329 distance = geompy.MinDistance(vertexReference, edge)
330 logging.debug("distance %s", distance)
332 generFiss.append(edge)
334 for edge in generatrices:
335 distance = geompy.MinDistance(generFiss[0], edge)
336 logging.debug("distance %s", distance)
338 generFiss.append(edge)
339 groupGenerFiss = geompy.CreateGroup(pipeFondFiss, geompy.ShapeType["EDGE"])
340 geompy.UnionList(groupGenerFiss, generFiss)
341 geomPublishInFather(initLog.debug,pipeFondFiss, groupGenerFiss, "GenFiss")
343 # --- demi cercles externes regroupés
344 groupsDemiCerclesPipe = list()
345 for i, vertex in enumerate(verticesEdgePeauFiss):
347 for edge in demiCerclesExternes:
348 if geompy.MinDistance(vertex, edge) < 0.1:
350 group = geompy.CreateGroup(pipeFondFiss, geompy.ShapeType["EDGE"])
351 geompy.UnionList(group, demis)
353 geomPublishInFather(initLog.debug,pipeFondFiss, group , name)
354 groupsDemiCerclesPipe.append(group)
356 # --- faces fissure dans le pipe
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)
372 groupFaceFissInPipe = geompy.CreateGroup(pipeFondFiss, geompy.ShapeType["FACE"])
373 geompy.UnionList(groupFaceFissInPipe, facesFissinPipe)
374 name = "FaceFissInPipe"
375 geomPublishInFather(initLog.debug,pipeFondFiss, groupFaceFissInPipe , name)
377 # --- edges de fond de fissure
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)
389 geomPublishInFather(initLog.debug,pipeFondFiss, groupEdgeFondFiss , name)
391 # -------------------------------------------------------------------------
394 # --- edges de bord face defaut à respecter
396 aFilterManager = smesh.CreateFilterManager()
397 nbAdded, internalBoundary, _NoneGroup = internalBoundary.MakeBoundaryElements( SMESH.BND_1DFROM2D, '', '', 0, [ ])
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')
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"
408 skinFaces = internalBoundary.CreateEmptyGroup( SMESH.FACE, 'skinFaces' )
409 nbAdd = skinFaces.AddFrom( internalBoundary.GetMesh() )
411 # --- maillage pipe fond fissure
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)
419 # --- maillage face de peau
421 meshFacePeau, groupEdgesPeauFiss = \
422 insereFissureLongue_b (facePeau, edgePeauFiss, groupEdgesBordPeau, bordsLibres, \
423 groupsDemiCerclesPeau, groups_demiCercles, verticesOutCercles, \
424 nbSegGenLong, nbSegGenBout, profondeur)
426 # --- maillage face de fissure
429 insereFissureLongue_c (faceFiss, groupEdgesPeauFiss, edgePeauFiss, group_generFiss, groupEdgesFaceFissPipe, \
430 profondeur, rayonPipe)
432 # --- maillage meshBoiteDefaut
435 meshBoiteDefaut, group_faceFissInPipe, group_faceFissOutPipe = \
436 insereFissureLongue_d (internalBoundary, meshFondFiss, meshFacePeau, meshFaceFiss, \
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)
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')
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] )
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')
474 maillageComplet.ConvertToQuadratic( 1 )
475 grps = [ grp for grp in groups if grp.GetName() == 'FONDFISS']
476 fond = maillageComplet.GetMesh().CreateDimGroup( grps, SMESH.NODE, 'FONDFISS' )
478 grps = [ grp for grp in groups if grp.GetName() == 'FACE1']
479 nb = maillageComplet.Reorient2D( grps[0], normfiss, grps[0].GetID(1))
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' )
488 maillageComplet.ExportMED(fichierMaillageFissure)
489 putName(maillageComplet, nomFicFissure)
490 logging.info("fichier maillage fissure %s", fichierMaillageFissure)
492 if salome.sg.hasDesktop():
493 salome.sg.updateObjBrowser()
495 return maillageComplet