PDA

Voir la version complète : code du type MCOMMAND......



paspas
27/11/2006, 14h25
salut

je bute encore sur le sdk

voila j'aimerai crée une spline par cofee :

je sais crée l objet spline (pas de souci)* par Insert(ObjectSpline,op,NULL)...*
mais commnent crée les points j' ai trouver dans le sdk comment manipuler les points , les segments et tout ce qui se rapporte a une spline existante .

dans le sdk j' ai trouver une page* *:SendModelingCommand() qui possede plein de code y comprit sur les splines*

mais comment ca marche j' ai tester par differente formulation mais rien a faire le cofee me signale un erreur

voila la definition du sdk


[bool] SendModelingCommand([int] command, [[BaseDocument] doc = NULL],
[BaseObject] op, [BaseContainer] data, [int] mode)


mais suis un peut prerdu sur la mise en forme du code

par* exemple le code MCOMMAND_DELETE qui je le suppose suprime un objet*

j ' ai tester* doc -> MCOMMAND_DELETE(objet);
ou* * * * * * objet ->MCOMMAND_DELETE()

m' etant deja cassé la tete ce wk (et le reste) pour trouver comment ca marche j' ai pas encore tester
les codes du type* MDATA_UNTRIANGULATE_NGONS qui resemble plus a des codes qui seraient liér au container ( enfin je suppose )

mais je désespere pas de trouver un jour* * *:wink:

paspas

Majoul
27/11/2006, 16h50
Regarde plutôt dans l'index BackupTags et VariableChanged du SDK , il y a des exemples.

paspas
27/11/2006, 17h25
merciiiii majoul

fait approfondir ca !!

enorme ce sdk j' ai pas encore tous fouiller mais c'est en bonne vois

mais encore merci de m' avoir servit de GPS :bail: sinon me serrait encore perdu :arg:

paspas

Majoul
28/11/2006, 18h20
pour ce qui est de la fonction :
SendModelingCommand([int] command, [[BaseDocument] doc = NULL], [BaseObject] op, [BaseContainer] data,[int] mode)

voici comme exemple la fonction optimiser :

http://perso.orange.fr/archizone/fc4d/modcommand.jpg

Aurety
28/11/2006, 19h02
Dites Majoul et Paspas, puisque vous êtes sur les splines, une petite idée pour le problême ici ? :oops:

http://www.frenchcinema4d.com/forum/index.php?topic=18009.msg326424#msg326424

Jean-Laurent
29/11/2006, 10h40
Ah, mince alors, j'avais pas vu ce sujet.
Si c'était pour le 20 décembre c'est fichu. :mrgreen:

J'ai regardé ton Xpresso, et le problème vient effectivement de l'utilisation du vent qui ne donne pas les valeurs des points qu'il a déplacé.
Je ne suis pas assez calé en Xpresso pour savoir si on peut contourner ce problème, mais à mon avis tu devrais poser la question dans la section Xpresso aussi.

Si j'avais à résoudre ce problème, je passerais par le coffee, en créant une expression qui reproduit l'effet vent en bougeant les points d'une mesh. Avec une formule de propagation des ondes, type y= A cos (wt - kx)
(C'est la formule pour une dimension) pour ajouter l'effet "flag", une petite variation temporelle de l'amplitude. (A(t))
et pour l'effet "turbulence", une oscillation supplémentaire suivant l'axe z. (Une simple multiplication).

Le bateau n'aurait plus qu'à récupérer ces coordonnées et collerait à tout instant à la vague. Pour son orientation, une dérivée (voir dérivée seconde pour le retard) etc...

Mathématiquement, c'est assez clair dans mon esprit et je l'ai déjà fait pour des systèmes à une dimension.
Le seul hic c'est que je ne me suis jamais posé la question du déplacement des points d'une mesh en coffee, et que je suis un peu débordé en ce moment.
J'ai toute ma journée de samedi par contre.
D'ici là, je regarde dans le SDK, comment on déplace des points, mais si paspas ou Majoul ont une idée plus simple. (L'expression coffee simulant le vent doit peut-être déjà existée? :oops:)

Bon courage. :odile:

Aurety
29/11/2006, 10h53
Oups Jean-Laurent, t'embêtes pas plus que ça, on a trouvé plein de solutions depuis mon message. Pardon pour le polluage de topic. :oops:

paspas
29/11/2006, 11h03
pas de souci le lapin c' est ma tournée :lol:

et merci a majoul : ca je l' imprime et je le met dans ma farde de tut merciiiiiiiiiiiiiii

paspas

Jean-Laurent
29/11/2006, 11h06
Ok, pas de problème.
J'étais allé voir le sujet ce matin, mais ça ne semblait toujours pas complétement résolu. :oops:
Sinon dans le SDK, il y a bien un exemple qui semble correspondre: "deformer" où on voit une vague polygonale
prête à bouger, mais le code est vide, curieux. :o

:odile:

Edit: Le dossier "derformexample.c4d" contient une expression coffee qui ne marche que sur la version CE6.
L'expression est très simple et correspond effectivement à mon descriptif précédent.

paspas
04/12/2006, 18h16
me revoila avec mes souci de code

en fait je voudrait les indices des point d'une selection

j' ai trouver dans le sdk une page qui parle de ca

voila les code que j ai mis


var* mavariable = new (PointSelectionTag);

mavariable = tagpoint -> GetSelection();

println (mavariable ) ;


et ce que j obtien c 'est un n° ID ( de l objet selection de point je suppose )

quand jutilse SetName ca marche et mon objet change de nom !

y a t- il encore une subtiliter qui m aurait echappé ?? ( surrement* :mrgreen:)

paspas dans le brouillard

Jean-Laurent
05/12/2006, 18h19
Je suis peut-être hors sujet, mais la fonction GetSelection() renvoi un type [BaseSelect].
Donc ça me semble normal que tu obtiennes un n° ID.

Pour obtenir les points, on trouve cet exemple dans le SDK:

// Prints all selected points of an object
var obj = doc->FindObject("MyObject");
var select = obj->GetPointSelection();

var i = 0;
var found = 0;

for (i = 0; i < obje->GetPointCount(); i++)
{
if (found >= select->GetCount()) break;
if (select->IsSelected(i))
{
println(obj->GetPoint(i));
found++;
}
}

paspas
05/12/2006, 18h31
merci , je vait encore chercher de ce cote la*


e suis peut-être hors sujet, mais la fonction GetSelection() renvoi un type [BaseSelect]. exact

mais je suppose qu 'il a une autre utilité autre que ca sinon voit pas l' interet de ce code : ne faut il paser pas passer par un container ??


pour tes code* je pense qu' il* donne les points qui sont selectionner dans la fenetre active

et pas le tag* de selection de point


paspas qui continue a chercher* sans se desesperé lol

Majoul
05/12/2006, 19h17
Il suffit de récupérer la sélection du tag




GetTag(op, Type)
{
* if(!op) return NULL ;
* var tag ;
* for(tag=op->GetFirstTag(); tag; tag=tag->GetNext())* if(tag->GetType()==Type) return tag ;
* return NULL ;
}

main(doc,op)
{
// on cherche le premier tag de sélection avec la fonction GetTag(op, Type)
* var tag = GetTag(op, Tpointselection) ; if(!tag) return ;
// on récupére la selection du tag
* var sel = tag->GetSelection() ;
// on affiche dans la console l'indice des points sélectionnés
* var i ;
* for(i=0; i<op->GetPointCount() ; i++)* if(sel->IsSelected(i)) println(i) ;
}

paspas
06/12/2006, 12h15
:odile: merci majoul

me disait aussi qu' il y avait une subtiliter :coup:


je teste ca ce soir , et merci encore

vait finir pas fair des trucs interesant en coffee

paspas

paspas
13/12/2006, 14h51
majoul :odile: si tu repasse

j' en revient au code du type MCOMMAND

comment tu fait si y a pas de data lier ex : le code MCOMMAND_DELETE ??

j' ai essayer de viré le data de la ligne de commande mais evidament ca marche pas :mrgreen:

paspas

xs_yann
17/12/2006, 12h47
J'ai le même problème, j'ai essayer de mettre le container "data" sans rien dedans mais c4d plante.
peut-être une piste là (http://www.plugincafe.com/forum/display_topic_threads.asp?ForumID=4&TopicID=1064&PagePosition=1)
mais je comprend pas très bien. :?

Pour MCOMMAND_DELETE il y a ça :
http://www.plugincafe.com/forum/display_topic_threads.asp?ForumID=4&TopicID=1581&PagePosition=1

j'ai essayer op->Remove, ça fait planter C4d.* :coup:

xs_yann
17/12/2006, 17h27
En fait je cherche à rendre éditable une primitive, j'ai donc cherché dans le SDK et j'ai trouvé MCOMMAND_MAKEEDITABLE.

MCOMMAND_MAKEEDITABLE ------->Make editable (returns object)

Mais quand je place ce code sur une primitve, c4d plante (il ne plante pas si c'est sur un neutre) :

main(doc,op)
{
if(!instanceof(op,PointObject))
var bc = new(BaseContainer) ;
SendModelingCommand(MCOMMAND_MAKEEDITABLE, doc, op, bc, MODIFY_ALL) ;
}

Une idée?
_________________________________________________
edit : un exemple dans le sdk :
op->Message(MSG_UPDATE); // notify object of change, otherwise Editor crashes

peut-être une piste :coup:* (en fait je crois que ça n'a rien à voir avec MCOMMAND :oops:).

_________________________________________________
edit2 :
variante qui ne fonctionne toujours pas. :cry2:

main(doc,op)
{
if(!instanceof(op,PrimitiveObject)) return;
var bc = new(BaseContainer) ;
SendModelingCommand(MCOMMAND_MAKEEDITABLE, doc, op, bc, MODIFY_ALL) ;
op->Message(MSG_UPDATE);
}

xs_yann
17/12/2006, 18h45
main(doc,op)
{
if(!instanceof(op,PrimitiveObject)) return;
var bc = new(BaseContainer) ;
SendModelingCommand(MCOMMAND_CURRENTSTATETOOBJECT, doc, op, bc, MODIFY_ALL)

;


CURRENTSTATETOOBJECT donne un resultat étrange. :o

Jean-Laurent
17/12/2006, 19h29
J'ai essayé sans plus de succès. :coup:

Mai je pense que la ligne qui de toute manière n'est pas bonne est:

var bc= new(BaseContainer);

Ce n'est pas la Data que la fonction SendModelingCommand attend.
J'ai essayé tout bêtement: MDATA_MAKEEDITABLE mais ça ne marche pas plus.

Le SDK est pas très clair.
Il faudrait mettre la main sur les exemples qui utilisent d'autres commandes sans option.
Comme le fichier ToolKnife.h, un truc dans le genre, dont ils parlent.
Je jette un oeil au lien que tu as donné, un truc tout bête nous échappe.

Edit: Je viens de jetter un oeil à ton premier lien.
Il recommande effectivement de mettre un container vide.
Mais il dit que le problème est que la commande crée un nouveau cube avec le même tag,
qui a son tour fait la même chose etc... D'où le plantage.

J'ai des doutes. :?

paspas
17/12/2006, 20h23
salut


voila mon test et mes codes

c est une extrapolation du lien que tu ma donné

pour le cube par defaut



var object= doc->FindObject("Cube");

var data=objet->GetContainer();

SendModelingCommand(MCOMMAND_MAKEEDITABLE,NULL,obj ect,data,MODIFY_ALL);

object->Message(MSG_UPDATE);

GeEventAdd(DOCUMENT_CHANGED);

en fait ca marche sauf que il faut pouvoir tester que l 'objet n' est pas un polygone
sinon ca tourne en rond ou ca plante*

paspas

xs_yann
18/12/2006, 11h26
en fait ca marche sauf que il faut pouvoir tester que l 'objet n' est pas un polygone
sinon ca tourne en rond ou ca plante*


Je pensais que

if(!instanceof(op,PrimitiveObject)) return;
ou

if(!instanceof(op,PointObject))

le faisais.

Ton code fonctionne? Je l'ai testé, ça plante quand même :o
Si je laisse
var data=objet->GetContainer();
il me dit "Variable or function expected" je change donc "objet" en "object", et là il plante.
Si je creer le Cube avant d'executer le code, le cube disparait. :coup:

paspas
18/12/2006, 15h41
oups* :oops:

SendModelingCommand(MCOMMAND_MAKEEDITABLE,NULL,obj ect,data,MODIFY_ALL);

c' est pas NULL mais doc*

paspas

ps en tout cas ca a marcher UNE fois :mrgreen:

xs_yann
18/12/2006, 16h07
Ton code fonctionne si le cube à été creer avant d'executer le code, si il est creer après ça plante.
En revanche une fois le cube éditer, il se passe des chose bizarres, mais lorque on change le nom du cube cela redevien normal :


var object= doc->FindObject("Cube");

var data=object->GetContainer();

SendModelingCommand(MCOMMAND_MAKEEDITABLE,doc,obje ct,data,MODIFY_ALL);
object->SetName("new_name");

object->Message(MSG_UPDATE);

GeEventAdd(DOCUMENT_CHANGED);

Ce code fonctionne si le cube est creé avant. :o


Perhaps the result of the command is that another cube, with the same tag, is inserted into the scene. Then that cube produces yet another cube, so your scene will grow to infinity.
Peut-être ça, mais je comprend pas très bien pourquoi un nouveau cube avec le même "tag" (nom ou tag, je ne sais pas ce qu'il voulait dire) serais creé. :?

paspas
18/12/2006, 16h52
regarde pour metre ce code au debut aussi


GeEventAdd(DOCUMENT_CHANGED);

comme ca c4d doit remetre (peut etre ) a jour sa hierachie d'objet

renome le cube par
SetName apres transformation

paspas

paspas
18/12/2006, 16h56
regarde pour metre ce code au debut aussi


GeEventAdd(DOCUMENT_CHANGED);

comme ca c4d doit remetre (peut etre ) a jour sa hierachie d'objet

perso ca trournait en boucle

a mon avis il faut un test pour arrete le progamme

paspas

xs_yann
18/12/2006, 17h02
Je crois que tu as fait "citer" au lieu de "modifier". :roll: :lol:

a mon avis il faut un test pour arrete le progamme
?

Sinon en mettant
GeEventAdd(DOCUMENT_CHANGED); au début cela ne change rien : il fonctionne si le cube est crée avant, il plante s'il est creé après.

paspas
18/12/2006, 17h14
Je crois que tu as fait "citer" au lieu de "modifier".*
oups* dsl



oui faut un teste pour arrete la boucle* si c est un polygone le programe demare pas (par exemple )

je sais pas tester ici*

si tu met ce code cofee dans le noed xpresso ??

tu met le noeud* cube en relatif et tu relie la sortie objet du cube a une entree du noeud cofee que tu* appele objet et tu utilice cette variable dans les codes ??

paspas

xs_yann
18/12/2006, 17h35
Oulà, ça devient compliquer. :o
Ca fait même pas une semaine que j'ai commencer le COFFEE, j'ai donc jamais essayer de le combiner avec Xpresso.
J'aurai bien aimé étudier ton rideau mais le code est protegé.
Ce que je ne comprend pas c'est pourquoi ce code ne fonctionnerais pas :


var object= doc->FindObject("Cube");
if(!instanceof(object,PrimitiveObject)){
return;
}
else if(instanceof(object,PrimitiveObject)){
var data=object->GetContainer();
SendModelingCommand(MCOMMAND_MAKEEDITABLE,doc,obje ct,data,MODIFY_ALL);
object->SetName("new_name");
object->Message(MSG_UPDATE);
GeEventAdd(DOCUMENT_CHANGED);

}


il dit bien que si ce n'est pas une primitve, il quitte ou si s'en est une, il execute, non?

paspas
18/12/2006, 18h39
perso

je prefere le cofee de xpresso ca facilite un peu les choses dans le sens ou le tu doit pas definir chaque objet ou chaque variable

il sont rentre par un port du noeud cofee

paspas

paspas
19/12/2006, 14h16
a premiere vue* le GeEventAdd(DOCUMENT_CHANGED) est remplacer par EventAdd([[int] flags]);
avec


EVENT_FORCEREDRAW

Force a complete redraw.

EVENT_ANIMATE

Animate document.

EVENT_NOEXPRESSION

Don't execute expressions.

EVENT_CAMERAEXPRESSION

If this is set (and not EVENT_NOEXPRESSION), the event will only update camera dependant expressions (for faster speed).



comme flag


citation du sdk

This command is used to notify C4D that something has changed somehow. It replaces the old GeEventAdd() function. You no longer have to specify exactly what happened. These are the optional flags:

a* tester

paspas

xs_yann
19/12/2006, 20h03
Ah c'est peut-être pour ça que je ne trouvais rien sur GeEventAdd().
En revanche je n'ai rien trouvé sur Message(MSG_UPDATE);* :o, je crois que je ne sais pas très bien chercher. :oops:
Je vais faire des tests. :odile:

xs_yann
19/12/2006, 20h23
var object= doc->FindObject("Cube");
if(!object) return;
if(!instanceof(object,PrimitiveObject)){
return;
}
else if(instanceof(object,PrimitiveObject)){
var data=object->GetContainer();
SendModelingCommand(MCOMMAND_MAKEEDITABLE,doc,obje ct,data,MODIFY_ALL);
object->SetName("new_name");
object->Message(MSG_UPDATE);
EventAdd();

}



j'ai déja rajouté* "if(!object) return;"* car lorsque il n'y avait pas de cube, ça ne fonctionnait pas.
Ensuite, j'ai un probmème le SetName ne fonctionne plus, mais je n'ai plus le temps de faire d'autres tests.
A plus :odile:

Jean-Laurent
19/12/2006, 20h24
En revanche je n'ai rien trouvé sur Message(MSG_UPDATE); :o, je crois que je ne sais pas très bien chercher. :oops:
Je vais faire des tests. :odile:


C'est dans DOCUMENT CLASS: BaseList2D.

Pas évident.