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"""
26 from .geomsmesh import geompy
27 from .geomsmesh import geomPublish
28 from .geomsmesh import geomPublishInFather
32 from .extractionOrientee import extractionOrientee
33 from .sortFaces import sortFaces
34 from .sortEdges import sortEdges
35 from .eliminateDoubles import eliminateDoubles
36 from .substractSubShapes import substractSubShapes
38 # -----------------------------------------------------------------------------
40 def insereFissureLongue_a(facePorteFissure, WirePorteFondFissure, \
42 pipefiss, rayonPipe, \
44 """procedure complete fissure longue"""
46 logging.info("Usage du mailleur %s", mailleur)
49 # -----------------------------------------------------------------------------
50 # --- peau et face de fissure
52 # --- partition peau defaut - face de fissure prolongee - wire de fond de fissure prolongée
53 partitionPeauFissFond = geompy.MakePartition([facePorteFissure, WirePorteFondFissure, fillingFaceExterne], list(), list(), list(), geompy.ShapeType["FACE"], 0, list(), 0)
54 geomPublish(initLog.debug, partitionPeauFissFond, 'partitionPeauFissFond' )
56 edges = geompy.ExtractShapes(WirePorteFondFissure, geompy.ShapeType["EDGE"], False)
60 for i_aux, edge in enumerate(edges):
61 props = geompy.BasicProperties(edge)
63 if ( longueur > lgmax ):
67 geomPublish(initLog.debug, edgemax, 'edgemax')
68 centreFondFiss = geompy.MakeVertexOnCurve(edgemax, 0.5)
69 geomPublish(initLog.debug, centreFondFiss, 'centreFondFiss')
70 tangentFondFiss = geompy.MakeTangentOnCurve(edgemax, 0.5)
71 geomPublish(initLog.debug, tangentFondFiss, 'tangentFondFiss')
73 bord1FondFiss = geompy.MakeVertexOnCurve(edgemax, 0.0)
74 geomPublish(initLog.debug, bord1FondFiss, 'bord1FondFiss')
75 tangentBord1FondFiss = geompy.MakeTangentOnCurve(edgemax, 0.0)
76 geomPublish(initLog.debug, tangentBord1FondFiss, 'tangentBord1FondFiss')
78 bord2FondFiss = geompy.MakeVertexOnCurve(edgemax, 1.0)
79 geomPublish(initLog.debug, bord2FondFiss, 'bord2FondFiss')
80 tangentBord2FondFiss = geompy.MakeTangentOnCurve(edgemax, 1.0)
81 geomPublish(initLog.debug, tangentBord2FondFiss, 'tangentBord2FondFiss')
83 planBord1 = geompy.MakePlane(bord1FondFiss, tangentBord1FondFiss, 3*rayonPipe)
84 planBord2 = geompy.MakePlane(bord2FondFiss, tangentBord2FondFiss, 3*rayonPipe)
85 geomPublish(initLog.debug, planBord1, 'planBord1')
86 geomPublish(initLog.debug, planBord2, 'planBord2')
88 [edgesInside, _, _] = extractionOrientee(fillingFaceExterne, partitionPeauFissFond, centreFondFiss, "EDGE", 1.e-3)
89 [facesInside, _, facesOnside] = extractionOrientee(fillingFaceExterne, partitionPeauFissFond, centreFondFiss, "FACE", 1.e-3)
91 # --- partition peau -face fissure - pipe fond de fissure prolongé
92 partitionPeauFissByPipe = geompy.MakePartition([facesInside[0], facesOnside[0]], [pipefiss], list(), list(), geompy.ShapeType["FACE"], 0, list(), 0)
93 geomPublish(initLog.debug, partitionPeauFissByPipe, 'partitionPeauFissByPipe' )
95 # --- identification face de peau
96 [facesPeauFissInside, _, facesPeauFissOnside] = extractionOrientee(fillingFaceExterne, partitionPeauFissByPipe, centreFondFiss, "FACE", 0.1, "peauFiss_bord_")
97 facesPeauSorted, _, _ = sortFaces(facesPeauFissOnside) # 4 demi disques, une grande face
98 facePeau = facesPeauSorted[-1] # la plus grande face
99 geomPublishInFather(initLog.debug,partitionPeauFissByPipe, facePeau, "facePeau")
101 # --- identification edges de bord face peau
102 edgesFilling = geompy.ExtractShapes(fillingFaceExterne, geompy.ShapeType["EDGE"], False)
104 for i, edge in enumerate(edgesFilling):
105 edgepeau = geompy.GetInPlace(facePeau, edge)
106 edgesBords.append(edgepeau)
107 groupEdgesBordPeau = geompy.CreateGroup(facePeau, geompy.ShapeType["EDGE"])
108 geompy.UnionList(groupEdgesBordPeau, edgesBords)
109 geomPublishInFather(initLog.debug,facePeau, groupEdgesBordPeau , "EdgesBords")
111 # --- identification face fissure externe au pipe et edge commune peau fissure
112 for face in facesPeauFissInside:
114 sharedEdges = geompy.GetSharedShapesMulti([facePeau, face], geompy.ShapeType["EDGE"])
115 if sharedEdges is not None:
117 edgePeauFiss = sharedEdges[0]
118 geomPublishInFather(initLog.debug,partitionPeauFissByPipe, faceFiss, "faceFiss")
119 geomPublishInFather(initLog.debug,faceFiss, edgePeauFiss, "edgePeauFiss")
120 geomPublishInFather(initLog.debug,facePeau, edgePeauFiss, "edgePeauFiss")
124 verticesEdgePeauFiss = geompy.ExtractShapes(edgePeauFiss, geompy.ShapeType["VERTEX"], False)
126 # --- identification edges demi cercle dans face de peau
127 edgesFacePeau = geompy.ExtractShapes(facePeau, geompy.ShapeType["EDGE"], False)
128 edgesFacePeauSorted, _, _ = sortEdges(edgesFacePeau)
129 demiCerclesPeau = edgesFacePeauSorted[0:4]
130 verticesDemiCerclesPeau = list()
131 for i_aux, edge in enumerate(demiCerclesPeau):
132 name = "demiCerclePeau_{}".format(i_aux)
133 geomPublishInFather(initLog.debug,facePeau, edge, name)
134 verticesDemiCerclesPeau += geompy.ExtractShapes(edge, geompy.ShapeType["VERTEX"], False)
135 verticesDemiCerclesPeau = eliminateDoubles(facePeau, verticesDemiCerclesPeau)
136 for i_aux, vertex in enumerate(verticesDemiCerclesPeau):
137 name = "verticesDemiCerclesPeau_{}".format(i_aux)
138 geomPublishInFather(initLog.debug,facePeau, vertex, name)
139 verticesOutCercles = substractSubShapes(facePeau, verticesDemiCerclesPeau, verticesEdgePeauFiss)
140 for i_aux, vertex in enumerate(verticesOutCercles):
141 name = "verticesOutCercles_{}".format(i_aux)
142 geomPublishInFather(initLog.debug,facePeau, vertex, name)
144 # --- demi cercles regroupés
145 groupsDemiCerclesPeau = list()
146 for i_aux, vertex in enumerate(verticesEdgePeauFiss):
148 for edge in demiCerclesPeau:
149 if ( geompy.MinDistance(vertex, edge) < 1.e-5 ):
151 group = geompy.CreateGroup(facePeau, geompy.ShapeType["EDGE"])
152 geompy.UnionList(group, demis)
153 name = "Cercle{}".format(i_aux)
154 geomPublishInFather(initLog.debug,facePeau, group , name)
155 groupsDemiCerclesPeau.append(group)
157 # --- identification edges commune pipe face fissure externe au pipe
158 edgePeauFissId = geompy.GetSubShapeID(partitionPeauFissByPipe, edgePeauFiss)
159 edgesFaceFiss = geompy.ExtractShapes(faceFiss, geompy.ShapeType["EDGE"], False)
160 edgesFaceFissPipe = list()
161 for edge in edgesFaceFiss:
162 if geompy.GetSubShapeID(partitionPeauFissByPipe, edge) != edgePeauFissId:
163 edgesFaceFissPipe.append(edge)
164 name = "edgeFaceFissPipe_%d"%len(edgesFaceFissPipe)
165 geomPublishInFather(initLog.debug,faceFiss, edge, name)
166 groupEdgesFaceFissPipe = geompy.CreateGroup(faceFiss, geompy.ShapeType["EDGE"])
167 geompy.UnionList(groupEdgesFaceFissPipe, edgesFaceFissPipe)
168 geomPublishInFather(initLog.debug,faceFiss, groupEdgesFaceFissPipe, "edgesFaceFissPipe")
170 return edgesInside, centreFondFiss, tangentFondFiss, \
171 planBord1, planBord2, \
172 facePeau, faceFiss, verticesOutCercles, verticesEdgePeauFiss, \
173 edgePeauFiss, demiCerclesPeau, \
174 groupEdgesBordPeau, groupsDemiCerclesPeau, groupEdgesFaceFissPipe