Blender (jusqu'à 2.49)
Python :
Créer et uvmapper un mesh
et
Mélanger les textures UV disponibles 
dans le fichier courant.
(English version)
    Début   Index
précédentScript Python
script python :identifier les tris Suivant

 
1/ Créer et uvmapper un mesh
2/ Mélanger les textures UV disponibles dans le fichier courant.
3/ Comment savoir si un vertex est sélectionné dans la fenêtre UVeditor ?
4/ UV vertex selector Script 

Créer et uvmapper un mesh
Dans cette version du script il ne serait possible d'assigner qu'un seul materiau à l'ensemble du mesh. 
 

#this seems to work

import Blender
from Blender import *

me=NMesh.GetRaw()
v=NMesh.Vert(1.0,0.0,0.0)
me.verts.append(v)
v=NMesh.Vert(1.0,1.0,0.0)
me.verts.append(v)
v=NMesh.Vert(0.0,1.0,0.0)
me.verts.append(v)
v=NMesh.Vert(0.0,0.0,0.0)
me.verts.append(v)

f=NMesh.Face()
f.v.append(me.verts[0])
f.v.append(me.verts[1])
f.v.append(me.verts[2])
f.v.append(me.verts[3])

uv=[]

uv.append( (0.0,0.0))
uv.append( (1.0,0.0))
uv.append( (1.0,1.0))
uv.append( (0.0,1.0))

f.uv=uv

im=Image.Load('f:/maincrystalpalace3.jpg')
f.image = im

if Blender.Get('version')>=228:
     C = NMesh.FaceModes
else:
     C = NMesh.Const

f.mode=C['LIGHT']
f.mode|=C['TEX']
f.mode|=C['TWOSIDE']

me.faces.append(f)
 

newmat = Material.New('newmat')
newmat.mode = newmat.mode  | 2048
me.materials.append(newmat) 

#
#f.mat=1

f.transp=NMesh.FaceTranspModes['SOLID']
f.flag=NMesh.FaceFlags['ACTIVE']

tex = Texture.New() 
tex.setType('Image') 
tex.image = im 
newmat.setTexture(0, tex) 
mtex = newmat.getTextures()
mtex[0].texco=Texture.TexCo.UV

NMesh.PutRaw(me,"Plane.002")
Blender.Redraw()

Mélanger les textures UV disponibles dans le fichier courant.
télécharger le script
 

#!BPY

"""
Name: 'UV Texture Randomizer'
Blender: 232
Group: 'UV'
Tooltip: 'a script to blend the uv textures with random'
""" 
__author__ = "Jean-Michel Soler (jms)"
__url__ = ("""Script's homepage, http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_python_uvmap.htm""",
"""Communicate problems and errors, http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender""")
__version__ = "11/2004"
__bpydoc__ = """
This script blends all the uvtextures of the current file face by face.

Usage:

   run the script from the UV Scripts Menu. All UV textures will be collected and 
   connected by face.
""" 

#-------------------------------------------------
# script pour melanger les texture uv sur l'ensemble des
# mesh .
#-------------------------------------------------

import Blender
IMAGES=Blender.Image.Get()

#-------------------------------------------------
# BY_OBJECT=0 
#   textures blended by faces
#   textures melangees par faces
# BY_OBJECT=1 
#  textures blended by object
#   textures melangees par object
#---------------------------------------------------
BY_OBJECT=1

#---------------------------------------------------
# Fonction :
# Tester les objets constitues de segment sans aucune 
# face exportable. Retourne faux si au moins une face
# est un triangle ou un quad
#---------------------------------------------------
def onlysegment(o): 
    for f in o.getData().faces:
        if len(f.v)>2:
           return 0
    return 1

#---------------------------------------------------
# Fonction :
# detecte la presence de coordonnee uv 
#---------------------------------------------------
def hasUV(m):
    for f in m.faces:
        #print f.uv
        if f.uv:
              return 1 
    return 0
#---------------------------------------------------
# Operation :
# Creer la liste des objets meshes 
#---------------------------------------------------
OBJ=[o for o  in Blender.Object.Get() 
           if o.getType()== 'Mesh' and 
              (o.getData().faces!=[] or 
                    not onlysegment(o))]

print OBJ

if Blender.Get('version')>=228:
     C = Blender.NMesh.FaceModes
else:
     C = Blender.NMesh.Const

for o in OBJ:
  m=o.getData()
  if hasUV(m) ==1 :
    if BY_OBJECT==1:
       val=int(Blender.Noise.random()*len(IMAGES))
       img=IMAGES[val]
       print img, val
    for f in m.faces:
        if BY_OBJECT==0:
           img=IMAGES[int(Blender.Noise.random()*len(IMAGES))]
           print img
        f.image=img
        f.mode=C['LIGHT']+C['TEX']+C['TWOSIDE']
    m.update()
Blender.Redraw() 

3/ Comment savoir si un vertex est sélectionné dans la fenêtre UVeditor ?

A cette date, 1er octobre 2005, il n'y a rien dans la documentation de l'API qui permette de savoir comment procéder .   On peut imaginer que les informations à ce sujet doivent pourtant être  accessibles simplement . Les coordonnées uv sont liées aux faces et les faces sont dotées d'un flag/drapeau qui permet de savoir s'il elles sont selectionnées ou cachées ou affichées .

Le dictionnaire Blender.NMesh.FaceFlags ne donne  que 3 valeurs, une pour chaque possibilité . On peut les afficher facilement avec le script suivant :
 

import Blender
for k in dir(Blender.NMesh.FaceFlags):
  a=Blender.NMesh.FaceFlags[k]
  print k,' : '
  for b in  [(a & 1<<n)>>n for n in range(15,-1,-1)]:print b,
  print 

 
Attention : observez comment les clefs de ce dictionnaires sont obtenues  :
dir(Blender.NMesh.FaceFlags)
normalement ce dervait être Blender.NMesh.FaceFlags.keys() mais cette focntion renvoie une erreur .
Résultats
ACTIVE  :  2
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
HIDE  :  64
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
SELECT  :  1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1

Comme ces données ne prennent que 3 bits sur les 16 disponibles on peut se poser des question sur ce que blender fait  du reste . Il ne reste plus qu'à tester chaque cas de figure et observer ce que le script suivant affichera .
 

import Blender
from Blender import NMesh

ME=Blender.Object.Get('Sphere').getData()
print dir(ME.faces[0].uv) 
SEL = NMesh.FaceFlags['SELECT']
FA=[f for f in ME.faces if (f.flag & SEL)]
a=FA[0].flag 
for b in  [(a & 1<<n)>>n for n in range(15,-1,-1)]:print b,

Cas numero 1 : aucun vertex sélectionné
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
Cas numero 2 : 1 seul vertex sélectionné
0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1
Cas numero 3 : 2  vertices sélectionnés
0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1
Cas numero 3 : 3  vertices sélectionnés
0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1

Visiblement les bits 2 à 5 sont utilisés pour marquer la sélection d'un vertex dans la fenêtre UVeditor . Il ne reste plus qu'à déterminer quel bit correspond à quel vertex dans la suite des coordonnées uv .  On modifie légèrement les script pour afficher  les cordonnées uv dans l'ordre :
 

import Blender
from Blender import NMesh

ME=Blender.Object.Get('Sphere').getData()
print dir(ME.faces[0].uv) 
SEL = NMesh.FaceFlags['SELECT']
FA=[f for f in ME.faces if (f.flag & SEL)]
print FA[0].flag 
a=FA[0].flag 
for b in  [(a & 1<<n)>>n for n in range(15,-1,-1)]:print b,
print
n=0
for a,b in FA[0].uv:
 print n,'uv : ', a*256,' X'
 print n,'uv : ', b*256,' Y' 
 n+=1
 print
 

et on compare avec les valeurs affichées  en Properties quand on appuie sur la touche N :


ME=Blender.Object.Get('Plane').getData()
FA=[f   for f in ME.faces if (f.flag & 60)] 
UV=[]
for f in FA:
    for u in f.uv:
        if f.flag & 1<<(f.uv.index(u)+2):
            UV.append((round(u[0]*256,2),round(u[1]*256,2)))
print UV[0] 
UV vertex selector
Ce script permet de sélectionner une des coordonées uv par face et dans toutes les faces sélectionnées . Une fois sélectionnés, les sommets positionnés sur le point (0.0,0.0) et  peuvent être déplacé tous ensembles par l'utilisateur .

Mode d'emploi :

 A priori on suppose que l'objet mesh est déjà sélectionné ainsi que les faces que l'on souhaite modifiées et, bien sûr, on se trouve en mode Faceselect .

 1/ Très important : Dans la fenêtre  uvedito, désélectionnez tous le ssommets avec la touche A.

2/ Lancez le script , soit à partir d'un des menus UV ou Scripts, soit à partir de la fenêtre d'édition de texte .

 3/ Dans la boite popup choisissez le numéro du sommet que vous souhaitez traiter  pour l'ensemble des faces . le choix d'étend de 1 à  4 .

4/ Appuyez sur OK sinon le script ne fonctionnera pas . 
  Dans toutes les faces sélectionnée, ce sommet UV va être activé et envoyé aux coordonnées (0.0,0.0)

5/ utilisez le raccourci  G  en faisant attention de ne pas cliquer avec la souris dans la fenêtre UV edtor car vous perdriez toutes les sélections  et déplacez vers la position souhaitée .

 6/ IMPORTANT: après avoir terminé de positionner les sommets n'oubliez pas de tout désélectionner de nouveau ..

#!BPY

"""
Name: '[WIP] UV vertex selector'
Blender: 232
Group: 'UV'
Tooltip: ''
"""
__author__ = "Jean-Michel Soler (jms)"
__url__ = ("""Script's homepage, http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_python_uvmap.htm""",
"""Communicate problems and errors, http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender""")
__version__ = "09/20/2006"
__bpydoc__ = """
    This script selects and moves to 0.0 location one of the uvcoords by face but in all the selected 
    faces  . 
Usage:
   1/ In the  uveditor window, unselect all the uv vertice . 
   2/ Run the script from the UV Scripts Menu. In the pupbox 
      choose the number of one uv vertex (up to 4) . 
   3/ Press  OK . in all selected faces, this uvvertex will be 
      activated and located on 0.0 . 
   3/ Push Gkey  (be careful of do not clic with the mouse on 
      the window, you will loose the selection ) and  move all 
      of them where you want ...
   4/ IMPORTANT : do not forget to unselect agin all before to 
     choose the next uv reusing th escript .
""" 
#-------------------------------------------------
# script pour ...
#------------------------------------------------- 

import Blender 
from Blender import Object,Scene
 

f = Blender.Draw.Create(1)
block = []
block.append(("Value: ", f, 1, 4,"Select the UV vertex"))
 

OBJ= Scene.getCurrent().getActiveObject()
if OBJ.getType()=='Mesh' :
 MESH=OBJ.getData()
 if MESH.hasFaceUV() :
  retval = Blender.Draw.PupBlock("Select UV Vertex", block)
  if retval :
   FA=[F   for F in MESH.faces if (F.flag & 1)] 
   for F in FA :
    F.uv[f.val]=(0.0,0.0)
    F.flag|=1<<(f.val+2)
    print F.flag
   MESH.update()


 
 
précédentScript Python
 script python :indentifier les tris 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