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