1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2024 CEA, EDF
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"""
26 from .geomsmesh import geompy
27 from .geomsmesh import geomPublish
28 from .geomsmesh import geomPublishInFather
29 from .geomsmesh import smesh
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
40 # -----------------------------------------------------------------------------
42 def insereFissureLongue_b (edgesInside, centreFondFiss, tangentFondFiss, \
43 planfiss, planBord1, planBord2, \
44 facePeau, verticesOutCercles, verticesEdgePeauFiss, \
45 fillingFaceExterne, rayonPipe, \
48 """procedure complete fissure longue"""
50 logging.info("Maillage pour le cas n°%s", nro_cas)
52 # -----------------------------------------------------------------------------
53 # --- pipe de fond de fissure
55 wireFondFiss = geompy.MakeWire(edgesInside, 1e-07)
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)
62 # si centreFondFiss et vertproj sont proches: exception. Angle = +- 90°
63 vec2 = geompy.MakeVector(centreFondFiss, vertproj)
64 angle = geompy.GetAngleRadians(vec1, vec2)
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)
74 disque = geompy.MakeRotation(disque, tangentFondFiss, -angle)
75 [vertexReference] = geompy.ExtractShapes(disque, geompy.ShapeType["VERTEX"], False)
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)
86 geomPublish(initLog.debug, disque, 'disque')
87 geomPublish(initLog.always, wireFondFiss, 'wireFondFiss', nro_cas)
88 geomPublish(initLog.always, pipeFondFiss, 'pipeFondFiss', nro_cas)
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)
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")
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
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_")
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)
132 for i, edgeId in enumerate(edgesIdPipeOnside):
133 if edgeId in edgesIdPipeOnplan:
134 rayons.append(edgesPipeOnside[i])
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])
146 # --- generatrices en contact avec la face fissure externe au pipe
148 for edge in generatrices:
149 distance = geompy.MinDistance(vertexReference, edge)
150 logging.debug("distance %s", distance)
152 generFiss.append(edge)
154 for edge in generatrices:
155 distance = geompy.MinDistance(generFiss[0], edge)
156 logging.debug("distance %s", distance)
158 generFiss.append(edge)
159 groupGenerFiss = geompy.CreateGroup(pipeFondFiss, geompy.ShapeType["EDGE"])
160 geompy.UnionList(groupGenerFiss, generFiss)
161 geomPublishInFather(initLog.debug,pipeFondFiss, groupGenerFiss, "GenFiss")
163 # --- demi cercles externes regroupés
164 groupsDemiCerclesPipe = list()
165 for i, vertex in enumerate(verticesEdgePeauFiss):
167 for edge in demiCerclesExternes:
168 if geompy.MinDistance(vertex, edge) < 0.1:
170 group = geompy.CreateGroup(pipeFondFiss, geompy.ShapeType["EDGE"])
171 geompy.UnionList(group, demis)
173 geomPublishInFather(initLog.debug,pipeFondFiss, group , name)
174 groupsDemiCerclesPipe.append(group)
176 # --- faces fissure dans le pipe
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)
192 groupFaceFissInPipe = geompy.CreateGroup(pipeFondFiss, geompy.ShapeType["FACE"])
193 geompy.UnionList(groupFaceFissInPipe, facesFissinPipe)
194 name = "FaceFissInPipe"
195 geomPublishInFather(initLog.debug,pipeFondFiss, groupFaceFissInPipe , name)
197 # --- edges de fond de fissure
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)
209 geomPublishInFather(initLog.debug,pipeFondFiss, groupEdgeFondFiss , name)
211 # -------------------------------------------------------------------------
214 # --- edges de bord face defaut à respecter
216 _ = smesh.CreateFilterManager()
217 _, internalBoundary, _ = internalBoundary.MakeBoundaryElements( SMESH.BND_1DFROM2D, '', '', 0, [ ])
218 putName(internalBoundary, 'internalBoundary', i_pref=nro_cas)
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)
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"
229 skinFaces = internalBoundary.CreateEmptyGroup( SMESH.FACE, 'skinFaces' )
230 _ = skinFaces.AddFrom( internalBoundary.GetMesh() )
232 # --- maillage pipe fond fissure
234 return pipeFondFiss, disques, rayons, \
235 demiCercles, generatrices, \
236 VerticesEndPipeFiss, bordsLibres, \
237 groupFaceFissInPipe, groupEdgeFondFiss, groupsDemiCerclesPipe, groupGenerFiss