Blender (jusqu'à 2.49)
|
Python
Trucs
et Astuces(1)
Description:
renommer tous ou partie de l'ensemble des objets d'un fichier.
|
|
Il arrive que l'on produise des modélisations
très détaillées avec un nombre considérable
d'objets divers dont les noms finissent par devenir assez peu clair quand
on essaye de les repérer au travers des fenêtres d'affichage
comme celles que la combinaison de touche Shift-F4
(fenêtre de visualisation globale des objets) et Shift
-F1 (fenêtre d'importation) peuvent faire apparaître.
Essayer de savoir ce que peut être
le Plane.001 ou Plane.002 ou Plane.075 relève
de la clairvoyance pure et simple.
Un peu d'ordre pendant la construction
originale aurait évité ce gendre de problème, mais
il est souvent trop tard (d'ailleurs ces opérations d'identification
n'ont rien d'agréable, ni d'attirant, et, en fait, elles sont tellement
fastidieuses qu'on peut dire qu'elles ont tout ce qu'il faut pour
qu'on les oublie). Ensuite, après la modlisation, parvenir
à une situation organisée où chaque objet est
titré, pour identifier son appartenance à tel ou tel
objet plus complexe, devient un vrai casse tête et, finalement, très
ennuyeux.
Ce tutoriel se propose de vous montrer
une petite astuce en Blender2.04/python pour rendre cette tache aussi intuitive
et rapide que possible en passant pasr un certain nombre de phase:
1/ Préparez
votre environnement Blender
2/ Charger
le fichier
3/ Exécuter
le script
4/ Comprendre
pourquoi ça marche.
5/ Transformer
le script pour ne modifier que les objets sélectionnés
Préparez
votre environnement Blender
Pour commencer, préparez votre environnement
Blender pour avoir un espace de travail divisé en, au moins, une
fenêtre 3D et une fenêtre de script. Une, pour voir ce que
vous faites (et parce que, cerise sur le gateau, il y a possibilité
de choisr "à vue" des groupes d'objets pour leur attribuer un nom,
mais chaque chose en son temps, nous verrons cela plus tard), l'autre,
parce qu'il est indispensable de se trouver dans la fenêtre de script
active lorsque l'on tape la combinaison de touche ALT-Pqui lance
l'exécution du script python.
![](images/python/fenetres.jpg)
Charger
le fichier
La méthode
de chargement est expliquée dans la page d'introduction de la
série
de tutoriels sur le Blender Python. Il me parait intéressant
de reprendre ici ces quelques mots pour les adapter à la nouvelle
présentation de Blender 2.0.
La
fenêtre de script est reconnaissable par ce bouton .
Dans la version 2.0x de Blender elle est accessible par une sorte colonne
qui offre un accès direct à chaque type de fenêtre.
C'est la troisième en partant du haut.
Note: Il est difficile
de situer exactement où se trouvera ce bouton. Tout au plus peut-on
signaler qu'il se trouve sur la barre de boutons que les auteurs du logiciel
ont nommé Header.
Peut-être cette barre se trouve-t-elle
au dessus de la fenêtre, ou au dessous. Comme dans la nouvelle mouture
du logiciel il y a un module de jeu qui peut être lancé en
ligne et temps réel, la barre en question peut très bien
avoir disparue. |
![](images/python/ouvrirfichier.jpg)
Il vaut mieux charger le script que de
l'écrire Pour cela cliquer le bouton de DataBloc .
Choisissez
OPEN
NEW .
![](images/python/ouvrirfichier1.jpg)
Cela ouvre un fenêtre de sélection
de fichier comme celle qui vous permet de charger un fichier blend. Le
bouton droit de votre souris surligne en bleu le fichier que vous désignez.
Le bouton gauche fait apparaître le nom dans le second formulaire
. Le bouton central charge immédiatement le fichier. Si vous
n'avez pas de souris 3 boutons ALT-bouton gauche le remplacera.
télécharger
le texte du script sur le web.
Exécuter
le script
Pour exécuter le script il faut
obligatpoirement amener le point de la souris sur la fenêtre
de script et taper: ALT-P.
![](images/python/scriptcharge.jpg)
Comprendre
pourquoi ça marche
Décortiquons le script ligne par
ligne.
Comme vous le savez peut-être déjà,
le langage python est un langage modulaire. On importe donc des blocs,
ou modules, contenants les fonctions et les noms de fonction dont on a
besoin. Dans le blender/python le module qui contient toutes les fonctions
et nom de fonctions, et même tous les sous-modules, s'appelle tout
simplement: Blender, il faut le charger au début du script
si l'on veut effectuer une quelquonque opération sur le logiciel
ou sur les objets qu'il gère en mémoire.
from Blender import Objet
... |
A partir du module principal, on charge
un sous-module: Objet qui permet d'accéder aux objets
du
logiciel. On pourrait se passer de cet appel et demander à utiliser
les méthodes et les champs de ce module en écrivant:
Blender.Objet.
L'appel permet de raccourcir les scripts en chargeant la liste de noms
contenu par le module de manière à ce que python puisse les
reconnaître.
Nous ne nous attarderons pas sur l'importation
du module sys qui n'est nécessaire que pour les utilisateurs
de blender dans un environnement Windows9x/nt/2000. Voir la
page d'intro à ce sujet.
Le module Object
offre les fonctions suivantes :
Get(nom_d_objet)
nom_d_objet est un argument
ou paramètre variable qui peut être, ou non, passé
à la fonction. Si un objet portant ce nom existe dans Blender (un
objet créé par l'utilisateur, evidemment) un pointeur
sur cet objet est retourné dans la variable qui aura été
créé pour le recevoir. En fait il faut écrire:
Variable_locale=Object.Get(nom_d_objet)
A partir de ce moment, si on veut obtenir
le contenu de l'objet nom_d_objet, ou intervenir sur ce contenu,
il faut passer par Variable_locale. Si aucun objet ne porte le nom passé
en paramètre Variable_locale contiendra la valeur None.
Si aucun paramètre n'est fourni
à la fonction elle renvoie une liste contenant tous les noms
d'objets disponibles à ce moment-là.
GetSelected().
Cette fonction retourne la liste
des objets sélectionnés. L'objet actif se trouve en première
position. Il faut écrire:
Variable_locale=Object.GetSelected()
Variable_locale[0] contiendra l'objet
en magenta vif.
Revenons au script.
Nous appliquons la fonction Get()
pour obtenir la liste de tous les noms dans L.
Permet de contrôler le contenu de
la liste en l'affichant dans la console (dos ou autre si on travaille
sous linux), et éventuellement prendre les mesures qui s'imposent
s'il y a un problème.
On crée une boucle sur la liste
de manière à ce que obj corresponde successivement
à chaque nom d'objet. En fait ce nom est en même temps l'objet
lui-même et il est possible de travailler sur chacune de ses variables.
Tous les objets contiennent ces champs:
name - nom de l'objet blender qui est référencé
par cet objet
block_type - "Object"
properties - liste odes propriétés des données
supplémentaires
parent - lien vers l'Objet parent
track - lien vers l'objet traqué
ipo - lien vers les Ipo
data - lien vers les données
mat - la matrice de cet objet
loc - le vecteur de localisation
dloc - le vecteur de localisation delta
rot - the rotation vector (angles are in radians)
drot - the delta rotation vector (angles are in radians)
size - le vecteur dimension/echelle
dsize - le vecteur de dimension/echelle delta
LocX - coordonnée X de localisation
LocY - coordonnée Y de localisation
LocZ - coordonnée Z de localisation
dLocX - X delta location coordinate
dLocY - Y delta location coordinate
dLocZ - Z delta location coordinate
RotX - angle X de rotation (en radians)
RotY - angle Y de rotation (en radians)
RotZ - angle Z de rotation (en radians)
dRotX - angle X delta de rotation (en radians)
dRotY - angle Y delta de rotation (en radians)
dRotZ - angle Z delta de rotation (en radians)
SizeX - dimension/echelle X
SizeY - dimension/echelle Y
SizeZ - dimension/echelle Z
dSizeX - dimension/echelle delta X
dSizeY - dimension/echelle delta Y
dSizeZ - dimension/echelle delta Z
EffX - coordonnée X de l'effector
EffY - coordonnée Y de l'effector
EffZ - coordonnée Z de l'effector
Layer - Calque de l'objet
|
On modifie systématiquement le champ
.name...
obj.name='test_'+obj.name
... |
en créant une chaine de caractère
constituée de la partie entre guillemet, qui est la partie modifiable
ou à ajouter, à laquelle on concatène (on ajoute,
encore une fois) le nom précédent de l'objet. On range le
résultat dans la variable .name
Pour que
le script ne modifie que les objets sélectionnés il sufiit
de transformer la ligne:
L=Object.Get()
en
L=Object.GetSelected()
Télécharger
la version modifiée
Pour faire court, le script peut se
résumer à :
nouveau_nom='cequejeveux_'
import Blender
from Blender import Object
L=Object.Get()
for obj in L:
obj.name=nouveau_nom+obj.name |
Pour corriger une éventuelle
erreur de nom
Script pour corriger les erreurs sur un
groupe d'objets sélectionnés
Télécharger
le script de correction de nom.
Fini
Note personnelle sur la
préparation des fenêtres activables par le menu SCR
(SCReen, écran).
Il est clair que chacun doit avoir ses
préférences et habitudes de travail en ce qui concerne la
présenation de l'espace de travail. Pour ma part j'ai choisi d'avoir
4 écrans accessibles par ce menu.
![](images/python/ouvrir_script204.jpg)
-- Un écran animation avec
une vue 3D, la fenêtre d'affichage des IPOs, et une fenêtre
en bandeau, tout en bas de l'écran pour avoir accès aux commandes
des differents types d'objets.
-- Un écran principal divisé
en deux fenêtres horizontales: une fenêtre de modélisation
3D que je contrôle habituellement avec les touches du clavier numérique,
et la fenêtre de commande.
-- Un écran script tel qu'il
a été décrit ci-dessus.
-- Un écran sequenceur qui
n'ets rien d'autre que l'écran standard du séquenceur de
blender (pour l'instant j'utilise peu le séquenceur).
|
Les questions concernant cette page
peuvent être posées sur :
news://news.zoo-logique.org/3D.Blender
|