Blender (jusqu'à 2.49)
|
Python
Inséré
proprement
un
nouveau script dans les menus
|
|
(voir aussi :Nouvelle
interface graphique pour le lancement des scripts et Appel
des scripts à partir des menus )
Les rédacteurs
de scripts ne pensent pas toujours à doter leur travaux d'un en-tête
permettant de les faire apparaître dans le menu
Scripts de Blender . C'est le genre de chose que l'utilisateur
de base peut réaliser lui-même mais avec prudence . En effet,
il existe deux types de scripts . Le premier, le script
simple, constitué d'un seul et unique fichier, se règle
facilement en ajoutant quelques lignes au début . Le second, qui
est constitué d'un nombre variable de modules (en général,
c'est pour cette raison qu'il n'y a pas d'en-tête pour les menus)
dans lesquels l'auteur a regroupé ses fonctions, est plus délicat
à traité car on ne le modifie pas ni ne l'installe sans risque
.
1/ En-tête
pour un fichier simple
Exemple
d'en-tête pour un fichier simple :
#!BPY
"""
Name: 'Paths (.svg, .ps, .eps, .ai, Gimp)'
Blender: 233
Group: 'Import'
Submenu: 'Gimp 1.0 - 1.2.5' Gimp_1_0
Submenu: 'Gimp 2.0' Gimp_2_0
Submenu: 'Illustrator (.ai) PS-Adobe-2.0' AI
Submenu: 'InkScape (.svg)' SVG
Submenu: 'Postscript (.eps/.ps) PS-Adobe-2.0' EPS
Tip: 'Import a path from any of a set of formats (still experimental)'
"""
|
Tous les en-têtes
de script que l'on souhaite voir apparaître dans les menus de blender
doivent commencer par cinq caractères :
Cette
expression indique à l'API python que ce qui se trouvera ensuite
dans l'espace de texte défini par les triples guillemets
doit être interprété
comme une mise en forme d'une hierarchie de menus.
Name: 'texte'
Blender: numéro de version
Group: 'type'
Submenu: 'texte' argument
...
Tip: 'texte'
Name, Blender,
Group
et Tip sont obligatoires . Les guillemets simples aussi autour des
chaine de caractère. En fait, tout ce qui est en gras ci-dessus
est obligatoire .
Le texte qui suit Name
sera affiché dans le menu mais ne doit pas respecter de forme particulière
. Il vaut meiux vérifier que ce nom n'est pas déjà
utilisé par un autre script .
Le numéro de version empêchera
l'utilisation avec une version antérieure qui ne contiendrait pas
certaines fonctions de l'API .
Le type qui suit Group doit
exister dans la version correspondante . Par défaut, et en cas de
doute, il est préférable de choisir le groupe Misc qui
correspond à Divers mais il faut éviter le groupe
Help qui force l'affichage dans un autre menu que Scripts .
Submenu est optionnel est
doit être suivi d'un premier texte libre qui apparaitra dans le menu
et d'un second qui sera passé au script lui-même comme s'il
s'agissait d'un argument en ligen de commande (voir la documentation du
module sys et de la propriété argv en python).
Enfin, le script
doit se trouver dans le répertoire
.blender/scripts
ou dans
le répertoire qui a été défini comme
pythonpath
dans la fenêtre des préférences
utilisateur .
Attention:
Si on souhaite modifier le python path
il faut fournir uen adresse valide : f:\didacticiel\blender\tutor\
ne passera pas alors que f:\didacticiel\blender\tutor ne posera
pas de problème . Il est indispensable d'utiliser le bouton
d'update pour reconstruire la liste . |
2/
Le principe du site-package appliqué au menu Scripts
Certains scripts sont constitués
de plusieurs modules . Les développeurs ayant l'habitude de nommer
leurs librairies de fonctions math.py ou matrix.py
se servir de la méthode précédente pour ajouter une
entrée dans le menu risque d'écraser les fichiers qui portent
déjà le même nom . La parade à ce genre
de problème est toute simple : on crée dans le répertoire
.blender/scriptsun
sous-répertoire pour accueillir tous les modules et on leur
ajoute un fichier __init__.py qui contient un appel aux module nécessaires
.
Par exemple, pour fiber2,
cela donnerait :
et le fichier __init__.py contient
la ligne :
Normalement en ajoutant dans le répertoire
.blender/scripts
le fichier fiber_in_menu_misc.py (le nom exact a peu d'importance,
il doit simplement être différent de ceux qui s'y trouvent
déjà) qui contient ces lignes :
#!BPY
""" Registration info for Blender menus: <- these words are ignored
Name: 'Fiber2'
Blender: 232
Group: 'Misc'
Tip: 'import fiber2 from site-packages.'
"""
import fiber2 |
On devrait obtenir un résultat mais
ce n'est pas suffisant pour les menus de Blender. Il faut appeler
directement le fichier __init__ :
...
import fiber2.__init__ |
ce qui revient à écrire
::
...
import fiber2.fiber2Gui |
3/
Le site-package ne permet pas d'utiliser le menu pour rappeler le même
script
C'est un phénomène
assez connu : le script finit de s'exécuter mais le python ne supprime
pas complètement les modules de son espace de nom . On peut le contrôler
facilement en utilisant le bout de code suivant :
import sys
for m in sys.modules.keys():
if m.find('fiber2')!=-1 : print m, sys.modules[m]
|
On obtient l'affichage suivant
dans la console dos:
fiber2.dynoise
<module 'fiber2.dynoise' from 'E:\zi^p\3DGRX\blender\blender-2.37
-windows\.blender\scripts\fiber2\dynoise.pyc'>
fiber2.fiber3
<module 'fiber2.fiber3' from 'E:\zi^p\3DGRX\blender\blender-2.37-w
indows\.blender\scripts\fiber2\fiber3.pyc'>
fiber2.math None
fiber2.fiber2Gui
<module 'fiber2.fiber2Gui' from 'E:\zi^p\3DGRX\blender\blender-
2.37-windows\.blender\scripts\fiber2\fiber2Gui.pyc'>
fiber2.string
None
fiber2 <module
'fiber2' from 'E:\zi^p\3DGRX\blender\blender-2.37-windows\.blende
r\scripts\fiber2\__init__.pyc'>
fiber2.sys None
fiber2.Blender
None
fiber2.os None
|
La solution consiste à
vérifier que ces noms de modules (les fonctions ont bien été
nettoyées) ne sont plus dans ce dictionnaire et, si c'est
le nécessaire, à les supprimer dans le script d'appel
:
#!BPY
""" Registration info for Blender menus: <- these words are ignored
Name: 'Fiber2'
Blender: 232
Group: 'Misc'
Tip: 'import fiber2 from site-packages.'
"""
import sys
for mod in sys.modules.keys():
if mod.find('fiber2') !=-1 : del sys.modules[mod]
import fiber2.__init__ |
Essayer
avec le fichier d'exemple
Les questions concernant cette page
peuvent être posées sur :
news://news.zoo-logique.org/3D.Blender
|