PDA

Voir la version complète : expression pour renommer des objets



tabou
30/07/2002, 13h19
J'ai écrit cette petite expression parceque j'en avais ras le bol de passer du temps à renommer de longues séries d'objet.
Pour s'en servir il suffit de mettre cette expression sur le parent et automatiquement les enfants prennent le nom du parent avec un séparateur et un numéro d'ordre. Par la suite tout nouvel objet qu'on met dans le groupe sera automatiquement renommé, pour éviter cela il suffit de supprimer l'expression après usage.
Voilà, je me suis dit que ça pouvait peut être servir à d'autres utilisateurs...

/* Cette expression, une fois placée sur le parent d’un groupe, renomme
automatiquement tous les enfants en donnant le nom du parent plus un numéro.

num permet de choisir à partir de quel numéro commence la numérotation
separateur permet de choisir le type de separateur (surprenant non ?)

tabou juillet 2002 http://tabou.free.fr/ tabou@free.fr
*/

main(doc,op)
{

var nom= op->GetName();if (!nom) return;
var objet= op->GetDown();if (!objet) return;
var num= 1;
var separateur= ".";

while (objet)
{
objet ->SetName(stradd(nom,separateur,tostring(num)));
objet= objet->GetNext();if (!objet) return;
num++;
}

}

Tengaal
30/07/2002, 14h05
Ah, enfin un nouveau message pour ma rubrique expression !
Bravo Tabou pour ce script qui est très pratique et simple d'utilisation, c'est exactement comme ça que le Coffee doit aider les utilsateurs c4d: efficace et simple !
Merci pour cet outil.
Je vais l'ajouter à la liste des expressions déjà présentes, est-ce que cette expression à un nom ? Il lui en faudrait un pour la répertorier...

tabou
30/07/2002, 14h20
je l'ai appelée renommer_hierarchie mais si tu as un nom plus précis ou plus évocateur n'hésite pas.

Est ce que tu sais si ce genre de choses pourra être fait avec XPresso ou s'il faudra continuer à moudre du bon vieux COFFEE ?

Tengaal
30/07/2002, 14h31
Pour l'instant je n'ai pas d'informations sur le sytème Xpresso, et je ne sais pas si c'est le remplaçant de Coffee, avec la possibilité de faire ses propres programmes. D'après les captures d'écrans sur le site de Maxon, on dirait plutôt qu'il s'agit d'un système qui gére l'interactivité entre les objets d'une scène en utilisant une interface graphique de type organigramme où on relie entre eux les objets par leurs paramètres. Par exemple si on a une sphère et un cube, si on relie position X de la sphère à rotation Z du cube, alors le déplacement de la spère sur son axe X va provoquer la rotation sur son axe Z du cube. (voir les vidéos sur les Thinking Particles...)
Pour l'instant c'est le seul truc que j'ai vu d' Xpresso, mais je pense que le Coffee va rester car c'est le langage de base de c4d pour les développements de plugins et je ne pense pas que Maxon balaye d'un coup tout cet acquis...

Designer
30/07/2002, 14h35
D'après les captures d'écrans sur le site de Maxon, on dirait plutôt qu'il s'agit d'un système qui gére l'interactivité entre les objets d'une scène en utilisant une interface graphique de type organigramme où on relie entre eux les objets par leurs paramètres. Par exemple si on a une sphère et un cube, si on relie position X de la sphère à rotation Z du cube, alors le déplacement de la spère sur son axe X va provoquer la rotation sur son axe Z du cube. (voir les vidéos sur les Thinking Particles...)
Pour l'instant c'est le seul truc que j'ai vu d' Xpresso, mais je pense que le Coffee va rester car c'est le langage de base de c4d pour les développements de plugins et je ne pense pas que Maxon balaye d'un coup tout cet acquis...

Oui, c´est tout exacte.

Designer
30/07/2002, 15h05
C´est une vraiment pratique script. Merci pour ca. Mais on devait considerer les enfants des enfants d´objet actif qui ne sont pas affecter dans le script. Alors j´ai fait des changements:



CheckHierarchy(obj, stopAt)
{
if (!obj) return NULL;

var next;
if (next = obj->GetDown()) return next;
if (next = obj->GetNext()) return next;

var up = obj;
while (up = up->GetUp())
{
if (up == stopAt) return NULL;
if (next = up->GetNext()) return next;
}
}

main(doc,op)
{

var parent = op;
var obj = parent->GetDown();if (!obj) return;
var nom = parent->GetName();
var num = 1;
var separateur= ".";

while(obj)
{
obj ->SetName(stradd(nom,separateur,tostring(num)));
obj = CheckHierarchy(obj, parent);
num++;
}

}


maintenant le script va recursivement à travers tous la hierarchie. :idea:
CheckHierarchy function est un "framework" que j´ai fait qu´on peut prendre toujours pour des chose recursive. Feel Free to use it for whatever you want (sorry, couldn´t translate it into french that fast :oops: )

tabou
30/07/2002, 16h00
Merci beaucoup Designer pour ta fonction "CheckHierarchy" :D
J'avais justement l'intention de m'attaquer au problème de la récursivité dans la hiérarchie et comme je ne pense pas pouvoir faire mieux que toi j'utiliserai donc ta fonction.
Ca me fera gagner du temps parceque je suis débutant dans l'utilisation de COFFEE et je ne peux pas écrire trois lignes de code sans plonger dans la doc. :roll:

Aurety
30/07/2002, 16h03
Bon dieu, c'est-y pas possible qu'il fasse obtenir ça par du coffee alors que ce devrait être par défaut sur C4D ! :x

Tengaal
30/07/2002, 17h04
Merci pour ce complément de script.
J'aurais une question sur le Coffee, et comme "Designer" connait parfaitement ça, j'en profite ! :wink:
J'ai découvert dans le livre d'Arntd von Koenigsmarck, qu'on pouvait stocker des valeurs personnelles dans les containers des objets, donc voici ma question:
Est-ce qu'il y a une zone réservée dans les containers pour le stockage de leurs propres paramètres ? Par exemple, est-ce que je peux stocker ma valeur personnelle à n'importe quelle position dans le container ? ( BaseContainer->SetData(position, ma_valeur); )

Designer
30/07/2002, 18h08
J'ai découvert dans le livre d'Arntd von Koenigsmarck, qu'on pouvait stocker des valeurs personnelles dans les containers des objets, donc voici ma question:
Est-ce qu'il y a une zone réservée dans les containers pour le stockage de leurs propres paramètres ? Par exemple, est-ce que je peux stocker ma valeur personnelle à n'importe quelle position dans le container ? ( BaseContainer->SetData(position, ma_valeur); )

Oui et Non. Oui il y a bien sûr des zones réservée pour tes valeurs dans un container. Mais tu ne les accèdes pas avec une position mais avec une ID. Une example:

var mon_ID = 10000; //L´ID vous pouvez choisir comme tu veux
var ma_valeur = "salut!";

// Stocker valueholder[mon_ID] = ma_valeur;
var bc = new(BaseContainer);
bc->SetData(mon_ID, ma_valeur);

// Recevoir valeur = valueholder[mon_ID]
var valeur = bc->GetData(mon_ID);


Alors, la meme chose comme avec les containers de par example un primitive.

Tu pourrais aussi stocker tes valeurs dans un cinema 4d propres container, par example de la "Cube Primitive" mais pour cela tu DOIS recevoir une ID uniquement de la plugincafé!!!!! C´est pas pour rigoler. Tu pourrais detruire des data du container si tu ne prend pas un id unique! :!:

Tengaal
30/07/2002, 19h22
Oui d'accord, je comprends très bien l'importance des ID ! :D
Je trouve donc étonnant que dans son livre ("Maxon Cinema 4D 7.0" p.160), Arndt von Koenigsmarck place ses valeurs personelles dans le container d'un objet en utilisant directement des chiffres (0 à 200) et non avec des IDs ! :?
Il ecrit par exemple:

(...)
var follow=doc->FindObject("Follow");
var bc=follow->GetContainer();
if (sec==0.0)
{
for (j=1;j<Delay+1;j++)
{
bc->SetData(j,op->GetPosition());
bc->SetData(j+200,op->GetRotation());
bc->SetData(98,sec);
(...)
}
}

Cette méthode doit donc être plutôt risquée si "Follow" n'est pas un Null object ?

Tengaal
30/07/2002, 19h36
Je viens de regarder la scène d'exemple qui utilise l'expression Coffee (CD fournit avec le livre) et aucune ID n'est définie dans le script, et l'objet "Follow" est un cube primitif !

Designer
30/07/2002, 20h14
Oui d'accord, je comprends très bien l'importance des ID ! :D
Je trouve donc étonnant que dans son livre ("Maxon Cinema 4D 7.0" p.160), Arndt von Koenigsmarck place ses valeurs personelles dans le container d'un objet en utilisant directement des chiffres (0 à 200) et non avec des IDs ! :?


Hehe, oui, c´est vraiment Arndt.. :) Alors, Bien sur les chiffres sont les IDs et je crois (ou mieux j´éspère:) ) que Arndt avait controller les IDs de la cube avant qu´il a écrit cette expression...mais moi je ne comprend pas aussi pourquoi il le fait sans dire quelque chose dans son text.

Je vais lui questionner plus tard. Mais je crois qu´y a une explication logique pour ca comme je connais Arndt, et il n´est pas de débutant en coffee. :)

Designer
30/07/2002, 21h46
salut :),

oui c´est vraiment bizarre est pas qc qui n´offre aucun inconvénient. alors, je comprend pas pourquoi il fait ca (je vais lui demander plus tard).

Bien sur, on peut faire ca, mais c´est comme j´ai déjà dit dangereux sans une id unique!

Dans des expressions on devait prendre des variables globales pour stocker des valeurs.