PDA

Voir la version complète : Questions et plugs coffee



xs_yann
01/03/2007, 20h08
Bonjour, :D



var PLUGIN_ID = 1020908; //ID du plug
var radio;
//class pour l'interface
class MyDialog : GeModalDialog
{
public:
MyDialog();

CreateLayout();
Init();
Command(id,msg);
}

MyDialog::MyDialog()
{
super();
}

MyDialog::CreateLayout()
{
SetTitle("Dialog");
AddRadioGroupH(7000,0,2);
AddItem(7000,6000,"a");
AddItem(7000,6001,"b");
AddDlgGroup(DR_DLGGROUP_OK|DR_DLGGROUP_CANCEL);
return TRUE;
}
MyDialog::Init()
{
SetItem(7000,6000); //le bouton d'ID 6000 (le a) sera activé à l'ouverture de la boite de dialogue
}
MyDialog::Command(id,msg)
{
switch(id)
{
case 6000: radio = Get????(id);break; //je voudrais avoir une variable pour savoir si le bouton est activé

}
}

class MyMenuPlugin : MenuPlugin
{
public:
MyMenuPlugin();

GetID();
GetName();
GetHelp();
Execute(doc);
}

MyMenuPlugin::MyMenuPlugin()
{
super();
}
MyMenuPlugin::GetID()
{
return PLUGIN_ID;
}
MyMenuPlugin::GetName()
{
return "Radio";
}
MyMenuPlugin::GetHelp()
{
return "Radio";
}

MyMenuPlugin::Execute(doc)
{
var d = new(MyDialog);
d->Open(-1,-1);
var op = doc->GetActiveObject();
if(radio==TRUE){
op->SetName("a");
}else{
op->SetName("b");
}
EventAdd(MSG_UPDATE);
}


main()
{
Register(MyMenuPlugin);
}


Après avoir longuement cherché dans le SDK et avoir analyser le "wip" sur les Ressorts de Jean-Laurent, je suis arrivé à avoir une interface correcte, mais le problème survient lors de l'interaction. J'avais à peu près réussi avec la valeur d'un slider avec
GetFloat(id) et
op->SetName(tostring(mavariable))

La question : Comment récuperer la position (booléen je suppose) d'un bouton radio, et l'utiliser dans l' Execute de la class MenuPlugin?

Merci à ceux qui auront pris la peine de lire :P

Jean-Laurent
01/03/2007, 20h59
Salut yann.

case 6000:radio = GetFloat(6000);

radio vaudra 1 si c'est coché, sinon radio vaudra 0.

Mais surtout:

SetCheckbox(6000,FALSE);

Dans MyDialog::Init() C'est cette ligne de code qui défini la valeur de départ de la checkBox.

Dans le "execute" un simple if (radio) suffira.

xs_yann
01/03/2007, 21h22
Merci Jean-Laurent


case 6000:radio = GetFloat(6000);

Si je met
case 6000:radio = GetFloat(id);
ça ne devrait rient changer, non?


SetCheckbox(6000,FALSE);
En fait ce n'est pas une check box mais un bouton radio j'ai donc mit

SetItem(7000,6000);
Pour que justement il soit activer à l'ouverture :lol:

J'ai juste FALSE en retour. Pas moyen qu'il affiche "a" comme nom.
Le code :

var PLUGIN_ID = 1020908; //ID du plug
var radio;
//class pour l'interface
class MyDialog : GeModalDialog
{
public:
MyDialog();

CreateLayout();
Init();
Command(id,msg);
}

MyDialog::MyDialog()
{
super();
}

MyDialog::CreateLayout()
{
SetTitle("Dialog");
AddRadioGroupH(7000,0,2);
AddItem(7000,6000,"a");
AddItem(7000,6001,"b");
AddDlgGroup(DR_DLGGROUP_OK|DR_DLGGROUP_CANCEL);
return TRUE;
}
MyDialog::Init()
{
SetItem(7000,6000);
}
MyDialog::Command(id,msg)
{
switch(id)
{
case 6000: radio = GetFloat(id);break;

}
}

class MyMenuPlugin : MenuPlugin
{
public:
MyMenuPlugin();

GetID();
GetName();
GetHelp();
Execute(doc);
}

MyMenuPlugin::MyMenuPlugin()
{
super();
}
MyMenuPlugin::GetID()
{
return PLUGIN_ID;
}
MyMenuPlugin::GetName()
{
return "Radio";
}
MyMenuPlugin::GetHelp()
{
return "Radio";
}

MyMenuPlugin::Execute(doc)
{
var d = new(MyDialog);
d->Open(-1,-1);
var op = doc->GetActiveObject();
if(radio){
op->SetName("a");
}else{
op->SetName("b");
}
EventAdd(MSG_UPDATE);
}


main()
{
Register(MyMenuPlugin);
}

Jean-Laurent
01/03/2007, 22h49
J étais pas loin. :mrgreen:
J ai un problème avec l apostrophe et mon navigateur. :cry2:

Vu que c est un bouton radio,

le code est "GetItem(7000)" dans "Command" Et il retourne l ID recherchée.
Tu retires le switch qui ne sert à rien.

Si c est "a" radio vaudra "6001" et si c est "b" radio vaudra "6002"

Tu peux ensuite mettre des if ou un switch dans "execute" pour le cas 6001 et le cas 6002.

xs_yann
02/03/2007, 11h00
Merci beaucoup Jean-Laurent :love:

Si c est "a" radio vaudra "6001" et si c est "b" radio vaudra "6002"
Non, "a" vaudra 6000 et "b" vaudra "6001" :mrgreen:

Le code exact donc (ça peut servir) :

var PLUGIN_ID = 1020908; //ID du plug
var radio;

class MyDialog : GeModalDialog
{
public:
MyDialog();

CreateLayout();
Init();
Command(id,msg);
}

MyDialog::MyDialog()
{
super();
}

MyDialog::CreateLayout()
{
SetTitle("Dialog");
AddRadioGroupH(7000,0,2);
AddItem(7000,6000,"a");
AddItem(7000,6001,"b");
AddDlgGroup(DR_DLGGROUP_OK|DR_DLGGROUP_CANCEL);
return TRUE;
}
MyDialog::Init()
{
SetItem(7000,6000);
}
MyDialog::Command(id,msg)
{
radio = GetItem(7000);
}

class MyMenuPlugin : MenuPlugin
{
public:
MyMenuPlugin();

GetID();
GetName();
GetHelp();
Execute(doc);
}

MyMenuPlugin::MyMenuPlugin()
{
super();
}
MyMenuPlugin::GetID()
{
return PLUGIN_ID;
}
MyMenuPlugin::GetName()
{
return "Radio";
}
MyMenuPlugin::GetHelp()
{
return "Radio";
}

MyMenuPlugin::Execute(doc)
{
var d = new(MyDialog);
d->Open(-1,-1);
var op = doc->GetActiveObject();
if(radio==6000){
op->SetName("a");
}else{
op->SetName("b");
}
EventAdd(MSG_UPDATE);
}


main()
{
Register(MyMenuPlugin);
}

Comment peut-on faire pour creer une nouvelle "boite de dialogue"? Une qui s'ouvre au démarrage (comme celle là) et une autre qui s'ouvrira lors d'une action. J'ai essayer de creer une nouvelle class GeModalDialog mais sans succes :coup:

Jean-Laurent
02/03/2007, 11h18
J'étais toujours pas trop loin. :mrgreen:
(Le mathématicien pense A, écrit B, dit C et ce qu'il faut comprendre c'est D.)
Vieille blague de physicien. :roll:

Chez moi ça marche.

Il faut créer une nouvelle classe dialogue dans le même style que la première.
Attention, pense bien à changer les noms, genre:

"class Mondialogue2: GeModalDialog

public: MonDialogue2();

MonDialogue2::MonDialogue2(); " etc...

Puis tu peux appeler cette classe dans n'importe quelle action.

EX:

if (radio) { var e = new(MonDialogue2);e->Open(-1,-1); }

Quand tu fais OK et que le premier bouton est coché, ça ouvre le dialogue.

Sinon, si tu as encore un problème montre nous le code. :odile:
Tu nous prépares quoi petit cachotier?:bave:

xs_yann
02/03/2007, 11h28
Il faut créer une nouvelle classe dialogue dans le même style que la première.
Attention, pense bien à changer les noms, genre:

"class Mondialogue2: GeModalDialog

public: MonDialogue2();

MonDialogue2::MonDialogue2(); " etc...

Puis tu peux appeler cette classe dans n'importe quelle action.

EX:

if (radio) { var e = new(MonDialogue2);e->Open(-1,-1); }

Quand tu fais OK et que le premier bouton est coché, ça ouvre le dialogue.


A mince c'est ce que je pensais avoir fait :?
Il faut que je retest :roll:


Tu nous prépares quoi petit cachotier? :bave:
Rien de spécial, je m'exerce :P
en fait c'est un plugin qui permet de, en choisissant la déformation voulu, qu'elle s'adapte à la taille de l'objet et à sa position.
J'ai le code mais pas l'interface :roll:

edit : c'est bizarre, il ouvre une boite vide (et donc impossible à fermer).
edit2 : c'est bon ça fonctionne :roll:
J'avais simplement remplacer CreateLayout() par CreateLayout2().

xs_yann
02/03/2007, 19h28
Est-ce que dans le SDK on peut trouver la liste des objets (cubeObject...)?
Je l'ai trouvé dans la liste de Tengaal mais il en manque certains (genre Explosion FX).

Jean-Laurent
03/03/2007, 10h16
Oups, j'avais raté ton message, pas pensé à regarder la date. :oops:

C'est dans "référence" -> "BaseObject" Oexplosionfx Explosion FX object.
Il faut descendre un peu et pour illustrer les objets qu'on peut allouer il y a une liste exhaustive il me semble.

Sinon, par glisser-déposer dans le code coffee, ça ne marche pas?

xs_yann
03/03/2007, 15h36
:oops: :oops:
J'avais bien vu cette liste mais je n'ai jamais compris ce que voulai dire AllocObject().
Jean-Laurent :prie:

Sinon, par glisser-déposer dans le code coffee, ça ne marche pas?
Tout ce que l'on peut glisser dans le code c'est ce qui se rapporte aux paramètres d'un objet (ceux que l'on obtiendrait en faisant un GetContainer()) enfin je crois. :roll:

xs_yann
04/03/2007, 18h42
Voilà le début du plug : http://ykoeth.free.fr/fc4d/deformation.zip
(fonction spécial pour l'os).
Encore beaucoup d'améliorations prévues, et surement encore beaucoups de bugs présent.
Même si le plug n'est pas forcément utile. :roll:
Le code est en .cof vous pouvez donc l'analyser à loisir. :P

Jean-Laurent
04/03/2007, 19h13
Je n'arrive pas à le télécharger. :cry2:
Il doit y avoir un problème avec le lien.

EDIT: Aujourd'hui ça marche. :poucehaut:

Jean-Laurent
05/03/2007, 11h02
Même si le plug n'est pas forcément utile. :roll:


Si,si. Moi je l'adore ton plug. :efface:
Il y a peut-être quelque chose qui m'échappe, mais quand je travaille sur un objet qui se trouve loin de l'origine des axes et auquel j'ai ajouté une rotation c'est la croix et la bannière pour y coller correctement un déformateur.
D'où l'intérêt de ton plug.
Il est très bien fait. :poucehaut:

Par contre, les accents ne passent pas chez moi. "DZformation" etc...

Un autre reproche, mais je présume que c'est un cours.
On ne peut pas déformer les primitives.
Le plus souvent quand j'utilise un déformateur (à part les os) c'est justement pour ne pas avoir à éditer une primitive. Pourtant pour les coordonnées c'est bien plus simple qu'avec des polygones?

xs_yann
05/03/2007, 18h38
Oui j'ai modifié le lien.
Pour les primitives, comme tu l'as dit c'est en cours, je crois que je vois a peu près comment faire. :bounce:

kald01
05/03/2007, 19h10
Encore un Génie :prie: Merci beaucoup, c'est vrai LE plug utile pour les déformation fini les transfers et les prises de tête :bounce: Si en plus tu peux l'appliquer aux primitives :prie:

Jean-Laurent
06/03/2007, 15h16
Seb vient de donner une astuce que je ne connaissais pas sur les déformateurs.
C'est moins poussé que le truc de Yann mais bien pratique. J'étais passé à côté.

Citation de Seb:
"Lorsque tu appliques un déformateur à un objet, appuyer en même temps sur alt rend ton objet enfant de ton déformateur et transfère les axes de ton déformateur à ceux de l'objet... "

xs_yann
06/03/2007, 18h48
Encore un Génie :prie:
:oops:


Lorsque tu appliques un déformateur à un objet, appuyer en même temps sur alt rend ton objet enfant de ton déformateur et transfère les axes de ton déformateur à ceux de l'objet...
:cry2:
Bon alors, je vais tenter de me rattraper :mrgreen: :
1. Avec cette technique le déformateur est parent et non enfant (et si l'on appuie sur schift pour le rendre enfant il ne s'adapte pas à la rotation).
2. Tu ne peut pas règler aussi facilement la taille du déformateur par rapport à l'objet.
3. Essaye de déplacer les axes de ton objet.
4. ...C'est tous ce que j'ai trouver pour l'instant :roll:

edit : en plus le plug place les déformateur de type melt, etc à la base de l'objet, et il y a une fonction spécial pour les os. :P

Sinon la technique de SebBBL (qui est expliquée dans un DVD de 3dFluff je crois) est bien pratique également pour appliquer les HN ou symétries, etc..

Bon pour en revenir au plug, pour les primitives j'ai un peu plus de mal que je ne le pensais, j'arrive très bien à les éditer et à placer le déformateur mais ensuite quand je veux utiliser le DoUndo(); mon déformateur disparait également, logique :roll:
:coup:

edit2 : CA Y EST!! Je crois que j'ai enfin réussi :D

Jean-Laurent
06/03/2007, 19h16
Oui,oui, j'avais fait les mêmes constatations que toi.
C'est pourquoi je précise bien que ton plug est plus poussé. :poucehaut:

Pourquoi veux-tu obligatoirement éditer les primitives? Ne pourrais-tu pas les laisser?

xs_yann
06/03/2007, 19h23
Pourquoi veux-tu obligatoirement éditer les primitives? Ne pourrais-tu pas les laisser?
Non en fait je les édite pour récuperer la position de certains points (comme les points des extrémités ou le point le plus bas) car en fait je calcul la hauteur grâce aux points (tu peux le voir dans le code), il me faut donc éditer la primitive.
Mais ne t'inquiète pas, la primitive n'est pas éditée réelement, tu ne le verra même pas dans ton géstionnaire (enfin je crois) car je l'édite juste le temps de recuperer les valeurs dans les variables et ensuite je le désédite (d'où la fonction DoUndo()).
Tu avais une autre idée?
Bon aller je me le plug en ligne ce sera peut-être plus clair.
http://ykoeth.free.fr/fc4d/deformation_v1.1.zip
:wink:

kald01
06/03/2007, 20h36
Merci, je testerai dès que j'ai un moment, mais dores et déjà merci :poucehaut: :bounce: :prie:

Jean-Laurent
06/03/2007, 20h55
Non en fait je les édite pour récuperer la position de certains points (comme les points des extrémités ou le point le plus bas) car en fait je calcul la hauteur grâce aux points (tu peux le voir dans le code), il me faut donc éditer la primitive.
Mais ne t'inquiète pas, la primitive n'est pas éditée réelement, tu ne le verra même pas dans ton géstionnaire (enfin je crois) car je l'édite juste le temps de recuperer les valeurs dans les variables et ensuite je le désédite (d'où la fonction DoUndo()).
Tu avais une autre idée?


Oui, j'ai vu ça dans le code et je trouvais ça très astucieux. :efface:
La première chose que j'ai testé étant justement le déplacement des axes pour voir si ça marchait toujours. :mrgreen:
Mais pour une primitive comme il n'est pas possible il me semble de décentrer les axes on peut se contenter de récupérer les données relatives à la taille de l'objet.
C'est pourquoi dans le message précédent, je pensais que la démarche était plus facile avec les primitives.

xs_yann
12/03/2007, 19h18
Kald : :wink:
Jean-Laurent :
Même si pour une primitve on ne peux pas déplacer les axes, je crois que pour récuperer la hauteur il faut le faire suivant la primitve (PRIM_CUBE_LEN ; PRIM_SPHERE_RAD etc...) alors que la j'ai la même fonction pour tous (et en plus le code est déjà écrit :P)
Je continu à m'amuser :art:, voici une petite mise à jour, c'est en fait un tag (qu'il faut appliquer à l'objet enfant) :

http://ykoeth.free.fr/fc4d/deformation_v.1.2.zip

Aurety
13/03/2007, 12h15
Super pratique xs_yann ! La classe... Je parle de toi sur CG_Talk, je pense que tu vas pouvoir préparer une version anglaise ! :mrgreen:

merci beaucoup !

http://forums.cgsociety.org/showthread.php?f=47&t=473585

paspas
13/03/2007, 12h34
salut

je vient seulement de voir ce post :oops: ( et pas encore bien regarder je le fait ce soir :D)


GetSplinePoint( x, segment )

[vector] GetSplinePoint([float] x, [int] segment);
Returns the position at the position x (0.0<=x<=1.0) along the specified segment. The positioning is natural, i.e. x=0.5 isn't necessarily at half the length. Use UniformToNatural() if you want to get a uniform distribution.

ca fonctionne pas sur les primitives ?

paspas

Ogier
13/03/2007, 12h41
ah oui dis donc ! c'est super méga pratique même !!
bravo ! (p'tit détail : sur PC, j'ai le panneau de config du plug ou j'ai les mots avec accents qui merdent... c'est pas booo :lol: )

kiteman
13/03/2007, 12h55
ouch xs-Yann :prie:

super ton plug :poucehaut:

je comprends rien du tout à ce language extra-terrestre qu'est la programmation , alors big respect !

edj kodiak
13/03/2007, 12h58
Yann :prie: :poucehaut:

époustouflant, éblouissant, ... pratique ^^

et comme Ogier, p'tit problème avec les accents sur PC

Aurety
13/03/2007, 17h14
Il y a Rich-Art sur CGTalk qui l'a traduit en anglais et demande si il lui est possible de le mettre à disposition pour les autres anglophones ?

shtl
13/03/2007, 18h24
Je viens de tester: c'est grandiose! Je le dock aussi direct, bravo et merci beaucoup XS_yann :prie:


ps:
on s'en tappe mais quand même, t'as toujours 15ans? c'est un peu agaçant tout de même :evil:

:mrgreen:

shtl
13/03/2007, 18h31
Pour pas encombrer le topic d'annonces officielles de plugins (http://www.frenchcinema4d.fr/forum/index.php?topic=4318.480)

suite aux problèmes récurents de mister Lenogre, même s'il marche impecc sous r10, je suis quand même aller jeter un œil dans la console:

COFFEE ERROR!
(20) Wrong parameter value type
File: Deformation.cof
Line: 328

sur la PPC mac, rien à signaler dans la console au sujet de CE plug.
M'enfin parfois la console s'affole et le plug tourne quand même et parfois c'est l'inverse ^^ donc bon...
si ça peut aider.

Jean-Laurent
13/03/2007, 19h38
Par contre, les accents ne passent pas chez moi. "DZformation" etc...


Je suis un sombre crétin. :oops:
Les accents passent très bien. C'est juste que tu es sous Mac et moi sous PC.
Il suffit donc de modifier le .cof et ça marche. On a droit aux accents.

xs_yann
13/03/2007, 20h33
Merci à tous :love:
Aurety :prie:
Je découvre juste le post sur GGtalk ça me fait vraiment plaisir. :bounce:
En revanche j'ai eu peur en lisant le post de Lenogre, j'espère que tu as raison shtl et qu'il s'agit bien du tag :arg:
Si oui, ce n'est pas très étonnant, c'est juste une idée qui m'est venu et que j'ai developpée en une ou deux heures :roll:
Normal qu'il ne soit pas au point, ça va venir :lol:
Sinon pour la version anglaise je crois que je vais modifier le plug avec des string_us et fr comme ça la langue sera automatique, ce sera plus simple (sauf pour moi :mrgreen:).
Pour les accents il faudra donc que je fasse une version PC :coup: (ou alors je les supprime tous :roll:)
Merci à tous

Sir Gong
13/03/2007, 20h44
http://gabribu.free.fr/files/fc4d/modos/modos03.jpg

Maha
13/03/2007, 20h54
Je ne sais pas pour vous, mais moi à 15 ans j'étais loin d'être capable de faire ça (c'est toujours le cas à passé 30 d'ailleurs), en plus je n'y aurai pas pensé (je découvrais qu'on pouvait faire autre chose avec les filles que leur tirer les cheveux à cet age là .)

En tout cas bravo! terrible petit plug ! le genre dont on arrive plus à ce passer:poucehaut:

xs_yann
13/03/2007, 21h17
Sir Gong : :lol: :love:

maha : Merci :wink:

n plus je n'y aurai pas pensé (je découvrais qu'on pouvait faire autre chose avec les filles que leur tirer les cheveux à cet age là .)

T'inquiète pas j'ai aussi du temps en dehors. :mrgreen:

edit : comment dit-on "marge" en anglais? Parce que j'ai demander au traducteur google, il me dit "stroke", moi je pensai que "stroke" c'était une crise cardiaque alors je le traduit en français et là il me dit "course". :o :roll:

Proutiste
13/03/2007, 21h19
Hop, téléchargé!
C'est vraiment terrible comme plug!
Merci :D

xs_yann
13/03/2007, 21h39
http://ykoeth.free.fr/fc4d/deformation.v1.3.zip
La langue est mise à jour (fr et us) et j'ai virer le tag Transfer qui n'était donc pas au point (je vais travailler dessus).
J'ai encore réperer des bugs, il va falloir arranger ça. :roll:
Si vous en reperer d'autre...

Aurety : merci donc pour le post sur CGtalk, si tu pouvais les remercier et leurs passer le bonjour ce serais sympa :calim: , merci :wink:

Jean-Laurent
13/03/2007, 21h43
Du coup j'ai rejeté un petit coup d'oeil sur la dernière mouture.

Il y a un petit problème de placement avec "explosion", "explosionfX" et "fusion".
Il suffit de rajouter une ligne de code.

C'est "explosionfx" qui crée l'erreur à la ligne 308, c'est lorsqu'elle est créée que le message apparaît dans la console.
Il doit juste y avoir une erreur dans la ligne de code qui définit la taille.

Chez moi, le tag "transfer" marche très bien. Je ne comprends pas où se situe le problème?
Si Lenogre ou SHTL pouvaient préciser.
On sélectionne le déformateur enfant et il se place sur le parent.

Pour la version PC si tu veux, je place les accents et je te l'envoi, c'est vite fait.
Ensuite il faut voir si tu la modifies sur MAC si ça conserve les accents placés sous PC. :odile:

Encore bravo. :efface:

Maha
13/03/2007, 21h59
T'inquiète pas j'ai aussi du temps en dehors. :mrgreen:


rhoo tu sais tu aura tout le temps plus tard .. pour l'instant tu peux passer tout ton temps à nous concocter de petits bijoux comme celui-ci




:mrgreen: je rigole bien sur .. si c'est pas à ton age qu'on profite de la vie .. en tout cas merci ! :bounce:

xs_yann
13/03/2007, 22h13
Merci Jean-Laurent pour cette remarque :prie:
Alors en fait c'est une variable maxH qui bug.
C'est une variable que j'utilisait pour les déformateur qui ont un rayon, je prend donc entre les 3 hauteurs (x,y et z) la plus élevée ce qui donnait :


var maxH;
if(hauteur.x>hauteur.y&&hauteur.x>hauteur.z)maxH=hauteur.x;
if(hauteur.y>hauteur.x&&hauteur.y>hauteur.z)maxH=hauteur.y;
if(hauteur.z>hauteur.x&&hauteur.z>hauteur.y)maxH=hauteur.z;
Mais apparemment cela ne fonctionne pas. :roll:

edit : honte sur moi. C'était en fait tous bête c'était du fait que lorque les hauteurs était égale maxH n'éxistait pas :

if(hauteur.x==hauteur.y||hauteur.x==hauteur.z||hau teur.y==hauteur.z)maxH=hauteur.x;
et ça roule (enfin je crois :roll:)

Le lien est mis à jour (j'en est profité pour corriger un bug sur la taille du FFD qui ne fonctionnait pas avec la marge.)
J'espère donc que ça fonctionne :wink:
:odile:

Jean-Laurent
14/03/2007, 09h52
J'ai un doute sur ta dernière ligne de code.
Tout dépend où tu la places, mais elle me semble quand même "dangereuse".

Tu n'aurais pas confondu les || et les &&?

Là, si Hx et Hy sont égales et que Hz est plus grand, c'est x qui est la hauteur maximale. :o

Le plus simple je pense est juste d'introduire des >= dans le code précédent (première ligne) sans ajouter de ligne de code. (la première ligne sera exécutée si Hx=Hy=Hz et la hauteur max sera Hx,Hy,Hz).

lenogre
14/03/2007, 10h24
J'avais pas vu que c'était dans les plugs. Effectivement no pb de ce côté là. Un grand bravo à toi.

tarlack
14/03/2007, 11h02
var maxH;
if(hauteur.x>hauteur.y&&hauteur.x>hauteur.z)maxH=hauteur.x;
if(hauteur.y>hauteur.x&&hauteur.y>hauteur.z)maxH=hauteur.y;
if(hauteur.z>hauteur.x&&hauteur.z>hauteur.y)maxH=hauteur.z;



Ce que tu peux faire et ca marchera :

var maxH = hauteur.x;
if(hauteur.y>hauteur.x&&hauteur.y>hauteur.z)maxH=hauteur.y;
if(hauteur.z>hauteur.x&&hauteur.z>hauteur.y)maxH=hauteur.z;


Ca sera toujours défini et la valeur sera ok, egalités ou pas. gran,d bravo à toi ;)

xs_yann
14/03/2007, 17h47
Merci Jean-Laurent et Tarlack :P
J'ai effectivement pensé au probmème que tu cites Jean-Laurent, mais trop tard.
Je suis content que tu y ai fait attention. :wink:

Tarlack : merci pour ta solution mais il y a toujours le problème que cite Jean-Laurent, non?
Exemple : si x=100, y=500,z=500.
maxH vaut 100 alors que ce n'est pas la plus grande valeur.

Le code :

var maxH;
if((hauteur.x>hauteur.y&&hauteur.x>hauteur.z)||(hauteur.x==hauteur.y&&hauteur.x>hauteur.z)||(hauteur.x==hauteur.z&&hauteur.x>hauteur.y))maxH=hauteur.x;
if((hauteur.y>hauteur.x&&hauteur.y>hauteur.z)||(hauteur.y==hauteur.x&&hauteur.y>hauteur.z)||(hauteur.y==hauteur.z&&hauteur.y>hauteur.x))maxH=hauteur.y;
if((hauteur.z>hauteur.x&&hauteur.z>hauteur.y)||(hauteur.z==hauteur.y&&hauteur.z>hauteur.x)||(hauteur.z==hauteur.x&&hauteur.z>hauteur.y))maxH=hauteur.z;


Oula, je me demande si je me complique pas la vie? :arg:
Il n'y a pas un moyen plus simple pour comparer trois valeurs et récuperer la plus grande?

Jean-Laurent
14/03/2007, 18h57
J'explicite un peu ma première idée.

var maxH;
if(hauteur.x>=hauteur.y&&hauteur.x>=hauteur.z)maxH=hauteur.x;
if(hauteur.y>=hauteur.x&&hauteur.y>=hauteur.z)maxH=hauteur.y;
if(hauteur.z>=hauteur.x&&hauteur.z>=hauteur.y)maxH=hauteur.z;

Et ça devrait marcher sans problème.

xs_yann
14/03/2007, 19h04
Exact Jean-Laurent. :poucehaut:
Merci :prie:

tarlack
14/03/2007, 19h25
ah oui, il faut juste remplacer les > par des >= :mrgreen:

paspas
15/03/2007, 14h23
salut yann

j'ai installer ton plug :poucehaut: joli coffee

mais un truc me turlupine

ton coffe est actif meme si on utilise pas tron plug :arg:

je vait t' avouer que je l' ai disséquer :twisted: pour pouvoir un peu l' etudier et donc j' ai remarquer dans la consolle que il se loadais constament
quand je l' utiliait ->normal mais meme apres sur un nouveau document il execute ton coffee , ca doit pas etre tes genant sauf que ca doit prendre un peu de ressource

mias tres joli travaille bravo



paspas

xs_yann
15/03/2007, 17h21
Salut paspas,
Effectivement c'est bizarre :arg:
Il faudra que je regarde ça. Je ne suis pas sur de pouvoir rsoudre un probème comme celu i-ci.

Jean-Laurent
16/03/2007, 13h49
A quoi vous voyez ça?
Un "println" quelque part dans le code?

Tous les plugIn sont automatiquement chargés à l'ouverture du logiciel, ça c'est normal il me semble.
Ensuite si le code est exécuté à chaque action c'est plus gênant.
Mais normalement ce n'est le cas que si un tag lié à une expression plug-in est créé.
Ce qui ici n'est pas le cas.

paspas
16/03/2007, 15h05
salut
quand tu lance la console il met

C.O.F.F.E.E
(j ai oublier le fin du text :mrgreen:)
{
deformation ...
transformation ....
}
C.O.F.F.E.E
(j ai oublier le fin du text :mrgreen:)

et d habitude tu a juste
C.O.F.F.E.E
(j ai oublier le fin du text :mrgreen:)
{
}

et ensuite ce que tu demande dans la console et les erreurs

paspas

xs_yann
16/03/2007, 19h46
Je profite du sujet car j'ai un code et je ne comprend pas où est le problème :coup:



var rd = doc->GetFirstRenderData();
println(rd->GetName());
var bc = rd->GetContainer();
bc->SetData(RDATA_NAME,"toto");
rd->SetContainer(bc);


Je ne comprend pas pourquoi les préférences de rendu ne sont pas renommées (en tout cas si je fait rd->SetName(); ça fonctionne, mais j'aurais besoin d'agir sur autre chose que le nom plus tard :roll:)
Si quelqun à une idée...
merci.

paspas
16/03/2007, 20h14
c' est que c' est pas un container :mrgreen:

plus sérieux

regarde plutot de ce coté , si je me rapple certain test que j ai réalisé il fait utiliser ces codes pour atteindre les containers des preferences vue et autres


// Base draw access
[BaseList2D] GetActiveBaseDraw();
[BaseList2D] GetRenderBaseDraw();
[BaseList2D] GetBaseDraw([int] index);


exemple :


bc = doc->GetActiveBaseDraw();
et la tu sait par la methode des container atteindre ce que tu cherche car bc est le container

enfin si je dis pas de betise

paspas

xs_yann
18/03/2007, 18h24
Merci paspas, mais dans le SDK dans Utilities RenderData, il est questions de container :?

Une autre question : On peut inserer un objet enfant de op, mais peut on l'inserer parent?

paspas
18/03/2007, 23h00
heuuuuu :coup:

je conprend pas la question ?

si op est parent c est que l autre est enfant non ??

dons si tu insere l' autre comme enfant op est parent

ou tu insere op comme enfant et l' autre est parent

paspas

xs_yann
19/03/2007, 19h14
Et bien en fait quand je fait :


var cercle = AllocObject(Osplinecircle);
if (op->GetDown())return;
doc->InsertObject(cercle, op, NULL);

resultat :
--Expression
|___cercle

Le cercle est inseré enfant de op, mais maintenant je voudrais qu'il soit parent, comme ça :

--cercle
|___Expression

paspas
19/03/2007, 19h46
malheuresement ( ou j' ai pas trouver ) je n ai encore pas reusi a inserer un objet directement dans le doc :cry2: sans passer par un objet deja existant (op en general ) ( je pense que c' est imposible ) ,


doc->InsertObject(cercle, doc, NULL); fonctionne pas :mrgreen:

la seul solution est de crée un NULL monde qui est parent de tout le monde meme de op

de la tu cree ton cercle dans monde et la tu sait apres metre op comme enfant de cercle

au moment de la creation :
monde
I......... cercle
I...........op

apres manip

monde
I...........cercle
I..........op

c est la seul solution que je vois

tu sait bloquer par COFEE la position du NULL monde en le callant sur celui par defaut de C4D

paspas qui serrait preneur sur le fait de casser une hierarchie :mrgreen:

xs_yann
19/03/2007, 20h50
Oula, je crois que l'on a des problèmes de communication :lol:
En fait pour creer un objet dans le doc tu fais

doc->InsertObject(cercle, NULL, NULL);
Mais justement je ne sais pas faire :

de la tu cree ton cercle dans monde et la tu sait apres metre op comme enfant de cercle
:roll:

paspas
19/03/2007, 23h26
:oops: merci du renseignement

paspas
19/03/2007, 23h45
me revoilou


voila j' ai été tester


op-> Remove(); // pas oublier sinon plantage :mrgreen:
op-> InsertUnder(cercle);


paspas confut de n' avoir pas comprit :oops:

xs_yann
22/03/2007, 11h01
Merci paspas, je ne connaissai pas cette fonction :prie:

xs_yann
22/03/2007, 18h46
:D

Comment faire pour creer un nombre d'objet défini?
J'ai essayé


var i;
for(i=0;i<=3;i++)
{
doc->InsertObject(AllocObject(Ocube)),NULL,NULL);
}

sans succès :coup:
merci

paspas
23/03/2007, 19h22
perso j utilise des tableau

un tableau pour les noms ( desoler les crochet ne se mete pas a l écran :cry2: j ai mit des () a la place desoler )

noms(0)= "objet0";
noms(1)= "objet1";
.
.
.
.
et ainsi de suite , tu peut utilier les code string et une boucle for pour crée les noms

et apres

var objet = new(array,3);

for(i=0;i<=3;i++)
{
objet(i) = doc -> FindObjet(noms(i));
if (!objet(i)) doc->....... et ce qui faut pour crée l' objet(i)!
}


j espere que j ai ete assez clair :oops:

et comme ca si je doit fair un truc sur un objet en particulier tout mes objet sont dans un tableau

xs_yann
24/03/2007, 15h25
Je n'avais pas pensé aux tableaux. :cry:
Paspas : :love: :prie:

xs_yann
25/03/2007, 19h18
Salut, :D

Me revoilà avec un nouveau plug :
http://ykoeth.free.fr/fc4d/LatheToLoft.zip

Ce plug permet donc de creer une peau nurbs à partir d'une révolution.

Explications :

http://ykoeth.free.fr/fc4d/img_lathetoloft/1.jpg
On créer une spline.

http://ykoeth.free.fr/fc4d/img_lathetoloft/2.jpg

http://ykoeth.free.fr/fc4d/img_lathetoloft/3.jpg
On la glisse dans une révolution Nurbs (lathe Nurbs, vu que les fonctions et les noms coffee sont en anglais j'ai mis mon interface en anglais :roll:)

http://ykoeth.free.fr/fc4d/img_lathetoloft/4.jpg
On va chercher le plug dans le menu Modules externes.

http://ykoeth.free.fr/fc4d/img_lathetoloft/5.jpg
Un objet peau Nurbs est automatiquement créé.

http://ykoeth.free.fr/fc4d/img_lathetoloft/6.jpg
A droite la peau, à gauche la révolution.

http://ykoeth.free.fr/fc4d/img_lathetoloft/7.jpg
Les splines.

http://ykoeth.free.fr/fc4d/img_lathetoloft/8.jpg
La spline de départ avec une interpolation Cubique

http://ykoeth.free.fr/fc4d/img_lathetoloft/9.jpg
Le résultat du plug (la peau est à droite).

Voilà, esperant que ça puisse servire. :wink:

shtl
25/03/2007, 19h44
A oui, c'est géniale, bravo XS-Yann :prie:

Je suis sûr que ça me sera utile un jour ou l'autre...

Encore une fois merci beaucoup de partager XS-Yann :prie:

Tiens je commence ma wish list :nono:
Un plug qui permet de remplacer un objet (primitif ou procédurale) par un autre:
Je veux que ce cube devienne une sphere.
Je veux que ce cube devienne une instance.
etc...

ça serai génial pour moi ^^


ah oui sinon, c'est XS-Pipe ? :D

xs_yann
25/03/2007, 19h55
Merci shtl :love:


Un plug qui permet de remplacer un objet (primitif ou procédurale) par un autre:
Je veux que ce cube devienne une sphere.
Je veux que ce cube devienne une instance.
etc...
http://www.frenchcinema4d.fr/forum/Smileys/default/icon_grin.gif
Je n'ai pas compris. :lol:
Cela apporterai quoi? C'est juste pour ne pas utiliser la fonction transferer? :roll:

xsPipe c'est juste quick pipe mais c'est le mien :D. Je l'ai donc simplifié en mettant juste mes fonctions (dont l'hypernurbs).
http://ykoeth.free.fr/fc4d/10.jpg

shtl
25/03/2007, 20h10
Ah ok, bah c'est cool aussi, il me semble que l'ancien quickpipe n'est plus compatible depuis la r8.5 ou 9 non?

Ça doit être génial de pouvoir se créer ses propres outils en fonction de son propre workflow :bave: :prie:


Oui bon, mon bidule est un truc très particulier, justement propre à mon travail. Une habitude que j'avais prise avec la r7 et les instances qui marchaient par dénomination: on entrait un nom qui définissait l'objet source. Après je me suis habitué aux nouvelles instances, et depuis la r10 on peu facilement isoler des objets du même nom...
Mais pour en revenir à cette idée, donc mettons que j'ai un cube du nom de "ß" duppliqué 250 fois dans ma scène, je voudrai que les 249 derniers "ß" deviennent des instances du premier "ß".
La commande transférer est bien, d'autant qu'une fois vérouillé au dock elle marche par simple click les fois suivante. Mais bon ça reste quand même 249 clicks :coup:
Pas très clair mon bidule hein ? :mrgreen:

Enfin bon j'ai osé le proposer, mais j'aurai aussi bien pu fermer ma gueule vu que tu partage déjà tes petits bijoux avec générosité :oops:

En plus tes plug sont en .cof (tiens, ça veut dire coffee?), ça marche avec toutes les versions, c'est vraiment géniale :bounce:

kald01
25/03/2007, 22h13
:shock: wow super Yann a encore frappé :prie: Super le coup de loft nurbs :poucehaut: Bien ton quickpipe :poucehaut:

paspas
26/03/2007, 12h07
shtl si tu repasse par ici

vas voir la bas (http://www.frenchcinema4d.fr/forum/index.php?topic=18725.0)

c est pas un plug mais un expresso faut juste l' ameliorer un peu suivant ce qu' on veut :mrgreen:

paspas

xs_yann
26/03/2007, 19h43
Merci Kald,
shtl : Je ne suis pas sur d'avoir tout compris mais j'ai commencé quelque chose, on verra bien. :wink:

shtl
26/03/2007, 20h09
:bounce: :bounce: :bounce:


Vous êtes des amours :love:

paspas: j'ai commencé à jeter un œil, mais il me faudrai au moins la moitié du cerveau disponible pour capter quelques chose là-dedans et parvenir à me l'adapter :oops:

XS-Yann:


shtl : Je ne suis pas sur d'avoir tout compris mais j'ai commencé quelque chose, on verra bien. :wink:

ouai sérieux? "fichtre" ce serai grandiose....
faut pas me faire des coups au cœur comme ça, chuis vieux moi :mrgreen:

tiens du coup pendant un rendu je t'ai fait deux petites captures sur un exemple assez récurent:
je modélise de manière sommaire mes volumes. Et je copie colle beaucoup d'objets dans la hiérarchie afin de conserver taille et position de base d'un objet pour aller vite.
http://www.shtl.org/FC4D/XSYann/cylindre.jpg

Mais la par exemple le canon doit être un tube:
http://www.shtl.org/FC4D/XSYann/tube.jpg

une commande du type de ton "déformation" qui permettrai de remplacer le cylindre par un tube, au même emplacement hiérarchique et position/rotation globale, mais ça pourrait être un cube. Et qui désactiverai à la vue et au rendu l'objet source ou le détruirai (choix avec case à cocher?). Et par exemple aussi en poussant plus loin, conserver les réglages de division Y, division des couvercles, et biseaux... C'est bien entendu possible de créer un tube, le transférer, reproduire les réglages de proportion, puis le replacer dans la hiérarchie... Mais c'est long quand on fait ça 200 fois par jour :cry:

mais un truc pareil demanderai sûrement un temps encore plus dingue à développer non?
Enfin perso j'en serai de toute façon totalement incapable :calim:


EDIT:
Après, pouvoir remplacer des objets du même nom par un système d'instance serai sûrement plus compliqué...
L'idée étant de rechercher touts les ojets commençant par un même suffix (exemple "cylindre_***** " ) et les remplacer par des instances.
ça voudrai dire par exemple sur mon exemple, remplacer tout les cylindres_*** par une instance. Je remplace l'originale par un tube, tout mes cylindres sont des tubes. Après la rolls serai un truc genre Mr Vue avec des options type "document", "objet selectionnés", "séléction + enfants" etc... :boss:


En tout cas si tu arrives à quelque chose, quoique ce soir s'en rapprochant :prie:

On verra bien :D

paspas
26/03/2007, 20h36
parvenir à me l'adapter

j ai pas dit que tu devais l adapter mais qu' on pouvait l adadter :poucehaut:

paspas

xs_yann
27/03/2007, 20h07
:cry2: Je ne trouve pas comment creer une zone de drop dans les dialogues.
Pour savoir si un bouton est appuyé il faut faire un GetFloat(); qui va retourné 0 si il n'est pas appuyé et 1 si il l'est, non?
En fait le plus gros problème risque d'être l'interface et non le code :roll:
Je me suis lancé dans les non-modals. :D

Jean-Laurent
27/03/2007, 21h02
:cry2: Je ne trouve pas comment creer une zone de drop dans les dialogues.


Je n'ai jamais trouvé, bonne chance. :wink:
Le plus inquiétant c'est que certains Plug In contournent la difficultées.
C'est un champ de texte avec recherche automatique des objets correspondants dans le gestionnaire.
Inquiétant. :?

xs_yann
28/03/2007, 13h08
Je n'ai jamais trouvé, bonne chance. :wink:
:o
En fait dans le SDK j'ai trouvé un fichier GuiDemo.cof qui contient une telle zone, mais dans le code je ne comprend pas comment elle est crée. (Je crois qu'il n'y a pas de Add.. dans le CreateLayout()). J'ai juste vu CheckDropArea, j'ai donc essayé une recherche sur plugincafe mais je n'ai rien trouvé :poucebas:

Et sinon pour le bouton?
C'est exactement le même problème que celui du début du topic mais au lieu de RadioGroup et AddItem(); c'est AddButton();
Au pire je vais tout tester on verra bien. :roll:
merci

Jean-Laurent
28/03/2007, 14h07
Ah, tient... Pourtant j'avais épluché le fichier GuiDemo qui m'avait semblé clair.
Tu me redonnes espoir, j'y retourne et je te tiens au courant. :prie:

Je n'avais pas vu ton edit sur le bouton.
J'y jette un oeil aussi, mais à priori ça devrait marcher comme tu le dis. :odile:

xs_yann
29/03/2007, 10h32
Je crois que j'ai compris, la zone de drag est en fait un static text vide, et il se passe quelque chose ensuite pour détécter la "collision" ( GuiDemo à étudier).
:bounce:

edit : J'ai réussi, je met le fichier en ligne plus tard, j'ai pas trop le temps là, désolé :oops:
( :mrgreen:)

xs_yann
30/03/2007, 17h52
Aller, voilà le fichier simplifier avec un static et un edit, sans noms temporaire pour le survol,etc : http://ykoeth.free.fr/fc4d/drop.cof
Pour le bouton j'ai toujours le même problème il retourne 0.0000 pour le GetFloat() et 0 pour tout les autres (GetItem() GetCheckBox()...)
:coup:

edit : j'ai trouvé. J'ai fais un enum au début avec le nom de mon bouton (myButton) ensuite dans le Command(id,msg) une condition switch(id) case :myButton
:roll:

xs_yann
01/04/2007, 17h56
Je ne montre rien pour l'instant mais ne t'inquiète pas shtl, ça avance plutôt bien. :wink:
:art:

shtl
01/04/2007, 18h05
Je ne dits rien :)

Désolé de pas pouvoir aider :?



Par contre voici un autre exemple du type de problème que j'ai très souvent et que je ne parvenai pas à expliquer:

http://www.shtl.org/FC4D/XSYann/Image-24.jpg

Plus de 1000 sphères, plus de 1000 cylindres. Pour les modifier je passe par un outil séléction. Et je modifie. C'est possible, mais long et fastidieux. Pouvoir donc remplacer/convertir ces objets en d'autres, en locurence en des instances, serai vraiment quelques chose de super pratique.

Je sais pas si c'est faisable, mais si ça l'est :prie:

shtl
01/04/2007, 21h34
Je ne montre rien pour l'instant mais ne t'inquiète pas shtl, ça avance plutôt bien. :wink:
:art:


haha je viens seulement de comprendre= un poisson d'avril ! :arg:

xs_yann
04/04/2007, 18h18
haha je viens seulement de comprendre= un poisson d'avril ! :arg:
Zut, je n'aurais pas cru que tu y penserais :mrgreen:

Non, réelement je m'approche de quelque chose de présentable mais chaque fois que je résoud un problème un nouveau se pose, en voilà un sur lequel je bloque :


var enfants;
for(enfants = op->GetDown();enfants;enfants=enfants->GetNext())
{
enfants->Remove();
}


Je souhaiterai supprimer tous les enfants de op, mais lorsque j'execute le code ci-dessus, seul un objet à la fois est supprimé. Si je fais println(enfants) il retourne bien tous les enfants.
:coup:
merci

Jean-Laurent
05/04/2007, 12h59
Je pense qu'on peut faire la même chose avec la seule fonction GetDown().
On supprime le premier enfant de l'objet, le seconde devient ainsi le premier enfant etc... jusqu'à ce qu'il n'y ait plus d'enfant. Pas besoin à mon avis d'utiliser GetNext();

Par contre je pense qu'il faut préciser quelque chose après Remove(). Un message à l'objet message(...) comme quoi des choses sont modifiées. Sinon, ça plante.

Ex: // Inserts an object as a child of another
var parent = doc->FindObject("Parent");
var object = doc->FindObject("MyObject");

object->Remove(); // Important!
object->InsertUnder(parent);

l'objet a été retiré par la fonction Remove() et pourtant à la ligne suivante on voit qu'il conserve son existence puisqu'on peut encore le placer dans le parent.

Je pense que dans ton code c'est un truc du genre qui se passe.
Tu retires l'objet, mais c'est toujours lui qui intervient.

Je teste ça.

Edit: Un truc de ce genre là, a l'air de marcher, à voir:


var enfant=op->GetDown();

while(enfant)
{enfant->Remove();
op->MultiMessage(MSG_UPDATE);
enfant=op->GetDown();}

paspas
05/04/2007, 14h59
salut

en général j'utilise un compteur qui compte les enfant d' un objet (compteur qui me fut donner par Majoul :prie:)

(je mettrait les code du compteur une fois chez moi )


une fois que je sait le nombre d' enfant

je liste mes objets dans un tableau

et après

si h est le nombre d 'enfant



for (i=0;i<h;i++)

{
var list_objet= doc ->FindObject(monobjet(i)); //liste objet
}


for (i=0;i<h;i++)

{
list_objet(i)->Remove(); // effacer objet
}


même sans le multimesage, ça marche encore que suis d'accord avec JL il faut sûrement quelque chose pour redessiner le brol

peut êtres un EventAdd ??

paspas

xs_yann
05/04/2007, 17h57
Merci à vous deux. :prie:
Jean-Laurent : ton code fonctionne très bien mais le problème c'est que, dans mon code, je ne vois pas d'alternative pour contourner la boucle. En fait le code est plus compliqué et mes objets ne peuvent être connu que dans la boucle (comme celle présentée au dessus).



var enfant,tab;
var i=0;
for(enfant = op->GetDown();enfant;enfant=enfant->GetNext())
{
i++;
tab = new(array,i);
if(enfant->GetName()=="toto")tab[i-1] = enfant;
if(tab[i-1])
{
tab[i-1]->SetName("newName");
}
}

J'applique donc ce code sur un objet qui à des enfants dont certains sont nommés "toto", jusque là tout se passe comme je veux et je peux renommer seul les enfants nommés "toto", mais lorsque je remplace le SetName par un remove comme ça :


var enfant,tab;
var i=0;
for(enfant = op->GetDown();enfant;enfant=enfant->GetNext())
{
i++;
tab = new(array,i);
if(enfant->GetName()=="toto")tab[i-1] = enfant;
if(tab[i-1])
{
tab[i-1]->Remove();
}
}
seulement un objet est supprimé.
N'est-il pas possible de tous les supprimer?
Merci.

paspas
05/04/2007, 18h23
je pense que ta boucle ne doit pas fair sont "tour " complétement

j' ai mit dans le code un test

regarde si ta boucle fait "enfant = op->GetDown()" tours :mrgreen:



var enfant,tab;
var i=0;
for(enfant = op->GetDown();enfant;enfant=enfant->GetNext())
{
i++;
tab = new(array,i);
if(enfant->GetName()=="toto")tab[i-1] = enfant;
if(tab[i-1])
{
println(i); // <----------- test
tab[i-1]->Remove();
}
}

si ton code erreur (comme je le pense) est un " out of range " je pense que le nonbre de tour de correspond pas a ton nombre de variable de ton tableau .

paspas

xs_yann
05/04/2007, 18h40
Si je place le println là où tu l'as mis il retourne la valeur de i lorsque il rencontre l'objet et si le println est placé en dehors du if il retourne le nombre d'objet enfants.


Expression
l___toto
l___Cube
l___toto


retourne 1 et 3 pour :

var enfant,tab;
var i=0;
for(enfant = op->GetDown();enfant;enfant=enfant->GetNext())
{
i++;
tab = new(array,i);
if(enfant->GetName()=="toto")tab[i-1] = enfant;
if(tab[i-1])
{
println(i); // <----------- test
tab[i-1]->Remove();
}
}

et 3 pour

var enfant,tab;
var i=0;
for(enfant = op->GetDown();enfant;enfant=enfant->GetNext())
{
i++;
println(i); // <----------- test
tab = new(array,i);
if(enfant->GetName()=="toto")tab[i-1] = enfant;
if(tab[i-1])
{

}
}

paspas
05/04/2007, 18h48
si il retourne 1 c est que la boucle ne se fait que UNE fois --> un seul objet enlever

ca doit etre ta condition
if(tab[i-1]) qui pose probleme



paspas

xs_yann
05/04/2007, 18h50
Sauf qu'il retourne 1 ET 3, il fait donc la boucle autant de fois qu'il y a d'enfants mais il n'affiche que 1 et 3 parce que seulement les objets 1 et 3 sont nommés toto.

paspas
05/04/2007, 18h53
oui mais la condition


if(tab[i-1])
{
println(i); // <----------- test
tab[i-1]->Remove();

ne se fait qu' une seul foi elle devrait se faire 2 fois
a moin que tu n' ai

2 fois 1 dans la console

le test n est la que pour vérifier ne nombre de fois qu' est réaliser la condition

st tu met println("George"); a la place de println(i);

dans ta console de doit avoir

George
George
George
..
..
..

autant de fois que d' objet a enlever


paspas

Jean-Laurent
05/04/2007, 21h33
J'ai mis une boucle while ne voyant pas l'utilité d'une boucle for, avec une condition de départ etc...
Mais le même code doit pouvoir se mettre sans problème dans ta boucle for.

Je jette un oeil demain à toutes vos explications.

Majoul
05/04/2007, 22h41
Si j’ai bien compris tu cherche à supprimer tous les enfants d’un objet « op »




var next = op->GetDown() ;
while(next)
{
var prev = next ;
next = next->GetNext() ;
prev->Remove() ;
}

xs_yann
06/04/2007, 17h48
Alors en fait je vais reprendre depuis le début car je n'ai pas été très clair, désolé :oops:

Voilà mon code :

Detect(op) {
if(op->GetName()=="toto")op->SetName("tata");
}
Parser(op){
var enfant;
for(enfant=op->GetDown();enfant;enfant=enfant->GetNext())
{
Parser(enfant);
Detect(enfant);
}
}



main(doc,op)
{
var base = doc->GetFirstObject();
while(base)
{
Parser(base);
Detect(base);
base = base->GetNext();
}
}

J'ai écrit une fonction récursive pour parser toute la hierarchie d'un objet.
Une fonction Detect (qui execute ce que je veux c'est juste pour éviter à avoir a reecrire les instructions à chaque fois, ici elle detecte si l'objet s'appelle toto).
Dans le main je fais une boucle qui passe par tous les premiers objets de la hierarchie. J'applique la fonction récursive à ces objets.
Jusque là tout fonctionne je peux parcourir toute la hierarchie du document. Maintenant si je veux renommer tout les "toto" en "tata" je place

if(op->GetName()=="toto")op->SetName("tata");
dans Detect, mais si je veux supprimer tous les "toto" je ne peux pas placer

if(op->GetName()=="toto")op->Remove();
:coup:
J'espère être clair cette fois ci :oops:

paspas
06/04/2007, 18h01
si tu rajoute une condition au code de majoul ??



var next = op->GetDown() ;
while(next)
{
var prev = next ;
next = next->GetNext() ;
var noms = prev->GetName();
if (noms=="toto") prev->Remove() ;

}


il devrait parcourir toute la hiérarchie et supprimer celui que tu veut non ?
mais faut trouver une condition pour stopper la boucle :coup:

paspas

xs_yann
06/04/2007, 18h14
Le problème c'est que le code de Majoul ne fonctionne sur seulemnt les enfants de l'objet et non sur les enfants des enfants, etc.
Et je n'arrive pas à l'adapter.

paspas
06/04/2007, 18h37
la seul solution est fair un test pour savoir si les objets on des enfant

si oui tu test pour savoir si y en a qui s' appelle "toto" si oui il les suprime

:idea: autre solution

tu crée un null ou par test tu place tout les object qui s'appelle toto et apres tu suprime avec le code de majoul les objet

un truc du genre


While (test=="toto")
{

var obj= doc->FindObject("toto");
var test = obj->GetName;
if (test=="toto")
{
InsertObject( obj, suprimer,NULL); // suprimer = null dans lequlle tu met tout les toto
obj-> SetName("sup");

}

}

et apres le code majoul pour suprimer tout les objet

je fait ca de tete sans c4d c' est a tester


EDIT

ou simplement
sans le null




While (test=="toto")
{

var obj= doc->FindObject("toto");
var test = obj->GetName;
if (test=="toto") obj->Remove();


}


re edit



While (test=="toto")
{

var obj= doc->FindObject("toto");
var test;
if (!obj) test ="momo"; // :mrgreen: en cas ou

else
{
test = obj->GetName;
obj->Remove();

}
}



bon c 'est un peu bizzare je dit pas :mrgreen:

Majoul
07/04/2007, 02h42
si c'est pour scanner une hiérarchie utilise cette routine




GNOH(obj, stop)
{
if (!obj) return NULL;

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

var precedent = obj ;
while (precedent = precedent->GetUp())
{
if (precedent == stop) return NULL ;
if (suivant=precedent->GetNext()) return suivant ;
}
}



et tu l'utilise comme cet exemple




for(op=doc->GetFirstObject(); op ; op=GNOH(op, NULL) )
{
if(op->GetName()=="toto") op->SetName("tata) ;
}

xs_yann
08/04/2007, 13h41
Majoul :prie:
Ta routine est beaucoup plus pratique que ma fonction récursive.
Merci paspas et Majoul :poucehaut:

shtl
08/04/2007, 13h54
Tiens hello XS-Yann. J'ai vu que sur cgtalk aussi on te harcelait de requettes :lol: :oops:
Et aussi que j'etait pas le seul à rêver de cette outil de remplacement par instance :!:

C'est tout :calim:

Du coup j'en profites pour vous remercier les autres aussi de filer un coup de patte, c'est cool :love:

Bon courage :bounce:

xs_yann
08/04/2007, 17h03
La version 1 de mon plug est, je pense, prête.
edit : il me manque un nom et une icône :roll:

shtl
08/04/2007, 17h07
:bounce: :bounce: :bounce:

:efface: :efface: :efface:

"XSY-uplaupbarbatruc"
"XSY-changething"
"XSY-magicalclone"
"XSY-switchme"

:mrgreen:

xs_yann
08/04/2007, 17h11
Tu ne serais pas un peu impatient par hasard? :mrgreen:
Pour l'instant c'est quelque chose d'assez basique mais je pourrai surement l'améliorer avec ton aide. :wink:
Je vais réfléchir au nom car il se nomme "shtl" pour le moment :lol:

shtl
08/04/2007, 17h18
:oops:

moi impatient? Je vois vraiment pas ce qui te fait dire ça ? :roll:


:mrgreen:


Sinon je vois pas trop comment je pourrai t'aider à l'améliorer, mais je serai super ravis de faire quoique ce soit pour enfin participer autrement qu'en faisant la pompom girl :lol:

Pour le nom je suis sur que tu trouveras quelque chose de plus compréhenssible que shtl :lol: :mrgreen: :poucehaut:

xs_yann
08/04/2007, 17h21
Je ne suis pas sur du bon fonctionnement du plug, et vu que je n'ai pas trop le temps aujourd'hui je te l'envoie par mp pour que tu le découvre. :wink:

shtl
08/04/2007, 17h35
:D :D <-- shtl trop joisse !

:( <-- chuis émus :mrgreen: :love:

ça m'a l'air de marcher terrible! :poucehaut:

Je vais le tester plus à fond au fur et à mesure, mais déjà c'est un immense gain de temps et un super confort de travail pour moi :efface:
rraaaa la grande classe XS-Yann :prie:
Je crois que pour moi c'est bon... Je te donnerai mon retour après l'avoir rodé quand même, et tu verras si tu à le temps et l'envie de l'améliorer. Mais j'ai l'impression que c'est parfait comme ça ( à part le nom en effet ^^)
C'est génant de demander plus :oops:

encore merci XS-yann, si tu vois un moyen de te renvoyer l'appareil d'une quelquonque façon, je serai ravis d'être ton débiteur parceque que pour le coup :efface:

shtl
08/04/2007, 17h37
Ouep en plus en remplaçant l'objet par une instance, après ya plus qu'à remplcer l'objet de réf par la primitive qu'on veut, l'objet qu'on veut. C'est gééénial :efface:

Il fait beau aujourd'hui :nono:

EDIT:
ok je me calme et vraiment j'attendrai de poster la prochaine: il suffit donc de décocher instance et on remplace par ce qu'on veut: ok :oops:

Majoul
08/04/2007, 17h39
Quel est le but final de l’outil ?
juste pour remplacer certains objets d’une scène par des instances d’un objet ou …

shtl
08/04/2007, 17h45
Quel est le but final de l’outil ?
juste pour remplacer certains objets d’une scène par des instances d’un objet ou …




oui en gros c'est l'idée, que j'avais tenté d'expliqué dans ces deux postes:

http://www.frenchcinema4d.fr/forum/index.php?topic=18946.msg349866#msg349866

http://www.frenchcinema4d.fr/forum/index.php?topic=18946.msg351084#msg351084


Mais ça peut servir à plein de choses: mettons que toutes les poutres dans un batiment sont des poutres de 200, comme généralement je nomme tout mes objets, avec cet outil j'ai plus à passer des heures à reprendre manuellement... Pourquoi ya une autre solution?

Majoul
08/04/2007, 18h48
Je comprend ce que tu veut dire, mais ce qu’il faut plutôt et qui manque dans C4d c’est un outil de sélection plus poussé que l’outil existant, qui puisse offrir une liberté dans le choix de combiner les critères de filtrage. par exemple :

Objet : primitive cube // filtre type objet
Objet dont le nom commence par « Poutre » // filtre nom
Objet Dont la taille X est égale à 150 unités // filtre paramètre
Objet avec une propriété texture avec le matériau « mat1 » // filtre propriété
Objet affecté au layer // filtre layer
position rotation échelle avec condition = ou > ou < // filtre coordonnés
etc...

Avec des filtres aussi poussés, on peut dire que ce genre de manip deviennent facile.

Parce que remplacer des objets par des instances ne résout le problème que pour des cas bien spécifiques.

xs_yann
09/04/2007, 11h45
Merci shtl.

Update du plug Deformation (http://ykoeth.free.fr/fc4d/deformation_v1.4.zip)
Il y avait des bugs lors de l'utilisation des commandes annuler/rétablir.

shtl
09/04/2007, 12h04
Je comprend ce que tu veut dire, mais ce qu’il faut plutôt et qui manque dans C4d c’est un outil de sélection plus poussé que l’outil existant, qui puisse offrir une liberté dans le choix de combiner les critères de filtrage. par exemple :

Objet : primitive cube // filtre type objet
Objet dont le nom commence par « Poutre » // filtre nom
Objet Dont la taille X est égale à 150 unités // filtre paramètre
Objet avec une propriété texture avec le matériau « mat1 » // filtre propriété
Objet affecté au layer // filtre layer
position rotation échelle avec condition = ou > ou < // filtre coordonnés
etc...

Avec des filtres aussi poussés, on peut dire que ce genre de manip deviennent facile.

Parce que remplacer des objets par des instances ne résout le problème que pour des cas bien spécifiques.





oui oui oui, souvent en bossant je me dit "arf ce serai bien si..."
Déjà l'outil de sélection permet de résoudre pas mal de chose toutefois.
En plus de tes exemples, un outil de sélection par shader serai bien pratique, en tout cas j'en aurai bien l'utilité personnelement:
activer/désactiver les shaders de transparence.
" / " les effets d'AO.
" / " les bitmaps ... etc...
ou alors un outil de sélection comme tu dit avec aussi des filtres de materiaux :love:

depuis la r10 il y a quelques options dans l'onglet illumination, j'ai l'impression que c'est ça mais j'ai pas encore vraiment pris l'habitude :oops:


xs_yann: bah non c'est moi qui te remercie.

tiens justement, en parlant d'annuler rétablir: avec ta mouture du plug de switch/change "shtl" ( ^^) faut pas se gourrer dans sa manipe :arg: :wink:
tu penses que c'est possible d'ajouter une commande annuler dans ton code, ou bien comme on modifie l'OM sans enregistrer à un moment la hiérarchie on peu plus revenir en arrière? Ou bien faut il faire le truc machin curent state to object ? :oops:
Je pose juste la question, aucune urgence: tel qu'il est c'est déjà super cool :poucehaut:

Majoul
09/04/2007, 19h33
je viens de me rappeler, regarde ici : http://www.frenchcinema4d.fr/forum/index.php?topic=13892.msg247119#msg247119

La dernière version du plug inachevé mais fonctionne correctement ( SFR ) : http://www.frenchcinema4d.fr/forum/index.php?topic=13912.0

shtl
09/04/2007, 19h51
:lol: mort de rire :lol:

evidemment tu y étais déjà passé ^^ un truc de fou :prie:

du coup j'ai refait la razia sur ton site :oops: et vais revoir tout ça :efface:

MAJOUL = :boss:

shtl
09/04/2007, 20h14
tiens au fait tant que je suis bien lancé dans le style j'abuse, est-ce que tu crois qu'il y aurai un moyen dans MrVue avec l'outil ON/OFF Objets, de conserver les préférences actuel des objets? Comme pour Solo button: si des instances par exemple sont désactivées AVANT l'activation OFF de Mr Vue, lorsqu'on repasse en ON elles restent désactivées?
Quand on a des grosses hiérarchie bien en WIP, ça peut être la cata parfois :cry2:

xs_yann
10/04/2007, 10h38
:roll:
:cry2:

shtl
11/04/2007, 17h58
bah... :oops:

xs_yann
24/04/2007, 20h59
Tes problèmes qui en eux ne doivent pas être très compliqués sont pour moi des vrais challenges. :arg:
Je tiens quand même à te remercier car grâce à toi j'apprend beaucoup en coffee :prie: :nono:


Si des instances par exemple sont désactivées AVANT l'activation OFF de Mr Vue, lorsqu'on repasse en ON elles restent désactivées?


Je me suis donc réalisé un "mini Mr.Vue" avec seulement les fonctions que j'utilise, et incluant la sauvegarde des valeurs précedentes comme tu l'as fait remarquer.

Je peux le montrer si vous voulez avec l'autorisation de MAJOUL (compiler en cob ou non). :wink:

Si tu as d'autres idées shtl vas-y :mrgreen:

shtl
24/04/2007, 21h14
Je tiens quand même à te remercier car grâce à toi j'apprend beaucoup en coffee :prie: :nono:

(...)

Si tu as d'autres idées shtl vas-y :mrgreen:


jeune fou!

je te prépare un roman :art:

:nono:

xs_yann
25/04/2007, 18h23
jeune fou!

je te prépare un roman :art:

:nono:

:bounce:

Voici un aperçu de mon MrVue :

http://ykoeth.free.fr/fc4d/xsvue_vue.jpg (http://ykoeth.free.fr/fc4d/xsvue_vue.jpg)

http://ykoeth.free.fr/fc4d/xsvue_objects.jpg (http://ykoeth.free.fr/fc4d/xsvue_objects.jpg)

shtl
28/04/2007, 21h19
jeune fou!

je te prépare un roman :art:

:nono:

:bounce:




désolé XS_Yann, pas de roman publiable :oops:

en revanche j'ai vu ça, un flash viewer en maxscript ! Si tu parvenais à nous pondre un truc dans le genre :boss:
http://forums.cgsociety.org/showthread.php?threadid=488927&utm_medium=plugblock&utm_source=cgtalk

:mrgreen:

Peut-être moins compliqué, encore que... :roll: un outil de re-projection de surface avancée serai bien cool aussi. Je te réunirai quelques liens pour expliquer l'idée, mais je me demande si il serai pas déjà possible de s'en approcher avec clothilde...

Enfin bref dés que j'ai plus de contenu je repasserai :D


PS:
superbe le XSY viewer :poucehaut:

edj kodiak
28/04/2007, 22h48
en revanche j'ai vu ça, un flash viewer en maxscript ! Si tu parvenais à nous pondre un truc dans le genre :boss:
http://forums.cgsociety.org/showthread.php?threadid=488927&utm_medium=plugblock&utm_source=cgtalk


ce n'est pas simplement un QTVR objet ou pano ??? :roll:
tu le veux obligatoirement en flash ?

Jean-Laurent
28/04/2007, 23h23
Je ne connais pas bien le QTVR.
Mais je présume que le QTVR objet permet de tourner autours de l'objet et le QTVR pano, permet de faire tourner le paysage. :?:

Sinon, ça semble jouable mais il faudrait effectivement préciser l'intérêt principal.

J'avais développé en flash une petite application qui permettait de faire tourner la Terre autours du Soleil (made in C4D) à partir des flèches directionnelles afin de voir l'éclairage.
On peut donc effectivement combiner l'intéractivité de Flash et des animations C4D.

edj kodiak
28/04/2007, 23h35
Mais je présume que le QTVR objet permet de tourner autours de l'objet et le QTVR pano, permet de faire tourner le paysage. :?:


c'est exactement ça :wink:

shtl
29/04/2007, 01h02
HHhaaa mm*rde j'ai posté avant d'avoir vraiment lu l'article, la honte :oops:
J'aurai juré que c'etait plus avancé que ça.... :|
C'est juste, c'est marrant que le post fasses la front de CGTalk :boss: avec quelque chose qui existe depuis bien 12 ans :lol:
Mais peut-être que 3dsmax ne connais pas quicktime? :lol:
Dommage, je sais que apparemment pas mal de monde cherche une solution pour montrer ses modèles en interactif à ses clients (pdf 3d, FBX viewer etc)
La solution avancée suivante serai le Temps Réel...Toute fois modifier un QT (VR) c'est pas facile on dirai, interagir entre du Xpresso, Coffee dans cinema directe offre peut être plus de souplesse? Ya beaucoup de plaintes régulièrement envers QTVR, moi pourtant ça me convient et j'ai adopté depuis longtemps :love:

Enfin bref.


Je cherche encore une fonction/petit outil aussi utile et attendu que le déformateur ou le remplacement d'instance avec options d'undo etc, qui nous faciliteraient la vie...

Mais si d'autres ont des idées, sur lesquels XSY peut s'entraîner et dont on puisse bénéficier après ? Chais pas je sèche un peu là :oops:

edj kodiak
29/04/2007, 01h39
Mais peut-être que 3dsmax ne connais pas quicktime? :lol:

c'est pas loin ;), sur 3DS (v6 en tout cas)*, ce n'était pô possible, enfin si mais non, y'avait 15 000 réglages minimum, et ça ne fonctionnait pô forcément
je ne crois pas que cela a été rajouter sur les versions suivantes, pô besoin pour les jeux videos :mrgreen: (quoi, ça ne sert pô qu'à ça 3ds ?)




Je cherche encore une fonction/petit outil aussi utile et attendu que le déformateur ou le remplacement d'instance avec options d'undo etc, qui nous faciliteraient la vie...

Mais si d'autres ont des idées, sur lesquels XSY peut s'entraîner et dont on puisse bénéficier après ? Chais pas je sèche un peu là :oops:

pourquoi tu veux le forcer à travailler :wink:


j'aimerais bien un outils où tu cliques sur un seul bouton et il te fait exactement ce à quoi tu penses ^^

EDIT : * c'était la version 8 et non la 6

xs_yann
29/04/2007, 19h14
Je cherche encore une fonction/petit outil aussi utile et attendu que le déformateur ou le remplacement d'instance avec options d'undo etc, qui nous faciliteraient la vie...

Tu dit ça parce que je n'ai pas encore réussi à programmer le plug de remplacement avec le undo/redo qui fonctionne :mrgreen:


pourquoi tu veux le forcer à travailler :wink:
T'inquiètes pas, vous pouvez m'exploiter. :lol:
De mon côté je cherche des plugs que je serais capable de développer, alors autant qu'il soit utile... :wink:

xs_yann
18/05/2007, 17h27
La version 2 du plug Deformation : http://ykoeth.free.fr/fc4d/deformation_v.2.zip

Modifications :

-La déformation est séléctionnée lorsque elle est créee.
-La deformation n'est pas créee si l'on appuie sur "Annuler" :roll:

Et la modification la plus importante :
On peut prendre en compte les enfants, et donc créer une deformation pour une symetrie, un groupe d'objet ou autre.

Voilà, je pense que maintenant ce plug peut être utile :wink:

shtl
18/05/2007, 17h29
Haha! peut être utile... :roll:
Je n'utilise jamais de deformateur sans ton plug depuis... la première version ^^

Bref une fois de plus mille merci XS_Yann :prie:

xs_yann
18/05/2007, 17h38
Ben moi, j'ai voulu l'utiiser à plusieures reprises mais cette fonction me manquait :roll:

J'ai oublié de dire aussi que lorsque vous faites une modification sur l'interface, celle-ci est toujours là si vous fermer et re-ouvrez le plug (si vous décochez une case elle reste décochez).

Il doit quand même rester de nombreux bugs, n'hésitez pas à me les signaler. :wink:

C2
29/07/2007, 00h41
N'hésite pas quand quelque chose te manque :bave:

C'est du chinois, mais je vois le résultat, c'est super efficace et pratique!!
Enorme bravo et enorme merci encore une fois :efface:

GUY FROG
07/09/2007, 01h31
Terrible ton Plug! :poucehaut:
Je viens de tomber dessus en épluchant la rubrique "nouveaux plugins"
Quel bonheur!
Jusqu'à maintenant, j'ai sûrement sous-exploité les déformateurs car cela m'agacait au plus haut point cet obligation d''ajustement/objet :x
Mais bon heureusement tu es passé par là. :wink:
Alors Yes! à moi le reflex "déformateurs" car maintenant ce sera tellement plus simple!
Et hop! un nouveau plugin dans ma liste des indispensables :D
Merci xs_yann!