1 # -*- coding: utf-8 -*-
4 from geomsmesh import geompy
6 # -----------------------------------------------------------------------------
7 # --- partition du bloc defaut par generatrice, tore et plan fissure
9 def partitionBlocDefaut(volDefaut, facesDefaut, gener, pipe,
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é
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)
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)
32 geompy.addToStudy( volDefautPart, 'volDefautPart' )
33 geompy.addToStudyInFather( volDefautPart, tore, 'tore' )
34 geompy.addToStudyInFather( volDefautPart, faceFissure, 'FACE1' )
35 #geompy.addToStudyInFather( volDefautPart, gencnt, 'generatrice' )
37 solids = geompy.ExtractShapes(blocp, geompy.ShapeType["SOLID"], True)
39 for i in range(len(solids)):
40 props = geompy.BasicProperties(solids[i])
43 imaxvol = vols.index(maxvol)
44 blocp = solids[imaxvol]
47 imaxvol = vols.index(maxvol)
48 ellipsoidep = solids[imaxvol]
50 geompy.addToStudyInFather( volDefautPart, blocp, 'bloc' )
51 geompy.addToStudyInFather( volDefautPart, ellipsoidep, 'ellipsoide' )
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)
58 #sharedEdges = geompy.GetSharedShapesMulti([blocp, ellipsoidep], geompy.ShapeType["EDGE"])
59 allSharedEdges = geompy.GetSharedShapesMulti([blocp, ellipsoidep], geompy.ShapeType["EDGE"])
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)
71 faces = geompy.ExtractShapes(facesDefaut, geompy.ShapeType["FACE"], True)
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)
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)
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])
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
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
118 allSharedEdges += geompy.GetSharedShapesMulti([facesBloc[i], facesExtElli[j]], geompy.ShapeType["EDGE"])
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])
128 for i in range(len(facesExternes)):
129 for j in range(i+1,len(facesExternes)):
132 shared += geompy.GetSharedShapesMulti([facesExternes[i], facesExternes[j]], geompy.ShapeType["EDGE"])
134 logging.info("no shared edges in %s,%s",i,j)
136 aretesInternes += shared
137 for i in range(len(aretesInternes)):
138 name = "aretesInternes_%d"%i
139 geompy.addToStudyInFather(blocp, aretesInternes[i], name)
142 for faceExtB in facesExtBloc:
143 edges = geompy.ExtractShapes(faceExtB, geompy.ShapeType["EDGE"], True)
144 for i in range(len(edges)):
146 for j in range(len(aretesInternes)):
147 if edges[i].IsSame(aretesInternes[j]):
151 edgesBords.append(edges[i])
152 name = "edgeBord%d"%i
153 geompy.addToStudyInFather(blocp,edges[i] , name)
155 if len(edgesBords) > 0:
156 group = geompy.CreateGroup(blocp, geompy.ShapeType["EDGE"])
157 geompy.UnionList(group, edgesBords)
160 return volDefautPart, blocp, tore, faceFissure, facesExternes, facesExtBloc, facesExtElli, aretesInternes, ellipsoidep, sharedFaces, sharedEdges, edgesBords