PDA

Voir la version complète : Voilà un scanneur de Tag.



Steph3D ::.
17/04/2007, 01h41
Hello, comme je suis entrain de coder un plug-in qui scanne toute la scène de C4D pour les exports, ben je vous passe une petite fonction de base très simple que j'ai entièrement commenté, et qui sert à scanner tous les tags sur un objet. C'est un code de base, mais qui modifié peu faire pas mal de chose :mrgreen:

Suffit de lui dir quel type de tag en recherche, et il va dire ou le tag se trouve dans la console de C4D

Faut copier/coller le code dans un coffee expression tag, et d'ajouter pleins de tag pour faire mumuse ;)



//////////////////////////////////////////////////////////////////////
// Fonction de base commentée pour rechercher des tags dans un objet
// (c) 2007 Steph3D - http://www.steph3d.net
//////////////////////////////////////////////////////////////////////

ScanTag(obj,Mon_Tag) { //On recherche un tag ( objet cible, class tag )

var tmp_tag = obj->GetFirstTag(); // on se place sur le 1er tag de la liste de l'objet cible

var i=0; // une p'tite variable pour compter les tag scanné dans la boucle

while (tmp_tag) // scan la liste des tag si le tmp_tag n'est pas vide
{
// si notre tag existe on le signal dans la console
if (instanceof(tmp_tag,Mon_Tag)) println("Tag trouvé ! ");

tmp_tag=tmp_tag->GetNext(); // on passe au tag suivant

// on signal dans la console le nouveau passage, ou la fin du scan ( si tmp_tag->GetNext() est vide )
if(tmp_tag) println("Ce tag n'est pas le bon, suivant... "); else println("Plus de tag à scanner");

i++; // Compteur ++

}
println(tostring(i)+" tag(s) scanné "); // affiche le compteur
println("---------------------");

return NULL; // renvois rien
}


main(doc,op)
{
var ChercheTag=PhongTag; // cherche tag de lissage phong
ScanTag(op, ChercheTag); // lancer la fonction scan
}

xs_yann
17/04/2007, 12h03
Et en plus combiné à la fonction que m'a donné Majoul (:love:), tu peux scanner tous les tags de tous les objets :boss: :


GetAllObjects(op,stop)
{
if(!op) return NULL;
var next;
if(next = op->GetDown())return next;
if(next = op->GetNext())return next;

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

main(doc,op)
{
var objet,tag;
var i=0;
var j= 0;
var k = 0;
var type = PhongTag;
for(objet = doc->GetFirstObject();objet;objet=GetAllObjects(objet,N ULL))
{
for(tag = objet->GetFirstTag();tag;tag = tag->GetNext())
{
j++;
if(instanceof(tag,type)) k++;
}
i++;
}
var name = strmid(tostring(type),7,sizeof(tostring(type))-8);

println("Il y a "+tostring(i)+" objet(s) sur la scène et "+tostring(j)+" tag dont "+tostring(k)+" "+tostring(name));

}

Steph3D ::.
17/04/2007, 17h38
Argh ! merci, j'en ai aussi fait un qui scanne toute la scène avec les objets ( j'y avais passé ma soirée ), mais j'avais encor un petit bug à ressoudre dans certaines conditions, je vais étudié le GetAllObjects.

Par contre, se scanne de tag ne trouve pas les tag personnalisé avec instanceof, mon nouveau plug-in de scan le fait, car maintenant je fais une recherche par GetType en exploitant l'id du plugintag personnalisé. Je poste le code quand je l'aurais remis au propre sans bug ;) C'est des fonctions élémentaires très intéressante pour développer des plug-ins.

xs_yann
17/04/2007, 17h59
La fonction de majoul : http://www.frenchcinema4d.fr/forum/index.php?topic=18946.80

Il suffit de faire ça non? :

GetAllObjects(op,stop)
{
if(!op) return NULL;
var next;
if(next = op->GetDown())return next;
if(next = op->GetNext())return next;

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

main(doc,op)
{
var objet,tag;
var i=0;
var j= 0;
var k = 0;
var type = 1001102; //IDs
for(objet = doc->GetFirstObject();objet;objet=GetAllObjects(objet,N ULL))
{
for(tag = objet->GetFirstTag();tag;tag = tag->GetNext())
{
j++;
if(tag->GetType==type) k++;
}
i++;
}
var name = strmid(tostring(type),7,sizeof(tostring(type))-8);

println("Il y a "+tostring(i)+" objet(s) sur la scène et "+tostring(j)+" tag dont "+tostring(k)+" "+tostring(name));

}


C'est des fonctions élémentaires très intéressante pour développer des plug-ins.
C'est clair et c'est cool de les faire partager. :poucehaut:
C'est un peu grâce à toi que j'ai commencé le coffee quand même :roll:

Steph3D ::.
17/04/2007, 19h19
Tu veux dir en postant mes questions de noob sur le coffee partout sur le forum, mais c'est vrais que c'était du taf de torturer Tengaal pour qu'il donne les bonnes réponses :mrgreen:

var type = 1001102; ça ne marche pas, enfin sur mes persoTag que j'ai testés.

Steph3D ::.
17/04/2007, 20h12
Bon, voilà le code de base pour faire un plug-in de scan.

Faut copier/coller dans un fichier *.cof à mettre dans le dossier plug-in. J'ai pas activé le code de l'icône, mais vous pouvez en faire une en tif.
Avec ça vous pouvez automatiser pas mal de trucs avec un peu d'imagination ;-)


//////////////////////////////////////////////////////////////////////////////////////////////
// Demo script
// (c) 2007 S.LAUX http://www.steph3d.net
//////////////////////////////////////////////////////////////////////////////////////////////
const var PLUGIN_ID = 10011; // Plugin ID (Registered)

var icon; // Variable global de l'icône

///// Fonction scan
ScanAllObjects(Obj,Doc)
{
if(!Obj) return NULL; // stop, si pas d'objet

var next;
if(next = Obj->GetDown())return next;
if(next = Obj->GetNext())return next;

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

// Plugin class pour créer l'object
class DemoScan extends MenuPlugin {
public:
DemoScan(); // Constructeur
GetID(); // Plugin ID
GetName(); // Plugin nom
GetHelp(); // Plugin étiquette
// GetIcon(); // Icon image
Execute(doc); // Execution du Plug-in
}

DemoScan::DemoScan() { super(); }
DemoScan::GetID() { return PLUGIN_ID; }
DemoScan::GetName() { return "Demo Script"; } // Non du plugin
DemoScan::GetHelp() { return "Lancer la demo"; } // Etiquette du plugin
//DemoSysteme::GetIcon() { return icon; }


DemoScan::Execute(doc) { // code principal d'execution

var Obj = doc->GetFirstObject(); // prend le 1er objet de la liste

var i=1; // variable du compteur

for(Obj = doc->GetFirstObject();Obj; Obj=ScanAllObjects(Obj,doc))
{
// Ici on place le code de traitement du scan qu'on veux faire pour chaque objet de la scene
Obj#ID_BASELIST_NAME="Scan Objet["+tostring(i)+"] --> Ok !!";

i++; // compteur
}

/////////////////////////////////////////////////////
// Pour rafraîchir toute la scène, c'est plus sur !
GeEventAdd(NEW_ACTIVE_OBJECT);
doc->Message(MSG_UPDATE);
doc->Message(DOCUMENT_CHANGED);

return TRUE;
}

main() {

// Récuperer le chemin du plug-in sur le disque
var path = GeGetRootFilename();
path->RemoveLast();

// Charger l'icone du plug-in
// path->AddLast("Ico.tif");
// icon = new(BaseBitmap,1,1);
// icon->Load(path);

// Enregistrer le Plug-in
Register(DemoScan);
}

nikolas
17/04/2007, 20h23
ça a l'air bien pratique.... Mais je comprend quedalle. :mrgreen: on fait comment? un copié/collé dans la console coffee?
nikolas; boulet intersidéral dans ce domaine...

Steph3D ::.
17/04/2007, 20h28
Non dans un fichier txt renommé en cof et placé dans ton rep plug-in

Cela va renommer tout tes objets ( démo)

Mais ici

{
// Ici on place le code de traitement du scan qu'on veut faire pour chaque objet de la scène
Obj#ID_BASELIST_NAME="Scan Objet["+tostring(i)+"] --> Ok !!";

i++; // compteur
}


Il suffit de remplacé le Obj#ID_BASELIST_NAME="Scan Objet["+tostring(i)+"] --> Ok !!";
Par un code de notre choix pour exécuter le script sur tous les objets de la scène

Steph3D ::.
17/04/2007, 21h15
Et voilà la source complète de mon scanneur de scène avec une image de ce que cela fait dans C4D

Avec ça, comme vous pouvez facilement scanner toutes les données de C4D par les containers, vous avez les bases pour programmer un exportateur de fichiers 8)


//////////////////////////////////////////////////////////////////////////////////////////////
// Code source d'un plug-in de base pour scanner toute la scène de Cinema4D
// (c) 2007 S.LAUX http://www.steph3d.net
//////////////////////////////////////////////////////////////////////////////////////////////
const var PLUGIN_ID = 10011; // Défini l' ID de notre nouveau plugin perso

var icon; // Variable global de l'icône

///// Fonction scan objet
ScanAllObjects(Obj,Doc)
{
if(!Obj) return NULL; // stop, si pas d'objet

var next;
if(next = Obj->GetDown())return next;
if(next = Obj->GetNext())return next;

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

///// Fonction scan tag
ScanTag(obj,R_Tag) { //On recherche un tag R_Tag sur l'objet obj

var tmp_tag = obj->GetFirstTag(); // on se place sur le 1er tag de la liste dans l'objet
var test,ID_Tag;
var i=0; // une p'tite variable pour compter les tag scanné

while (tmp_tag) // scan la liste des tag si tmp_tag n'est pas vide
{
ID_Tag=tmp_tag->GetType(); // Récup l'ID du tag
if (ID_Tag==R_Tag) { // si l'ID du tag = l'ID du tag qu'on recherche
println("[ID:"+tostring(ID_Tag)+"] Tag trouvé ! "); // si notre tag existe on le signal dans la console
}
// on signal dans la console le nouveau passage, ou la fin du scan ( si tmp_tag->GetNext() est vide )
else if(tmp_tag) println("[ID:"+tostring(ID_Tag)+"] Ce tag n'est pas le bon, suivant... "); else println("Plus de tag à scanner");

tmp_tag=tmp_tag->GetNext(); // on passe au tag suivant
i++; // Compteur ++
}
println(tostring(i)+" tag(s) scanné "); // affiche le compteur

return NULL;
}

// Plugin class pour créer l'object
class DemoScan extends MenuPlugin {
public:
DemoScan(); // Constructeur
GetID(); // Plugin ID
GetName(); // Plugin nom
GetHelp(); // Plugin étiquette
// GetIcon(); // Icon image du plug-in
Execute(doc); // Execution du Plug-in
}

DemoScan::DemoScan() { super(); }
DemoScan::GetID() { return PLUGIN_ID; }
DemoScan::GetName() { return "Scaner 4D"; } // Non du plugin
DemoScan::GetHelp() { return "Scaner la scene"; } // Etiquette d'aide du plugin
//DemoSysteme::GetIcon() { return icon; } // Icon du plug


DemoScan::Execute(doc) { // code principal d'execution

var Obj = doc->GetFirstObject(); // prend le 1er objet de la liste de des objets de C4D
var i=1; // variable du compteur
var RechercheTag = 5612; // ID du tag, ici un phong tag pour exemple
CallCommand(13957); // vide la console ( 13957 = l'ID de la commande "effacer" de la console )

for(Obj = doc->GetFirstObject();Obj; Obj=ScanAllObjects(Obj,doc))
{ // Ici on place le code de traitement du scan qu'on veux faire pour chaque objet de la scene

println("------------------------------------------> Objet"+tostring(i)); // println affiche un text dans la console
ScanTag(Obj,RechercheTag); // scan les tags
i++; // compteur
}
println("------------------------------------------> Fin du scan");
println("------------------------------------------> "+tostring(i-1)+" Objet(s) scannés");
println("//////////////////////////////////////////////////");

/////////////////////////////////////////////////////
// Pour rafraîchir toute la scène, c'est plus sur !
GeEventAdd(NEW_ACTIVE_OBJECT);
doc->Message(MSG_UPDATE);
doc->Message(DOCUMENT_CHANGED);

return TRUE;
}

main() {

// Récuperer le chemin du plug-in sur le disque
var path = GeGetRootFilename();
path->RemoveLast();

// Charger l'icone du plug-in
// path->AddLast("Ico.tif");
// icon = new(BaseBitmap,1,1);
// icon->Load(path);

// Enregistrer le Plug-in
Register(DemoScan);
}



[Fichier joint supprimé par l'administrateur]

lenogre
18/04/2007, 12h24
Majoul avait fait un plug dans le genre (SelectFilterReplace) qui permet de croiser différents critères pour faire des recherches d'objets. Très efficace comme tjs.

Steph3D ::.
18/04/2007, 15h21
Connais pas, mais bon la c'est pas vraiment un plug-in dans le sens utiles. C'est plus un code de base pour ceux qui débute avec le coffee, ça leur évitera de trop chercher comme j'ai dû le faire ;-)

nikolas
18/04/2007, 15h58
merci steph ;)

Sir Gong
18/04/2007, 21h15
J'aimerais tellement comprendre tout ça.

T'as entendu parler d'un plug qui s'apppelle Jean-Pierre.cof ?