Salome HOME
Merge branch 'master' into gni/evolution
[modules/smesh.git] / src / Tools / blocFissure / gmu / partitionBlocDefaut.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
21 import logging
22 from .geomsmesh import geompy
23 from .geomsmesh import geomPublish
24 from .geomsmesh import geomPublishInFather
25 from . import initLog
26
27 # -----------------------------------------------------------------------------
28 # --- partition du bloc defaut par generatrice, tore et plan fissure
29
30 def partitionBlocDefaut(volDefaut, facesDefaut, gener, pipe,
31                         facefis, ellipsoide):
32   """
33   Partition du bloc defaut par la generatrice de l'ellipse,
34   le tore elliptique, la face plane de fissure
35   @param volDefaut : le bloc defaut
36   @param gener : la generatrice de l'ellipse, positionnée dans l'espace
37   @param pipe : le tore partitionné par le plan de fissure, positionné
38   dans l'espace
39   @param facefis : la face plane de la fissure, positionnée dans l'espace
40   @return (volDefautPart, blocp, tore, faceFissure), le bloc partitionné,
41   les sous shapes issues de la partition
42   (le bloc moins le tore, la generatrice, le tore, la face de fissure)
43   """
44   logging.info("start")
45
46   volDefautPart = geompy.MakePartition([volDefaut], [pipe, facefis, ellipsoide], [], [], geompy.ShapeType["SOLID"], 0, [], 1)
47   blocp = geompy.GetInPlaceByHistory(volDefautPart, volDefaut)
48   #gencnt = geompy.GetInPlaceByHistory(volDefautPart, gener)
49   tore = geompy.GetInPlaceByHistory(volDefautPart, pipe)
50   faceFissure = geompy.GetInPlaceByHistory(volDefautPart, facefis)
51   #ellipsoidep =geompy.GetInPlaceByHistory(volDefautPart, ellipsoide)
52
53   geomPublish(initLog.debug,  volDefautPart, 'volDefautPart' )
54   geomPublishInFather(initLog.debug, volDefautPart, tore, 'tore' )
55   geomPublishInFather(initLog.debug, volDefautPart, faceFissure, 'FACE1' )
56   #geomPublishInFather(initLog.debug, volDefautPart, gencnt, 'generatrice' )
57
58   solids = geompy.ExtractShapes(blocp, geompy.ShapeType["SOLID"], True)
59   vols = []
60   for i in range(len(solids)):
61     props = geompy.BasicProperties(solids[i])
62     vols.append(props[2])
63   maxvol = max(vols)
64   imaxvol = vols.index(maxvol)
65   blocp = solids[imaxvol]
66   vols[imaxvol] = 0
67   maxvol = max(vols)
68   imaxvol = vols.index(maxvol)
69   ellipsoidep = solids[imaxvol]
70
71   geomPublishInFather(initLog.debug, volDefautPart, blocp, 'bloc' )
72   geomPublishInFather(initLog.debug, volDefautPart, ellipsoidep, 'ellipsoide' )
73
74   sharedFaces = geompy.GetSharedShapesMulti([blocp, ellipsoidep], geompy.ShapeType["FACE"])
75   for i in range(len(sharedFaces)):
76     name = "faceCommuneEllipsoideBloc_%d"%i
77     geomPublishInFather(initLog.debug,blocp, sharedFaces[i], name)
78
79   #sharedEdges = geompy.GetSharedShapesMulti([blocp, ellipsoidep], geompy.ShapeType["EDGE"])
80   allSharedEdges = geompy.GetSharedShapesMulti([blocp, ellipsoidep], geompy.ShapeType["EDGE"])
81   sharedEdges = []
82   for i in range(len(allSharedEdges)):
83     if geompy.NbShapes(allSharedEdges[i], geompy.ShapeType["VERTEX"]) > 1: # edge non degeneree
84       sharedEdges.append(allSharedEdges[i])
85   for i in range(len(sharedEdges)):
86     name = "edgeCommuneEllipsoideBloc_%d"%i
87     geomPublishInFather(initLog.debug,blocp, sharedEdges[i], name)
88
89   facesExternes = []
90   facesExtBloc = []
91   facesExtElli = []
92   faces = geompy.ExtractShapes(facesDefaut, geompy.ShapeType["FACE"], True)
93   if len(faces) == 0:
94     faces = [facesDefaut]
95   for i in range(len(faces)):
96     faceExt = geompy.GetInPlace(ellipsoidep, faces[i])
97     if faceExt is not None:
98       name = "faceExterne_e%d"%i
99       geomPublishInFather(initLog.debug,ellipsoidep, faceExt, name)
100       facesExternes.append(faceExt)
101       facesExtElli.append(faceExt)
102
103     faceExt = geompy.GetInPlace(blocp, faces[i])
104     if faceExt is not None:
105       name = "faceExterne_b%d"%i
106       geomPublishInFather(initLog.debug,blocp, faceExt, name)
107       facesExternes.append(faceExt)
108       facesExtBloc.append(faceExt)
109     else:
110       logging.info("  recherche faces externes par GetShapesOnShape")
111       vertex = geompy.MakeVertexOnSurface(faces[i], 0.5, 0.5)
112       normal = geompy.GetNormal(faces[i], vertex)
113       extrusionFace = geompy.MakePrismVecH(faces[i], normal, 1)
114       #extrusionFace = geompy.MakePrismVecH2Ways(faces[i], normal, 0.1)
115       #extrusionFace = geompy.MakeScaleTransform(extrusionFace, vertex, 1.01)
116       name = "extrusionFace_b%d"%i
117       geomPublishInFather(initLog.debug,blocp, extrusionFace, name)
118       #facesExt = geompy.GetShapesOnShape(extrusionFace, blocp, geompy.ShapeType["FACE"], GEOM.ST_ONIN)
119       facesExt = geompy.GetShapesOnShape(extrusionFace, blocp, geompy.ShapeType["FACE"], GEOM.ST_ON)
120       for j in range(len(facesExt)):
121         name = "faceExterne_b%d_%d"%(i,j)
122         geomPublishInFather(initLog.debug,blocp, facesExt[j], name)
123         facesExternes.append(facesExt[j])
124         facesExtBloc.append(facesExt[j])
125
126   if len(facesExtBloc) < len(faces): # toutes les faces externes du bloc n'ont pas été trouvées. TODO eliminer les detections  multiples
127     logging.info("  recherche faces externes par aretes partagees avec faces externes ellipsoide")
128     facesBloc = geompy.ExtractShapes(blocp, geompy.ShapeType["FACE"], True)
129     for i in range(len(facesBloc)):
130       notOnEllipsoide = True
131       for j in range(len(sharedFaces)): # eliminer les faces communes avec l'ellipsoide
132         if facesBloc[i].IsSame(sharedFaces[j]):
133           notOnEllipsoide = False
134           break
135       if notOnEllipsoide:
136         for j in range(len(facesExtElli)): # les faces recherchees ont une ou plusieurs edge communes avec la ou les faces externes de l'ellipsoide
137           allSharedEdges = []
138           try:
139             allSharedEdges += geompy.GetSharedShapesMulti([facesBloc[i], facesExtElli[j]], geompy.ShapeType["EDGE"])
140           except:
141             pass
142           if len(allSharedEdges) > 0:
143             name = "faceExterne_b%d_%d"%(i,j)
144             geomPublishInFather(initLog.debug,blocp, facesBloc[i], name)
145             facesExternes.append(facesBloc[i])
146             facesExtBloc.append(facesBloc[i])
147
148   aretesInternes = []
149   for i in range(len(facesExternes)):
150     for j in range(i+1,len(facesExternes)):
151       shared = []
152       try:
153         shared += geompy.GetSharedShapesMulti([facesExternes[i], facesExternes[j]], geompy.ShapeType["EDGE"])
154       except:
155         logging.info("no shared edges in %s,%s",i,j)
156       else:
157         aretesInternes += shared
158   for i in range(len(aretesInternes)):
159     name = "aretesInternes_%d"%i
160     geomPublishInFather(initLog.debug,blocp, aretesInternes[i], name)
161
162   edgesBords = []
163   for faceExtB in facesExtBloc:
164     edges = geompy.ExtractShapes(faceExtB, geompy.ShapeType["EDGE"], True)
165     for i in range(len(edges)):
166       isInterne = False
167       for j in range(len(aretesInternes)):
168         if edges[i].IsSame(aretesInternes[j]):
169           isInterne = True
170           break
171       if not isInterne:
172         edgesBords.append(edges[i])
173         name = "edgeBord%d"%i
174         geomPublishInFather(initLog.debug,blocp,edges[i] , name)
175   group = None
176   if len(edgesBords) > 0:
177     group = geompy.CreateGroup(blocp, geompy.ShapeType["EDGE"])
178     geompy.UnionList(group, edgesBords)
179   edgesBords = group
180
181   return volDefautPart, blocp, tore, faceFissure, facesExternes, facesExtBloc, facesExtElli, aretesInternes, ellipsoidep, sharedFaces, sharedEdges, edgesBords