# -*- coding: utf-8 -*- import logging from geomsmesh import geompy from prolongeVertices import prolongeVertices # ----------------------------------------------------------------------------- # --- zone de defaut, constructions geometrique avec CAO d'origine def creeZoneDefautGeom(objetSain, shapeDefaut, origShapes, verticesShapes, dmoyen, lgExtrusion=50): """ Construction CAO de la zone à remailler, quand on utilise la CAO d'origine, apres appel creeZoneDefautMaillage @param objetSain : la géometrie de l'objet initial @param shapeDefaut : objet géometrique représentant la fissure (selon les cas, un point central, ou une shape plus complexe, dont on ne garde que les vertices) @param origShapes : liste id subShapes @param verticesShapes : listes noeuds de bord @param dmoyen : longueur arete moyenne bord @lgExtrusion : distance d'extrusion de la face du defaut (ne vaut que pour des fissures courtes) @return (facesDefaut, centreDefaut, normalDefaut, extrusionDefaut) """ logging.info("start") trace = True faces = [] curves = [] cdgs = [] projs = [] normals = [] extrusions = [] partitions = [] decoupes = [] for ishape, vertices in enumerate(verticesShapes): aShape = origShapes[ishape] [face] = geompy.SubShapes(objetSain, [aShape]) faces.append(face) curve = geompy.MakePolyline(vertices, False) curves.append(curve) if trace: name="poly_%d"%aShape geompy.addToStudy(curve, name) # cdg = geompy.MakeCDG(curve) cdgs.append(cdg) if trace: name="cdgpoly_%d"%aShape geompy.addToStudy(cdg, name) # projCdg = geompy.MakeProjection(cdg, face) projs.append(projCdg) if trace: name="projCdg_%d"%aShape geompy.addToStudy(projCdg, name) # normal = geompy.GetNormal(face, projCdg) normals.append(normal) if trace: name="normal_%d"%aShape geompy.addToStudy(normal, name) # extrusion = geompy.MakePrismVecH2Ways(curve, normal, 10) extrusions.append(extrusion) if trace: name="extrusion_%d"%aShape geompy.addToStudy(extrusion, name) # verticesProlongees = prolongeVertices(vertices) # curveprol = geompy.MakePolyline(verticesProlongees, False) if trace: name="polyProl_%d"%aShape geompy.addToStudy(curveprol, name) # extruprol = geompy.MakePrismVecH2Ways(curveprol, normal, 10) if trace: name="extruProl_%d"%aShape geompy.addToStudy(extruprol, name) # partition = geompy.MakePartition([face], [extruprol], [], [], geompy.ShapeType["FACE"], 0, [], 0) partitions.append(partition) if trace: name="partition_%d"%aShape geompy.addToStudy(partition, name) pass # centreSphere = geompy.MakeCDG(shapeDefaut) geompy.addToStudy(centreSphere, "cdg_defaut") ccurves = geompy.MakeCompound(curves) gravCenter = geompy.MakeCDG(ccurves) geompy.addToStudy(gravCenter, "cdg_curves") for i in range(len(partitions)): if trace: logging.debug(" --- original shape %s", origShapes[i]) dists = [] facesToSort = [] subFaces = geompy.ExtractShapes(partitions[i], geompy.ShapeType["FACE"], True) for aFace in subFaces: cdg = geompy.MakeCDG(aFace) distance = geompy.MinDistance(cdg, centreSphere) dists.append(distance) facesToSort.append(aFace) if trace: logging.debug("distance = %s", distance) pass pass if len(dists) > 0: minDist = min(dists) for j,d in enumerate(dists): if d == minDist: aFace = facesToSort[j] name="decoupe_%d"%origShapes[i] geompy.addToStudy(aFace, name) decoupes.append(aFace) break pass pass facesDefaut = decoupes[0] if len(decoupes) > 1: facesDefaut = geompy.MakePartition(decoupes, [], [], [], geompy.ShapeType["FACE"], 0, [], 0) geompy.addToStudy(facesDefaut, "facesDefaut") shells=[] if len(decoupes) > 1: # plusieurs faces de defaut subFaces = geompy.ExtractShapes(facesDefaut, geompy.ShapeType["FACE"], True) # --- regroupe les subFaces en shells connectes theFaces = list(subFaces) # copy while len(theFaces) > 0: logging.debug("------- len(theFaces) %s" , len(theFaces)) theFace = theFaces[0] logging.debug(" start with face %s",theFaces[0]) theFaces[0:1] = [] aShell = [theFace] toAdd =[theFace] while len(toAdd) > 0: toAdd = [] toRemove = [] for i in range(len(theFaces)): logging.debug(" try %s", theFaces[i]) for aFace in aShell: logging.debug(" with %s", aFace) try: edge = geompy.GetSharedShapesMulti([aFace, theFaces[i]], geompy.ShapeType["EDGE"]) edgeShared = True except: edgeShared = False if edgeShared: if theFaces[i] not in toAdd: toAdd.append(theFaces[i]) toRemove.append(i) logging.debug(" --- add %s", theFaces[i]) aShell += toAdd for k in sorted(toRemove, reverse=True): theFaces[k:k+1] = [] theShell = geompy.MakeShell(aShell) name = "theShell%d"%len(shells) geompy.addToStudy(theShell,name) shells.append(theShell) # distances = [] for aShell in shells: # --- trouver le shell en contact avec la fissure distances.append(geompy.MinDistance(aShell, shapeDefaut)) minDist = min(distances) for index in range(len(distances)): if distances[index] == minDist: break theShellDefaut = shells[index] # else: # --- une seule face de defaut subFaces = [facesDefaut] theShellDefaut = geompy.MakeShell(subFaces) if trace: geompy.addToStudy(theShellDefaut,"theShellDefaut") theFaces = geompy.ExtractShapes(theShellDefaut, geompy.ShapeType["FACE"], True) distances = [] for aFace in theFaces: distances.append(geompy.MinDistance(aFace, centreSphere)) minDist = min(distances) for index in range(len(distances)): if distances[index] == minDist: break centreDefaut = geompy.MakeProjection(centreSphere, theFaces[index]) if trace: geompy.addToStudy(centreDefaut, "centreDefaut") normalDefaut = geompy.GetNormal(subFaces[index], centreDefaut) if trace: geompy.addToStudy(normalDefaut, "normalDefaut") extrusionDefaut = geompy.MakePrismVecH(theShellDefaut, normalDefaut, -lgExtrusion) info = geompy.ShapeInfo(extrusionDefaut) logging.debug("shape info %s", info) if (info['SOLID'] > 1) or (info['COMPOUND'] > 0) : solids = geompy.ExtractShapes(extrusionDefaut, geompy.ShapeType["SOLID"], True) solid0 = solids[0] for i in range(1,len(solids)): solid0 = geompy.MakeFuse(solid0, solids[i]) extrusionDefaut = solid0 if trace: geompy.addToStudy(extrusionDefaut, "extrusionDefaut") return facesDefaut, centreDefaut, normalDefaut, extrusionDefaut