PDA

Voir la version complète : Question Ordre de sélection



Floc
09/11/2013, 00h02
Bonjour a tous
Voila dans le cadre du cqtv7 j'ai écris un petit script super basique histoire de rattraper une bévue. Le but est de remplacer un objet qui a été dupliqué par un autre, un peu comme dans after ou on peu remplacer les médias de plusieurs calque d'un coup en utilisant le drag & drop + "Alt".
Le script fonctionne. On sélectionne des objet et le premier en haut de la liste dans l'object editor remplace ceux qui sont en dessous. Il suffit donc de placer l'objet "remplaçant" au dessus des "remplacés" dans l'object editor.
En fait au départ je voulais que ce soit le dernier sélectionné qui soit le remplaçant mais apparemment c4d ne fonctionne pas comme ça.
Le truc c'est que je suis pas sur que ce soit bien catholique comme méthode. C'est simplement que j'ai constaté que GetActiveObject à l'air de fonctionner comme ça, mais j'en suis pas plus sur que ça.
Ma question est donc est ce que la méthode est "secure" ou est ce qu'il vaut mieux en utiliser une autre.


PS: au cas ou le script est en pièce jointe dans mon WIP cqtv7 fontaine

valkaari
09/11/2013, 02h29
Pour info, dans les scripts il y a deux variables qui sont initialisées directement.
doc qui est le doc actif et op qui est l'objet sélectionné. (s'il existe)
Pas besoin obligatoirement de récupérer le document actif. (d'un autre coté, si on veut coder en toute sécurité c'est mieux de le faire :p)
Pour les plugins à voir mais je crois que ces variables ne sont pas initialisées.

Pour ton code si tu utilises c4d.GETACTIVEOBJECTFLAGS_SELECTIONORDER tu vas conserver l'ordre de sélection de tes objets.
Donc si comme tu le dis tu dois sélectionner en dernier l'objet qui remplace les autres tu peux le récupérer avec objList[-1]
Quand tu veux utiliser une boucle sur un tableau et avoir quand même un compteur, tu as la fonction enumerate.
Ça ne change rien au fonctionnement mais c'est plus "pythonesque".

Sinon vérifier qu'il y a au moins deux éléments sélectionnés. C'est un truc de branleur le code, si y a pas les éléments pour faire des opérations, on fait rien.


Sinon dans le menu character--> command tu as la commande pour remplacer des objets par un autre avec quelques options.
Tu sélectionnes tes objets à remplacer et tu doubles clics sur celui qui doit remplacer



import c4d
from c4d import utils
from c4d import gui
#Welcome to the world of Python

def main():

objList = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_SELE CTIONORDER)
if len(objList) <2:
gui.MessageDialog('Sélectionnez deux objets au minimum')
return

masterObj = objList[-1]

newRootObject = c4d.BaseObject(c4d.Onull)
newRootObject.SetName("New_Objects")
doc.InsertObject(newRootObject)




for cpt,theObj in enumerate(objList):
m = theObj.GetMg()
newChild = masterObj.GetClone()
newName = "newChild_" + str(cpt)
newChild.SetName(newName)
newChild.SetMg(m)
newChild.InsertUnder(newRootObject)

c4d.EventAdd()


if __name__=='__main__':
main()

Floc
09/11/2013, 02h58
Merci beaucoup Valkaari, et pour le coup de pouce sur le code, et pour l'info du menu character.
C'est effectivement ce que je cherchai.
Du coup le script était pas vraiment utile, mais c'est en pythonant qu'on devient pythoneur, n'est il pas ?.
Je fais quand même remonter l'info dans le wip ainsi que le script qui peut eventuellement servir a des "prime users".

xs_yann
09/11/2013, 17h06
Salut,

Je ne connaissais pas la commande du Menu Character, merci Val.

Autre solution, il y a un plugin (payant) qui fait ça, c'est xsReplace :

http://www.xsyann.com/wp-content/uploads/2013/03/xsreplace_desc.png

Il suffit de sélectionner les objets que l'on veut remplacer, puis ouvrir le plugin.
On peut ensuite filtrer la sélection pour ne garder que certains objets (on peut filtrer par préfixe, suffixe, type d'objet, calques...).
Ensuite on drag&drop l'objet de référence qui va servir à remplacer les autres.
On peut choisir l'alignement du nouvel objet par rapport à l'ancien (pratique pour remplacer des objets posés sur un sol par exemple).

Ça fonctionne aussi pour remplacer les textures, ou appliquer un script sur la sélection filtrée.

http://www.xsyann.com/plugins/xsreplace/

valkaari
09/11/2013, 17h57
ha ben je connaissais pas ton plug cool. Pour ceux qui comptent les points, un partout balle au centre ^^