1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2021 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
20 """procédure complète de construction d'une fissure longue"""
25 from salome.smesh import smeshBuilder
28 from .geomsmesh import geompy
29 from .geomsmesh import geomPublish
30 from .geomsmesh import geomPublishInFather
31 from .geomsmesh import smesh
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
42 # -----------------------------------------------------------------------------
44 def insereFissureLongue_b (edgesInside, centreFondFiss, tangentFondFiss, \
45 planfiss, planBord1, planBord2, \
46 facePeau, verticesOutCercles, verticesEdgePeauFiss, \
47 fillingFaceExterne, rayonPipe, \
50 """procedure complete fissure longue"""
52 logging.info("Maillage pour le cas n°%d", nro_cas)
54 # -----------------------------------------------------------------------------
55 # --- pipe de fond de fissure
57 wireFondFiss = geompy.MakeWire(edgesInside, 1e-07)
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)
64 # si centreFondFiss et vertproj sont proches: exception. Angle = +- 90°
65 vec2 = geompy.MakeVector(centreFondFiss, vertproj)
66 angle = geompy.GetAngleRadians(vec1, vec2)
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)
76 disque = geompy.MakeRotation(disque, tangentFondFiss, -angle)
77 [vertexReference] = geompy.ExtractShapes(disque, geompy.ShapeType["VERTEX"], False)
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)
88 geomPublish(initLog.debug, disque, 'disque')
89 geomPublish(initLog.debug, wireFondFiss, 'wireFondFiss')
90 geomPublish(initLog.debug, pipeFondFiss, 'pipeFondFiss')
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)
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")
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
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_")
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)
134 for i, edgeId in enumerate(edgesIdPipeOnside):
135 if edgeId in edgesIdPipeOnplan:
136 rayons.append(edgesPipeOnside[i])
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])
148 # --- generatrices en contact avec la face fissure externe au pipe
150 for edge in generatrices:
151 distance = geompy.MinDistance(vertexReference, edge)
152 logging.debug("distance %s", distance)
154 generFiss.append(edge)
156 for edge in generatrices:
157 distance = geompy.MinDistance(generFiss[0], edge)
158 logging.debug("distance %s", distance)
160 generFiss.append(edge)
161 groupGenerFiss = geompy.CreateGroup(pipeFondFiss, geompy.ShapeType["EDGE"])
162 geompy.UnionList(groupGenerFiss, generFiss)
163 geomPublishInFather(initLog.debug,pipeFondFiss, groupGenerFiss, "GenFiss")
165 # --- demi cercles externes regroupés
166 groupsDemiCerclesPipe = list()
167 for i, vertex in enumerate(verticesEdgePeauFiss):
169 for edge in demiCerclesExternes:
170 if geompy.MinDistance(vertex, edge) < 0.1:
172 group = geompy.CreateGroup(pipeFondFiss, geompy.ShapeType["EDGE"])
173 geompy.UnionList(group, demis)
175 geomPublishInFather(initLog.debug,pipeFondFiss, group , name)
176 groupsDemiCerclesPipe.append(group)
178 # --- faces fissure dans le pipe
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)
194 groupFaceFissInPipe = geompy.CreateGroup(pipeFondFiss, geompy.ShapeType["FACE"])
195 geompy.UnionList(groupFaceFissInPipe, facesFissinPipe)
196 name = "FaceFissInPipe"
197 geomPublishInFather(initLog.debug,pipeFondFiss, groupFaceFissInPipe , name)
199 # --- edges de fond de fissure
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)
211 geomPublishInFather(initLog.debug,pipeFondFiss, groupEdgeFondFiss , name)
213 # -------------------------------------------------------------------------
216 # --- edges de bord face defaut à respecter
218 _ = smesh.CreateFilterManager()
219 _, internalBoundary, _ = internalBoundary.MakeBoundaryElements( SMESH.BND_1DFROM2D, '', '', 0, [ ])
220 putName(internalBoundary, 'internalBoundary', i_pref=nro_cas)
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)
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"
231 skinFaces = internalBoundary.CreateEmptyGroup( SMESH.FACE, 'skinFaces' )
232 _ = skinFaces.AddFrom( internalBoundary.GetMesh() )
234 # --- maillage pipe fond fissure
236 return pipeFondFiss, disques, rayons, \
237 demiCercles, generatrices, \
238 VerticesEndPipeFiss, bordsLibres, \
239 groupFaceFissInPipe, groupEdgeFondFiss, groupsDemiCerclesPipe, groupGenerFiss