PDA

Voir la version complète : coffee : subcontainer/array dans container ?



clemz
04/02/2010, 19h43
hello :odile:

je me casse encore le nez à essayer de stocker des variables dans un tag coffee .. je bloque . On m'avait dit de créer un sous-container , et de le stocker dans le container de mon objet/tag , à une ID spécifique ( ici 1000001 pour le moment )

mais je n'arrive pas à accéder à ce sous-container après .
voici par ex ce que je fais en gros :


var bc = myobject->GetContainer(); // le container principal de mon objet
var bc0 = new(BaseContainer); // un nouveau container qui va être un sous-container stocké dans bc

bc0->SetData(id1,stuff1) // on remplit ce sous-container de valeurs
bc0->SetData(id2,stuff2)
etc...

bc->SetData(MyID,bc0) // on rentre bc0 dans bc ( en tout bien tout honneur ) , à l'id de test 1000001 ou lune id donnée par plugincafe

myobject->SetContainer(bc); // et on set bc sur l'objet pour mettre à jour.

// et maintenant je voudrais accéder au sous-container bc0 .. mais ça ne fonctionne pas .. donc est-ce que bc0 a bien été stocké dans bc ?
...
bc0 = bc->GetData(MyID);
var value1 = bc0->GetData(id1);
var value2 = bc0->GetData(id2); etc

--------------

mais je n'arrive pas a lire le sous-container bc0 après :( .. quelqu'un m'a aussi conseillé de passer par les ' Hyperfiles' .. mais je comprends pas ce que c'est et ce que ça fait .. le sdk est nul pour ça il n'y a absolument aucun exemples .. c'est la fête du slip pour savoir utiliser ces machins ^^

any ideas plizzzz ?
(désolé si j'ai deja demandé ça (j'suis un peu fatigué ^^ ) mais comment faites-vous pour stoker des variables en fait avec un tag coffee ? sans qu'il n'y est reset à chaque réouverture du fichier c4d )

merki

Tengaal
04/02/2010, 22h17
un "sous-container" ? jamais entendu parlé...
un container déjà à la base ne sert qu'à stocker une petite quantité de données (ex: les attributs d'un objets), et quand on stocke une donnée dans un container en lui associant un ID spécifique, c'est une valeur qui est stockée à chaque ID, pas un groupe de valeur comme pourrait l'être un autre container.

stocker la données "container2" dans "container1" revient à stocker la valeur d'ID interne du "container2" mais pas son contenu.

Ensuite tout dépend des types de données que tu veux stocker (valeurs numériques, textes), il y a un tag qui est intéressant pour y stocker des valeurs organisées sous forme d'une tableau, c'est le "Variable Tag". (v doc sdk COFFEE pour plus d'infos)
Il est invisible quand il est ajouté à un objet, dans le fonctionnement classique de C4D ce type de tag sert à stocker les coordonnées UVW, les position en caches de particules, les structures de points et/ou polygones, etc...)

son utilisation:

var mon_objet=doc->FindObject("Cube");
var VTag=AllocVariableTag(type,nombre); // ex: type=Tpoint et nombre=40*3 -> stocker 40 vecteurs composé de x, y et z
// pour atteindre les 3 composantes du 25e vecteur stocké (le 1er vecteur est à l'indice 0)
// x=3*24 et y=3*24+1 et z=3*24+2
var tableau=new(array,nombre,3);

//remplir les valeurs dans le tableau
tableau[0,0]=x0; tableau[0,1]=y0; tableau[0,3]=z0;
tableau[1,0]=x1; tableau[1,1]=y1; tableau[1,3]=z1;
tableau[2,0]=x2; tableau[2,1]=y2; tableau[2,3]=z2;
(...)
tableau[40,0]=x40; tableau[40,1]=y40; tableau[40,3]=z40;

VTag->SetData(tableau); //on remplit le Variable tag avec un tableau ayant la même structure
mon_objet->InsertTag(VTag); //on créé le tag sur l'objet

ensuite bien sûr on ne créé pas un variable Tag à chaque fois, on se contente de vérifier si il y a bien le Variable Tag sur l'objet concerné, puis on lit/écrit les données dedans, celles-ci seront conservés, tout comme sont conservés les UVW d'un objet, les tags de sélection de points ou polygones, tag de zone d'influence, les caches d'animations de particules ou de dynamiques,etc...

ensuite, on peut aussi, dans le cas de gros stockage, générer un fichier externe (je ne parle pas d'un HyperFile) qui sera à côté du C4D, ainsi à l'ouverture du C4D, le plugin va regarder si il y a également le fichier de données présent, va l'ouvrir et l'utiliser.
un peu comme le dossier "illum" qui crée des fichiers de précalculs de rendu IG.

clemz
04/02/2010, 23h48
waouw super merci Tengaalou ! :prie: :D . je vais essayer ça de souite :art:

tient sinon je me demandais si tu aurais toujours à dispo ton ancien script elasticspline ? car je me penche sur de la dynamique ( effet de drag , pas de ressort ) et pour l'instant j'ai un effet de drag plus ou moins convainquant , en utilisant la base du scipt 'soft target' fournis en expresso .. mais bon je sents que j'ai choisis une usine a gaz pour faire un truc qui pourait être simple enfin je sais pas trop .. ( c'est toujours pour mon bricolage d'aile/plumes là : )

:odile:

http://kiteclem35.free.fr/3D/C4D/Wing/wing%20progress-2.jpg

Tengaal
05/02/2010, 10h18
tiens, tous mes vieux trucs dont "Elastic Spline" sont dispo sur cette page
http://www.tengaal.com/Pages/download/plugins.htm

les scripts seront certainement à actualiser un peu car la plupart datent de C4D 8 pour les plus récents.

il y a des appels de fonctions qui se sont simplifiés depuis, par exemple pour définir le nom d'un objet:
avant on faisait objet->SetName("mon objet");
désormais on fait objet#ID_BASELIST_NAME="mon objet"

Pour créer un objet depuis le script, avant on faisait : var mon_cube=new(CubeObject);
maintenant on fera plutôt: var mon_cube=AllocObject(Ocube); //vior doc coffee pourliste des ID d'objets avec "AllocObject(type)"

idem pour accéder aux paramètres des objets, avant c'etait très lourd, il fallait ouvrir le container de l'objet et aller piocher dedans le paramètre, maintenant il suffit de prendre le paramètre dans la fenêtre d'attribut de l'objet et de le faire glisser dans la fenetre script COFFEE ) côté du nom de l'objet, on aura ainsi par exemple:
objet_sphere#PRIM_SPHERE_SUB=10; // ici on définit à 10 le nombre de segment d'une sphere primitive.

donc avec ces simplifications d'accès, on peut améliorer ou en tout cas simplifier les vieux scripts COFFEE.

mais normalement les anciens appels fonctionnent toujours malgré tout.

clemz
05/02/2010, 12h07
super merci chef :odile:

( hihi moi j'ai mis tout plein de "objet->SetName("mon objet");" .. ^^ le boulet . merci pour les tips :love: )

clem

oli_d
06/02/2010, 09h12
un "sous-container" ? jamais entendu parlé...


On a la possibilité de stocker un container dans un autre container. Ça parait con, mais si on a des données à stocker dans le container au lieu d'avoir un ID unique pour chaque donnée, on en utilise qu'un seul qui servira à stocker le sous-container. Dans ce sous-container on utilise les ID qu'on veut sans risquer de tomber en conflit avec un ID existant.


var myId = 12345; //ID unique
//création du sous-container
var bc = op->GetContainer();
var bc0 = new(BaseContainer);
bc0->SetData(1,"test");
bc0->SetData(2,1234);
bc->SetData(myId,bc0);
op->SetContainer(bc);

//récupération du container
var bcont = op->GetContainer();
var ss_bc = bcont->GetContainer(myId);
if(ss_bc)
{
println( ss_bc->GetString(1));
println(tostring(ss_bc->GetInt(2)));
}

Chez moi ce code fonctionne...
J'ai juste remplacé les GetData par GetContainer & co, comme ça on peut être sûr du type de données

Tengaal
06/02/2010, 11h27
il faut que je teste ça tiens, merci pour le tuyau en tout cas. :wink:

clemz
06/02/2010, 20h36
ha merci Oli_D :) suis pas fou alors ( juste nul ^^ ) :bounce:
je vais retenter et voir pourquoi ça marchait pas alors. :odile:

BerTiN03
06/02/2010, 22h43
Vous êtes pas bien, sérieux... :mrgreen: