Salome HOME
simplification
[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 from .geomsmesh import geompy
25 from .geomsmesh import geomPublish
26 from .geomsmesh import geomPublishInFather
27
28 from . import initLog
29
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
35
36 # -----------------------------------------------------------------------------
37
38 def insereFissureLongue_a(facePorteFissure, WirePorteFondFissure, \
39                           fillingFaceExterne, \
40                           pipefiss, rayonPipe, \
41                           mailleur="MeshGems", nro_cas=None):
42   """procedure complete fissure longue"""
43   logging.info('start')
44   logging.info("Usage du mailleur %s", mailleur)
45
46
47   # -----------------------------------------------------------------------------
48   # --- peau et face de fissure
49
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 )
53
54   edges = geompy.ExtractShapes(WirePorteFondFissure, geompy.ShapeType["EDGE"], False)
55
56   lgmax = 0
57   imax = 0
58   for i_aux, edge in enumerate(edges):
59     props = geompy.BasicProperties(edge)
60     longueur = props[0]
61     if ( longueur > lgmax ):
62       lgmax = longueur
63       imax = i_aux
64   edgemax = edges[imax]
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)
70
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)
75
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)
80
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)
85
86   [edgesInside, _, _] = extractionOrientee(fillingFaceExterne, partitionPeauFissFond, centreFondFiss, "EDGE", 1.e-3)
87   [facesInside, _, facesOnside] = extractionOrientee(fillingFaceExterne, partitionPeauFissFond, centreFondFiss, "FACE", 1.e-3)
88
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 )
92
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)
98
99   # --- identification edges de bord face peau
100   edgesFilling = geompy.ExtractShapes(fillingFaceExterne, geompy.ShapeType["EDGE"], False)
101   edgesBords = list()
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)
108
109   # --- identification face fissure externe au pipe et edge commune peau fissure
110   for face in facesPeauFissInside:
111     try:
112       sharedEdges = geompy.GetSharedShapesMulti([facePeau, face], geompy.ShapeType["EDGE"])
113       if sharedEdges is not None:
114         faceFiss = face
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)
119         break
120     except:
121       pass
122   verticesEdgePeauFiss = geompy.ExtractShapes(edgePeauFiss, geompy.ShapeType["VERTEX"], False)
123
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)
141
142   # --- demi cercles  regroupés
143   groupsDemiCerclesPeau = list()
144   for i_aux, vertex in enumerate(verticesEdgePeauFiss):
145     demis = list()
146     for edge in demiCerclesPeau:
147       if ( geompy.MinDistance(vertex, edge) < 1.e-5 ):
148         demis.append(edge)
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)
154
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)
167
168   return edgesInside, centreFondFiss, tangentFondFiss, \
169           planBord1, planBord2, \
170           facePeau, faceFiss, verticesOutCercles, verticesEdgePeauFiss, \
171           edgePeauFiss, demiCerclesPeau, \
172           groupEdgesBordPeau, groupsDemiCerclesPeau, groupEdgesFaceFissPipe