PDA

Voir la version complète : Dupliquer un objet



padawa
08/10/2004, 18h49
Hello la compagnie,

me voici lancé dans mes premiers tests. Dans les tuts de Tengaal, il explique comment créer un objet.
Mais comment dupliquer un objet? :?

PS: A tout hazard, je suis en train de mélanger de l'xpresso et du coffee, si c'est faisable dans xpresso je veux bien la solution aussi :wink:

Ah, pour finir, les tuts coffee dans les 3dattack mag sont trés bien fait aussi, malgrés mon anglais un peu juste je comprend :poucehaut:
Avis au débutant comme moi

Tengaal
08/10/2004, 19h15
Et bien déjà si tu jettes un oeil (voire 2) dans la doc SDK Coffee de maxon, qui est la chose essentielle à faire, tu trouveras ta réponse facilement, je te donne une piste: GetClone...

Majoul
08/10/2004, 19h56
Une autre piste, regarde aussi la fonction " CopyTo " pour les flags.

padawa
08/10/2004, 20h06
Ok je vais explorer ca :wink:
tank iou e lotte
(quand j'vous dit que j'ai un anglais pourri) :mrgreen:

Majoul
08/10/2004, 20h28
T’ai pas le seul si c’a te rassure.

padawa
12/10/2004, 01h26
Bon, j'ai bien regardé et trouvé les fonctions dont vous parlé,
mais aprés plusieur essai j'y arrive toujours pas :cry2:

Mon probleme est que je trouve le sdk, comment dire, inbuvable et incompréhensible pour un débutant. Je sais que Tengaal va me contredire,
mais par exemple pour Getclone voila la seule explication que l'on trouve.


[BaseObject] GetClone([int] flags);


Pour un débutant ca veut pas dire grand chose.
Si je traduis a ma facon ca donne:
[retourne l'objet voulu] Getclone([un chiffre???] un parametre);
Je suis certain d'avoir tout faux. En plus BaseObject est une déclaration de classe. Est ce que ca veut dire qu'il faut faire une classe se rapportant a la fonction avant de pouvoir l'utiliser :?

Si il y avait un petit exemple a chaque fois ca serait beaucoup plus clair pour moi :)

De plus si je suis toujour ma logique le Getclone() doit retourner l'objet pour qu'en suite le Copyto() cré la copie. :o
Donc j'ai commencé mon code comme ca:

var double = op->GetClone(100001);

J'ai mis le 100001 par rapport au tut de 3dattack car je pense que ce doit etre un ID.

Et la je trouve la base du CopyTo():

[bool] CopyTo([BaseObject] dest, [int] flags);


J'analyse : [renvoi un booléen] CopyTo([l'objet choisi] la destination mais sous quel forme???, [un numéro d'ID] un parametre);
je tape ca:
var ok = CopyTo( double vector(100,100,100),100002);
Et la bien sur je doit avoir encore plus faux car j'ai une erreur de variable exepted (pour le Getclone je n'avais pas d'erreur, mais je sais bien que ca n'est pas plus juste pour autant)

Voila, je demande pas qu'on me fasse le code, ca ne m'avancerais pas plus et j'aime bien comprendre ce que je fais, mais si une ame charitable pouvais me donner les codes pour déchifrer clairement le SDK ca m'aiderai beaucoup :poucehaut:
Je pense que celui ci est fait pour des gens qui ont déja une grande maitrise de ce type de langage.

Majoul
12/10/2004, 02h04
mon_objet c'est l'objet à copier

les Flags : CL_NO_BITS , CL_ONLY_VISIBLETAGS , CL_NO_TRACKS , CL_NO_HIERARCHY




var doc = GetActiveDocument() ;

// on fait la copie sans les enfants par exemple
var copie = mon_objet->GetClone(CL_NO_HIERARCHY) ;

// on insére par exemple l'objet dans le document en début de liste
doc->InsertObject(copie, NULL, NULL) ;



c'est un peut plus claire comme ça.

Tengaal
12/10/2004, 10h31
Pour info, le terme entre crochets [...] désigne un type de valeur donc ton CopyTo( [object] dest, [int] flag) signifie en plus clair CopyTo (objet_a_créer , comment ).

Donc l'erreur que tu as vient du fait qu'on te demande de fournir un objet (BaseObject) alors que tu fournis un vecteur (vector)...

C'est à dire qu'il te demande en paramètre, un objet (BaseObject) suivi d'une valeur entière (int) qui représente la manière dont la copie se fait.

Les flags, tu les connais, puisque tu connais CopyTo() car ils y sont listés...
Ces valeurs (int) sont représentées sous formes de valeurs constantes définies en texte:
CL_NO_BITS
CL_ONLY_VISIBLETAGS
CL_NO_TRACKS
CL_NO_HIERARCHY

En générale les valeurs constantes internes de C4D sont toutes exprimées en texte majuscule.

Donc dans le second paramètre "flag" tu y copies cette valeur constante.

par exemple :

si "op" est l'objet à copier.
var mon_objet;
var reponse=CopyTo(mon_objet , 0 ) ; // 0: aucune condition de flag donc une copie intégrale
EDIT: il faut corriger en "var reponse=op->CopyTo(mon_objet , 0 ) ;"

ou bien

var reponse=CopyTo(mon_objet , CL_NO_TRACKS ) ; // copie l'objet mais PAS ses pistes d'animation
EDIT: il faut corriger en "var reponse=op->CopyTo(mon_objet , CL_NO_TRACKS ) ;"

Ensuite il te suffit d'intégrer l'objet créé (mon_objet) dans le document actuel pour le voir.


Mon probleme est que je trouve le sdk, comment dire, inbuvable et incompréhensible pour un débutant. Je sais que Tengaal va me contredire
Saches, que j'ai été débutant comme tout le monde, et quand j'ai découvert C4D ainsi que le COFFEE et sa doc SDK j'étais aussi dérouté, sauf qu'à l'époque qu'il n' y avait pas de forum, et le peu de gens qui formaient le noyau de la communauté actuelle, ne connaissaient pas la programmation COFFEE.

Donc en résumé, l'apprentissage c'est surtout un travail de découverte personnaelle en épluchant soigneusement tous les scripts COFFEE existant pour comprendre comment ils utilisent les fonctions de base... :wink:

En ce qui concerne l'anglais, et bien si tu souhaites mettre le nez dans la programmation, pas de secret, il faut t'y mettre.

padawa
12/10/2004, 11h15
Merci a vous 2 ca s'éclairci pas mal maintenant :poucehaut:
Je comprend mieux la description, donc entre crochet c'est le type de valeur correspondant a la commande ou la variable. Ce qui m'a le plus perturbé c'est le INT qui pour moi veut dire integer et donc entier sous forme de nombre :o Je savais pas que ca pouvait etre du texte.
Enfin, Tengaal dans ton exemple, il y a un truc que je comprend pas.
Comment la fonction sait elle que l'on copie l'objet op (serait ce par deduction logique?) et en plus quand j'insere ton code j'ai toujours une erreur de "variable or function expected" juste au debut de la parenthése du copyto.
Est ce voulu pour que je me creuse un peu la tete pour trouver ou y a t il réellement une erreur :mrgreen:

Tengaal
12/10/2004, 11h55
Oui, désolé je me suis trompé j'ai voulu répondre trop vite, heureusement que tu me fais la remarquer ! :oops:

en fait CopyTo() est une fonction associée aux BaseObject, donc si tu veux que op soit copié dans mon_objet alors :

var reponse=op->CopyTo(mon_objet, flag);

Tu peux constater que je suis également une burne ! (surtout le matin pas réveillé) :roll: :wink:

padawa
12/10/2004, 12h18
euh :oops: ca marche toujour pas

J'avais deja essayé ta version et a la compilation il me dit pas d'erreur et a l'execution j'ai un "imcompatible value... NIL / OBJECT"
Dans ma logique je pense qu'il ne comprend pas l'attribution d'un objet a un booléen mais en réalité
qu'est ce que ca veut dire?

Tengaal
12/10/2004, 12h57
C'est pas grave, laisse tomber le CopyTo(...) pour l'instant, voici le code pour créer une copie d'un ojet dans le document :

main(doc,op)
{
// créé une copie intégrale de l'objet "op"
var mon_objet=op->GetClone(0);

// on insère cette copie dans le document en cours.
doc->InsertObject(mon_objet,NULL,NULL);
}


Pour créer plusieurs copies, il suffit d'utiliser une boucle "for (...)".

Pour les instances c'est plus complexe, il faut d'abord créer l'objet "instance" puis dans ses paramètres (container) le lier à l'objet de référence.

padawa
12/10/2004, 13h12
Ok merci :poucehaut:

Majoul
12/10/2004, 20h42
Tu peut utiliser directement des entiers pour les conditions (flag).

CL_ONLY_VISIBLETAGS = 0
CL_NO_HIERARCHY = 4
CL_NO_TRACKS = 8
CL_NO_BITS = 16

Et quand on veut poser plusieurs conditions on les sépare par ( | ) = Ctrl + Alt + 6
Ces deux lignes de code sont identique.

var copie = act->GetClone(CL_NO_HIERARCHY | CL_NO_BITS ) ;

var copie = act->GetClone( 4 | 16) ;


Fait gaffe la fonction CopyTo() supprime l’objet dest.
Par exemple :

Mon_objet ->CopyTo(objet_dest, 0 ) ;

ce qui veut dire : on fait une copie de Mon_objet et on remplace objet_dest par la copie.
Si mon objet_dest a des enfants c’est la copie qui devient leur parent.


.

padawa
12/10/2004, 22h29
D'ou le pourquoi du comment des integer :wink:
je comprend mieux.

Merci encore, c'est vraiment une aubaine pour la communauté des gens qui veulent bien transmettre leur savoir :prie: (en francais en plus :mrgreen: )

Majoul
13/10/2004, 20h12
Ce modeste savoir je l’ai trouvé tout simplement dans le SDK avec quelques exemples trouvés sur le net pour comprendre le fonctionnement, sans oublier les PDF de Tengaal.