PDA

Voir la version complète : Update automatique de xrefs ?



Loriel
31/05/2010, 18h12
Salut à tous!

Je trouve les Xrefs très pratique mais il y manque à mon goût une upgrade automatique chargeant la dernière version du fichier de référence(test_01, test_02...) à l'ouverture, une fonction très importante qui du coup les rends beaucoup moins intéressantes.
Car si l'on à dans différentes scène, un objet xref faisant référence au même fichier, dés que l'on fait une modification et donc une nouvelle version du fichier Xref, il faut manuellement indiqué à tous les objets xrefs leurs nouveaux chemins d'accès.
Ce qui peut être fort fastidieux.

Bon en me relisant, je ne suis pas sùr d'être très clair :mrgreen:


En bref, serrait-il possible de faire un script coffee au xpresso ou...?
Qui nous permettent d'avoir un upgrade automatique chargeant la dernière version d'une xref à l'ouverture du fichier?

Ce serais trop pratique.

Tengaal
31/05/2010, 18h47
j'utilise souvent les Xref sur de très gros projets et en ce qui me concerne quand j'ouvre mon fichier projet; tous les Xref dedans sont chargés correctement avec les derniers fichiers Xrefs modifiés.

D'ailleurs quand on ouvre un fichier Xref en plus du fichier global, la modification de ce Xref, sans même le sauvegarder, est répercutée dans le fichier projet instantanément, quand on rebascule sur celui-ci.

Par contre, ce que je vérifie systématiquement quand j'ai un dossier projet avec dedans le fichier global + fichiers Xref, c'est dans le fichier global, de définir les Xref avec uniquement le nom du fichier, pas le chemin complet. Comme ça les Xref sont accédés en relatif, c'est à dire dans le dossier projet, le projet peut donc être transféré sur n'importe quelle autre machine sans que les liens Xrefs ne soient à redéfinir systématiquement.

Donc pour ta question d'upgrade automatique des Xrefs, je ne vois pas trop quelle réponse te donner, car je ne comprends pas trop ta problématique en fait... :roll:

Si tu fais différentes versions de Xref avec des noms différents (c'est peut-être ça ton problème ?), en effet il faut redéfinir le nom vers ton nouveau fichier Xref, c'est logique, C4D ne charge que les fichiers Xref avec les noms de fichiers qu'on lui a donné.
C4D n'a pas de système lui disant de lire le fichier dont le nom incrémenté ("xref_objet_02.c4d", "xref_objet_03.c4d", etc...) porte le numéro le plus élevé (le fichier le plus récent).

Dans ce cas de figure, si je veux garder une version antérieure avant modification dans un fichier Xref, tout simplement je créé un objet neutre "old", masqué dans la vue et au rendu, dans lequel je glisse une copie de l'objet à modifier, et je sauve toujours avec le même nom de Xref. on peut donc dans un Xref avoir plusieurs copie "old 01", "old 02" ect... pendant la phase de conception.

une fois que le projet abouti et qu'on est prêt à passer à la phase de rendu, alors on peut nettoyer les Xref en supprimant ces "old" inutiles.

ça répond peut-être mieux à ta question ?

Loriel
01/06/2010, 01h22
Tout d'abord merci pour ta réponse. :poucehaut:

Personnellement je travail toujours avec le save incremental qui me permet de garder un d'historique de mon projet.
De plus en ce moment je bosse en équipe et qu'il m'est précieux de connaitre le numéro de version des fichiers.
Surtout pour des fichiers partagés et modifiés par plusieurs personnes.


Donc pour ta question d'upgrade automatique des Xrefs, je ne vois pas trop quelle réponse te donner, car je ne comprends pas trop ta problématique en fait... :roll:

En fait mon problème c'est de devoir systématiquement modifié le nom du fichier et par la même occasion perdre trace de son origine.
Quand le nombre des xrefs à gérer devient important le fait de devoir renommer peut-faire perdre un temps précieux.
Le fait de pouvoir simplement glisser une nouvelle version du fichier xrefs pour qu'il soit pris en compte serait à mon sens très pratique.




Dans ce cas de figure, si je veux garder une version antérieure avant modification dans un fichier Xref, tout simplement je créé un objet neutre "old", masqué dans la vue et au rendu, dans lequel je glisse une copie de l'objet à modifier, et je sauve toujours avec le même nom de Xref. on peut donc dans un Xref avoir plusieurs copie "old 01", "old 02" ect... pendant la phase de conception.

Bonne technique mais travaillant constamment avec une renderfarm via internet je dois limiter au maximum la taille et les manipulations de mes fichiers.



de définir les Xref avec uniquement le nom du fichier, pas le chemin complet. Comme ça les Xref sont accédés en relatif, c'est à dire dans le dossier projet, le projet peut donc être transféré sur n'importe quelle autre machine sans que les liens Xrefs ne soient à redéfinir systématiquement.


Nom de fichier uniquement ça je confirme.


Un exemple si j'ai 15 fichiers avec une voiture dans chaqu'un.
J'ai un fichier xref_tex_01 contenant toutes les textures de mes différents modèles.
Je modifie mes textures, un save incremental puis je dois aller dans mes quinze fichiers pour changé le nom dans l'objet xref pour xref_tex_02.

Peut-être qu'il y a un moyen de faire un petit script magique...

shtl
01/06/2010, 09h52
Oui ça serai pratique. Ou bien une boîte de dialogue "une version plus récente de tel xref est disponible, voulez vous la remplacer?"

En attendant, tu peux tricher en: faisant tes incrémentales sur les versions de travail, donc dossier séparé ("at work" par exemple), et garder la même nomenclature pour les xrefs partagées. Ça demande donc de vérifier la version de la xref sur la date de modification du fichier dans le finder. Éventuellement faire tourner les couleurs de fichiers dans le finder pour t'y retrouver un peu.. Restent enfin les commentaires dans les informations du fichier dans le finder. Surtout si tout tes collègues sont sur le même OS. :wink:

Mais claro, avec la même nomenclature, faut pas se gourer!

En fait à mon avis, c'est un logiciel de gestion de travail d'équipe (pipeline workflow ?) qui manque à c4d. (et donc du domaine de la wish-list au final ^^)
J'avais lu des articles à ce sujet, je crois qu'il s'agissait en l'occurrence de 3dsmax, et il me semble vaguement que c'est alienware ou boxx qui rendait leur appli compatible avec le soft 3d via la gestion du serveur.
En gros, quand une modification est faite dans la hiérarchie du projet, le soft indique "qui", "quand" et "quoi" à été modifié. Rigg, influences, bitmaps, animation, materiaux etc... par qui, (non du post, nom de l'utilisateur) sur quoi (mesh batiment gauche 024; personnage clara version24) dans quel fichier, et ainsi de suite. Et en quelques cases, la possibilité de fusionner les dernières update du projet disponibles sur le serveur. Bref, le rêve pour du taf d'équipe :bave: .... :cry2:
Faudrait que je retrouve ça :wip:

Loriel
01/06/2010, 11h04
Ça demande donc de vérifier la version de la xref sur la date de modification du fichier dans le finder. Éventuellement faire tourner les couleurs de fichiers dans le finder pour t'y retrouver un peu.. Restent enfin les commentaires dans les informations du fichier dans le finder. Surtout si tout tes collègues sont sur le même OS. :wink:


J'avoue que j'avais pas pensé aux commentaires sur le finder!
Trés bonne solution temporaire pour moi.
:poucehaut:



En fait à mon avis, c'est un logiciel de gestion de travail d'équipe (pipeline workflow ?) qui manque à c4d. (et donc du domaine de la wish-list au final ^^)
J'avais lu des articles à ce sujet, je crois qu'il s'agissait en l'occurrence de 3dsmax, et il me semble vaguement que c'est alienware ou boxx qui rendait leur appli compatible avec le soft 3d via la gestion du serveur.
En gros, quand une modification est faite dans la hiérarchie du projet, le soft indique "qui", "quand" et "quoi" à été modifié. Rigg, influences, bitmaps, animation, materiaux etc... par qui, (non du post, nom de l'utilisateur) sur quoi (mesh batiment gauche 024; personnage clara version24) dans quel fichier, et ainsi de suite. Et en quelques cases, la possibilité de fusionner les dernières update du projet disponibles sur le serveur. Bref, le rêve pour du taf d'équipe :bave: .... :cry2:
Faudrait que je retrouve ça :wip:

:cry2: :cry2: :cry2: :cry2: :bave: :bave: :bave: :bave: :coup: :coup: :coup: :coup:



Oui ça serai pratique. Ou bien une boîte de dialogue "une version plus récente de tel xref est disponible, voulez vous la remplacer?"

En fait si y quelqu'un à une idée de comment je pourrais faire un tag qui actif remplace automatiquement par la version la plus récente. Est-ce possible à réalisé ou trop compliqué ?

oli_d
01/06/2010, 11h09
Je ne sais pas si j'ai tout compris, mais pour ce que j'ai compris cela ne m'a pas l'air trop compliqué. Je suis juste complètement à la bourre en ce moment, j'essaie dès que j'ai un moment.... (à moins que quelqu'un d'autre se lance entre temps...)

Loriel
01/06/2010, 12h59
Hey-ha!!!
:prie: :prie: :nono:

Tengaal
01/06/2010, 13h03
oui, un système de rafraichissement des Xref vers des fichiers incrémentés ne doit pas être trop compliqué à faire.

il faut d'abord lire le nom du fichier défini dans le Xref, on isole son nom d'une part et son numéro d'autre part.
ex: "fichier_02.c4d" le nom de base est "fichier_" et le numéro est "02".

on incrémente le numéro ( "02" devient "03") et on reconstruit le nom du fichier qui serait le nouveau : "fichier_03.c4d"
on vérifie si ce fichier existe ou non, si oui, alors on le redéfinit dans le Xref, sinon on garde l'existant.

Loriel
01/06/2010, 13h08
Comme ça sa parait super simple :mrgreen:
Mais en pratique :calim:

Tengaal
01/06/2010, 13h41
ben au niveau de l'analyse du nom de fichier c'est simple :

nom_fichier : nom du fichier c4d utilisé dans le Xref, d'ou on extrait :

var nom_base=strmid(nom_fichier,0,sizeof(nom_fichier)-6); // on garde le nom sans les 2 chiffres de fin ni l'extension".c4d"
var numero=strmid(nom_fichier,sizeof(nom_fichier)-6,2); // on garde les 2 chiffres d'indice de fichier

donc ici, si nom_fichier="cube_05.c4d" par exemple, on obtient
nom_base="cube_"
numero="05"

je suis en train de voir de mon côté ce qu'il est possible de faire...

Loriel
01/06/2010, 15h04
Terrible !
Bon je suis une vrai quille en programmation c'est du coffee?

Tengaal
01/06/2010, 15h21
oui, ici c'est du Coffee, pour éventuelement faire un script personnalisé, c'est un langage assez bien adapté.
j'imagine que ça doit aussi être scriptable en python...

Tengaal
01/06/2010, 17h37
Voici un script en pièce jointe de ce message, à placer dans ".../library/scripts/".

On sélectionne un Xref qui pointe vers un fichier du genre "objet_02.c4d",
ensuite on execute le script: "module externes->scripts personnalisés->Xref_update" (ou mieux : un raccourci dans une palette)
et si un fichier "objet_03.c4d" existe dans le même dossier, alors le XRef est redéfini et actualisé avec ce nouveau fichier.

Pour l'instant le script ne s'applique qu'à un Xref à la fois.

Il est sans doute possible d'appliquer cet update à plusieurs Xrefs en même temps, en les plaçant dans un groupe par exemple.
il faudrait adapter le code pour qu'il scanne les Xref un par un et qu'il leur applique ce système d'update.
Si j'ai le temps je fais une autre version.

:wink:

Loriel
01/06/2010, 17h39
Je test tout de suite

Loriel
01/06/2010, 18h14
Je suis tes instructions mais ne parvient pas à le faire fonctionné.


Je me suis créé un raccourcis.
J'ai aussi essayé de faire un tag coffee sur la xref, sans succès.
J'ai testé avec chemin d'accés et sans chemin d'accés, si j'ai bien compris le -6 que tu utilise dans le code représente les 6 caractères à enlevé, j'ai donc respecté la nomenclature que tu as utilisé: objet_02,....
Peut-être ai-je raté quelque chose? :coup:

Tengaal
01/06/2010, 18h37
De mon côté ça marche parfaitement bien.
Tu es sur mac ?

oui le "-6" c'est pour se placer sur le nom de fichier, à -6 caractères en partant de la fin "XX.c4d" ça fait 6 caracteres.

en effet pour la nomenclature je me suis basé sur une incrémentation à 2 chiffres, ça peut donc être:
"objet_01.c4d" ou alors "objet_version_01.c4d" ou bien "objet 01.c4d" ou "objet version 01.c4d".

bref, l'important dans le nom c'est simplement d'utiliser 2 chiffres avant l'extension ".c4d".

voilà une autre version du script qui prend en compte soit le chemin complet du fichier (accès absolu si le fichier Xref est dans un autre dossier que le projet), ou bien l'accès au fichier Xref juste par son nom, donc dans le dossier où se trouve le C4D global du projet.

là encore, il faut juste copier le script "Xref_update.CSC" dans le dossier de C4D ".../library/scripts/" puis redémarrer C4D.

Loriel
01/06/2010, 18h51
Oui je suis sur mac.
Je test celui-ci :prie:

Loriel
01/06/2010, 19h03
Ok pour moi ca marche avec chemin d'accès, mais pas sans.
Par-contre si j'ai trois version(01,02,03) et que je suis sur la version 01, le script me fait passer à 02 et non à la version 03, je dois reexecuter le script pour arrivé à la version 03.
En tout cas tu te rapproches sérieusement. :prie: :prie:
:bave:

Tengaal
01/06/2010, 19h30
ah oui, c'est vrai que ça serait plus logique d'updater directement sur le plus récent plutôt que de passer uniquement au fichier supérieur.
Il y a juste à faire une boucle d'incrémentation des noms de fichiers, tester à chaque fois si le fichier existe on incrémente à nouveau, on s'arrête dès que le fichier "objet_XX.c4d" n'existe pas. Et dans ce cas on défini le fichier d'indice le plus élevé et existant, comme nouveau Xref.

par contre ça ne marche pas quand tu définis le Xref avec uniquement le nom seul ?
bizarre ici ça marche parfaitement dans tous les cas...
c'est souvent le problème entre PC et Mac les accès fichiers...

Loriel
01/06/2010, 20h24
Je confirme, sur mon mac, le nom seul sans chemin d'accès ne fonctionne pas.
Même après plusieurs redémarrages du soft.
:bave:

Tengaal
02/06/2010, 00h01
Voici une autre version du script pour fiabiliser la gestion du fichier Xref défini soit en chemin complet (absolu) ou sans chemin (en relatif).

De mon côté sur PC ça fonctionne très bien, j'ai reprogrammé complètement la gestion des chemins pour que ça fonctionne sur Mac.
J'espère que c'est le cas... A tester...

je n'ai pas encore revu l'update vers le fichier existant le plus haut en index, ni la gestion d'update de plusieurs Xrefs d'un coup dans un même groupe.

Loriel
02/06/2010, 00h17
Ca marche nikel avec ou sans chemin d'accès.
:bounce:

Tengaal
02/06/2010, 01h18
ah très bien !

Dans ce cas, voici une version de nouveau plus évoluée ! :wink:

Cette fois-ci, si on a plusieurs versions d'un fichier Xref ("objet_01.c4d", "objet_02.c4d", "objet_03.c4d".... "objet_08.c4d")
alors le script va directement identifier la version la plus récente "objet_08.c4d" et redéfinir le Xref avec ce fichier.

utilisation :
- on a un Xref qui pointe (en absolu ou en relatif) vers "objet_01.c4d"
- on sélectionne ce Xref puis on exécute le script.
- le Xref se reconfigure vers le fichier "objet_08.c4d" (en absolu ou en relatif suivant ce qui était défini avant)

chez moi ça fonctionne bien, à tester sur mac. :wink:

EDIT: ah oui juste une chose, le test des versions récente de fichier se fait en incréentant de 1 à chaque fois, donc si dans les différentes version de fichier, on passe par exemple de "objet_04.c4d" à "objet_06.c4d", alors le script ne trouve pas le 05, donc pour lui le fichier le plus récent sera le 04.

Loriel
02/06/2010, 07h55
Genial ça marche avec et sans chemin d'accès !!!
J'ai essayé de mettre ton script dans un neoud coffee d'un tag Xpresso.
Pour lier ton script directement à l'objet xref contenant le tag.
Et éventuellement avoir un script par xref.

Mais je ne comprends pas le fonctionnement d'un neoud coffe dans xpressso.

Car ce que je cherche c'est un moyen d'avoir une sorte d'auto update à l'ouverture du fichier.
Je pense au cas d'une render farm avec un projet master où chaqu'un incrémente c'est nouvelles xrefs sans qu'il y ai besoin de réouvrir le fichier maitre.



EDIT: ah oui juste une chose, le test des versions récente de fichier se fait en incréentant de 1 à chaque fois, donc si dans les différentes version de fichier, on passe par exemple de "objet_04.c4d" à "objet_06.c4d", alors le script ne trouve pas le 05, donc pour lui le fichier le plus récent sera le 04.


Bon ça pause le problème d'avoir toutes les versions de xrefs ou des versions fantômes pour faire le pont.
Mais c'est déjà super!
:prie:

Tengaal
02/06/2010, 11h21
a mon avis c'est une erreur que de vouloir mettre ce systeme sous forme d'un tag Xpresso ou Coffee sur chaque Xref, car ces scripts tourneront en permanence, ça va bien plomber ta manipulation de projet, et également le rendu car à chaque image, les scripts des tag s'executeront.
C'est pour ça que le script personnalisé est plus intéressant car il créé l'action uniquement quand on appelle le script.

et pour un rendu en Render farm en général on fournit des sources de projet bien nettoyées et optimisées, et non toutes les sous versions anciennes qui ne servent pas, donc là il faut actualiser le projet global avec les Xrefs définitifs, puis faire un dossier projet avec le c4d du projet global et les Xrefs utilisés seulement (+ textures bien sûr).

Sinon, il faut que le fichier Xref modifié le plus récent soit toujours du même nom (ex: "xref_objet.c4d" défini dans le Xref du fichier projet), et on stocke les anciennes versions avec des noms différents (ex:"xref_objet_old01.c4d") , ainsi à chaque ouverture de fichier, c'est ce fichier là "xref_objet.c4d" qui sera pris, donc le plus récent. Mais dans ce cas là mon script ne sert plus à rien, ici c'est juste une question de nommage des fichiers Xref, avec un fichier de nom fixe utilisé systématiquement par le projet, et les anciens portant des noms différents...

bref c'est une méthode de travail à caler rien de plus...

Chez 3DWeave, lorsqu'on travaille à plusieurs sur un même projet d'envergure, avec chacun un fichier Xref à traiter, on bosse le fichier dans notre coin, avec des versions incrémentés, et quand on est arrivé à une nouvelle version (version 08 par exemple), on copie ce fichier dans le dossier projet partagé, et on renomme ce fichier avec le nom précis fixe du fichier Xref (sans numero).
Donc dans ce dossier projet partagé on a toujours le projet global + les Xrefs dernieres versions (en liens relatifs) ayant tous un nom fixe.
En ouvrant le fichier projet global on a donc toujours le projet le plus évolué, le plus récent.
Le dossier projet est donc toujours mis à jours et autonome(liens relatifs des Xrefs), il peut être ensuite envoyé n'importe ou pour le rendu RenderFarm ou pour bosser sur une autre machine.
Les versions anciennes incrémentés sont gardées de côté tout simplement, dans le dossier de celui qui bosse sur cette partie.

Loriel
02/06/2010, 11h51
Chez 3DWeave, lorsqu'on travaille à plusieurs sur un même projet d'envergure, avec chacun un fichier Xref à traiter, on bosse le fichier dans notre coin, avec des versions incrémentés, et quand on est arrivé à une nouvelle version (version 08 par exemple), on copie ce fichier dans le dossier projet partagé, et on renomme ce fichier avec le nom précis fixe du fichier Xref (sans numero).
Donc dans ce dossier projet partagé on a toujours le projet global + les Xrefs dernieres versions ayant tous un nom fixe.
En ouvrant le fichier projet global on a donc toujours le projet le plus évolué, le plus récent.
Les versions anciennes incrémentés sont gardées de côté tout simplement, dans le dossier de celui qui bosse sur cette partie.

Le problème du nom des versions ce pose lorsque l'on est susceptible de bosser à plusieurs sur les mêmes xrefs, en plus sur la render farm si l'on à plusieurs projets avec des xrefs en commun le nom fixe ne nous permet pas de savoir si c'est le bon fichier qui à été remplacé...


a mon avis c'est une erreur que de vouloir mettre ce systeme sous forme d'un tag Xpresso ou Coffee sur chaque Xref, car ces scripts tourneront en permanence, ça va bien plomber ta manipulation de projet, et également le rendu car à chaque image, les scripts des tag s'executeront.

Je ne pensais pas qu'un tag Coffe avec ton script éxecuter à chaque image soit très lourd au niveau du temps de rendu.
Peut-être est il possible de l'executer une seul fois à l'ouverture du fichier?

Personnellement quand je bosse avec les xrefs j'ai un répertoire avec tous mes objets xrefs, de manière à ne pas avoir de xref en double et d'édité la mauvaise pensant que c'est la bonne.
Le fait de devoir avoir un nom fixe oblige à ouvrir la xref du finder ou autre car toute modif effectué directement depuis le fichier maitre, serait effectué sur la xref présente à la racine du projet et non dans le répertoire d'objet xref.

Je sais pas si c'est compréhensible en me relisant j'ai des doutes.
:mrgreen:

Tengaal
02/06/2010, 13h26
Je ne pensais pas qu'un tag Coffee avec ton script éxecuter à chaque image soit très lourd au niveau du temps de rendu.
Peut-être est il possible de l'executer une seul fois à l'ouverture du fichier?
ben eventuellement tu peux toujours animer la case "activer" du tag coffe ou Xpresso sur l'image 0 par exemple, et décocher/enregistrer la case à l'image 1.
Comme ça tu sais qu'en te plaçant sur ta timeline à l'image 0, ton script s'executera donc updatera tes Xrefs.
et pour actualiser ton projet au démarrage, il suffit donc de le sauvegarder en ayant ta timeline calée sur l'image 0, ainsi au chargement les scripts s'executeront.
Mais en utilisation, si tu reste sur l'image 0 et que tu fais des actions sur les objets, tes scripts s'executeront en permanence, donc si tu as pas mal de Xref et que tes scripts scannent tout le temps les fichiers pour atteindre la dernier version, ça risque en effet de plomber pas mal ton travail, les scripts accèdent au disque dur pour scanner les fichiers existants, donc ça ralenti pas mal les choses...

Au rendu d'animation ça sera pareil, tes scripts s'executeront avant le rendu de chaque image, si tu multiplie ça par quelques milliers d'images à rendre, tu arrives rapidement à 1/2 journée de plus de calculs uniquement à cause du fonctionnement des scripts (sauf si tu utilise l'astuce de leur activation sur l'image 0 uniquement...)

Loriel
02/06/2010, 17h10
Bonne idée !
En faisant un copier collé avec le script dans un tag coffee j'ai une erreur de syntaxe après l'execution du script, saurais tu d'ou celà peut venir?

Merci à toi Tengaal
Je vais essayer de mon coté sur ta base quand j'aurais un peu de temps pour me mettre au coffee.
:wip:

xs_yann
02/06/2010, 20h10
Salut,

J'ai suvi un peu le topic et j'ai décidé d'écrire aussi un petit script.
Il fonctionne à l'inverse de celui de Tengaal : il parse le dossier source et regarde si des fichiers correspondent à une update.

Update toute les Xrefs de la scene.
Chemin absolu et relatif.
Pour les fichiers de la forme "nomdefichier[id].extension".

Voici le plug : http://www.xsyann.com/plugins/xsXrefUpdate.cof

Commenté en français (pas beau) :


/*
** xsXrefUpdate.cof
**
** Made by yann koeth (xs_yann)
** Wed Jun 02 16:58:29 2010
*/

const var PLUGIN_ID = 1025347; //id unique -> plugincafe

class xsXrefUpdate : MenuPlugin // classe pour le plugin
{
private:
GetPath(filename, doc); // les fonctions utilisees
RemoveSuffix(name); // sont declares privees
GetFileId(name);
GetFileBase(name);
UpdateXref(xref, doc);
GNHO(op);
public:
xsXrefUpdate();
GetID();
GetName();
GetHelp();
Execute(doc);
};

xsXrefUpdate::xsXrefUpdate()
{
super(); // appel du constructeur de la classe MenuPlugin
}

xsXrefUpdate::GetID()
{
return PLUGIN_ID;
}

xsXrefUpdate::GetName()
{
return "xsXrefUpdate";
}

xsXrefUpdate::GetHelp()
{
return "Update Xrefs references";
}

/*
ex : "C:\Desktop\monfichier.c4d" retourne "C:\Desktop"
ex : "monfichier.c4d" retourne le path du document ouvert.
*/
xsXrefUpdate::GetPath(filename, doc)
{
var path = filename->GetClone();
path->RemoveLast();
var file = filename->GetLastString();
var docfn = doc->GetFilename();
docfn->RemoveLast();
if (!strcmp(file, filename->GetFullString()))
path = docfn;
return path;
}

xsXrefUpdate::RemoveSuffix(name)
{
var fn = new(Filename);
fn->SetFullString(name);
fn->DelSuffix();
return fn->GetFullString();
}

/*
Nomenclature de la forme : fichier[xx].c4d
ou [xxx] est un nombre -> file_01.c4d, toto3.c4d, foo-42.c4d, bar_1337.ext
*/
xsXrefUpdate::GetFileId(name)
{
name = RemoveSuffix(name); // on enleve le suffix
var i = sizeof(name) - 1;
while (i >= 0 && isdigit(name[i])) // tant que le fichier termine par un chiffre
i--;
return evaluate(strmid(name, i + 1, sizeof(name))); // on recupere le nbre de fin et on l'eval
}


/*
Complement de GetFileId
Pour toto_01.c4d retourne toto
*/
xsXrefUpdate::GetFileBase(name)
{
name = RemoveSuffix(name);
var i = sizeof(name) - 1;
while (i >= 0 && isdigit(name[i]))
i--;
return strmid(name, 0, i);
}

xsXrefUpdate::UpdateXref(xref, doc)
{
var filename = xref#SCENEINSTANCE_FILENAME;
var path = GetPath(filename, doc); // le path du fichier
var file = filename->GetLastString(); // le nom de fichier
var id = GetFileId(file); // l'id courant
var base = GetFileBase(file); // la base
var bf = new(BrowseFiles);
if (!bf->Init(path, FALSE))
return NOTOK;
var updated = FALSE;
while (bf->GetNext()) // on parcours le dossier
{
if (!bf->IsDir())
{
var cfile = bf->GetName();
var cbase = GetFileBase(cfile);
if (!strcmp(base, cbase)) // si la base est la meme
{
var cid = GetFileId(cfile);
if (cid > id) // et l'id superieur
{
id = cid; // on update
file = cfile;
updated = TRUE;
}
}
}
}
var newfn = path->GetClone();
newfn->AddLast(file);
xref#SCENEINSTANCE_FILENAME = newfn;
return updated;
}

xsXrefUpdate::GNHO(op) // Get Next Hierarchy Object
{
if (op == NULL)
return NULL;
var next;
if ((next = op->GetDown()))
return next;
if ((next = op->GetNext()))
return next;

var prev = op;
while ((prev = prev->GetUp()))
if ((next = prev->GetNext()))
return next;
return NULL;
}

const var Osceneinstance = 200000118; // Xref

xsXrefUpdate::Execute(doc)
{
if (!doc)
return FALSE;
var upcnt = 0, totcnt = 0;
var op;
for (op = doc->GetFirstObject(); op; op = GNHO(op)) // Pour tout les objs de la scene
{
if (op->GetType() == Osceneinstance) // Si c'est une Xref
{
totcnt++;
doc->AddUndo(UNDO_OBJECT, op);
var upres = UpdateXref(op, doc); // on update
if (upres == NOTOK)
return FALSE;
upcnt += upres;
}
}
TextDialog(tostring(upcnt) + " Xrefs on " + tostring(totcnt) + " updated.", DLG_OK);
EventAdd(MSG_UPDATE);
return TRUE;
}

main()
{
Register(xsXrefUpdate);
}



Bon courage. :wink:

user4D
02/06/2010, 21h46
Et Dieu créa xs_yann :mrgreen:

Loriel
02/06/2010, 21h55
:shock:

D'abord XSYann une fois de plus merci ! :love: :love: :love:

Y a t'il possibilité d'exécuter ton script à l'ouverture du fichier ?
J'ai essayer de mettre le script dans un tag coffee sans succès.

Magnifique!

:nono:

xs_yann
02/06/2010, 22h37
:wink:

Oui il y a moyen de l'executer a l'ouverture. (je crois)
Je te fais ca plus le tag demain. :art:

Loriel
02/06/2010, 23h56
:love:

Loriel
03/06/2010, 02h05
J'ai remarqué que, l'orsque le chemin d'accès n'est pas présent, une fois éxecution du plug le chemin d'accès est ajouter.
Trop bien ça marche avec des nom de fichier bizarre du style:4015_kgigj_rth_005.c4d
et passe de 005 à 012 même si les fichiers entre les deux sont manquant.

Trop pratique!
Un gain de temps énorme pour le travail sur fichier contenant plusieurs xrefs. :!:

Loriel
03/06/2010, 10h32
En temps normal a recherche des xrefs ce fait comme pour les texture CAD c4d va chercher dans le dossier racine de le scene ouverte, dans le dossier tex de ce même dossier et aux différents chemins d'accès choisi dans les préférence de c4d.
Je me demandais si il te serait compliqué de recherché les update d'xrefs aussi dans les chemins d'accés choisi dans les prefs de c4d?
:arrow:

Tengaal
03/06/2010, 11h14
il va falloir sortir le chéquier là ! :lol:

bon ben si tu a trouvé une solution pour ta gestion des Xrefs c'est cool ! :wink:
bravo xs_yann :poucehaut:

xs_yann
03/06/2010, 13h10
Merci Tengaal. :wink:

http://www.xsyann.com/plugins/xsXrefUpdate.cof


l'orsque le chemin d'accès n'est pas présent, une fois éxecution du plug le chemin d'accès est ajouter
Corrigé.

Il cherche dans les dossiers défini dans les prefs de rendu et le dossier tex.

Modifications :


// Get Path devient GetPaths et retourne un tableau
xsXrefUpdate::GetPaths(filename, doc)
{
var paths = new(array, MAX_GLOBAL_TEXTURE_PATHS + 4);
var path = filename->GetClone();
path->RemoveLast();
var file = filename->GetLastString();
var docfn = doc->GetFilename();
docfn->RemoveLast();
if (!strcmp(file, filename->GetFullString()))
path->SetFullString("");
var i = 0;
paths[i++] = path; // le path de la xref courante
paths[i++] = docfn; // le path du doc ouvert

var tex = docfn->GetClone();
tex->AddLast("tex");
paths[i++] = tex; // le dossier tex a la racine du doc
var j;
for (j = 0; j < MAX_GLOBAL_TEXTURE_PATHS; j++)
paths[i + j] = GetGlobalTexturePath(j); // les dossier predefinis
paths[i + j] = NULL;
return paths;
}




xsXrefUpdate::UpdateXref(xref, doc)
{
var updated = FALSE;
var filename = xref#SCENEINSTANCE_FILENAME;
if (filename->IsEmpty()) // on update pas s'il la reference Xref est vide
return updated;
var paths = GetPaths(filename, doc); // on recupere les paths
var i;
for (i = 0; paths[i]; i++) // on boucle sur tout les paths
{
if (paths[i]->IsEmpty() || !GeFileExist(paths[i], TRUE)) // Si le path est vide ou un dossier qui n'existe pas on incremente
continue;
var file = filename->GetLastString();
var id;
id = GeFileExist(filename, FALSE) ? GetFileId(file) : 0; // permet de recuperer un fichier d'update avec un id inferieur si le courant n'existe pas
var base = GetFileBase(file);
var bf = new(BrowseFiles);
if (!bf->Init(paths[i], FALSE))
return NOTOK;
while (bf->GetNext())
{
if (!bf->IsDir())
{
var cfile = bf->GetName();
var cbase = GetFileBase(cfile);
if (!strcmp(base, cbase))
{
var cid = GetFileId(cfile);
if (cid > id)
{
id = cid;
file = cfile;
updated = TRUE;
var newfn = paths[i]->GetClone();
newfn->AddLast(file);
filename = newfn;
}
}
}
}
}
xref#SCENEINSTANCE_FILENAME = filename;
return updated;
}

xs_yann
03/06/2010, 13h30
Si tu veux un Tag en mode PluginTag c'est très simple a mettre en place. En revanche une expression c'est impossible car dans une expression les fonctions d'acces au fichiers ne fonctionnent pas pour des raisons de sécurité. (?)


If this is in an expression, it won't work as COFFEE Expressions cannot do any form of file system access (for security reasons).

Tu peux cependant le faire en Xpresso avec un noeud COFFEE (où là les fonctions fonctionnent...).

Quelqu'un sait comment récuperer l'objet porteur du tag Xpresso (comme 'op' en coffee) ?

edit : J'ai trouvé voilà l'Xpresso : http://www.xsyann.com/plugins/xsXrefUpdate.c4d

oli_d
03/06/2010, 14h56
Pfiouuuuuu quand les compétences de Maîtres Tengaal et XsYann se combinent ça déménage ....

Bravo à tous les deux ! :prie:

Loriel
03/06/2010, 15h09
:love: :prie: :efface:
Je suis trop content !!
Ton plug est une tuerie !!!
:prie: :prie: :prie:
J'ai fait un petit geste :roll: sur le bouton donate.

Loriel
03/06/2010, 18h46
Je viens de faire un test avec netrender mais apparement le script ne fonctionne pas avec netrender, mais uniquement à l'ouverture du fichier?

J'ai essayé de mettre la priorité de tag xpresso sur initial mais pas de différence.

J'ai découvert que ton plug en plus d'être un super gain de temps scanne aussi pour des versions plus anciennes ( si mon objet xref fait appel a un fichier nommé objet_03, mais qu'il n'est pas présent alors ton script le fera pointer sur objet_01 (le dernier fichier présent).
Trés pratique pour des xref de tex pour ne pas perdre le lien de toutes les textures.

Loriel
04/06/2010, 00h21
En fait le problème avec netrender c'est le chemin absolu.
En chemin relatif, ça passerais nikel. :mrgreen:

xs_yann
05/06/2010, 14h40
Merci beaucoup Loriel. :poucehaut:



En fait le problème avec netrender c'est le chemin absolu.
En chemin relatif, ça passerais nikel. :mrgreen:


Et il y a moyen de modifier le script pour que ca fonctionne ?

Loriel
05/06/2010, 16h06
Et il y a moyen de modifier le script pour que ca fonctionne ?


Attend c'est à moi que tu demandes?
Parceque moi et le code.... :calim:

Loriel
05/06/2010, 16h08
Chemin absolu:
doc/work/test/object.c4d

Chemin relatif:
object.c4d

Loriel
07/06/2010, 23h20
Mais bon puisque tu me le demandes:



Et il y a moyen de modifier le script pour que ca fonctionne ?


Je pense que oui.
Mais je sais pas comment faire :mrgreen:

Loriel
10/06/2010, 14h24
Vas-y mec! :love:
T'es à deux doigts d'avoir un outil indispensable pour les boulots en équipe à domicile ou sur netrender.
Y manque juste un chemin relatif.
Pitier!! :mrgreen:

xs_yann
10/06/2010, 16h22
:nono:
Desolé mon ordi portable m'a laché j'ai pas pu faire la modif avant. Me voilà reparti avec ce bon vieux G4 bipro... :D

Ce que tu veux c'est le chemin relatif avec les chemins de textures des prefs ?

yannminh
10/06/2010, 17h22
je suis preneur bravo... merci !!!

Yann, NooPreneur

Loriel
10/06/2010, 17h28
Yo :bounce: :bounce: :bounce:


L'idéal serait que dans l'objet xrefs ne soit présent que le nom de fichier sans son chemin d'accès.
Pour le reste c'est extra.
:bounce: :bounce:

tabou
10/06/2010, 17h50
:prie: Excellent, je prends aussi

L'expression n'est utilisable avec une renderfarm que si le chemin d'accès est relatif, mais tu n'a pas à t'occuper des chemins de textures des prefs, à ma connaissance cela n'a pas d'incidence sur la gestion des Xrefs.

Mille mercis :poucehaut:

Loriel
10/06/2010, 21h20
Tabou, XS_Yann parle du chemin aux textures car son plug va cherché les xrefs aussi bien dans la racine du dossier contenant la scène que dans les dossiers d'accès aux textures choisis dans les préférences de c4d.
:odile:

tabou
11/06/2010, 00h33
Ah d'accord, je n'avais pas capté que l'expression peut chercher ailleurs que dans le dossier racine, ce qui est bien pratique dans certains cas, merci pour l'explication.

Loriel
15/06/2010, 12h29
J'espère que ton bon G4 bipro à pas rendu l'âme lui aussi :-(

Loriel
17/06/2010, 14h55
:crying:

xs_yann
17/06/2010, 22h35
Salut Loriel,
Désolé j'ai mis du temps (j'ai perdu mes serials c4d + projet d'ecole...), bref.
En fait je ne comprend toujours pas ton probleme, je pensais avoir gerer les chemin relatifs...
Si tu pouvais me donner un exemple un peu plus parlant.
Merci. :)

Loriel
18/06/2010, 09h24
:sweatdrop:
Ouf t'es encore parmi nous!!
Bon un exemple:

J'ai un objet xref avec un nom de fichier sans chemin d'accès: objet_01.c4d, je lui applique ton tag expresso et il me l'update en ajoutant le chemin d'accès:/DOCS/W.I.P./WORKFLOW/Xref_update/objet_02.c4d, ce qui fait qu'il est ensuite impossible de lancer le rendu sur une render farm car ce chemin d'accès y est inexistant.
L'idéal serait, que le nom du fichier soit updaté sans l'ajout du chemin d'accès: objet_02.c4d

J'espère que je suis plus clair.

Merci encore pour ton temps et ce que tu en fais !!

Loriel
18/06/2010, 09h44
Dés que ton tag xpesso/coffee fonctionne, je ferai un petit tuto.
Pour expliquer les avantages de ton plug.

xs_yann
18/06/2010, 14h57
Ok, je crois que j'ai compris je vois ca des que possible. ;)

xs_yann
18/06/2010, 19h52
http://www.xsyann.com/plugins/xsXrefUpdate.cof

Je ne peux pas enregistrer l'Xpresso maintenant voici le code a placer dedans :



GetPaths(filename, doc)
{
var paths = new(array, MAX_GLOBAL_TEXTURE_PATHS + 4);
var path = filename->GetClone();
path->RemoveLast();
var file = filename->GetLastString();
var docfn = doc->GetFilename();
docfn->RemoveLast();
if (!strcmp(file, filename->GetFullString()))
path->SetFullString("");
var i = 0;
paths[i++] = path;
paths[i++] = docfn;

var tex = docfn->GetClone();
tex->AddLast("tex");
paths[i++] = tex;
var j;
for (j = 0; j < MAX_GLOBAL_TEXTURE_PATHS; j++)
paths[i + j] = GetGlobalTexturePath(j);
paths[i + j] = NULL;
return paths;
}

RemoveSuffix(name)
{
var fn = new(Filename);
fn->SetFullString(name);
fn->DelSuffix();
return fn->GetFullString();
}

GetFileId(name)
{
name = RemoveSuffix(name);
var i = sizeof(name) - 1;
while (i >= 0 && isdigit(name[i]))
i--;
return evaluate(strmid(name, i + 1, sizeof(name)));
}

GetFileBase(name)
{
name = RemoveSuffix(name);
var i = sizeof(name) - 1;
while (i >= 0 && isdigit(name[i]))
i--;
return strmid(name, 0, i);
}

IsRelativePath(filename)
{
return !strcmp(filename->GetLastString(), filename->GetFullString());
}

UpdateXref(xref, doc)
{
var updated = FALSE;
var filename = xref#SCENEINSTANCE_FILENAME;
if (filename->IsEmpty())
return updated;
var paths = GetPaths(filename, doc);
var i;
for (i = 0; paths[i]; i++)
{
if (paths[i]->IsEmpty() || !GeFileExist(paths[i], TRUE))
continue;
var file = filename->GetLastString();
var id;
id = GeFileExist(filename, FALSE) ? GetFileId(file) : 0;
var base = GetFileBase(file);
var bf = new(BrowseFiles);
if (!bf->Init(paths[i], FALSE))
return NOTOK;
while (bf->GetNext())
{
if (!bf->IsDir())
{
var cfile = bf->GetName();
var cbase = GetFileBase(cfile);
if (!strcmp(base, cbase))
{
var cid = GetFileId(cfile);
if (cid > id)
{
id = cid;
file = cfile;
updated = TRUE;
var newfn;
if (!IsRelativePath(filename))
newfn = paths[i]->GetClone();
else
newfn = new(Filename);
newfn->AddLast(file);
filename = newfn;
}
}
}
}
}
xref#SCENEINSTANCE_FILENAME = filename;
return updated;
}

const var Osceneinstance = 200000118; // Xref

main()
{
var doc = GetActiveDocument();
if (op->GetType() == Osceneinstance)
if (UpdateXref(op, doc))
EventAdd(MSG_UPDATE);
}


Dis moi si c'est ok. ;)

Loriel
19/06/2010, 00h21
Ca a l'air de marcher comme sur des roulettes.
Je regarde plus en détail demain.

Loriel
19/06/2010, 14h05
Merci XS :thumbup1:
Génial Ton expresso/coffe marche à merveille.
Pourtant une chose étrange que je ne m'explique pas est que l'expresso ne fonctionne apparemment que lorsque la scène est ouverte et ne s'effectue pas lors du calcul seul d'une image sur net-render ou avec un batch render en local.
Par exemple si j'ai un document nommé test avec un objet xref avec ton tag, faisant appel à un fichier nommé xref_01.
Pendant que le document test reste fermé, je créé un autre fichier xref_02 et le met à la racine du document.
Lorsque je lance le rendu du fichier test, l'upgrade ne se fait pas.
Dommage si quelqu'un à une idée?

Loriel
22/06/2010, 18h00
Décidément c'est à n'y rien comprendre après plusieurs jours d'utilisation de ton plug, j'ai une scène avec une dizaine de xrefs et mon rendu de 1min 30 dans le viewport passe à 15 mins si je le lance dans le pictureviewer.
En virant les xpressos avant le rendu = 1min 30 dans le picture viewer et dans le viewport.
J'en perds mon latin.

xs_yann
22/06/2010, 18h21
a mon avis c'est une erreur que de vouloir mettre ce systeme sous forme d'un tag Xpresso ou Coffee sur chaque Xref, car ces scripts tourneront en permanence, ça va bien plomber ta manipulation de projet, et également le rendu car à chaque image, les scripts des tag s'executeront.


En revanche, je ne connais pas la cause de la difference de temps de rendu entre le viewport et le picture viewer il faudrait regarder si le script s'exécute bien quand tes temps de rendus sont bas.

Loriel
22/06/2010, 19h23
Pourtant une chose étrange que je ne m'explique pas est que l'expresso ne fonctionne apparemment que lorsque la scène est ouverte et ne s'effectue pas lors du calcul seul d'une image sur net-render ou avec un batch render en local.

J'ai refait le test et ca fonctionne en local, y faut que je test sur netrender.
Je n'y comprend rien.
En plus ton expresso fonctionne de manière aléatoire de temps en temps ça fonctionne et puis ça ne marche plus même en activant réactivant le tag.
Par contre si je relance C4D ça marche à tous les coups sur le premier doc que je vais ouvrir mais après c'est un coup sur deux.
J'ai mis la priorité sur initial.
Sur mes scènes de test avec des cubes et des sphères je n'ai aucun ralentissement de rendu.

Loriel
22/06/2010, 19h30
En fait pour les rendus ça fonctionne en local uniquement si les xrefs sont présentent dans le chemin d'accés aux textures choisi dans les préférences de rendu, si elles y sont absentent, le tag ne fonctionne pas.
Il ne prend pas en compte les xrefs présentent dans le dossier racine.
C'est pour ça que ça fonctionne pas avec netrender.

Loriel
22/06/2010, 19h39
a mon avis c'est une erreur que de vouloir mettre ce systeme sous forme d'un tag Xpresso ou Coffee sur chaque Xref, car ces scripts tourneront en permanence, ça va bien plomber ta manipulation de projet, et également le rendu car à chaque image, les scripts des tag s'executeront.


Quand je vois à quelles vitesse se font les updates quand ça fonctionne (instantané) je ne crois pas que le problème vienne de là.



En revanche, je ne connais pas la cause de la difference de temps de rendu entre le viewport et le picture viewer il faudrait regarder si le script s'exécute bien quand tes temps de rendus sont bas.

Quand les rendus sont rapides(dans le viewport) le fichier est ouvert donc l'update fonctionne.

Fluffy
22/06/2010, 20h13
Merci de ne pas abuser du systême de report de messages, à n'utiliser que s'il y a un probl6eme sur un sujet en particulier, pas pour des trucs qui concernent le profil.
Libre à toi de contacter l'un de nous directement par MP dans ce genre de cas de figure.
Pour répondre à ta question "pourquoi mon titre est passé à Squatteur?": les intitulés de titres ont changé par rapport aux réglages par défaut, tout membre qui a entre 150 et 300 messages est désormais "Squatteur".

Si tu as un autre problême, je t'invite à poster dans la section de recensement de bugs, dans le forum "Le site".

Loriel
22/06/2010, 20h30
OK Fluffy je ne pensais pas "abuser" je ne savais juste pas à qui poser ma question.
Merci de ta réponse.
+

Loriel
16/08/2010, 22h29
Je réup ce topic au cas ou Yann tu pourrais nous faire une variante de ton plugin (pas le tag xpresso) avec un chemin relatif et non absolut.
Please:thumbup1::thumbup1::thumbup1::001_tt1:
Je t'en serai éternellement reconnaissant.