Code Vonc

Dégrouper les objets

CommentairesComments

La liste "groupes" contient pour chaque polygone l'indice du groupe auquel il appartient.


import c4d


def degroupe(obj):
    
    if not obj : return
    
    nbPolys = obj.GetPolygonCount()
    polys = obj.GetAllPolygons()
    
    groupes = [-1] * nbPolys
    nbGroupes = 0
    
    n = c4d.utils.Neighbor()
    n.Init(obj)
    
    for i, g in enumerate(groupes) :
        
        if g != -1 : continue
        
        polysATraiter = [i]
        
        while(polysATraiter) :
        
            polysATraiterSuivant = []
            
            for p in polysATraiter :
                
                groupes[p] = nbGroupes
                
            for p in polysATraiter :
                
                poly = polys[p]
                
                voisA = n.GetNeighbor(poly.a, poly.b, p)
                voisB = n.GetNeighbor(poly.b, poly.c, p)
                voisD = n.GetNeighbor(poly.d, poly.a, p)
                voisC = c4d.NOTOK
                
                if poly.c != poly.d :
                    voisC = n.GetNeighbor(poly.c, poly.d, p)
                
                if voisA != c4d.NOTOK and groupes[voisA] == -1 :
                    polysATraiterSuivant.append(voisA)
                
                if voisB != c4d.NOTOK and groupes[voisB] == -1 :
                    polysATraiterSuivant.append(voisB)
                
                if voisC != c4d.NOTOK and groupes[voisC] == -1 :
                    polysATraiterSuivant.append(voisC)
                
                if voisD != c4d.NOTOK and groupes[voisD] == -1 :
                    polysATraiterSuivant.append(voisD)
            
            polysATraiter = list(set(polysATraiterSuivant))
        
        nbGroupes += 1
    
    return groupes, nbGroupes
    
    
def main() :
    
    groupes, nbGroupes = degroupe(op)
    
    print groupes
    print nbGroupes
    
    # Sélectionne le premier groupe de polys
    
    bs = op.GetPolygonS()
    
    for i, g in enumerate(groupes) :
        
        if g == 0 :
            bs.Select(i)
    
    c4d.EventAdd()
    
if __name__=='__main__':
    main()