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
41 # -----------------------------------------------------------------------------
43 def insereFissureLongue_b(edgesInside, centreFondFiss, tangentFondFiss, \
44 planfiss, planBord1, planBord2, \
45 facePeau, verticesOutCercles, verticesEdgePeauFiss, \
46 fillingFaceExterne, rayonPipe, \
48 """procedure complete fissure longue"""
51 # -----------------------------------------------------------------------------
52 # --- pipe de fond de fissure
54 wireFondFiss = geompy.MakeWire(edgesInside, 1e-07)
56 disque = geompy.MakeDiskPntVecR(centreFondFiss, tangentFondFiss, rayonPipe)
57 [vertex] = geompy.ExtractShapes(disque, geompy.ShapeType["VERTEX"], False)
58 vertproj = geompy.MakeProjection(vertex, planfiss)
59 vec1 = geompy.MakeVector(centreFondFiss, vertex)
61 # si centreFondFiss et vertproj sont proches: exception. Angle = +- 90°
62 vec2 = geompy.MakeVector(centreFondFiss, vertproj)
63 angle = geompy.GetAngleRadians(vec1, vec2)
65 # on utilise la projection du centre sur la peau pour avoir un vecteur non nul
66 vertproj = geompy.MakeProjection(centreFondFiss, facePeau)
67 vec2 = geompy.MakeVector(centreFondFiss, vertproj)
68 angle = geompy.GetAngleRadians(vec1, vec2)
69 sommetAxe = geompy.MakeTranslationVector(centreFondFiss, tangentFondFiss)
70 if ( produitMixte(centreFondFiss, vertex, vertproj, sommetAxe) > 0 ):
71 disque = geompy.MakeRotation(disque, tangentFondFiss, angle)
73 disque = geompy.MakeRotation(disque, tangentFondFiss, -angle)
74 [vertexReference] = geompy.ExtractShapes(disque, geompy.ShapeType["VERTEX"], False)
76 pipeFondFiss = geompy.MakePipe(disque, wireFondFiss)
77 pipeFondFiss = geompy.MakePartition([pipeFondFiss], [planfiss, wireFondFiss, planBord1, planBord2], list(), list(), geompy.ShapeType["SOLID"], 0, list(), 0)
78 #pipe = geompy.MakePipe(disque, WirePorteFondFissure)
79 #pipe = geompy.MakePartition([pipe],[fillingFaceExterne], list(), list(), geompy.ShapeType["SOLID"], 0, list(), 0)
80 #pipes = geompy.ExtractShapes(pipe, geompy.ShapeType["SOLID"], False)
81 #pipesSorted, volmin, volmax = sortSolids(pipes)
82 #pipeFondFiss = pipesSorted[-1]
83 #pipeFondFiss = geompy.MakePartition([pipeFondFiss], [planfiss, wireFondFiss, planBord1, planBord2], list(), list(), geompy.ShapeType["SOLID"], 0, list(), 0)
85 geomPublish(initLog.debug, disque, 'disque')
86 geomPublish(initLog.debug, wireFondFiss, 'wireFondFiss')
87 geomPublish(initLog.debug, pipeFondFiss, 'pipeFondFiss')
89 VerticesEndFondFiss, _ = findWireEndVertices(wireFondFiss)
90 for i_aux, vertex in enumerate(VerticesEndFondFiss):
91 name = "vertexEndFondFiss_{}".format(i_aux)
92 geomPublishInFather(initLog.debug,wireFondFiss, vertex, name)
93 VerticesEndPipeFiss = list()
94 for vertex in VerticesEndFondFiss:
95 VerticesEndPipeFiss.append(geompy.GetInPlace(pipeFondFiss, vertex))
96 for i_aux, vertex in enumerate(VerticesEndPipeFiss):
97 name = "vertexEndPipeFiss_{}".format(i_aux)
98 geomPublishInFather(initLog.debug,pipeFondFiss, vertex, name)
100 geomPublishInFather(initLog.debug,pipeFondFiss, VerticesEndPipeFiss[0], "PFOR")
101 geomPublishInFather(initLog.debug,pipeFondFiss, VerticesEndPipeFiss[1], "PFEX")
102 if ( geompy.MinDistance(VerticesEndPipeFiss[0], verticesOutCercles[0]) > geompy.MinDistance(VerticesEndPipeFiss[0], verticesOutCercles[1]) ):
103 aux = verticesOutCercles[0]
104 verticesOutCercles[0] = verticesOutCercles[1]
105 verticesOutCercles[1] = aux
106 geomPublishInFather(initLog.debug,facePeau, verticesOutCercles[0], "THOR")
107 geomPublishInFather(initLog.debug,facePeau, verticesOutCercles[1], "THEX")
109 [_, _, facesPipeOnside] = extractionOrientee(fillingFaceExterne, pipeFondFiss, centreFondFiss, "FACE", 0.1, "pipe_bord_")
110 [_, _, edgesPipeOnside] = extractionOrientee(fillingFaceExterne, pipeFondFiss, centreFondFiss, "EDGE", 0.1, "pipe_bord_")
111 disqueInt1 = geompy.GetInPlaceByHistory(pipeFondFiss, planBord1)
112 disqueInt2 = geompy.GetInPlaceByHistory(pipeFondFiss, planBord2)
113 disques = facesPipeOnside + [disqueInt1, disqueInt2]
114 edgesDiskInt = geompy.ExtractShapes(disqueInt1, geompy.ShapeType["EDGE"], False)
115 edgesDiskInt = edgesDiskInt +geompy.ExtractShapes(disqueInt2, geompy.ShapeType["EDGE"], False)
116 edgesSorted, _, _ = sortEdges(edgesDiskInt) # 4 rayons, 2 demi cercles
118 centre = geompy.MakeVertexOnSurface(planfiss, 0.5, 0.5)
119 refpoint = geompy.MakeTranslationVector(centre, geompy.GetNormal(planfiss,centre))
120 geomPublish(initLog.debug, refpoint, 'refpoint')
121 [_, _, facesPipeOnplan] = extractionOrientee(planfiss, pipeFondFiss, refpoint, "FACE", 0.1, "pipe_plan_")
122 [_, _, edgesPipeOnplan] = extractionOrientee(planfiss, pipeFondFiss, refpoint, "EDGE", 0.1, "pipe_plan_")
124 # --- rayon disques = (edgesPipeOnside inter edgesPipeOnplan) + rayons disque internes
125 # demi cercles = edgesPipeOnside moins edgesPipeOnplan + demi cercles disque internes
126 # generatrices = edgesPipeOnplan moins rayon disques (3 grandes et 6 petites)
127 edgesIdPipeOnside = getSubshapeIds(pipeFondFiss, edgesPipeOnside)
128 edgesIdPipeOnplan = getSubshapeIds(pipeFondFiss, edgesPipeOnplan)
131 for i, edgeId in enumerate(edgesIdPipeOnside):
132 if edgeId in edgesIdPipeOnplan:
133 rayons.append(edgesPipeOnside[i])
135 demiCercles.append(edgesPipeOnside[i])
136 demiCerclesExternes = demiCercles
137 rayons = rayons + edgesSorted[:4] # les 4 plus petits sont les rayons
138 demiCercles = demiCercles + edgesSorted[4:] # les suivants sont les arcs de cercle
139 rayonsId = getSubshapeIds(pipeFondFiss, rayons)
140 generatrices = list()
141 for i, edgeId in enumerate(edgesIdPipeOnplan):
142 if edgeId not in rayonsId:
143 generatrices.append(edgesPipeOnplan[i])
145 # --- generatrices en contact avec la face fissure externe au pipe
147 for edge in generatrices:
148 distance = geompy.MinDistance(vertexReference, edge)
149 logging.debug("distance %s", distance)
151 generFiss.append(edge)
153 for edge in generatrices:
154 distance = geompy.MinDistance(generFiss[0], edge)
155 logging.debug("distance %s", distance)
157 generFiss.append(edge)
158 groupGenerFiss = geompy.CreateGroup(pipeFondFiss, geompy.ShapeType["EDGE"])
159 geompy.UnionList(groupGenerFiss, generFiss)
160 geomPublishInFather(initLog.debug,pipeFondFiss, groupGenerFiss, "GenFiss")
162 # --- demi cercles externes regroupés
163 groupsDemiCerclesPipe = list()
164 for i, vertex in enumerate(verticesEdgePeauFiss):
166 for edge in demiCerclesExternes:
167 if geompy.MinDistance(vertex, edge) < 0.1:
169 group = geompy.CreateGroup(pipeFondFiss, geompy.ShapeType["EDGE"])
170 geompy.UnionList(group, demis)
172 geomPublishInFather(initLog.debug,pipeFondFiss, group , name)
173 groupsDemiCerclesPipe.append(group)
175 # --- faces fissure dans le pipe
177 facesFissinPipe = list()
178 generFissId = getSubshapeIds(pipeFondFiss, generFiss)
179 logging.debug("generatrice fissure %s", generFissId)
180 for face in facesPipeOnplan:
181 edges =geompy.ExtractShapes(face, geompy.ShapeType["EDGE"], False)
182 edgesId = getSubshapeIds(pipeFondFiss, edges)
183 logging.debug(" edges %s", edgesId)
184 for i,edgeId in enumerate(edgesId):
185 if edgeId in generFissId:
186 logging.debug("face found")
187 facesFissinPipe.append(face)
188 name = "faceFissInPipe_%d"%i
189 geomPublishInFather(initLog.debug,pipeFondFiss, face, name)
191 groupFaceFissInPipe = geompy.CreateGroup(pipeFondFiss, geompy.ShapeType["FACE"])
192 geompy.UnionList(groupFaceFissInPipe, facesFissinPipe)
193 name = "FaceFissInPipe"
194 geomPublishInFather(initLog.debug,pipeFondFiss, groupFaceFissInPipe , name)
196 # --- edges de fond de fissure
198 edgesFondFiss = list()
199 for i, edge in enumerate(edgesInside):
200 anEdge = geompy.GetInPlace(pipeFondFiss, edge)
201 logging.debug(" edge %s ", anEdge)
202 edgesFondFiss.append(anEdge)
203 name ="edgeFondFissure_%d"%i
204 geomPublishInFather(initLog.debug,pipeFondFiss, anEdge, name)
205 groupEdgeFondFiss = geompy.CreateGroup(pipeFondFiss, geompy.ShapeType["EDGE"])
206 geompy.UnionList(groupEdgeFondFiss, edgesFondFiss)
208 geomPublishInFather(initLog.debug,pipeFondFiss, groupEdgeFondFiss , name)
210 # -------------------------------------------------------------------------
213 # --- edges de bord face defaut à respecter
215 _ = smesh.CreateFilterManager()
216 _, internalBoundary, _ = internalBoundary.MakeBoundaryElements( SMESH.BND_1DFROM2D, '', '', 0, [ ])
218 un_critere = smesh.GetCriterion(SMESH.EDGE,SMESH.FT_FreeBorders,SMESH.FT_Undefined,0)
219 criteres.append(un_critere)
220 filtre = smesh.GetFilterFromCriteria(criteres)
221 bordsLibres = internalBoundary.MakeGroupByFilter( 'bords', filtre )
222 smesh.SetName(bordsLibres, 'bordsLibres')
224 # --- pour aider l'algo hexa-tetra a ne pas mettre de pyramides a l'exterieur des volumes replies sur eux-memes
225 # on designe les faces de peau en quadrangles par le groupe "skinFaces"
227 skinFaces = internalBoundary.CreateEmptyGroup( SMESH.FACE, 'skinFaces' )
228 _ = skinFaces.AddFrom( internalBoundary.GetMesh() )
230 # --- maillage pipe fond fissure
232 return pipeFondFiss, disques, rayons, \
233 demiCercles, generatrices, \
234 VerticesEndPipeFiss, bordsLibres, \
235 groupFaceFissInPipe, groupEdgeFondFiss, groupsDemiCerclesPipe, groupGenerFiss