PDA

Voir la version complète : ajouter un nouveau paramètre a un container ?



paspas
10/12/2007, 13h52
salut

voilas le souci :

je voudrait rajouter une valeur dans un container , je m' explique :

le but est de placer dans un objet une nouvelle valeur dans son container , de facon a pourvoir savoir si cette objet a été modifier par un autre coffee

en gros un programme coffee modifie une spline , ce programme crée une valeur dans le container de cette spline , un autre programme teste une spline , si il trouve dans le container cette valeur in fait une action sinon si pas il fait une autre action

j' ai en partie solutionner avec :



var cont = new (BaseContainer);

cont = objet ->GetContainer();
var MaValeur = cont->GetInt(0);

cont->InsData(MaValeur,1);
cont->SetData(MaValeur1); // pas forcement utile mais ca marche mieux :shock:

var index= MaValeur->GetIndexData();

println(index);


je recupere ce que je trouve comme valeur d'index
et dans le second programme


et je récupère la valeur avec un GetData(valeur trouvée dans le println(index))

mais ça me parait un peut chipot et peux fiable :oops:

si quelque qu' un a une autre soluce ou une explication suis preneur

paspas

Tengaal
10/12/2007, 17h08
pour stocker une valeur dans un container il faut d'abord définir un ID (numéro d'identifiant qui permet de pointer directement la valeur parmis les autres paramètres) ensuite tu écris la valeur avec SetData (ID, valeur) ou tu la lis GetData(ID).

Cet ID peut être n'importe quelle valeur définie de manière absolue, par exemple ID=123456789.
Ce qu'il faut éviter c'est de définir un ID déjà utiliser pour les paramètres du container, c'est à dir un ID correspondant déjà au stockage d'un paramètre de l'objet, sinon bien sûr, tu vas écraser ce paramètre avec ta valeur perso, et ça risque de partir en vrille ! :lol:

l'ideal c'est de se définir un ID (12345 par exemple) ensuite de vérifier si il est dispo ou pas, en lisant la valeur de cet ID avec GetData(ID), si ça ne renvoit rien, if (!GetData(ID)), alors tu peux logiquement y mettre ta valeur perso.

pour vérifier plus rapidement quels ID utilisent C4D pour pointer vers les paramètres des objets, tu vas dans le dossier de C4D \resource\res\description\
là il y a des fichier en extension .h (header) tu les ouvres avec un editeur de texte, ils contiennent les ID (noms et identifiant associés) des paramètres pour chaque type d'objet.

Pour un objet Nurbs Bezier par exemple, les ID utilisés sont
BEZIEROBJECT_SUBRX = 1000,
BEZIEROBJECT_SUBRY = 1001,
BEZIEROBJECT_SUBX = 1002,
BEZIEROBJECT_SUBY = 1003,
BEZIEROBJECT_CLOSEX = 1004,
BEZIEROBJECT_CLOSEY = 1005

:wink:

Tengaal
10/12/2007, 17h13
Pour un objet SPline :

SPLINEOBJECT_INTERPOL = 820,
SPLINEOBJECT_TYPE = 1000,
SPLINEOBJECT_TYPE_LINEAR = 0,
SPLINEOBJECT_TYPE_CUBIC = 1,
SPLINEOBJECT_TYPE_AKIMA = 2,
SPLINEOBJECT_TYPE_BSPLINE = 3,
SPLINEOBJECT_TYPE_BEZIER = 4,
SPLINEOBJECT_INTERPOLATION = 1001,
SPLINEOBJECT_INTERPOLATION_NONE = 0,
SPLINEOBJECT_INTERPOLATION_NATURAL = 1,
SPLINEOBJECT_INTERPOLATION_UNIFORM = 2,
SPLINEOBJECT_INTERPOLATION_ADAPTIVE = 3,
SPLINEOBJECT_INTERPOLATION_SUBDIV = 4,
SPLINEOBJECT_CLOSED = 1002,
SPLINEOBJECT_SUB = 1003,
SPLINEOBJECT_ANGLE = 1004,
SPLINEOBJECT_MAXIMUMLENGTH = 1005

paspas
10/12/2007, 17h18
merci ```


il faut d'abord définir un ID

comment ?

container ->InsData(12345); // avec ca ??
container->SetData(12345,10);

avec le test que tu preconise bien sur . :lol:

Tengaal
10/12/2007, 17h26
non normalement tu as juste à définir ta valeur comme tu l'as fait dans ton exemple avec MaValeur, c'est ton ID.

var monID=12345;

container->SetData(monID, 1); // ça écrit la valeur 1 accessible avec son ID 12345
edit : SetContainer(container);// redéfini le container avec ce nouveau paramètre

var valeur=container->GetData(monID); // retourne 1 si tu la lis

container->SetData(monID, 2); // remplace ta valeur perso 1 par 2
edit : SetContainer(container);// redéfini le container avec ce changement de valeur

paspas
10/12/2007, 17h35
merciiiiiii

je test ca ce soir :poucehaut:

paspas

xs_yann
10/12/2007, 17h44
J'ai testé exactement ça ce midi Tengaal, mais lorsque que j'ai essayé d'y accéder avec une autre expressions coffee il retourne nil. :coup:

edit : autant pour moi, j'avais oublié le SetContainer(); :oops:

Tengaal
10/12/2007, 18h21
oui moi aussi j'avais oublié de préciser qu'il fallait terminer par un SetContainer() pour actualiser le changement de valeur. :wink: