Blender (jusqu'à 2.49)
Python :
Contrôler les courbes Ipos 
avec le python (2/n)
    Début   Index
précédentScript Python
Script python Suivant

Répéter un motif de courbe pour l'API inférieure à la version <= 2.28
Répéter un motif de courbe pour l'API supérieure à la version > 2.32
Répéter un motif de courbe : variation pour imiter cyclic extrapolation

Répéter un motif de courbe pour l'API inférieure à la version <= 2.28

L'objectif de ce script est de copier un certain nombre de fois le motif d'une courbe IPO quelconque attribuée à un objet quelconque.
 

#------------------
#  jm soler (c)  juillet 2003
#  repeter une motif d'une courbe ipo 
#  attribuée à un objet quelconque.
#------------------
import Blender

#nom de l'objet, ['Plane',...] 
objet=['Plane']

#['LocX','LocY','LocZ','dLocX','dLocY','dLocZ',...]
ipo=['LocX']

#'Vect','Free','Auto'
Vtype='Auto' 

#nombre de fois ou le motif est repete 
duplique=2

#boucle sur la liste de nom d'objet definis dans la liste 'objet'
for o  in objet:
  #selection de lobjet 
  O=Blender.Object.Get(o)
  #recuperation des son bloc IPO
  I=O.getIpo()

  #analyse du bloc
  for i in ipo: 
    #traitement des courbes
    for C in I.curves:

      #comparaison des nom de courbes avec celles indiquees dans la iste
      # 'ipo'
      if C.name==i:
         #si le nom est bien dans la liste recuperation du dernier
         # point de la courbe
         Dernier=C.bezierPoints[-1].pt[:]
         Point=[]

         #copie du motif defini par la courbe
         for bz in C.bezierPoints:
            Point.append([bz.pt[:],bz.h1[:],bz.h2[:],bz.h1t,bz.h2t])

         #boucle le nombre de fois indique dans la variable 'duplique'
         for t in range(duplique):
           #ajout de point à la fin de la courbe 
           for bz in Point:
                #...
                C.addBezier((bz[0][0]+Dernier[0],bz[0][1]),Vtype)

           #------------
           # N'utiliser la fonction suivante que dans les versions anterieures
           # a la 228
           #------------
           #recalcul de la courbe
           Blender.Ipo.Recalc(C)

           #recuperation de la position du dernier point pour recommencer
           Dernier=C.bezierPoints[-1].pt[:]

Blender.Window.RedrawAll()
 

Répéter un motif de courbe pour l'API supérieure à la version > 2.32

Globalement le script fonctionne de la même manière que dans les versions natéreiures ou égales à al 2.28.
Hélas, il n'est plus possible (au moins au moment où cette page est mise à jour) de sélectionner le mode de gestion des poignets . La boucle:
 

for bz in C.bezierPoints:
            Point.append([bz.pt[:],bz.h1[:],bz.h2[:],bz.h1t,bz.h2t])
devient:
 
for bz in C.bezierPoints:
            h1, p, h2 = bz.getTriple()
            Point.append([h1[:],p[:],h2[:]])

Le script:
 
 

#------------------
#  jm soler (c)  novembre 2004
#  repeter une motif d'une courbe ipo 
#  attribuée à un objet quelconque.
#------------------
import Blender

# INDISPENSABLE  donnez la liste des courbes
# qui doivent etre traites (en atendant  l'interface
# graphique qui ne devrait pas tarder). Exemple :
#['LocX','LocY','LocZ','dLocX','dLocY','dLocZ',...]
ipo=['LocX']

#nom de l'objet, normalement tou sles objets 
#selectionnes
objet=[o.name for o in Blender.Object.GetSelected()]
 

#'Vect','Free','Auto'
Vtype='Auto' 

#nombre de fois ou le motif est repete 
duplique=2

#boucle sur la liste de nom d'objet definis dans la liste 'objet'
for o  in objet:
  #selection de lobjet 
  O=Blender.Object.Get(o)
  #recuperation des son bloc IPO
  I=O.getIpo()
  print "I=O.getIpo()", I
  #analyse du bloc
  if I!=None:
    for i in ipo: 
      #traitement des courbes
      n=0
      for C in I.curves:
        #comparaison des nom de courbes avec celles indiquees dans la iste
        #'ipo' 
        if C.getName()==i:
           print "C.getName()==i:",C.getName(),i 
           #si le nom est bien dans la liste recuperation du dernier
           # point de la courbe
           Dernier=C.bezierPoints[-1].pt[:]
           #...
           Point=[]
           #copie du motif defini par la courbe
           for bz in C.bezierPoints:
              h1, p, h2 = bz.getTriple()
              Point.append([h1[:],p[:],h2[:]])
           #...
           #boucle le nombre de fois indique dans la variable 'duplique'
           for t in range(duplique):           #ajout de point à la fin de la courbe 
             for bz in Point:
                 C.addBezier((bz[1][0]+Dernier[0],bz[1][1]))
             #... 
             #------------
             # N'utiliser la fonction suivante que dans les versions anterieures
             # a la 228
             #------------
             #recalcul de la courbe
             Blender.Ipo.Recalc(C)
             #...
             #recuperation de la position du dernier point pour recommencer
             Dernier=C.bezierPoints[-1].pt[:]
             #... 

Blender.Window.RedrawAll()

Répéter un motif de courbe : variation pour imiter cyclic extrapolation 
 

#------------------
#  jm soler (c) novembre 2004/févier 2006
#  repeter une motif d'une courbe ipo 
#  attribuée à un objet quelconque.
#------------------
import Blender

# INDISPENSABLE  donnez la liste des courbes
# qui doivent etre traites (en atendant  l'interface
# graphique qui ne devrait pas tarder). Exemple :
#['LocX','LocY','LocZ','dLocX','dLocY','dLocZ',...]
ipo=['RotY']

#nom de l'objet, normalement tous les objets 
#selectionnes
objet=[o.name for o in Blender.Object.GetSelected()]
 

#'Vect','Free','Auto'
Vtype='Auto' 

#nombre de fois ou le motif est repete 
duplique=1

# Pour imiter cyclic extrapolation, changer la valeur  de cette variable
EXTRAPOLATION = 0  # 1 actif, 0 inactif

#boucle sur la liste de nom d'objet definis dans la liste 'objet'
for o  in objet:
  #selection de lobjet 
  O=Blender.Object.Get(o)
  #recuperation des son bloc IPO
  I=O.getIpo()
  print "I=O.getIpo()", I
  #analyse du bloc
  if I!=None:
    for i in ipo: 
      #traitement des courbes
      n=0
      for C in I.curves:
        #comparaison des nom de courbes avec celles indiquees dans la iste
        #'ipo' 
        if C.getName()==i:
           print "C.getName()==i:",C.getName(),i 
           #si le nom est bien dans la liste recuperation du dernier
           # point de la courbe
           Dernier=C.bezierPoints[-1].pt[:]
           if EXTRAPOLATION:   
             DIFFERENCE=Dernier[1]-C.bezierPoints[0].pt[:][1]
           else :
             DIFFERENCE = 0.0
           #...
           Point=[]
           #copie du motif defini par la courbe
           for bz in C.bezierPoints:
              h1, p, h2 = bz.getTriple()
              Point.append([h1[:],p[:],h2[:]])

           #...
           #boucle le nombre de fois indique dans la variable 'duplique'
           for t in range(duplique):           #ajout de point à la fin de la courbe 
             for bz in Point:                 
                    C.addBezier((bz[1][0]+Dernier[0],
                        bz[1][1]+DIFFERENCE))
             #... 
             #------------
             # N'utiliser la fonction suivante que dans les versions anterieures
             # a la 228
             #------------
             #recalcul de la courbe
             Blender.Ipo.Recalc(C)
             #...
             #recuperation de la position du dernier point pour recommencer
             Dernier=C.bezierPoints[-1].pt[:]
             #... 

Blender.Window.RedrawAll()

Pour l'instant ce script est limité aux objets mais il devrait être possible de l'étendre à tous les domaines (Material, Camera, Lamp, etc.) du logiciel . Mais en raison du très grand nombre de nom de courbe possible, cela  ne se fera qu'au travers d'une interface graphique .

Préparation de l'interface graphique :
 

#==============================
# Dictionnaire des types IPOs  et des courbes qui leur sont liées 
#==============================
IPO_type={
 "Camera" :  'Lens', 'ClSta', 'ClEnd',
"Material": 'R', 'G', 'B', 'SpecR', 'SpecG', 'SpecB', 'MirR', 'MirG', 'MirB', 'Ref',  'Alpha', 'Emit', 'Amb', 'Spec', 'Hard', 'SpTra', 'Ang', 'Mode', 'HaSize', 'Translu', 'RayMir', 'FresMir', 'FresMirI', 'FresTra', 'FresTraI', 'TraGlow', 'OfsX', 'OfsY', 'OfsZ', 'SizeX', 'SizeY', 'SizeZ', 'TexR', 'TexG', 'TexB', 'DefVar', 'Col', 'Nor', 'Var',
"Object": 'LocX', 'LocY', 'LocZ', 'dLocX', 'dLocY', 'dLocZ', 'RotX', 'RotY', 'RotZ','dRotX', 'dRotY', 'dRotZ', 'SizeX', 'SizeY', 'SizeZ', 'dSizeX', 'dSizeY', 'dSizeZ', 'Layer', 'Time', 'ColR', 'ColG', 'ColB', 'ColA', 'FStreng', 'FFOff', 'Damping', 'RDamp', 'Perm',
'Lamp': 'Energ', 'R','G', 'B', 'Dist', 'SpoSi', 'SpoBl', 'Quad1', 'Quad2', 'HaIntl',
'World': 'HorR', 'HorG', 'HorB', 'ZenR', 'ZenG', 'ZenB', 'Expos', 'Misi', 'MisDi',  'MisSta', 'MisHi', 'StaR', 'StaG', 'StaB', 'StarDi', 'StarSi', 'OfsX', 'OfsY', 'OfsZ','SizeX', 'SizeY', 'SizeZ', 'TexR', 'TexG', 'TexB', 'DefVar', 'Col', 'Nor', 'Var',
"Texture": 'NSize', 'NDepth', 'NType', 'Turb', 'Vnw1', 'Vnw2', 'Vnw3', 'Vnw4', 'MinkMExp', 'DistM', 'ColT', 'iScale', 'DistA', 'MgType', 'MgH', 'Lacu', 'Oct', 'MgOff', 'MgGan', 'NBase1', 'NBase2',
"Curve": 'Speed',
"Key": 'Speed', 'Key 1','Key 2','Key 3','Key 4','Key 5','Key 6','Key 7','Key 8','Key 9','Key 10','Key 11','Key 12','Key 13','Key 14','Key 15','Key 16','Key 17', 'Key 18','Key 19','Key 20', 'Key 31',
"Action": 'LocX', 'LocY', 'LocZ', 'SizeX', 'SizeY', 'SizeZ','QuatX', 'QuatY', 'QuatZ', 'QuatW',
"Sequence": 'Fac',
"Constraint": 'Inf.'}

 
 
précédentScript Python
 Script python 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