1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2023 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"""
24 from .geomsmesh import geompy
25 from .geomsmesh import geomPublish
26 from .geomsmesh import geomPublishInFather
30 from .extractionOrientee import extractionOrientee
31 from .sortFaces import sortFaces
32 from .sortEdges import sortEdges
33 from .eliminateDoubles import eliminateDoubles
34 from .substractSubShapes import substractSubShapes
36 # -----------------------------------------------------------------------------
38 def insereFissureLongue_a(facePorteFissure, WirePorteFondFissure, \
40 pipefiss, rayonPipe, \
41 mailleur="MeshGems", nro_cas=None):
42 """procedure complete fissure longue"""
44 logging.info("Usage du mailleur %s", mailleur)
47 # -----------------------------------------------------------------------------
48 # --- peau et face de fissure
50 # --- partition peau defaut - face de fissure prolongee - wire de fond de fissure prolongée
51 partitionPeauFissFond = geompy.MakePartition([facePorteFissure, WirePorteFondFissure, fillingFaceExterne], list(), list(), list(), geompy.ShapeType["FACE"], 0, list(), 0)
52 geomPublish(initLog.debug, partitionPeauFissFond, 'partitionPeauFissFond', nro_cas )
54 edges = geompy.ExtractShapes(WirePorteFondFissure, geompy.ShapeType["EDGE"], False)
58 for i_aux, edge in enumerate(edges):
59 props = geompy.BasicProperties(edge)
61 if ( longueur > lgmax ):
65 geomPublish(initLog.debug, edgemax, 'edgemax', nro_cas)
66 centreFondFiss = geompy.MakeVertexOnCurve(edgemax, 0.5)
67 geomPublish(initLog.debug, centreFondFiss, 'centreFondFiss', nro_cas)
68 tangentFondFiss = geompy.MakeTangentOnCurve(edgemax, 0.5)
69 geomPublish(initLog.debug, tangentFondFiss, 'tangentFondFiss', nro_cas)
71 bord1FondFiss = geompy.MakeVertexOnCurve(edgemax, 0.0)
72 geomPublish(initLog.debug, bord1FondFiss, 'bord1FondFiss', nro_cas)
73 tangentBord1FondFiss = geompy.MakeTangentOnCurve(edgemax, 0.0)
74 geomPublish(initLog.debug, tangentBord1FondFiss, 'tangentBord1FondFiss', nro_cas)
76 bord2FondFiss = geompy.MakeVertexOnCurve(edgemax, 1.0)
77 geomPublish(initLog.debug, bord2FondFiss, 'bord2FondFiss', nro_cas)
78 tangentBord2FondFiss = geompy.MakeTangentOnCurve(edgemax, 1.0)
79 geomPublish(initLog.debug, tangentBord2FondFiss, 'tangentBord2FondFiss', nro_cas)
81 planBord1 = geompy.MakePlane(bord1FondFiss, tangentBord1FondFiss, 3*rayonPipe)
82 planBord2 = geompy.MakePlane(bord2FondFiss, tangentBord2FondFiss, 3*rayonPipe)
83 geomPublish(initLog.debug, planBord1, 'planBord1', nro_cas)
84 geomPublish(initLog.debug, planBord2, 'planBord2', nro_cas)
86 [edgesInside, _, _] = extractionOrientee(fillingFaceExterne, partitionPeauFissFond, centreFondFiss, "EDGE", 1.e-3)
87 [facesInside, _, facesOnside] = extractionOrientee(fillingFaceExterne, partitionPeauFissFond, centreFondFiss, "FACE", 1.e-3)
89 # --- partition peau -face fissure - pipe fond de fissure prolongé
90 partitionPeauFissByPipe = geompy.MakePartition([facesInside[0], facesOnside[0]], [pipefiss], list(), list(), geompy.ShapeType["FACE"], 0, list(), 0)
91 geomPublish(initLog.always, partitionPeauFissByPipe, 'partitionPeauFissByPipe', nro_cas )
93 # --- identification face de peau
94 [facesPeauFissInside, _, facesPeauFissOnside] = extractionOrientee(fillingFaceExterne, partitionPeauFissByPipe, centreFondFiss, "FACE", 0.1, "peauFiss_bord_")
95 facesPeauSorted, _, _ = sortFaces(facesPeauFissOnside) # 4 demi disques, une grande face
96 facePeau = facesPeauSorted[-1] # la plus grande face
97 geomPublishInFather(initLog.always, partitionPeauFissByPipe, facePeau, "facePeau", nro_cas)
99 # --- identification edges de bord face peau
100 edgesFilling = geompy.ExtractShapes(fillingFaceExterne, geompy.ShapeType["EDGE"], False)
102 for edge in edgesFilling:
103 edgepeau = geompy.GetInPlace(facePeau, edge)
104 edgesBords.append(edgepeau)
105 groupEdgesBordPeau = geompy.CreateGroup(facePeau, geompy.ShapeType["EDGE"])
106 geompy.UnionList(groupEdgesBordPeau, edgesBords)
107 geomPublishInFather(initLog.always, facePeau, groupEdgesBordPeau , "EdgesBords", nro_cas)
109 # --- identification face fissure externe au pipe et edge commune peau fissure
110 for face in facesPeauFissInside:
112 sharedEdges = geompy.GetSharedShapesMulti([facePeau, face], geompy.ShapeType["EDGE"])
113 if sharedEdges is not None:
115 edgePeauFiss = sharedEdges[0]
116 geomPublishInFather(initLog.always, partitionPeauFissByPipe, faceFiss, "faceFiss", nro_cas)
117 geomPublishInFather(initLog.always, faceFiss, edgePeauFiss, "edgePeauFiss", nro_cas)
118 geomPublishInFather(initLog.always, facePeau, edgePeauFiss, "edgePeauFiss", nro_cas)
122 verticesEdgePeauFiss = geompy.ExtractShapes(edgePeauFiss, geompy.ShapeType["VERTEX"], False)
124 # --- identification edges demi cercle dans face de peau
125 edgesFacePeau = geompy.ExtractShapes(facePeau, geompy.ShapeType["EDGE"], False)
126 edgesFacePeauSorted, _, _ = sortEdges(edgesFacePeau)
127 demiCerclesPeau = edgesFacePeauSorted[0:4]
128 verticesDemiCerclesPeau = list()
129 for i_aux, edge in enumerate(demiCerclesPeau):
130 name = "demiCerclePeau_{}".format(i_aux)
131 geomPublishInFather(initLog.debug,facePeau, edge, name, nro_cas)
132 verticesDemiCerclesPeau += geompy.ExtractShapes(edge, geompy.ShapeType["VERTEX"], False)
133 verticesDemiCerclesPeau = eliminateDoubles(facePeau, verticesDemiCerclesPeau)
134 for i_aux, vertex in enumerate(verticesDemiCerclesPeau):
135 name = "verticesDemiCerclesPeau_{}".format(i_aux)
136 geomPublishInFather(initLog.debug,facePeau, vertex, name, nro_cas)
137 verticesOutCercles = substractSubShapes(facePeau, verticesDemiCerclesPeau, verticesEdgePeauFiss)
138 for i_aux, vertex in enumerate(verticesOutCercles):
139 name = "verticesOutCercles_{}".format(i_aux)
140 geomPublishInFather(initLog.debug,facePeau, vertex, name, nro_cas)
142 # --- demi cercles regroupés
143 groupsDemiCerclesPeau = list()
144 for i_aux, vertex in enumerate(verticesEdgePeauFiss):
146 for edge in demiCerclesPeau:
147 if ( geompy.MinDistance(vertex, edge) < 1.e-5 ):
149 group = geompy.CreateGroup(facePeau, geompy.ShapeType["EDGE"])
150 geompy.UnionList(group, demis)
151 name = "Cercle{}".format(i_aux)
152 geomPublishInFather(initLog.always,facePeau, group , name, nro_cas)
153 groupsDemiCerclesPeau.append(group)
155 # --- identification edges commune pipe face fissure externe au pipe
156 edgePeauFissId = geompy.GetSubShapeID(partitionPeauFissByPipe, edgePeauFiss)
157 edgesFaceFiss = geompy.ExtractShapes(faceFiss, geompy.ShapeType["EDGE"], False)
158 edgesFaceFissPipe = list()
159 for edge in edgesFaceFiss:
160 if geompy.GetSubShapeID(partitionPeauFissByPipe, edge) != edgePeauFissId:
161 edgesFaceFissPipe.append(edge)
162 name = "edgeFaceFissPipe_%d"%len(edgesFaceFissPipe)
163 geomPublishInFather(initLog.debug,faceFiss, edge, name, nro_cas)
164 groupEdgesFaceFissPipe = geompy.CreateGroup(faceFiss, geompy.ShapeType["EDGE"])
165 geompy.UnionList(groupEdgesFaceFissPipe, edgesFaceFissPipe)
166 geomPublishInFather(initLog.debug,faceFiss, groupEdgesFaceFissPipe, "edgesFaceFissPipe", nro_cas)
168 return edgesInside, centreFondFiss, tangentFondFiss, \
169 planBord1, planBord2, \
170 facePeau, faceFiss, verticesOutCercles, verticesEdgePeauFiss, \
171 edgePeauFiss, demiCerclesPeau, \
172 groupEdgesBordPeau, groupsDemiCerclesPeau, groupEdgesFaceFissPipe