|
Blender (jusqu'à 2.49)
|
Python
Swap
matrices
between
2 or several objects
|
|
1/
First version : Swap between only two objects
Dans cette première
version, il n'y a que deux objets . En soi, ce script n'est pas très
utile il ne fait que doubler la procédure suivante :
1/ sélectionner
2
objets et seulement 2 (plus ne servirait à rien, le surplus
serait tout simplement ignoré).
2/ activer [move
object center only] (le bouton avec 3points soulignés par une
flêche)
3/ faire S(key),
-(key),
1(key) et [entrée]
| #!BPY
"""
Name: 'Swap Objetc's Location'
Blender: 237
Group: 'Object'
Tooltip: 'Swap the location of the two selected object'
"""
__author__ = "Authors Name"
__url__ = ("blender", "elysiun","Inverse Objetc's Location script homepage,
http://http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_invobjloc.htm",)
__version__ = "0.02"
__bpydoc__ = """\
In this script, the first object of the the half list is swaped with
the first object of with the second half .
If the objects list contains 2 elements, the script swaps
the first one and second one. if the list owns 4 elements,
it swaps the first with the third one and so on .
Usage: Select two objects or more but the number must always be even
(pair) and call the script .
Notes: two objects must be selected at least .
"""
# --------------------------------------------------------------------------
# Inverse Objetc's Location (c) Jean-Michel Soler 26/07/2005
# --------------------------------------------------------------------------
import Blender
from Blender import Object, Mathutils
try:
O=Object.GetSelected()
n2=len(O)/2
for n in range(0,n2):
mat=O[n].getMatrix()
O[n].setMatrix(O[n+n2].getMatrix())
O[n+n2].setMatrix(mat)
Blender.Redraw()
except:
print "two objects must be selected at least " |
2/
second version : half list by half list
| #!BPY
"""
Name: 'Swap Objetc's Location'
Blender: 237
Group: 'Object'
Tooltip: 'Swap the location of the two selected object'
"""
__author__ = "Jean-Michel Soler"
__url__ = ("blender", "elysiun","Inverse Objetc's Location script homepage,
http://http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_invobjloc.htm",)
__version__ = "0.02"
__bpydoc__ = """\
In this script, the first object of the the half list is swaped with
the first object of with the second half .
If the objects list contains 2 elements, the script swaps
the first one and second one. if the list owns 4 elements,
it swaps the first with the third one and so on .
Usage: Select two objects or more but the number must always be even
(pair) and call the script .
Notes: two objects must be selected at least .
"""
# --------------------------------------------------------------------------
# Inverse Objetc's Location (c) jmsoler 26/07/2005
# --------------------------------------------------------------------------
import Blender
from Blender import Object, Mathutils
try:
O=Object.GetSelected()
n2=len(O)/2
for n in range(0,n2):
mat=O[n].getMatrix()
O[n].setMatrix(O[n+n2].getMatrix())
O[n+n2].setMatrix(mat)
Blender.Redraw()
except:
print "two objects must be selected at least " |
3/
By connected objects each other in a interactive list with connexions
displayed in 3D window
Le procédé
est un peu plus long . On commence par lancer le script 'swap_link_obj.py'
soit
en le plaçant dans la fenêtre de texte et en faisant
Alt-p,
soit en l'appelant par le menu Scripts (dans ce cas, il se chargera
automatiquement) .
Le script va se connecter automatiquement
à l'objet actif courant, et lui ajouter un scriptlink avec
un évennement Redraw, c'est- à-dire un lien qui oblige
le logiciel à exécuter le script pour cet objet chaque fois
que la fenêtre 3D est redessinée et en même
temps il crée une liste de nom d'objets qu'il accroche au module
python principal pour pouvoir la retrouver à la prochaine
exécution (rappel : les données sont effacées
entre deux exécutions sauf celle qui sont liées directement
au module Blender, ce qui est une mauvaise habitude iil vaudrait mieux
utiliser le module Blender.Registry ).

Chaque fois qu'il est exécuté,
le script analyse la liste des noms d'objet . Si l'objet courant n'y
figure pas , il ajoute le nom de ce dernier et déplace le lien scriptlink
de l'ancien objet courant au nouveau (le nom du précédent
objet est mémorisé dans la variable Blender.master) . De
cette manière, il n'y a qu'une seule et unique exécution
du script . Il compte aussi le nombre d'objet sélectionnés
et si aucun objet, n'est sélectionné, il vide la liste
mémorisée , ce qui permet de recommencer une série
de liens .

| #!BPY
"""
Name: 'Prepare a list of connected objects'
Blender: 232
Group: 'Object'
Tooltip: 'draw connections to swap location between several selected
objects'
"""
# ============================================
# (c) jm soler 27/07/2005, released under Blender artistic licence
# last update : 27/07/2005
# ============================================
import Blender
from Blender import BGL,Draw
p=[0,0,0.0,0.0]
p2=[0,0,0.0,0.01]
NAME='swap_link_obj.py'
try:
O= Blender.Scene.getCurrent().getActiveObject()
if len(Blender.Object.GetSelected())==1:
Blender.connectedlist=[]
if O.getName() not in Blender.connectedlist:
Blender.connectedlist.append(O.getName())
M=Blender.Object.Get(Blender.master)
M.clearScriptLinks([NAME])
Blender.master=O.getName()
if O.getScriptLinks('Redraw')== None :
O.addScriptLink(NAME,'Redraw')
elif NAME not in O.getScriptLinks('Redraw'):
O.addScriptLink(NAME,'Redraw')
for P in range(0,len(Blender.connectedlist)-1,2):
p=Blender.Object.Get(Blender.connectedlist[P]).getMatrix()[3][:]
p2=Blender.Object.Get(Blender.connectedlist[P+1]).getMatrix()[3][:]
BGL.glColor3f(1.0,0.5,0.0)
BGL.glBegin(BGL.GL_LINES)
BGL.glVertex3f(p[0],p[1],p[2])
BGL.glVertex3f(p2[0],p2[1],p2[2])
BGL.glEnd()
BGL.glColor3f(1.0,1.0,1.0)
except:
if NAME not in [t.name for t in Blender.Text.Get()]:
SCRIPTDIR = Blender.Get('scriptsdir')
Blender.Text.Load(SCRIPTDIR+NAME)
O= Blender.Scene.getCurrent().getActiveObject()
Blender.connectedlist=[]
Blender.connectedlist.append(O.getName())
Blender.master=O.getName()
if O.getScriptLinks('Redraw')== None :
O.addScriptLink(NAME,'Redraw')
elif NAME not in O.getScriptLinks('Redraw'):
O.addScriptLink(NAME,'Redraw')
|
Les questions concernant cette page
peuvent être posées sur :
news://news.zoo-logique.org/3D.Blender
|