Salome HOME
Bos #23995 [CEA 24030] ParaView 5.9: fix volumes selection
[modules/smesh.git] / src / Tools / blocFissure / gmu / insereFissureLongue_a.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2021  EDF R&D
3 #
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.
8 #
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.
13 #
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
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20 """procédure complète de construction d'une fissure longue"""
21
22 import logging
23
24 import salome
25
26 from .geomsmesh import geompy
27 from .geomsmesh import geomPublish
28 from .geomsmesh import geomPublishInFather
29
30 from . import initLog
31
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
37
38 # -----------------------------------------------------------------------------
39
40 def insereFissureLongue_a(facePorteFissure, WirePorteFondFissure, \
41                           fillingFaceExterne, \
42                           pipefiss, rayonPipe, \
43                           mailleur="MeshGems", nro_cas=None):
44   """procedure complete fissure longue"""
45   logging.info('start')
46   logging.info("Usage du mailleur %s", mailleur)
47
48
49   # -----------------------------------------------------------------------------
50   # --- peau et face de fissure
51
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', nro_cas )
55
56   edges = geompy.ExtractShapes(WirePorteFondFissure, geompy.ShapeType["EDGE"], False)
57
58   lgmax = 0
59   imax = 0
60   for i_aux, edge in enumerate(edges):
61     props = geompy.BasicProperties(edge)
62     longueur = props[0]
63     if ( longueur > lgmax ):
64       lgmax = longueur
65       imax = i_aux
66   edgemax = edges[imax]
67   geomPublish(initLog.debug, edgemax, 'edgemax', nro_cas)
68   centreFondFiss = geompy.MakeVertexOnCurve(edgemax, 0.5)
69   geomPublish(initLog.debug, centreFondFiss, 'centreFondFiss', nro_cas)
70   tangentFondFiss = geompy.MakeTangentOnCurve(edgemax, 0.5)
71   geomPublish(initLog.debug, tangentFondFiss, 'tangentFondFiss', nro_cas)
72
73   bord1FondFiss = geompy.MakeVertexOnCurve(edgemax, 0.0)
74   geomPublish(initLog.debug, bord1FondFiss, 'bord1FondFiss', nro_cas)
75   tangentBord1FondFiss = geompy.MakeTangentOnCurve(edgemax, 0.0)
76   geomPublish(initLog.debug, tangentBord1FondFiss, 'tangentBord1FondFiss', nro_cas)
77
78   bord2FondFiss = geompy.MakeVertexOnCurve(edgemax, 1.0)
79   geomPublish(initLog.debug, bord2FondFiss, 'bord2FondFiss', nro_cas)
80   tangentBord2FondFiss = geompy.MakeTangentOnCurve(edgemax, 1.0)
81   geomPublish(initLog.debug, tangentBord2FondFiss, 'tangentBord2FondFiss', nro_cas)
82
83   planBord1 = geompy.MakePlane(bord1FondFiss, tangentBord1FondFiss, 3*rayonPipe)
84   planBord2 = geompy.MakePlane(bord2FondFiss, tangentBord2FondFiss, 3*rayonPipe)
85   geomPublish(initLog.debug, planBord1, 'planBord1', nro_cas)
86   geomPublish(initLog.debug, planBord2, 'planBord2', nro_cas)
87
88   [edgesInside, _, _] = extractionOrientee(fillingFaceExterne, partitionPeauFissFond, centreFondFiss, "EDGE", 1.e-3)
89   [facesInside, _, facesOnside] = extractionOrientee(fillingFaceExterne, partitionPeauFissFond, centreFondFiss, "FACE", 1.e-3)
90
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.always, partitionPeauFissByPipe, 'partitionPeauFissByPipe', nro_cas )
94
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.always, partitionPeauFissByPipe, facePeau, "facePeau", nro_cas)
100
101   # --- identification edges de bord face peau
102   edgesFilling = geompy.ExtractShapes(fillingFaceExterne, geompy.ShapeType["EDGE"], False)
103   edgesBords = list()
104   for edge in 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.always, facePeau, groupEdgesBordPeau , "EdgesBords", nro_cas)
110
111   # --- identification face fissure externe au pipe et edge commune peau fissure
112   for face in facesPeauFissInside:
113     try:
114       sharedEdges = geompy.GetSharedShapesMulti([facePeau, face], geompy.ShapeType["EDGE"])
115       if sharedEdges is not None:
116         faceFiss = face
117         edgePeauFiss = sharedEdges[0]
118         geomPublishInFather(initLog.always, partitionPeauFissByPipe, faceFiss, "faceFiss", nro_cas)
119         geomPublishInFather(initLog.always, faceFiss, edgePeauFiss, "edgePeauFiss", nro_cas)
120         geomPublishInFather(initLog.always, facePeau, edgePeauFiss, "edgePeauFiss", nro_cas)
121         break
122     except:
123       pass
124   verticesEdgePeauFiss = geompy.ExtractShapes(edgePeauFiss, geompy.ShapeType["VERTEX"], False)
125
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, nro_cas)
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, nro_cas)
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, nro_cas)
143
144   # --- demi cercles  regroupés
145   groupsDemiCerclesPeau = list()
146   for i_aux, vertex in enumerate(verticesEdgePeauFiss):
147     demis = list()
148     for edge in demiCerclesPeau:
149       if ( geompy.MinDistance(vertex, edge) < 1.e-5 ):
150         demis.append(edge)
151     group = geompy.CreateGroup(facePeau, geompy.ShapeType["EDGE"])
152     geompy.UnionList(group, demis)
153     name = "Cercle{}".format(i_aux)
154     geomPublishInFather(initLog.always,facePeau, group , name, nro_cas)
155     groupsDemiCerclesPeau.append(group)
156
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, nro_cas)
166   groupEdgesFaceFissPipe = geompy.CreateGroup(faceFiss, geompy.ShapeType["EDGE"])
167   geompy.UnionList(groupEdgesFaceFissPipe, edgesFaceFissPipe)
168   geomPublishInFather(initLog.debug,faceFiss, groupEdgesFaceFissPipe, "edgesFaceFissPipe", nro_cas)
169
170   return edgesInside, centreFondFiss, tangentFondFiss, \
171           planBord1, planBord2, \
172           facePeau, faceFiss, verticesOutCercles, verticesEdgePeauFiss, \
173           edgePeauFiss, demiCerclesPeau, \
174           groupEdgesBordPeau, groupsDemiCerclesPeau, groupEdgesFaceFissPipe