# -*- coding: utf-8 -*- import logging from geomsmesh import geompy # ----------------------------------------------------------------------------- # --- partition du bloc defaut par generatrice, tore et plan fissure def partitionBlocDefaut(volDefaut, facesDefaut, gener, pipe, facefis, ellipsoide): """ Partition du bloc defaut par la generatrice de l'ellipse, le tore elliptique, la face plane de fissure @param volDefaut : le bloc defaut @param gener : la generatrice de l'ellipse, positionnée dans l'espace @param pipe : le tore partitionné par le plan de fissure, positionné dans l'espace @param facefis : la face plane de la fissure, positionnée dans l'espace @return (volDefautPart, blocp, tore, faceFissure), le bloc partitionné, les sous shapes issues de la partition (le bloc moins le tore, la generatrice, le tore, la face de fissure) """ logging.info("start") volDefautPart = geompy.MakePartition([volDefaut], [pipe, facefis, ellipsoide], [], [], geompy.ShapeType["SOLID"], 0, [], 1) blocp = geompy.GetInPlaceByHistory(volDefautPart, volDefaut) #gencnt = geompy.GetInPlaceByHistory(volDefautPart, gener) tore = geompy.GetInPlaceByHistory(volDefautPart, pipe) faceFissure = geompy.GetInPlaceByHistory(volDefautPart, facefis) #ellipsoidep =geompy.GetInPlaceByHistory(volDefautPart, ellipsoide) geompy.addToStudy( volDefautPart, 'volDefautPart' ) geompy.addToStudyInFather( volDefautPart, tore, 'tore' ) geompy.addToStudyInFather( volDefautPart, faceFissure, 'FACE1' ) #geompy.addToStudyInFather( volDefautPart, gencnt, 'generatrice' ) solids = geompy.ExtractShapes(blocp, geompy.ShapeType["SOLID"], True) vols = [] for i in range(len(solids)): props = geompy.BasicProperties(solids[i]) vols.append(props[2]) maxvol = max(vols) imaxvol = vols.index(maxvol) blocp = solids[imaxvol] vols[imaxvol] = 0 maxvol = max(vols) imaxvol = vols.index(maxvol) ellipsoidep = solids[imaxvol] geompy.addToStudyInFather( volDefautPart, blocp, 'bloc' ) geompy.addToStudyInFather( volDefautPart, ellipsoidep, 'ellipsoide' ) sharedFaces = geompy.GetSharedShapesMulti([blocp, ellipsoidep], geompy.ShapeType["FACE"]) for i in range(len(sharedFaces)): name = "faceCommuneEllipsoideBloc_%d"%i geompy.addToStudyInFather(blocp, sharedFaces[i], name) #sharedEdges = geompy.GetSharedShapesMulti([blocp, ellipsoidep], geompy.ShapeType["EDGE"]) allSharedEdges = geompy.GetSharedShapesMulti([blocp, ellipsoidep], geompy.ShapeType["EDGE"]) sharedEdges = [] for i in range(len(allSharedEdges)): if geompy.NbShapes(allSharedEdges[i], geompy.ShapeType["VERTEX"]) > 1: # edge non degeneree sharedEdges.append(allSharedEdges[i]) for i in range(len(sharedEdges)): name = "edgeCommuneEllipsoideBloc_%d"%i geompy.addToStudyInFather(blocp, sharedEdges[i], name) facesExternes = [] facesExtBloc = [] facesExtElli = [] faces = geompy.ExtractShapes(facesDefaut, geompy.ShapeType["FACE"], True) if len(faces) == 0: faces = [facesDefaut] for i in range(len(faces)): faceExt = geompy.GetInPlace(ellipsoidep, faces[i]) if faceExt is not None: name = "faceExterne_e%d"%i geompy.addToStudyInFather(ellipsoidep, faceExt, name) facesExternes.append(faceExt) facesExtElli.append(faceExt) faceExt = geompy.GetInPlace(blocp, faces[i]) if faceExt is not None: name = "faceExterne_b%d"%i geompy.addToStudyInFather(blocp, faceExt, name) facesExternes.append(faceExt) facesExtBloc.append(faceExt) else: logging.info(" recherche faces externes par GetShapesOnShape") vertex = geompy.MakeVertexOnSurface(faces[i], 0.5, 0.5) normal = geompy.GetNormal(faces[i], vertex) extrusionFace = geompy.MakePrismVecH(faces[i], normal, 1) #extrusionFace = geompy.MakePrismVecH2Ways(faces[i], normal, 0.1) #extrusionFace = geompy.MakeScaleTransform(extrusionFace, vertex, 1.01) name = "extrusionFace_b%d"%i geompy.addToStudyInFather(blocp, extrusionFace, name) #facesExt = geompy.GetShapesOnShape(extrusionFace, blocp, geompy.ShapeType["FACE"], GEOM.ST_ONIN) facesExt = geompy.GetShapesOnShape(extrusionFace, blocp, geompy.ShapeType["FACE"], GEOM.ST_ON) for j in range(len(facesExt)): name = "faceExterne_b%d_%d"%(i,j) geompy.addToStudyInFather(blocp, facesExt[j], name) facesExternes.append(facesExt[j]) facesExtBloc.append(facesExt[j]) if len(facesExtBloc) < len(faces): # toutes les faces externes du bloc n'ont pas été trouvées. TODO eliminer les detections multiples logging.info(" recherche faces externes par aretes partagees avec faces externes ellipsoide") facesBloc = geompy.ExtractShapes(blocp, geompy.ShapeType["FACE"], True) for i in range(len(facesBloc)): notOnEllipsoide = True for j in range(len(sharedFaces)): # eliminer les faces communes avec l'ellipsoide if facesBloc[i].IsSame(sharedFaces[j]): notOnEllipsoide = False break if notOnEllipsoide: for j in range(len(facesExtElli)): # les faces recherchees ont une ou plusieurs edge communes avec la ou les faces externes de l'ellipsoide allSharedEdges = [] try: allSharedEdges += geompy.GetSharedShapesMulti([facesBloc[i], facesExtElli[j]], geompy.ShapeType["EDGE"]) except: pass if len(allSharedEdges) > 0: name = "faceExterne_b%d_%d"%(i,j) geompy.addToStudyInFather(blocp, facesBloc[i], name) facesExternes.append(facesBloc[i]) facesExtBloc.append(facesBloc[i]) aretesInternes = [] for i in range(len(facesExternes)): for j in range(i+1,len(facesExternes)): shared = [] try: shared += geompy.GetSharedShapesMulti([facesExternes[i], facesExternes[j]], geompy.ShapeType["EDGE"]) except: logging.info("no shared edges in %s,%s",i,j) else: aretesInternes += shared for i in range(len(aretesInternes)): name = "aretesInternes_%d"%i geompy.addToStudyInFather(blocp, aretesInternes[i], name) edgesBords = [] for faceExtB in facesExtBloc: edges = geompy.ExtractShapes(faceExtB, geompy.ShapeType["EDGE"], True) for i in range(len(edges)): isInterne = False for j in range(len(aretesInternes)): if edges[i].IsSame(aretesInternes[j]): isInterne = True break if not isInterne: edgesBords.append(edges[i]) name = "edgeBord%d"%i geompy.addToStudyInFather(blocp,edges[i] , name) group = None if len(edgesBords) > 0: group = geompy.CreateGroup(blocp, geompy.ShapeType["EDGE"]) geompy.UnionList(group, edgesBords) edgesBords = group return volDefautPart, blocp, tore, faceFissure, facesExternes, facesExtBloc, facesExtElli, aretesInternes, ellipsoidep, sharedFaces, sharedEdges, edgesBords