Blender (jusqu'à 2.49)
|
Python
Outline
selected vertices
|
|
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
Les questions concernant cette page
peuvent être posées sur :
news://news.zoo-logique.org/3D.Blender
|