Voir la version complète : Questions et plugs coffee
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, 19h59
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.
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, 21h49
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.
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, 10h18
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:
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().
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, 09h16
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?
: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:
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, 18h13
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, 10h02
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?
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:
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, 14h16
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... "
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, 18h16
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?
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:
Merci, je testerai dès que j'ai un moment, mais dores et déjà merci :poucehaut: :bounce: :prie:
Jean-Laurent
06/03/2007, 19h55
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.
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
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
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
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: )
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, 11h58
Yann :prie: :poucehaut:
époustouflant, éblouissant, ... pratique ^^
et comme Ogier, p'tit problème avec les accents sur PC
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 ?
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:
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, 18h38
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.
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, 19h44
http://gabribu.free.fr/files/fc4d/modos/modos03.jpg
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:
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, 20h19
Hop, téléchargé!
C'est vraiment terrible comme plug!
Merci :D
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, 20h43
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:
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:
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, 08h52
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).
J'avais pas vu que c'était dans les plugs. Effectivement no pb de ce côté là. Un grand bravo à toi.
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 ;)
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, 17h57
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.
Exact Jean-Laurent. :poucehaut:
Merci :prie:
ah oui, il faut juste remplacer les > par des >= :mrgreen:
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
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, 12h49
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.
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
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.
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
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?
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
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
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:
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:
:oops: merci du renseignement
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:
Merci paspas, je ne connaissai pas cette fonction :prie:
: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
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
Je n'avais pas pensé aux tableaux. :cry:
Paspas : :love: :prie:
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:
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
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
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:
:shock: wow super Yann a encore frappé :prie: Super le coup de loft nurbs :poucehaut: Bien ton quickpipe :poucehaut:
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
Merci Kald,
shtl : Je ne suis pas sur d'avoir tout compris mais j'ai commencé quelque chose, on verra bien. :wink:
: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
parvenir à me l'adapter
j ai pas dit que tu devais l adapter mais qu' on pouvait l adadter :poucehaut:
paspas
: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, 20h02
: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. :?
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, 13h07
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:
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:)
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:
Je ne montre rien pour l'instant mais ne t'inquiète pas shtl, ça avance plutôt bien. :wink:
:art:
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:
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:
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, 11h59
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();}
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
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.
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
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])
{
}
}
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
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.
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, 20h33
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.
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() ;
}
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:
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
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.
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:
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) ;
}
Majoul :prie:
Ta routine est beaucoup plus pratique que ma fonction récursive.
Merci paspas et Majoul :poucehaut:
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:
La version 1 de mon plug est, je pense, prête.
edit : il me manque un nom et une icône :roll:
:bounce: :bounce: :bounce:
:efface: :efface: :efface:
"XSY-uplaupbarbatruc"
"XSY-changething"
"XSY-magicalclone"
"XSY-switchme"
:mrgreen:
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:
: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:
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:
: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:
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:
Quel est le but final de l’outil ?
juste pour remplacer certains objets d’une scène par des instances d’un objet ou …
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?
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.
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.
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:
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
: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:
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:
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:
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:
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)
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, 21h48
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, 22h23
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, 22h35
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:
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, 00h39
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
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:
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:
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:
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:
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, 00h31
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!
Powered by vBulletin® Version 4.2.1 Copyright © 2024 vBulletin Solutions, Inc. Tous droits réservés