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