1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2019 CEA/DEN, 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
22 from .geomsmesh import geompy
23 from .geomsmesh import geomPublish
24 from .geomsmesh import geomPublishInFather
27 # -----------------------------------------------------------------------------
28 # --- partition du bloc defaut par generatrice, tore et plan fissure
30 def partitionBlocDefaut(volDefaut, facesDefaut, gener, pipe,
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é
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)
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)
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' )
58 solids = geompy.ExtractShapes(blocp, geompy.ShapeType["SOLID"], True)
60 for i in range(len(solids)):
61 props = geompy.BasicProperties(solids[i])
64 imaxvol = vols.index(maxvol)
65 blocp = solids[imaxvol]
68 imaxvol = vols.index(maxvol)
69 ellipsoidep = solids[imaxvol]
71 geomPublishInFather(initLog.debug, volDefautPart, blocp, 'bloc' )
72 geomPublishInFather(initLog.debug, volDefautPart, ellipsoidep, 'ellipsoide' )
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)
79 #sharedEdges = geompy.GetSharedShapesMulti([blocp, ellipsoidep], geompy.ShapeType["EDGE"])
80 allSharedEdges = geompy.GetSharedShapesMulti([blocp, ellipsoidep], geompy.ShapeType["EDGE"])
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)
92 faces = geompy.ExtractShapes(facesDefaut, geompy.ShapeType["FACE"], True)
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)
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)
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])
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
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
139 allSharedEdges += geompy.GetSharedShapesMulti([facesBloc[i], facesExtElli[j]], geompy.ShapeType["EDGE"])
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])
149 for i in range(len(facesExternes)):
150 for j in range(i+1,len(facesExternes)):
153 shared += geompy.GetSharedShapesMulti([facesExternes[i], facesExternes[j]], geompy.ShapeType["EDGE"])
155 logging.info("no shared edges in %s,%s",i,j)
157 aretesInternes += shared
158 for i in range(len(aretesInternes)):
159 name = "aretesInternes_%d"%i
160 geomPublishInFather(initLog.debug,blocp, aretesInternes[i], name)
163 for faceExtB in facesExtBloc:
164 edges = geompy.ExtractShapes(faceExtB, geompy.ShapeType["EDGE"], True)
165 for i in range(len(edges)):
167 for j in range(len(aretesInternes)):
168 if edges[i].IsSame(aretesInternes[j]):
172 edgesBords.append(edges[i])
173 name = "edgeBord%d"%i
174 geomPublishInFather(initLog.debug,blocp,edges[i] , name)
176 if len(edgesBords) > 0:
177 group = geompy.CreateGroup(blocp, geompy.ShapeType["EDGE"])
178 geompy.UnionList(group, edgesBords)
181 return volDefautPart, blocp, tore, faceFissure, facesExternes, facesExtBloc, facesExtElli, aretesInternes, ellipsoidep, sharedFaces, sharedEdges, edgesBords