1 # -*- coding: utf-8 -*-
4 from geomsmesh import geompy
5 from geomsmesh import geomPublish
6 from geomsmesh import geomPublishInFather
9 # -----------------------------------------------------------------------------
10 # --- partition du bloc defaut par generatrice, tore et plan fissure
12 def partitionBlocDefaut(volDefaut, facesDefaut, gener, pipe,
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é
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)
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)
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' )
40 solids = geompy.ExtractShapes(blocp, geompy.ShapeType["SOLID"], True)
42 for i in range(len(solids)):
43 props = geompy.BasicProperties(solids[i])
46 imaxvol = vols.index(maxvol)
47 blocp = solids[imaxvol]
50 imaxvol = vols.index(maxvol)
51 ellipsoidep = solids[imaxvol]
53 geomPublishInFather(initLog.debug, volDefautPart, blocp, 'bloc' )
54 geomPublishInFather(initLog.debug, volDefautPart, ellipsoidep, 'ellipsoide' )
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)
61 #sharedEdges = geompy.GetSharedShapesMulti([blocp, ellipsoidep], geompy.ShapeType["EDGE"])
62 allSharedEdges = geompy.GetSharedShapesMulti([blocp, ellipsoidep], geompy.ShapeType["EDGE"])
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)
74 faces = geompy.ExtractShapes(facesDefaut, geompy.ShapeType["FACE"], True)
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)
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)
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])
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
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
121 allSharedEdges += geompy.GetSharedShapesMulti([facesBloc[i], facesExtElli[j]], geompy.ShapeType["EDGE"])
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])
131 for i in range(len(facesExternes)):
132 for j in range(i+1,len(facesExternes)):
135 shared += geompy.GetSharedShapesMulti([facesExternes[i], facesExternes[j]], geompy.ShapeType["EDGE"])
137 logging.info("no shared edges in %s,%s",i,j)
139 aretesInternes += shared
140 for i in range(len(aretesInternes)):
141 name = "aretesInternes_%d"%i
142 geomPublishInFather(initLog.debug,blocp, aretesInternes[i], name)
145 for faceExtB in facesExtBloc:
146 edges = geompy.ExtractShapes(faceExtB, geompy.ShapeType["EDGE"], True)
147 for i in range(len(edges)):
149 for j in range(len(aretesInternes)):
150 if edges[i].IsSame(aretesInternes[j]):
154 edgesBords.append(edges[i])
155 name = "edgeBord%d"%i
156 geomPublishInFather(initLog.debug,blocp,edges[i] , name)
158 if len(edgesBords) > 0:
159 group = geompy.CreateGroup(blocp, geompy.ShapeType["EDGE"])
160 geompy.UnionList(group, edgesBords)
163 return volDefautPart, blocp, tore, faceFissure, facesExternes, facesExtBloc, facesExtElli, aretesInternes, ellipsoidep, sharedFaces, sharedEdges, edgesBords