Blender (jusqu'à 2.49)
Python
Swap  matrices 
between 2 or several objects
 
    Main   Index
previuosScript Python
En chantier Next
1/ First version : Swap between only two objects
2/ second version : half list by half list
3/ By connected objects  each other in a interactive list with connexions displayed in 3D window

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')
 


 
précédentScript Python
 En Chantier 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