PDA

Voir la version complète : WIP coffee : Calcul du temps...



Guedinouff
01/01/2005, 19h14
Bonjour tout le monde,

Je viens de commencer une expression qui permettrait de calculer le temps passer sur un projet. J'ai déjà fait quelque chose qui permet d'afficher dans la barre d'état le temps depuis lequel c4d est ouvert. Je sais c'est pas très évolué et çà ne sert pas encore à grand chose. Mais ce n'est j'espère que le début.

J'arrive malheureusement à un problème : je voudrais réaliser une action à l'ouverture du document (la copie du temps passé lors de la précédente ouverture du document contenant l'expression). J'ai trouvé dans le SDK la fonction GeEventAdd avec le paramètre New_document qui s'active lors de l'ouverture d'un nouveau document.
J'ai écrit dans la fonction main les lignes suivantes :


var reponse;
reponse=GeEventAdd(NEW_DOCUMENT);
println(reponse);

Mais lorsque je charge les modules coffee dans la fenêtre console, j'ai les lignes suivantes qui s'affichent et se répètent infiniment :


COFFEE ERROR!
(7) ... is not a function
1


Le 1 correspond à la ligne "println(reponse);"
Je dois probablement mal utiliser la fonction GeEventAdd.
Quelqu'un a-t-il une idée sur la manière d'utiliser cette fonction pour détecter l'événement. Et enfin cette fonction pourra-t-elle me permettre de détecter l'ouverture du document contenant l'expression ou ne peut-elle détecter que la création d'un nouveau document une fois que le fichier contenant l'expression est ouvert ??

Je vous remercie par avance de votre réponse :)

Guedinouff
13/01/2005, 22h28
Pas mal de temps s'est écoulé depuis que j'ai décidé de me mettre à réaliser une expression de calcul du temps passé sur un projet. Voici enfin la première version. Le fichier utilise le plugin gratuit NoteSheet de Paul Everett pour décrire la fonction des différentes valeurs.

http://ns2118.ovh.net/~deltazon/archives/guedinouff_v01.zip

Pour le moment elle ne fait pas grand chose :
- Elle permet de calculer le temps qui s'écoule entre l'activation et la désactivation d'une case à cochée.
- Elle permet aussi de garder en mémoire le temps qui s'est écoulé pendant les précédentes activation et désactivation de la case à cocher.

Le code n'est pas très propre. Et le stockage des valeurs n'est pas vraiment dans les règles de l'art.
J'essayerais d'améliorer ces deux points dans une future version.

Dans la prochaine version, j'essayerais de me pencher sur le problème de la non désactivation de la case à cocher avant de quitter (lors d'un oubli ou d'un plantage).
Je pensais comparer le temps depuis lequel c4d est ouvert ("time()") et la valeur du time à l'activation de la case à cocher. Si la première valeur est inférieure à la seconde, c'est que l'on a quitter c4d entre temps. Il faudrait donc remettre la case à cochée à 0.
Ou même mieux mais qui demanderait le stockage d'un autre valeur : l'heure de l'activation de la case à cocher. On regarderait alors si ("le time actuel" - "le temps écoulé depuis l'ouverture de c4d à l'activation de la case à cocher") est égal à ("l'heure actuelle" - "l'heure d'activation de la case à cochée").
Il faut aussi que je mette en place un système de sauvegarde automatique à chaque activation de la fonction main.

Les commentaires sont les bienvenue :)

Guedinouff
14/01/2005, 22h17
Je viens de voir en lisant des sujets du forum que la fonction GeEventAdd était destinée non pas à détecter un évènement mais à indiquer à c4d que quelque chose avait changé (enfin si j'ai bien compris). Donc les évènements ce ne sera pas à chercher par là. :coup:

Je croyais avoir vu quelque part un sujet qui expliquait comment stocker de manière invisible des données en COFFEE, mais je ne retrouve plus le lien après une série de recherche dans le forum programmation. Quelqu'un aurait-il la gentillesse de me donner un petit coup de main pour m'aider à trouver le lien vers le sujet. :cry:

Après avoir cherché pendant un moment dans le SDK, je n'ai pas trouvé comment récupérer la date du système. Ce que j'avais pris pour cette fonction récupère en réalité le temps de l'animation. Et à part time(), je n'ai rien trouvé d'autre sur la gestion du temps. J'ai pourtant l'impression d'avoir bien cherché. Cà m'étonne qu'un language n'est pas une fonctionnalité comme celle-ci qui paraît assez basique.:cry2:
Voilà, vous connaissez tout mes problèmes actuellement... :lol:

v.montel
14/01/2005, 23h30
Hello

Je pense qu'il ne faudrait pas qu'il y ait de case à cocher pour activer le calcul du temps, sinon, ça revient à écrire sur son bout de papier l'heure qu'il est au début du travail, et l'heure qu'il est à la fin, d'où inutilité du plug, non?? Du coup, je ne suis pas sûr que ce soit un plug mais plutôt un utilitaire extérieur à C4D qu'il faille faire. :?:

Guedinouff
15/01/2005, 15h58
Je suis entièrement d'accord avec toi.
En fait, je cherche toujours un système pour que çà démarre tout seul sinon effectivement c'est inutile. Quand à faire un utilitaire externe, je vois pas trop comment on pourrait détecter l'ouverture d'un document dans c4d avec une autre appli. L'autre inconvénient de faire un truc en externe c'est que j'essaye d'apprendre la programmation coffee.

Je pensais à deux truc :
- si le time() est inférieur à un nombre, on lance le début du calcul mais çà pose problème si on ouvre un fichier longtemps après l'ouverture de c4d. Et çà pose aussi problème avec les fichiers qui mette trop longtemps à s'ouvrir
- une sorte de mémoire qui n'existe que lorsque le fichier est ouvert (qui ne garde pas les infos après la fermeture). Je ferais alors une petite boucle qui lance le calcul du temps si cette mémoire n'est pas créé. J'ai regardé du côté de la section Memory du SDK mais je n'ai pas trop compris les fonctions.

J'ai quand même fait le truc avec une case à cocher car si j'arrive un jour à déclencher automatiquement l'expression à l'ouverture d'un document, je pensais inclure une case à cocher pour mettre en pause (ce serait compliqué de lire dans les pensées de l'utilisateur sur ce point).

Je cherche par contre toujours le lien vers un message du forum sur le stockage des valeurs de manière invisible...:) :wip:

En tout cas si je ne trouve rien , je me lancerais dans autre chose et j'attendrais d'avoir fait des progrès en coffee avant de continuer.:)

Floby
15/01/2005, 16h15
Je sais pas si ça répond à ta question sur le stockage de valeurs invisibles, mais Tengaal avait posé un message ou il éxpliquait comment stocker des valeurs dans les ID inutilisés d'un tag. ça devait être dans le forum programmation.

v.montel
15/01/2005, 16h53
Salut Guedinouff

Je ne sais pas trop quoi penser de tout ça... Je suis d'accord avec toi sur les difficultés de mise en place du système, et il faut à mon avis faire un cahier des charges le plus précis possible avant de commencer la prog, pour savoir quel est le besoin précis. Parce que à y réfléchir comme ça, sans plus, quels sont les arguments qui donnent de l'intérêt à un tel plug?? Je pense qu'il faut clarifier l'intérêt/usage du plug, surtout si en effet on compare avec le systèmeD : je commence un taf, je note l'heure sur mon post-it, je finis je note aussi l'heure.

Quelle peut-être la valeur ajoutée? Peut-être le calcul automatique : temps passé multiplié par ton tarif horaire HT, TTC, et édition de la facture... :mrgreen:

Guedinouff
16/01/2005, 01h21
Je viens d'avoir une nouvelle idée pour mon expression qui a de nombreux avantages :
- on a pas besoin d'activer une case
- elle détecte automatiquement une pause
- pas de problème en cas de plantage ou de chargement (enfin je crois)

J'utilise le calcul du temps passé entre deux activations de la fonction main. Si le temps est supérieur à la valeur passé en paramètres dans l'Xpression, le temps passé depuis la dernière activation de main n'est pas compté. Sinon, on ajoute le temps passé à un total.
Si le time() précédent est supérieur au time actuel on annule de même qu'en cas de pause.
L'imprécision est en fait assez minime (elle se compte en secondes).

Voilà donc cette nouvelle version (en plus le code s'en trouve simplifié (enfin pour le moment).

http://ns2118.ovh.net/~deltazon/archives/guedinouff_v02.zip

J'attends vos commentaires.

Floby : Merci c'était çà que je cherchait sauf que je mettais de mauvais mots-clés.

V.Montel : J'espère avec le nouveau système que j'ai trouvé pouvoir commencer à faire quelquechose ayant un intérêt. Quand à l'utilité finale du plug, je ne sais pas encore, je pensais m'inspirer d'un sujet posté dans la section plugins qui m'avait donné envie de me pencher sur la question (un sujet posté par Tengaal je crois).

Je pense intégrer dans une prochaine version :
- un système de paramétrage pour le lieu d'affichage du temps (barre d'état ou nom de l'expression)
- un système de décompte depuis une date.

Je pense (enfin j'espère) que ces deux trucs ne devrait pas être trop compliqué à faire.

Par la suite, je pensais déjà commencé à essayer de mettre une interface à mon truc (sous forme de tag probablement).
Voilà pour la suite :)

v.montel
16/01/2005, 01h27
Yep,
Peux-tu m'éclairer sur ce que tu entends par "fonction main". Je crois que c'est ce qui m"empêche de comprendre le reste du message :wink:

Je vois de quel post tu voulais parler, et il était bien à l'innitiative de Tengaal, qui voulait trouver un solution pour facturer le temps de travail.

Guedinouff
16/01/2005, 13h24
La fonction main dont je parle est la fonction que toutes les expressions COFFEE possède. Elle se présente de la sorte :

main(doc,op)
{

}

ou dans les nœuds coffee d'une expression Xpresso (ce qui est le cas ici) de cette façon :

main()
{

}

Le script contenu dans cette fonction s'exécute chaque fois que l'utilisateur change quelque chose.
Donc le principe est que l'on calcule le temps qui s'écoule que si l'utilisateur est suffisamment actif.



Je vois de quel post tu voulais parler, et il était bien à l'innitiative de Tengaal, qui voulait trouver un solution pour facturer le temps de travail.

Je n'ai bien sûr pas la prétention de faire un plug aussi évolué que ce qui avait été proposé dans ce sujet. Mais je pense que je m'inspirerais de plusieurs idées pour les futurs versions.:)

Guedinouff
18/01/2005, 19h36
Voilà une nouvelle version de mon expression.
J'ai ajouté :
- des cases à cocher pour le lieu d'affichage du temps (Nom de l'objet ou barre d'état)
- un système de décompte du temps passé :
on active la case à cocher
on choisit ou non d'être alerté lorsque le temps de décompte est arrivé à 0 ou est négatif
on choisit le temps depuis lequel on doit décompter (en minutes)

Pour le moment, l'affichage d'un temps négatif lorsque la décompte est activé n'est pas au point.

J'essayerais dans la prochaine version de faire un peu d'ordre dans ces sous-enfants qui ne font pas très classe.
Au fait, quelqu'un aurait-il une idée pour désactiver une entrée de Donnée utilisateur en COFFEE (quel soit grisé). Sinon Je crois que je vais devoir me résoudre à me pencher sur les pages qui traite de l'interface utilisateur dans le SDK.

Voici donc le fichier :
http://ns2118.ovh.net/~deltazon/archives/guedinouff_v03.zip

Dernière chose, pour le moment je me base sur le système de la différence de temps entre deux activations de la fonction main. A votre avis, est-ce que j'ai raison ou il y a des problèmes qui risquent de se poser avec cette méthode ?:)

Sir Gong
18/01/2005, 19h57
Non Jeff, t'es pas tout seul...

Tous mes encouragements pour ton entreprise à laquelle je ne comprends rien, mais ça a l'air sympa. :D

quinn
18/01/2005, 20h01
C'est normal que le systéme d'affichage ne tourne pas en temps réel ,je dois faire mise a jour de la scéne pour voie le temps s'écoulé


Tous mes encouragements pour ton entreprise à laquelle je ne comprends rien
Pareil que le monsieur :nono:

Guedinouff
19/01/2005, 16h58
C'est normal que le systéme d'affichage ne tourne pas en temps réel ,je dois faire mise a jour de la scéne pour voie le temps s'écoulé


Voilà ce qu'a dit Tengaal ce matin dans un post de Tabou

Le rafraichissement d'écran REDRAW_ALL, et les fonctions d'actualisation en général (MSG_UPDATE et autres...), ne sont pas super efficace depuis la version C4D 8, car l'architecture du soft est différente des versions précédentes.
J'ai notamment eu ce genre de soucis sur des plugins perso à monter sur C4D 8, les actualisations de matériaux par exemple, ne se font pas de manière aussi évidente et rapide que dans les versions antérieures de C4D. Comme si le code qui les génère passait en second plan... C'est C4D 8 qui décide quand le rafraichissement peut se faire, même si on a un code qui est sensé le forcer...
En fait les codes en Coffee ne s'éxécutent que lors d'une action dans C4D 8+ (le document s'actualise et en même temps on execute les scripts), alors que dans les versions antérieures, un script coffee s'exécute en permanence, donc les fonctions de rafraichissement sont forcément déclenchées de manière plus "forcée", puisque C4D 6-7 est "soumis" à ce script. Dans C4D 8+ c'est le contraire, C4D contrôle les scripts, c'est lui qui décide quand le code peut s'executer.


Cà doit donc venir de çà, le truc du rafraîchissement.
Mais à la réflexion, c'est sur le principe de l'activation à chaque action que le script est basé. Si le script s'active en permanence, il ne doit pas pouvoir être possible de détecter les pauses. Donc mon script ne doit pas fonctionner correctement sur les versions antérieures à c4d 8.


Tous mes encouragements pour ton entreprise à laquelle je ne comprends rien, mais ça a l'air sympa

Vous ne comprenez pas ce que je veux faire ou le script coffee ??
En tout cas merci pour les encouragements...:)

Guedinouff
27/01/2005, 18h52
Voici une nouvelle version de mon expression. J'ai juste mis en place un système de stockage des valeurs dans le container de l'objet neutre.
J'ai aussi modifié l'expression qui permet de contrôler l'état des valeurs de l'expression principale.

Après des tests, j'ai l'impression que l'objet neutre ne possède pas de container. on peut donc stocker des valeurs dedans sans problème apparent.
Cependant, je me demande si sous R9, cela est toujours valable.
Tengaal faisait un certain nombre de mise en garde sur le stockage de valeurs dans le container d'un objet. Ce que j'ai fait présente-t-il des risques de plantage ou autre ??
Dernière chose au sujet des containers. Après quelques tests, j'ai l'impression que les valeurs stockées sont gardés toujours en mémoire. Cela est-il vrai que parce que mes tests étaient très rapprochés dans le temps ou bien les valeurs sont-elles stockées dans le document et il n'y aucun problème de pertes des données.

Enfin, je me pose une question, le fait que mon expression se fasse à chaque action de l'utilisateur, ne peut-elle pas nuire à l'utilisation de c4d ? C'est pas que j'ai l'impression d'avoir fait une expression très complexe...

Voici le fichier :
http://ns2118.ovh.net/~deltazon/archives/guedinouff_v04.zip

Les commentaires sont bien sûr toujours bienvenue... :)

Guedinouff
28/01/2005, 22h08
Voici une mini mise à jour. La seule correction que j'ai apporté est la mise en place d'un système correcte de mise en forme du temps en cas de décompte négatif.
Rien de bien compliqué...:)

Voici le fichier
http://ns2118.ovh.net/~deltazon/archives/guedinouff_v041.zip

tabou
29/01/2005, 12h37
Je viens de tester ton expression avec la R9 et un fichier relativement gros (3 millions de polys) ça tourne sans problème, je n'ai pas senti de ralentissement :poucehaut:
Je n'ai pas trouvé comment remettre le compteur à 0 :roll:

Majoul
29/01/2005, 19h49
Tu arrive au but, reste mettre en place la remise à zéro comme le suggéré Tabou, et finir par mettre tout cela dans une structure de plugin
Sinon si tu veut stocker un container dans un objet sans prendre de risque utilise un objet polygone, c’est le seul objet c4d qui n’a pas de container.

Je viens d’essayer ton expresso en rajoutant à la fin du script :
GeEventAdd(DOCUMENT_CHANGED) ;
L’horloge est actualisé en continu mais il faut l’appliquer que lorsque la seconde est écoulé afin d’éviter la boucle, sans cette condition la fonction sera exécuter des centaines de fois en une seconde et c’a peut devenir une gêné lorsqu’on travaille sur le logiciel.

bonne continuation et bravo. :poucehaut:

Guedinouff
30/01/2005, 00h35
Je viens de tester ton expression avec la R9 et un fichier relativement gros (3 millions de polys) ça tourne sans problème, je n'ai pas senti de ralentissement

Cà c'est une bonne nouvelle. C'est le genre de test que je peux pas faire : mon ordi n'apprécie pas trop, il a tellement de mal avec les 3 millions d polys (3 plans de 1 000 000 de polys chacun) que je ne me rends pas compte du changement de vitesse :mrgreen:
J'essayerais quand même d'essayer de simplifier un peu le code. Une petite question au passage, le fait de fusionner des petites lignes en une ligne plus grande accélère-t-il le script en coffee ?
Est-ce que le fait de le compiler (j'ai lu quelques part sur le forum que çà accélère le script), ne fait-il pas ce genre de modifs automatiquement ?

Pour la remise à zéro du compteur, je viens de rajouter une petite case à cocher qui remet à zéro le temps passé et le time() de la précédente activation de main(), ainsi que le fait que le message d'avertissement est déjà été affiché : en fait les trois valeurs du containers sont remises à zéro.

Voici le fichier : http://ns2118.ovh.net/~deltazon/archives/guedinouff_v05.zip

Pour la mise en place d'une structure de plugin, je suis entrain d'y réfléchir. Je pensais mettre çà sous la forme d'un propriété. Comme çà, on pourrait avoir plusieurs compteurs en même temps (je rajouterais alors une mise en pause pour chaque propriété).
Pour créer l'interface utilisateur, je vais bientôt commencer à traduire les fichiers traitant de ce sujet dans le SDK (je suis entrain de finir une version traduite qui sera disponible j'espère d'ici quelques jours).
L'ajout de l'interface va donc prendre un peu de temps :wip:

Majoul, au sujet de la ligne de commande que tu proposes de rajouter, elle pose un problème : la fonction GeEventAdd(DOCUMENT_CHANGED), réactive la fonction main() à chaque fois que la fonction main() vient d'être activée; On ne peut donc pas détecter l'inactivité de l'utilisateur (enfin si j'ai bien tout compris).

Ce qui résout le problème, c'est d'être tellement actif, qu'on active la fonction main() à chaque seconde. Cà donne un compteur qui se met à jour tout le temps. De plus, si l'utilisateur s'arrête, la pause est détectée :mrgreen: :mrgreen:



Sinon si tu veut stocker un container dans un objet sans prendre de risque utilise un objet polygone, c’est le seul objet c4d qui n’a pas de container.

L'objet neutre possède donc un container ?

En fait, si je transforme l'expression en propriété, il doit peut-être y avoir une solution pour stocker les valeurs à l'intérieur même de la propriété. :)