Blender (jusqu'à 2.49)
Python
Outline selected vertices
    Début   Index
précédentScript Window.EditMode()
Fonction Help Doc Suivant

Version Compatible <=Blender 2.35
Version Compatible >=Blender 2.36 : remarques sur les nouvelles propriétés
Le script  pour B236 et suivant
Observations sur la conservation des données pendant un passage de mode d'édition

Version Compatible <=Blender 2.35
 

#!BPY

""" Registration info for Blender menus: <- these words are ignored
Name: 'Outline vertices selection'
Blender: 233
Group: 'Mesh'
Tip: 'return the outline of the selected vertice. '
"""
"""
#----------------------------------------------
# (c) jm soler Aout 2004, released under Blender Artistic Licence 
#    for the Blender 2.34 Python Scripts Bundle.
#----------------------------------------------
# Page officielle :
#   http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_outlineselect.htm
# Communiquer les problemes et erreurs sur:
#   http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender
#---------------------------------------------
# ce script est proposé sous Blender Artistic Licence pour etre associe
# a la distribution de Blender 2.33 et 2.34
#----------------------------------------------
"""
import Blender 
from Blender import NMesh

def select_face(me,result):
   if result==1: 
      return me.getSelectedFaces()
   else: 
     fullface=[]
     for f in me.faces:
         c=0 
         for v in f.v:
            if v.sel==1: c+=1
         if c==len(f.v):
            fullface.append(f)
     return fullface

def collecte_edge(me,result):
      edgelist = []
      for face in select_face(me,result):
          if len(face.v) == 4:
              vlist = [0,1,2,3,0]
          elif len(face.v) == 3:
              vlist = [0,1,2,0]
          else:
              vlist = [0,1]
          for i in range(len(vlist)-1): 
                 vert0 = min(face.v[vlist[i]].index,face.v[vlist[i+1]].index)
                 vert1 = max(face.v[vlist[i]].index,face.v[vlist[i+1]].index) 
                 edgeinlist = 0
                 for edge in edgelist:
                     if ((edge[0]==vert0) and (edge[1]==vert1)):
                          edgeinlist = 1
                          edge[2] = edge[2]+1
                          edge.append(me.faces.index(face))
                          break 
                 if edgeinlist==0:
                          edge = [vert0,vert1,1,me.faces.index(face)]
                          edgelist.append(edge)
      edgecorlist=[] 
      for  edge in edgelist:
        if  edge[2]==1:
            edgecorlist.append(edge)
      for v in me.verts:
          v.sel=0
      for edge in  edgecorlist:
          me.verts[edge[0]].sel=1
          me.verts[edge[1]].sel=1
      me.update() 
      edges=len(edgelist)
      return edges, edgelist

MESH3D = Blender.Object.GetSelected()[0]
if MESH3D.getType() == 'Mesh':
   warning = "SELECT TYPE: %t | FACE SELECT (uv mode edit but does not work for the moment)? %x1| Vertex SELECT (normal mode edit)? %x2"
   result = Blender.Draw.PupMenu(warning) 
   EDITMODE=Blender.Window.EditMode()
   Blender.Window.EditMode(0)
   MESH = MESH3D.getData() 
   edges, edgelist=collecte_edge(MESH,result)
   Blender.Window.EditMode(EDITMODE) 

Version Compatible >=Blender 2.36  et suivant 

L'API python 2.36/237 offre l'accès à de nouveaux paramètres dans le module NMesh ainsi que dans la gestion des objets meshes eux-même. 

Ces nouvelles propriétés occasionnent quelques difficultés de gestion dans les anciens scripts car les nouvelles valeurs ne sont pas toutes en relation et la modification d'un élément n'est pas toujours pris en compte dans les autres éléments qui sont  liés au même domaine . C'est le cas en particulier des faces sélectionnées qui devraient être  en relation avec les sommets sélectionnés.   La modification de la valeur  sur le paramatre vert.sel n'est pas  retranscrite dans la liste des faces.sel . On peut aussi constater que la liste des faces selectionnées à la préseance dans l'affichage .

Ces améliorations ne sont pas seulement cause de problèmes, elles permettent de raccourcir certaines fonctions et de les accélérere en particulier la fonction select_face  :
 
 

...
def select_face(me,result):
   if result==1: 
      return me.getSelectedFaces()
   else: 
     fullface=[]
     for f in me.faces:
         c=0 
         for v in f.v:
            if v.sel==1: c+=1
         if c==len(f.v):
            fullface.append(f)
     return fullface
...

peut être  réduite à une simple ligne :
 

...
def select_face(me,result):
     return [f for f in me.faces if f.sel==1]
...

Le script 

Il n'est pas encore possible de l'utiliser  en mode de sélection Edge

ou Face :

Les données sont effacées pendant le passage d'un mode à l'autre .
 

#!BPY

""" Registration info for Blender menus: <- these words are ignored
Name: 'Outline vertices selection'
Blender: 236
Group: 'Mesh'
Tip: 'return the outline of the selected vertice. '
"""
"""
#----------------------------------------------
# (c) jm soler February 2005, released under Blender Artistic Licence 
#    for the Blender 2.36 Python Scripts Bundle.
#----------------------------------------------
# Page officielle :
#   http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_outlineselect.htm
# Communiquer les problemes et erreurs sur:
#   http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender
#---------------------------------------------
# ce script est proposé sous Blender Artistic Licence pour etre associe
# a la distribution de Blender 2.33 et 2.34
#----------------------------------------------
"""
import Blender 
from Blender import NMesh

def select_face(me,result):
     return [f for f in me.faces if f.sel==1]

def collecte_edge(me,result):
      edgelist = []
      for face in select_face(me,result):
          if len(face.v) == 4:
              vlist = [0,1,2,3,0]
          elif len(face.v) == 3:
              vlist = [0,1,2,0]
          else:
              vlist = [0,1]
          for i in range(len(vlist)-1): 
                 vert0 = min(face.v[vlist[i]].index,face.v[vlist[i+1]].index)
                 vert1 = max(face.v[vlist[i]].index,face.v[vlist[i+1]].index) 
                 edgeinlist = 0
                 for edge in edgelist:
                     if ((edge[0]==vert0) and (edge[1]==vert1)):
                          edgeinlist = 1
                          edge[2] = edge[2]+1
                          edge.append(me.faces.index(face))
                          break 
                 if edgeinlist==0:
                          edge = [vert0,vert1,1,me.faces.index(face)]
                          edgelist.append(edge)
      edgecorlist=[] 
      for  edge in edgelist:
        if  edge[2]==1:
            edgecorlist.append(edge)
      for f in me.faces:
          f.sel=0
      for v in me.verts:
          v.sel=0
      for edge in  edgecorlist:
          me.verts[edge[0]].sel=1
          me.verts[edge[1]].sel=1
      me.update() 
      edges=len(edgelist)
      return edges, edgelist

MESH3D = Blender.Object.GetSelected()[0]
if MESH3D.getType() == 'Mesh':
   EDITMODE=Blender.Window.EditMode()
   Blender.Window.EditMode(0)
   MESH = MESH3D.getData() 
   edges, edgelist=collecte_edge(MESH,0)
   Blender.Window.EditMode(EDITMODE) 

Observations sur la conservation des données pendant un passage de mode d'édition





précédentScript Window.EditMode()
 Fonction Help Doc Suivant
Vers le  Haut de page

Les questions concernant cette page  peuvent être posées sur  :
 news://news.zoo-logique.org/3D.Blender


 

 

Livre en français
Blender : apprenez, pratiquez, Créez, livre, Ed. Campus Press, coll. Starter Kit
Blender Starter Kit

Forum
FAQ
Lexique
Didacticiels
Compilations
Blender2KT
Débuter
Modelage
Blender python
Materiaux
Lumière
Animation
API python (eng)
Archives nzn
Statistiques
Doc flash Sculptris
Galerie Sculptris

mon site de démos sur youtube