PDA

Voir la version complète : MrVue en Python 1.04



valkaari
11/08/2011, 14h43
Salut,

Puisque visiblement l'outil MrVue était très apprécié mais qu'il ne fonctionne plus sous la R12 (et donc R13 aussi).
Que Majoul, le créateur n'est visiblement pas très joignable (voire impossible à joindre), Vee m'a demandé de recréer ce plug.

Donc j'aimerais en profiter pour lancer un sujet sur la french afin de travailler dessus de manière collective.
1) le plug est fourni avec le code ouvert (tout le monde peut le voir et le modifier)
2) je ne suis pas le dev exclusif de l'outil. Si une personne désire modifier, améliorer, rajouter des options elle est plus que bienvenue. (hein Oli_D et XS_Yann ?)

3) Les graphistes qui voudraient faire une image, un icône peuvent toujours le faire
4) Les remarques ou demandes de nouvelles fonctions sont les bienvenues.

Je demande juste d'incrémenter la version, de rajouter un peu de blabla dans le cartouche et le nom du dev qui a fait la modif, histoire de s'y retrouver. Enfin je demande.... ça serait bien de le faire, hein, moi je m'en fous un peu finalement xD


Pour le mode de fonctionnement, si aucun objet n'est sélectionné, le plug prendra le premier niveau de la hiérarchie. Si on demande de prendre en compte les enfants, il prendra du coup tous les objets.

Si on sélectionne des objets, seuls ceux-là seront pris en compte. Si on coche la case "enfants" les objets sélectionnés + enfants.


La case tous les objets prend tous les objets, que la case enfants soit sélectionnée ou pas.




Known bugs : :cursing:
- sur une scène de 26000 objets avec une grosse grosse hiérarchie, le plug arrive à saturer le nombre d'appel récursif.
- la désactivation de l'affichage de tous les objets (onglet affichage) est beaucoup plus rapide si l'on décoche "enfants" (2 s contre 10 s)
- dans l'interface, tous les objects et pas ojects

A faire : :hammer:
- Prendre en compte les objets non sélectionnés seulement
- Faire une interface avec des icônes et horizontale pour pouvoir docker le plug dans un coin de l'interface ?


Bug à vérifier : :001_unsure:



Bref vous pouvez faire vos remarques.

Dernière version
3438


Ancienne version
3404
3422
3426

Vee
11/08/2011, 14h50
http://myst-aventure.com/forum/style_emoticons/MystAventure/respect.gif http://myst-aventure.com/forum/style_emoticons/MystAventure/kiss.gif

Fonctionne nickel chez ouam après test sur une grosse, grosse scène.

Huv
11/08/2011, 15h46
Cool !
Je dois avouer, je n'ai jamais compris a quoi servait le 1er onglet :icon_redface: (affichage),
Pour l'activation et desactivation des Hn, instances et tout le tremblement, ca fonctionne :-) ,
en revanche, rien concernant les textures (Ar ou vray)...
:thumbup1:

Edit : s'il y avait moyen d'y integrer l'activation ou desactivation des cloners mograph, ce serait plus que top !

Seb-bbl
11/08/2011, 15h49
J'en ai rêvé, Val l'a fait : le premier plug collaboratif pensé par une communauté d'utilisateurs ! Comme beaucoup ici, je ne pense pas ajouter la moindre ligne de code, mais s'il y a des critiques à donner, je serai ravi de le faire ! A très vite pour le test !

PS : Le plug est-il en français ? Si c'est le cas, peut-être proposer une version anglais afin que cela profite au plus grand nombre.

valkaari
11/08/2011, 15h57
Dans le répertoire res, il y a string_us et string_fr

Dans les deux il y a un fichier c4d_strings.str et un fichier dialogue_pymv.str

Ces deux fichiers contiennent les chaines de caractères. Si des gens veulent modifier les intitulés ou faire une traduction, ils peuvent. (attention aux caractères spéciaux qui sont codé)

Donc pour l'instant, anglais et français.

Les commentaires sont en anglais. (enfin mon anglais à moi hein ....)

J'ai choisi de travailler avec les fichiers externe d'interface et de langue pour justement faciliter l'évolution.
C'est peut être aussi l'occasion d'apprendre pleins de choses sur le développement de plugs.

Seb-bbl
11/08/2011, 15h59
Bien joué !

valkaari
11/08/2011, 16h44
Cool !
Je dois avouer, je n'ai jamais compris a quoi servait le 1er onglet :icon_redface: (affichage),
Pour l'activation et desactivation des Hn, instances et tout le tremblement, ca fonctionne :-) ,
en revanche, rien concernant les textures (Ar ou vray)...
:thumbup1:

Edit : s'il y avait moyen d'y integrer l'activation ou desactivation des cloners mograph, ce serait plus que top !

Alors le premier onglet dispose de deux lignes de boutons radio.
La première c'est le réglage de la vue. L'autre c'est au rendu.

Les colonnes :
la première c'est forcer en ON (vert) l'autre en off (rouge) la troisième c'est réglage par défaut et la dernière la noir, c'est "ne rien changer"

Options que j'ai remis même si c'est très discutable.

Pour l'histoire du tag vray, normalement si je dis pas de bêtises et si mes souvenirs sont bon, le tag texture que ça soit vray ou AR reste le même. Le plug ne fait que rajouter une chaine de caractère dans le champ de sélection et comme elle n'existe pas, la texture ne s'applique plus.



Pour ce qui est de rajouter un option d'objet, c'est là que c'est beau :
1) lancer cinema4D et le command manager.
2) chercher l'objet que l'on veut désactiver en tapant dans le champ de recherche son nom (ex cloner si vous êtes en anglais)
3) à coté du bouton assign en bas à droite il y a l'id correspondant à cet objet (toujours pour le cloner : ID 1018544)
4) fermer c4d et ouvrir le fichier pymv.pyp qui se trouve à la racine du plugins (c'est le code, avec un éditeur de texte tout simple ça marche)
5) trouver la section #define ckeckbox base ID start at 12xxx (ligne 123)

6) c'est là que ça devient un peu moins facile mais relativement simple
a)
créer une nouvelle ligne pour le cloneur en faisant en sorte que "id" soit unique
GuiCheckBoxCloClo = {"id":12013,
b)
ajouter une chaine de caractère pour le nom de la checkbox
"String":"le clocloMomo",
c)
ajouter l'ID trouvé dans le command manager
"c4dObjectID":1018544}
ce qui donne la ligne suivant
GuiCheckBoxCloClo = {"id":12013,"String":"le clocloMomo","c4dObjectID":1018544}

7) ajouter dans une des listes (deux lignes en dessous) la variable crée (GuiCheckBoxCloclo) soit dans le tableau BoxGenGrp1 ou BoxGenGrp2 (suivant où on veut le mettre dans l'interface)
ligne avant modife:
BoxGenGrp2 = [GuiCheckBoxIns,GuiCheckBoxMet,GuiCheckBoxSym,GuiCh eckBoxBoo,GuiCheckBoxArr,GuiCheckBoxAtm]
ligne après modif
BoxGenGrp2 = [GuiCheckBoxIns,GuiCheckBoxMet,GuiCheckBoxSym,GuiCh eckBoxBoo,GuiCheckBoxArr,GuiCheckBoxAtm,GuiCheckBo xCloClo]
(ne pas oublier la virgule pour séparer les variables)

8)Sauvegarder le fichier et c'est bon, testez la nouvelle case à cocher.


Du coup vous allez me dire "oui mais du coup, les anglais auront la même chaine de caractère."

Ben oui, c'est là qu'un codeur passe et vas rajouter une ID dans le fichier c4d_symbol.h et dans le code python (merci d'ailleurs pour cette fonction qui est en phase beta qui oblige de déclarer les variables dans les deux endroits)
et rajouter dans les fichiers string, et le code c4d.GeloadString(toto).

Tout ça pour permettre la diffusion plus globale de l'outils. Par contre chez vous, vous pouvez faire ce que vous voulez :)

diego1968
11/08/2011, 16h48
Merci Val :icon_boss::thumbup1:pour ce travail sur ce plug tellement utile…je vais tester de ce pas:sweatdrop:

oli_d
12/08/2011, 09h11
Super initiative, merci déjà pour l'immense travail !

J'ai testé en vitesse et il y a chez moi une pétouille avec les textures quand il n'y rien dans le champ sélection cela provoque une erreur à ligne 411 car la chaîne est "None".

J'ai juste rajouté une ligne dans ta fonction FindAndRemoveString pour le cas ou la chaine est None (if not myString : myString = '' ) et ça à l'air de fonctionner:


def FindAndRemoveString(self,myString):
if not myString : myString = ''
return myString.replace(c4d.plugins.GeLoadString(IDS_TEXT URETAG),'') Je ne veux pas faire une version juste pour ça

Une petite chose au lieu d'utiliser les nombres de références et les transférer dans une constante à ta sauce, tu peux utiliser directement les constantes c4d, par exemple pour le tag texture au lieu de 5616 tu peux directement mettre c4d.Ttexture.
Le problème c'est pour les trouver ces constantes, il y en a une série dans la doc du C++ sous BaseObject, BaseTag, etc .. sous les méthodes Alloc(). Sinon on les trouve aussi dans un fichier coffeesymbols.h dans le dossier resource de c4d.

Sinon pour les améliorations, je trouverais bien de pouvoir revenir à un état initial avec les visibilités. Dans une scène on a toujours des trucs qui sont de toute façon masqués. Il faudrait pouvoir enregistrer un ou même plusieurs états de visibilité ce qui permettrait aussi d'enregistrer des variantes par exemple (en stockant les infos dans un Hyperfile ou un fichier texte...)

A part ça ton code est super bien structuré, mais ça prend quand même du temps de se plonger dedans et ces temps je suis à la bourre, pour changer ... Mais j'aimerais quand même bien participer, je réfléchis à la chose et je donne des nouvelles dès que possible

Vee
12/08/2011, 11h10
Sinon pour les améliorations, je trouverais bien de pouvoir revenir à un état initial avec les visibilités.Excellente idée ! Je suis pour.

Sinon, je signale juste que sur une très grosse scène (26 000 objets) la désactivation de l'affichage de tous les objets (onglet affichage) est beaucoup plus rapide si l'on décoche "enfants" (2 s contre 10 s)

valkaari
12/08/2011, 11h21
arfff la chaîne de caractère vide .... faut que je me mettes à la programmation défensive moi :sweatdrop:

Pour les IDs des objets je sais mais je voulais avoir les déclarations des objets assez haut dans le code. En dehors d'une classe ou d'une fonction il trouve pas c4D.tTesture ou c4d.Ocube c4d.Osds et je sais pas pourquoi :icon_redface:

pour les trouver on peut aussi utiliser la console python, quand tu drag and drop le truc, il te le dit "the object 'cloner' Omograph_cloner was added as 'Cloner'

ben je vais rajouter l'idée de """""sauvegarde"""""" de l'état de départ dans la TODO list du premier post ^^

oli_d
12/08/2011, 11h31
Rhhôôôô trop bien le coup de la console, j'avais jamais pensé à ça, merci pour l'info c'est super plus mieux rapide...

2Mylent
12/08/2011, 12h59
Ne connaissant pas ce plug-in à l'origine, j'ai donc testé avec curiosité cette remise en forme :icon_wip:
Avant tout, Merci valkaari :thumbup1:

Ma version: V12 Prime.
- Le plug-in fonctionne bien sur ma scène en cours
- Seul défaut, le refresh écran, quant-on clique sur "Activé" ou "Désactivé", on ne voit pas de modification, au début j'ai cru que cela ne fonctionnait pas mais, un micro zoom (par exemple) permet de faire un refresh de la sècne et de montrer que le plug-in a bien fait son travail (c'est compréhensible mon charabia ? :blush:)


:icon_wavey:

diego1968
12/08/2011, 13h59
Bon, j'ai fait un test et la fonction texture…je n'ai pas compris, mais elle ne fonctionne pas avec une scene nouvellement créée avec R12…par contre si j'ouvre une ancienne scène sous R12 tout fonctionne…:huh:

Pour le reste c'est ok

iolofato
12/08/2011, 14h25
Super mazette,

Idem les cases à cocher de l'onglet texture ne réagissent pas chez moué.

Concernant les icônes je me suis fais vite fait un petit set plus dans le look c4d si ça vous intéresse ;)

[màj] fichier lié .tif contient une couche alpha pour coller à n'importe quelle couleur de fond ;)

valkaari
12/08/2011, 14h26
Bizarre pour le refresh, je l'ai pourtant ajouté avec la commande EventAdd().

Pour ce qui est du tag texture, effectivement, lorsque l'on crée un tag texture, le champ sélection renvoi None.
La fonction ne fait pas la vérification. Le code proposé par Oli_D devrait résoudre le problème.
(voilà un cas typique de programmation défensive, toujours vérifier si la donnée qu'on veut traiter correspond bien à nos attentes ^^')

edit :


Super mazette,

Idem les cases à cocher de l'onglet texture ne réagissent pas chez moué.

Concernant les icônes je me suis fais vite fait un petit set plus dans le look c4d si ça vous intéresse ;)


cool alors pour les images, si tu veux avoir la même couleur que ton interface, il suffit de mettre une couche alpha dans ton fichier. Du coup ton visuel fonctionnera aussi avec ceux qui ont personnalisé leurs couleurs ou qui utilisent la couleur claire par défaut.

iolofato
12/08/2011, 14h31
ah ben mince c'est ce que j'avais fait mais il me collait tout de même un fond blanc… hop c'est bon je le corrige dans le lien ci-dessus !

valkaari
12/08/2011, 14h40
D'ailleurs, du coup avec une interface en 'light' le dernier bouton disparait à cause de sa couleur, donc l'alpha est pas forcement une solution non plus :sweatdrop:

3410


Mais sur le principe ça fonctionne xD

iolofato
12/08/2011, 14h52
ah oui ton visuel ne tient pas compte de tous les calques… (suffirait de les écraser note bien)
Chez moi c'est bon dans les deux interfaces, c'est du vite fait hein, mais le tif comporte les calques si qq'un veut s'amuser :)

user4D
12/08/2011, 19h19
Belle initiative valkaari :icon_thumbsup:

Et ton niveau en dev :icon_prie:

diego1968
12/08/2011, 19h31
Merci oli_D pour la ligne de code qui rétablie la fonction texture dans les nouvelles scènes R12 ! :thumbup1:

Bravo à tout les 2 !:icon_boss:

xs_yann
12/08/2011, 22h00
Sinon pour les améliorations, je trouverais bien de pouvoir revenir à un état initial avec les visibilités. Dans une scène on a toujours des trucs qui sont de toute façon masqués. Il faudrait pouvoir enregistrer un ou même plusieurs états de visibilité ce qui permettrait aussi d'enregistrer des variantes par exemple (en stockant les infos dans un Hyperfile ou un fichier texte...)


Je l'avais fait une fois avec un tag invisible dans l'object manager, qui permet de stocker l'état. C'est plus simple à mettre en place et à utiliser qu'un fichier mais peut-être un peu lourd (quoi qu'en créant seulement des tags pour les objets qui ne sont pas 'editeur:gris / rendu:gris' et en nettoyant les tags qui ne sont plus utiles ça peut se tenter).

Rudy
12/08/2011, 22h08
Merci Val et xs_yann pour les plugs:thumbup1:

Mr Vue est un incontournable, certes.

Cependant, yann a créé deux plug qui proposent une alternative intéressante xsHNSwitch et xsTextureSwitch, que j'utilise depuis.

Alors c'est dire l'intérêt avec lequel je suis ce sujet de très près.

:icon_prie: :icon_prie:

valkaari
13/08/2011, 01h04
Je l'avais fait une fois avec un tag invisible dans l'object manager, qui permet de stocker l'état. C'est plus simple à mettre en place et à utiliser qu'un fichier mais peut-être un peu lourd (quoi qu'en créant seulement des tags pour les objets qui ne sont pas 'editeur:gris / rendu:gris' et en nettoyant les tags qui ne sont plus utiles ça peut se tenter).

On peut aussi le stocker directement dans le basecontainer de l'objet quitte à récup un ID de plus pour être certain qu'il n'y ai pas de conflits (c'est ce que fait goz)

oli_d
13/08/2011, 06h43
Si c'est pour un seul état le base container est à mon avis la meilleure solution. Quand je parlais de fichiers externes c'était pour pouvoir sauvegarder plusieurs "états d'affichages", mais à la réflexion cela fait peut-être un peu doublon avec les calques qui peuvent déjà plus ou moins jouer ce rôle ...

oli_d
13/08/2011, 08h18
Ma petite contribution pour l'instant :


correction pour les textures sans sélection
ajout des Undo (annulation)

J'ai également ajouté un self.doc dans la méthode CreateLayout pour avoir accès partout dans la classe et pas refaire systématiquement un doc = c4d.documents.GetActiveDocument()

J'ai pas testé et vérifié en détail, donc si vous voyez des problèmes genre écrans bleus, ordinateur qui fume, signalez-les ....

J'avais commencé en commentant chaque ligne que j'avais modifiée, mais j'ai vite abandonné car cela devenait le bordel, au final j'ai juste modifié le cartouche pour ce qui est des commentaires.
Est-ce comme ça que tu voyais la chose Val ?

iolofato
13/08/2011, 10h17
et un set d'icônes…

gegebabou
13/08/2011, 12h03
Merci, et bravo pour l'état d’esprits de création en communauté, c'est comme ça que doit être internet.
En complément du plugin SOLObutton c'est le top, peut être qu'il est possible d'ajouter l'équivalent un petit bouton qui isole une sélection et un qui réaffiche???
Sur le même onglet on-off si non on passe son temps à basculer d'un onglet à l'autre.
J'ai m'y PY Mr Vue sur l'interface par défaut, derrière l'onglet Objets et il y a de la place.
Je dit ça, je dit rien, je serais bien incapable d'écrire quoi que ce soit sur le plugin.

2Mylent
13/08/2011, 12h11
oli_d :icon_clap:
En R12 Prime, tout fonctionne très bien y compris le refresh :thumbup1:
iolofato, merci pour les icones :icon_wavey:
Suggestion: il serait bien de notifier le N°de version en cours du plug-in dans la partie commentaire (Info) afin que d'être sur que nous testons la bonne version :icon_mrgreen:

J'ai un autre problème en relation avec le plug-in mais pas directement:
- j'ai docker MrVue sur une de mes palettes
- Je mets à jour le plug-in MrVue dans le répertoire principale de C4D (C:\Program Files\MAXON\CINEMA 4D R12\plugins)
- Redemarrage de C4D
- Test de MrVue..... Rien ne fonctionne, nada :icon_pleure:
- Je relance MrVue depuis le menu de C4D..... MrVue fonctionne parfaitement :biggrin:
- Alors, je resauvegarde mon interface (par défaut) et ma personnalisée (avec MrVue en cour)
- Relance de C4D
- Test de MrVue...... fonctionne pas :icon_arg:
- Je relance MrVue depuis le menu de C4D..... MrVue fonctionne parfaitement :icon_eek:
- je ....... :death:
Je comprends pas! :icon_question:
Une idée du problème? :huh:

Seb-bbl
13/08/2011, 12h12
Y'a une petite erreur de typo dans l'interface : tous les ojects.

clemz
13/08/2011, 12h12
haaaa excellent ! :) merci Val et les autres contributeurs ! c'est vrai que MrVue ça manquait sévère :P

(mais il est toujours vivant Majoul ? j'ai l'impression qu'il donne plus signe de vie depuis longtemps :( )

Rudy
13/08/2011, 12h28
oli_d :icon_clap:
En R12 Prime, tout fonctionne très bien y compris le refresh :thumbup1:
iolofato, merci pour les icones :icon_wavey:
Suggestion: il serait bien de notifier le N°de version en cours du plug-in dans la partie commentaire (Info) afin que d'être sur que nous testons la bonne version :icon_mrgreen:

J'ai un autre problème en relation avec le plug-in mais pas directement:
- j'ai docker MrVue sur une de mes palettes
- Je mets à jour le plug-in MrVue dans le répertoire principale de C4D (C:\Program Files\MAXON\CINEMA 4D R12\plugins)
- Redemarrage de C4D
- Test de MrVue..... Rien ne fonctionne, nada :icon_pleure:
- Je relance MrVue depuis le menu de C4D..... MrVue fonctionne parfaitement :biggrin:
- Alors, je resauvegarde mon interface (par défaut) et ma personnalisée (avec MrVue en cour)
- Relance de C4D
- Test de MrVue...... fonctionne pas :icon_arg:
- Je relance MrVue depuis le menu de C4D..... MrVue fonctionne parfaitement :icon_eek:
- je ....... :death:
Je comprends pas! :icon_question:
Une idée du problème? :huh:

Je pense que tu ne devrais pas coller tes plug dans C:/program files, mais ici:

C:\Users\Rudy\AppData\Roaming\MAXON\CINEMA 4D R12_1CC4E3E1\plugins ...

Attention, ce répertoire est caché par défaut.( dans l'explorateur : outils / option des dossiers / affichage / cocher: afficher les fichiers, dossiers et lecteurs cachés ... puis appliquer)

C'est également dans CINEMA 4D R12_1CC4E3E1 que tu trouveras les librairies, prefs etc ....

Astuce pour un accès rapide à ce dossier sous windows 7: une fois l’explorateur ouvert, tu saisis l'icône du chemin de ce répertoire (à gauche de l'adresse complète en haut ) puis tu la glisse sur l’icône de l'explorateur de la barre des taches. Plus tard, un clic droit sur cette icône te permet de retrouver instantanément ces adresses de dossier et donc de les ouvrir.

Seb-bbl
13/08/2011, 12h32
Encore plus rapide : tu ouvres C4D, tu ouvres les préférences générales et dans le panneau généralités tu cliques sur "Accéder au dossier". Et tu en profites pour le mettre en favoris.

valkaari
13/08/2011, 12h39
J'ai modifié légèrement le code d'oli pour que le self.doc.StartUndo() soit quelques lignes plus tôt dans le code (sinon, quand on force tous les objets, les undo s'ajoutaient aux actions réalisées avant l'utilisation de l'outil)

C'est ça Oli, faut juste modifier le cartouche puis voilà ^^
Je crois qu'on vas ajouter des 0.0x quand on ajoute des fonctions mineur et les majeurs passeront par du 0.x

J'ai également mis les icons de lolofato.


J'ai rajouté sur le premier post la dernière version et je vais de ce pas rajouter vos dernières remarque. En ce qui concerne les erreurs de texte, c'est dans les fichiers str qu'il faut faire les modifs ^^

Pour le dock dans l'interface, est ce que ça règle le souci quand tu le mets dans le répertoire perso rudy ?

Rudy
13/08/2011, 15h15
Encore plus rapide : tu ouvres C4D, tu ouvres les préférences générales et dans le panneau généralités tu cliques sur "Accéder au dossier". Et tu en profites pour le mettre en favoris.

J'ai encore appris, merci pour l'info Seb :thumbup1:


... Pour le dock dans l'interface, est ce que ça règle le souci quand tu le mets dans le répertoire perso rudy ?

Le dock se place bien dans l'interface, en onglet ou seul, mais j'ai essayé sur une scène du nautilus et pis rien quoi. Pas d'activation ou désactivation des nurbs, symétries et consort ... et pareil pour les textures. Dans la version juste avant, cela fonctionnait pourtant.

Idem pour une scène nouvelle.

Je place pourtant toujours mes plug dans ce répertoire, y compris l'ancien Mr Vue de Majoul qui fonctionnait bien (en R11 et 11.5)

xs_yann
13/08/2011, 16h27
Le dock se place bien dans l'interface, en onglet ou seul, mais j'ai essayé sur une scène du nautilus et pis rien quoi. Pas d'activation ou désactivation des nurbs, symétries et consort ... et pareil pour les textures. Dans la version juste avant, cela fonctionnait pourtant.

Idem pour une scène nouvelle.


C'est à cause de la dernière modif de oli. C'est bien de stocker le doc en attribut dans la classe ça permet d'éviter les GetActiveDocument() à répétition et donc de réduire le temps d'execution mais il ne faut pas faire la seule affectation dans le CreateLayout sinon ça induit un comportement inattendu. Exemple : J'ouvre Mr.Vue dans une scène (là ça fonctionne), je créer une nouvelle scène (sans fermer Mr.Vue entre temps), maintenant Mr.Vue agira sur la première scène et non celle active.

valkaari
13/08/2011, 16h27
Le soucis de l'intégration dans l'interface vient donc la commande self.doc = c4d.documents.GetActiveDocument() qui est dans la fonction createLayout.

L'interface est initialisé avant la création du document. Donc, le self.doc n'est pas défini. Du coup les opérations qui s'appuie dessus font planter le plug. (quand je vous parles de programmation défensive xD)

Donc j'ai rajouté la ligne self.doc = c4d.documents.GetActiveDocument() dans la fonction command(self): qui est appelé lorsque l'on clique sur un bouton de l'interface. (je passe quand même en version 1.03 pour être certain que tout le monde a la bonne version)


edit : ha ben grilled par yann ^^

xs_yann
13/08/2011, 17h19
edit : ha ben grilled par yann ^^

De pas longtemps. :icon_mrgreen:

Un truc qui pourrait être pas mal, plutôt que d'avoir une liste prédéfinie dans l'onglet On-Off, ce serait bien de n'avoir que (et tous) les objets qu'il y a dans la scène. Du style :
import c4d

def GetNextHierarchyObject(op):
if op is None:
return None
down = op.GetDown()
if down:
return down
next = op.GetNext()
if next:
return next
prev = op.GetUp()
while prev:
next = prev.GetNext()
if next:
return next
prev = prev.GetUp()
return None

def main():
op = doc.GetFirstObject()
l = []
while op:
try:
l.index(op.GetType())
except ValueError:
l.append(op.GetType())
op = GetNextHierarchyObject(op)
for objectType in l:
print c4d.GetObjectName(objectType)

if __name__=='__main__':
main()

Après c'est vrai que c'est rare d'avoir à désactiver tous les tores ou les FFD (par exemple). Mais sans ça, ce serait bien déjà de jouer avec le 'GeDialog.Enable(gadget, enable)' pour griser les checkbox où, dans tous les cas, il n'y a pas d'objet de ce type sur la scène. ;)

edit :
Ce serait pas mal aussi de rajouter

import webbrowser
...
FC4D_URL = 'http://www.frenchcinema4d.fr/'
...
elif id == 1001: # avec une constante c'est mieux
webbrowser.open(FC4D_URL)

2Mylent
13/08/2011, 17h25
BRAVO! :icon_clap:
Cela fonctionne bien maintenant et avec le plugin dans mon répertoire "C:\Program Files\MAXON\CINEMA 4D R12\plugins" :thumbup1:

Merci :icon_wavey:


Rudy: je n'utilise jamais les répertoires "User" :P

Rudy
13/08/2011, 21h42
Je viens de tester la version .03 et c'est nickel :thumbup1:

Merci :icon_wavey:

oli_d
14/08/2011, 12h29
C'est à cause de la dernière modif de oli

C'est ça de coder avec la tête dans le c... merci d'avoir modifié

oli_d
14/08/2011, 13h47
Bon j'ai un peu bossé sur des fonctions pour la sauvegarde d'un état avec la méthode du container avec identifiant unique, la restauration de l'état et le mode solo du ou des éléments sélectionnés


import c4d


BC_STATE_ID = 1027483


def doOnHierarchy(start,func):
while start:
func(start)
doOnHierarchy(start.GetDown(),func)
start = start.GetNext()

def saveVisibility(op):
bc = c4d.BaseContainer()
bc[0] = op.GetEditorMode()
bc[1] = op.GetRenderMode()
op[BC_STATE_ID]=bc

def restaureVisibility(op):
bc = op[BC_STATE_ID]
if bc :
op.SetEditorMode(bc[0])
op.SetRenderMode(bc[1])
else : #Voir ce que l'on fait si un objet n'a pas été enregistré
op.SetEditorMode(c4d.MODE_UNDEF)
op.SetRenderMode(c4d.MODE_UNDEF)

def solo(op):
if op.GetBit(c4d.BIT_ACTIVE) :
op.SetEditorMode(c4d.MODE_ON)
op.SetRenderMode(c4d.MODE_ON)
else :
op.SetEditorMode(c4d.MODE_OFF)
op.SetRenderMode(c4d.MODE_OFF)


if __name__=='__main__':
#doOnHierarchy(doc.GetFirstObject(),saveVisibility )
#doOnHierarchy(doc.GetFirstObject(),restaureVisibi lity)
doOnHierarchy(doc.GetFirstObject(),solo)
c4d.EventAdd()J'ai testé sous forme de script ça à l'air de fonctionner, reste à l'intégrer dans le plugin mais là je dois partir ...

diego1968
14/08/2011, 14h01
Je vous adore !:icon_love:

Vous êtes beau…fort…et intelligents :icon_boss:

Moi, je suis un peu jaloux…mais je me soigne :icon_mrgreen:

Un grand merci pour votre participation si active à la vie nos plug-in et de notre forum préféré:icon_prie::icon_prie::icon_prie:

xs_yann
15/08/2011, 00h18
Bien joué oli. :thumbup1:

Je verrais bien un truc dynamique (avec des LayoutFlushGroup) où l'on peut donner un nom à ses sauvegardes (que l'on pourrait stocker avec bc[idSave * 2] = op.GetEditorMode() et bc[idSave * 2 + 1] = op.GetRenderMode() ou alors bc = op[BC_STATE_ID + idSave] par exemple) comme ça on peut sauvegarder plusieurs états, les supprimer et switcher entre les états à loisir (genre une ligne par sauvegarde avec le nom de la sauvegarde, un bouton 'on' et un bouton 'delete'). Avec les list de Python ça ne doit pas être extrêmement fastidieux à mettre en place. :icon_artist:

valkaari
15/08/2011, 02h40
J'aime beaucoup l'idée d'interface interactive qui n'affiche que les objets présents dans la scène ou les états sauvegardé.

On pourrait peut être rajouter un onglet.

Une idée aussi pour stocker les états, au lieu de mettre une colonne par état, c'est d'enregistrer l'état en binaire.
Pour un objet masqué dans le viewport et dans le rendu on aurait 100100 (36), avec un masque de bit, on peut savoir rapidement quel switch est on ou off, ou alors une comparaison avec un numérique. Du style si ma valeur = 36 alors masquer dans les deux cas.
Cela permet aussi de ne faire qu'un accès au basecontainer de l'objet. (ça peut être important si on a plein d'objets)

On peut aussi rajouter deux bits, un pour l'état on/off de l'objet et un pour la texture on/off.

xs_yann
15/08/2011, 12h54
Une idée aussi pour stocker les états, au lieu de mettre une colonne par état, c'est d'enregistrer l'état en binaire.
Pour un objet masqué dans le viewport et dans le rendu on aurait 100100 (36), avec un masque de bit, on peut savoir rapidement quel switch est on ou off, ou alors une comparaison avec un numérique. Du style si ma valeur = 36 alors masquer dans les deux cas.
Cela permet aussi de ne faire qu'un accès au basecontainer de l'objet. (ça peut être important si on a plein d'objets)


Etant donné qu'on ne peut pas avoir deux états à la fois on peut même réduire à 4 bits vu qu'on a 3 états (ON, OFF, UNDEF) x 2, on utilise les deux premiers bits pour le rendu (00 = ON, 01 = OFF et 10 = UNDEF par exemple) et les deux autres pour l'éditeur (ce qui donne 0101 pour ton exemple).
Ce qui donnerait un truc du genre :
import c4d

def getStateBits(op):
flags = op.GetEditorMode()
flags <<= 2
flags += op.GetRenderMode()
return flags

def getEditorMode(flags):
return flags >> 2

def getRenderMode(flags):
return flags & 0b11

def main():
op = doc.GetActiveObject()
flags = getStateBits(op)
print getEditorMode(flags)
print getRenderMode(flags)

if __name__=='__main__':
main()

valkaari
15/08/2011, 16h37
ha vi pas con, voir il me semble que le champ a 3 valeurs, 0 undef, 1 on, 2 off. Ce qui correspond à 00, 01,10 en binaire.

L'avantage du binaire, c'est qu'on peut rajouter des bits pour les autres infos comme activation ou non de l'objet et des textures.

En mettant les masque de bits en variable, il devient assez facile de rajouter des bits pour tout type d'info.

xs_yann
15/08/2011, 21h35
ha vi pas con, voir il me semble que le champ a 3 valeurs, 0 undef, 1 on, 2 off. Ce qui correspond à 00, 01,10 en binaire.

Oui c'est comme ça que je m'en sert :

def getStateBits(op):
flags = op.GetEditorMode() # 00 ou 01 ou 10 (0, 1, 2)
flags <<= 2 # on décale de 2 bits : 0000 ou 0100 ou 1000
flags += op.GetRenderMode() # 0101, 1010, 0001, etc...
return flags

edit : j'en profite pour expliquer la suite pour ceux que ça interesse :
def getEditorMode(flags):
return flags >> 2 # on décale de 2 bits à droite ce qui nous donne le 00, 01, 10 (0, 1, 2) de gauche

def getRenderMode(flags):
return flags & 0b11 # on fait un 'et binaire' avec 0011 (0b11) et le flag (1001, 1000, 1010...) ce qui a pour résultat les deux bits de droite
# pour la notation 0bx ----> 0b101010 : 101010 est en base binaire, 0x2A : 2A est en base héxadecimale,
# 052 : 52 est en base octale, 42 : 42 est en base décimale

valkaari
16/08/2011, 00h16
Ha vi, j'avais pas pleinement fait attention à ton code :sweatdrop:

Sinon, en plus du décalage de bits, il faudrait rajouter une masque avant. Au cas ou plus tard, on rajoute un bit de poids fort pour une autre option.


Bon sinon, on a le principe technique, faudrait m'expliquer la réel utilité de cette commande pour stocker les états des objets. :sweatdrop:

Huv
16/08/2011, 13h16
Nickel pour le boulot realise :thumbup1:
dernier truc, si possible... lorsque les textures (AR) sont desactivées, je ne les ai effectivement pas au rendu...
ce qui n'est malheureusement pas le cas avec vray et ses textures... (bien sur, je pourrai passer par l'overide material de vray...
mais j'aimerai avoir cette possiblité supplémentaire avec Mr. vue...), en effet, les textures vray sont bien inactives a la vue, mais reapparaissent lors du rendu...
Merci :icon_smile:

EDIT : pas moyen d'y faire apparaitre les cloner Mograph ?

valkaari
16/08/2011, 14h45
En attendant que l'on intègre le fait que l'interface ne propose que les objets présent dans la scène active tu peux le rajouter en 8 étapes grâce à ce qui est sur la page précédente ^^
http://frenchcinema4d.fr/showthread.php?72980-MrVue-en-Python-1.03&p=966290&viewfull=1#post966290

Pour ce qui est de vray, je vois pas pourquoi vray serait capable de coller une texture sur une sélection qui n'existe pas. Le tag texture que ça soit vray ou pas est le même mais le moteur ne réagit pas de la même façon. Faut trouver une autre solution surement xD

Huv
16/08/2011, 15h30
tu peux le rajouter en 8 étapes grâce à ce qui est sur la page précédente
Tu me sur-estimes ! je suis bien incapable de faire ce genre de chose... deja le comprendre...
Je vais patienter :icon_mrgreen:

oli_d
17/08/2011, 08h49
Bon ben j'apprends plein de truc avec ce post, jusqu'à présent pour dire "mettre un masque de bit" je disais "sortir couvert" (ça c'est fait...)



Bon sinon, on a le principe technique, faudrait m'expliquer la réel utilité de cette commande pour stocker les états des objets. :sweatdrop:
C'était dans le cas ou tu veux faire des variantes dans ton document, dans le taf que je suis en train de faire j'ai 4 variantes de développement des arbres (version simplifiée, à la plantation, après 10 ans et après 30 ans), en plus je veux faire des vues avec ou sans les feuilles, donc pour ce genre de truc cela pourrait être pratique d'avoir pusieurs états (un peu comme les compositions de calques dans photoshop). Mais comme je l'ai déjà dit c'est quand même très vite réglé en utilisant des calques, donc pas vraiment nécessaire ....

Je continue à croire que le BaseContainer à identifiant unique avec plusieurs champs stockés reste plus simple ...

Mais en tout cas merci pour ces explications à tous les deux car car je ne connaissais vraiment pas.

Majoul
18/08/2011, 06h30
Hello tout le monde
Je suis étonné de voir que le plugin MrVue (baptiser à une certaine époque par Aurety) est toujours utiliser par certain.
Je suis toujours en vie mais par contre j’ai perdu mon ‘a’ en cour de route.
Comme vous tous je me suis penché sur la programmation en python, et j’ai commencé par réécrire quelque vieillerie tel que CamerAdjust
une video de la version actuelle.

http://www.youtube.com/watch?v=Reat5zIEvPo

oli_d
18/08/2011, 06h51
Wahou le retour de Monsieur Majoul !

Je suis vraiment super content d'avoir des nouvelles, et en plus à ce que je vois tu es toujours redoutable d'efficacité, vraiment génial ton CameraAdjust .

Et oui tes plugs restent très utilisés, on entend aussi régulièrement des gens qui recherchent Tuilegen !

Bienvenue à nouveau parmi nous !

clemz
18/08/2011, 10h59
haaa Majoul is aliiiiiive ! :) content de te revoir !

valkaari
18/08/2011, 14h24
Il a l'air super cool ton plug là. J'espères que tu nous en veux pas d'avoir reconstruit MrVue.

Tient, si t'as un bout de code pour ton menu contextuel, ça m'intéresse ^^

xs_yann
18/08/2011, 22h56
Le grand Majoul est de retour, ça promet. :thumbup1:

J'ai ajouté la liste d'objet dynamique et la sauvegarde d'état (editeur/rendu).
J'ai touché un petit peu à tout dans le code, j'ai essayé de factoriser un peu avec ce principe :


# dans le command
if id == IDC_FOO:
self._SetAllObjectsName() # pour l'exemple
...
# les méthodes

def _DoOnHierarchy(function)
#applique la fonction sur tous les objets de la hierarchie (appel function(op))

def _SetAllObjectsName():
self._DoOnHierarchy(self._SetOneObjectName)

def _SetOneObjectName(op):
op.SetName("toto")


J'ai fait le stockage des états sous la forme :

bc = op[BC_STATE_ID]
bc[0] = "StateName"
bc[1] = 1001 # (voir post plus haut)
bc[2] = "Another state"
bc[3] = 1111
etc....


Le reste est normalement assez compréhensible avec les noms de fonctions, n'hésitez pas à me demander des explications.

S'il y a des choses qui ne fonctionnent plus comme avant dites le moi, et val si j'ai supprimé des trucs dans le code que tu voulais garder n'hésite pas à les remettre.

Il faudrait faire la sauvegarde des textures on/off et du generator flag, faire le refresh automatique des listes dynamique, et peut-être mettre la fonction de sauvegarde dans un nouvel onglet. :icon_artist:

valkaari
18/08/2011, 23h46
j'aime bien ton "un peu" ^^

J'ai regardé ultra méga rapidos, et testé à peu près à la même vitesse. J'ai modifié le premier post pour ajouter cette version.

Pour Vray, il semblerait que en plus de la modification de la sélection, l'ajout d'un tag texture (même vide) soit obligatoire pour désactiver la texture.

edit :
Pour le refresh automatique, il y a peut être un ID à récup via la fonction message. (surement même)

Huv
19/08/2011, 12h15
La desactivation des textures fonctionne bien sur la derniere version (vray y compris), desactivation des cloneurs, top aussi, mais...
au moment de la desactivation des objets, si les objets en question sont des primitives non edites, tout disparait... :icon_redface:

valkaari
19/08/2011, 14h36
La desactivation des textures fonctionne bien sur la derniere version (vray y compris), desactivation des cloneurs, top aussi, mais...
au moment de la desactivation des objets, si les objets en question sont des primitives non edites, tout disparait... :icon_redface:

Tant mieux, je vois pas ce que yann a rajouté par contre pour que ça fonctionne :icon_redface: Help !!
Pour les primitives, ça me semble normal qu'elle disparaisse quand tu la désactives.

Par contre, pour le tag texture et la gestion du champ sélection, il faut bien faire un replace systématiquement pour éviter qu'elle se retrouve en double. (ce qui était le cas sur les versions précédentes histoire d'être propre)

Huv
19/08/2011, 15h04
Pour les primitives, ça me semble normal qu'elle disparaisse quand tu la désactives
Ben non... le principe de Mr vue est de desactiver les hn, les cloneurs (sur cette nouvelle version), les sysmetries, etc... en aucun cas l'objet de base, en tout cas sur la version "normal" (compatible R11), les primitives restent apparente.

xs_yann
19/08/2011, 15h15
Pour Vray, il semblerait que en plus de la modification de la sélection, l'ajout d'un tag texture (même vide) soit obligatoire pour désactiver la texture.

J'en suis arrivé à la même conclusion.



Pour le refresh automatique, il y a peut être un ID à récup via la fonction message. (surement même)

Je pense aussi, il faut juste faire en sorte que le refresh ne soit fait que quand c'est nécessaire histoire que ça ne soit pas trop lourd.



Par contre, pour le tag texture et la gestion du champ sélection, il faut bien faire un replace systématiquement pour éviter qu'elle se retrouve en double. (ce qui était le cas sur les versions précédentes histoire d'être propre)

J'ai vu ça mais je me suis dis que ça ne posait pas de problème vu qu'elles sont toutes supprimées en mode off. De toute façon c'est pas grand chose, faudra juste que celui qui fait la prochaine version pense à le rajouter. ;)



Tant mieux, je vois pas ce que yann a rajouté par contre pour que ça fonctionne :icon_redface: Help !!
Moi non plus. :icon_mrgreen:

@ Huv : Tu es sûr que tu as bien testé avec VrayBridge comme moteur de rendu ?



Ben non... le principe de Mr vue est de desactiver les hn, les cloneurs (sur cette nouvelle version), les sysmetries, etc... en aucun cas l'objet de base, en tout cas sur la version "normal" (compatible R11), les primitives restent apparente.

Mais si tu ne veux pas désactiver les primitives, il suffit de ne pas cocher la case, non ?
La liste dynamique affiche tous les objets qui possèdent un generator flag.

Huv
19/08/2011, 15h23
@ Huv : Tu es sûr que tu as bien testé avec VrayBridge comme moteur de rendu ?
Haha, ben oui, quand meme... :icon_mrgreen:




Mais si tu ne veux pas désactiver les primitives, il suffit de ne pas cocher la case, non ?
Effectivement :icon_redface: mais avec l'habitude de bosser avec Mr vue en R11, je fais systematiquement "tout coché" et je desactives...

Vee
22/08/2011, 14h51
Dites, on a une jolie section "Plugins (http://frenchcinema4d.fr/downloads.php?do=cat&id=3)" dans la partie "Téléchargements", ce serait bien d'y proposer Mr Vue en Python, non ?
Valouchon chéri ?

Vcyrille
22/08/2011, 15h00
Pas en cours de développement Vee. :P

Vee
22/08/2011, 15h07
Oui, et on peut aussi considérer que des amélioration lui seront apportées pendant encore 5 ans et qu'il ne sera jamais définitif.
Le plugin est fonctionnel. Il suffit de le remplacer dans la section téléchargement quand une modif y est apportée.
Le but c'est de le rendre accessible à un maximum d'utilisateurs... plutôt que de le laisser vivoter ici, confidentiellement.

valkaari
22/08/2011, 15h23
Faudrait juste que l'on soit certain qu'il fonctionne bien avec vray pour la désactivation des textures. Comme disait Yann, peut être mettre la sauvegarde des états sur un autre onglet.

Après ça, on pourra considérer qu'il est distribuable y compris sur les autres forum.

actarus
24/08/2011, 11h11
Hello tout le monde
Je suis étonné de voir que le plugin MrVue (baptiser à une certaine époque par Aurety) est toujours utiliser par certain.
Je suis toujours en vie mais par contre j’ai perdu mon ‘a’ en cour de route.
Comme vous tous je me suis penché sur la programmation en python, et j’ai commencé par réécrire quelque vieillerie tel que CamerAdjust
une video de la version actuelle.

http://www.youtube.com/watch?v=Reat5zIEvPo

Bonjour Majoul,
juste pour te signaler que la maj de "camera adjust" m'intéresse, et je pense ne pas être le seul; donc n'hésites pas à nous en dire plus!

Vcyrille
24/08/2011, 22h39
c'est clair que tu n'es pas le seul, en fait tout les ptits gars qui font des insertions sont intéressés :icon_love:

Huv
30/08/2011, 15h54
Moyen que MrVue prennent aussi en compte les loupiottes ? :whistling:

lenogre
30/08/2011, 17h02
Pour les lampes, je verrais plutôt un autre plugin style LightManager qui a eu existé en v8.

Content de voir que Majoul bouge encore (OptiConnect marche tjs et j'en suis très content)

Quant aux autres furieux de la ligne de code, il y a une certaine poésie à vous lire. Incompréhensible mais onirique.

valkaari
31/08/2011, 01h44
Moyen que MrVue prennent aussi en compte les loupiottes ? :whistling:


tu veux désactiver d'un coup toutes les lumières de la scène ?

Huv
31/08/2011, 10h26
tu veux désactiver d'un coup toutes les lumières de la scène ?
Yes, sans passer par un enieme plugin (d'ou l'idee avec Mr vue), ou sans etre oblige de mettre les objets en "arborescence simple" et ensuite de desactiver les dossiers, instances, pour les retrouver... :icon_smile:

oli_d
31/08/2011, 13h13
Mais c'est déjà possible, à moins que je n'aie pas compris le problème ...

Majoul
31/08/2011, 18h32
J’aivais déjà pensé il y a quelque année à une nouvelle conception du plugin MrVue, plus souple pour l’utilisateur, en gardant tout simplement le même esprit que la liste d’objet C4d. Objet / propriété
2 type d’objet : objet global et objet dossier où les tags sont des filtres (lumiére, HN, instances ……….)
Avec le coffee j’aivais trouvé beaucoup de difficultés pour pouvoir le réaliser.
Je pense que si je le réécris en python j’arriverais à terme de mon idée.

Voici une video qui illustre l’idée déjà poster sur le forum et datant de 5 an.


http://www.youtube.com/watch?v=UvKHGUZNIes

Sir Gong
31/08/2011, 18h55
Majoul, je t'ai remis ton "a", quelqu'un avait du le planquer pour faire une blague.

Majoul
31/08/2011, 19h10
Majoul, je t'ai remis ton "a", quelqu'un avait du le planquer pour faire une blague.


C’est une blague Orange, si tu résilie ton contrat chez eux, c’est ton mail qui est planqué chez les disparus. Mail disparut membre à l’oubliette.

valkaari
31/08/2011, 21h11
ha ouais spa mal ton truc là ^^

Mais du coup, tu comptes le faire, le vendre, le mettre à disposition, ou tu veux qu'on continu sur le principe de faire un plug collectif ?

Huv
01/09/2011, 17h24
Mais c'est déjà possible, à moins que je n'aie pas compris le problème ...
Ah ? a part si tu as mis tes loupiottes sur un calque au debut du projet.... sinon, je veux bien l'astuce... :icon_smile:

lenogre
06/09/2011, 01h06
pour Huv (et les autres MAIS UNIQUEMENT SUR MAC), un plugin python qui liste les lumières d'une scène :

http://adamswaab.wordpress.com/2010/02/19/light-lister-for-c4d-v11-mac-only/

oli_d
06/09/2011, 09h17
Ah ? a part si tu as mis tes loupiottes sur un calque au debut du projet.... sinon, je veux bien l'astuce... :icon_smile:

Je disais simplement que c'est déjà possible dans MrVue dans l'onglet On-Off, tu coches Tous les objets puis Lumière et clic sur le bouton Désactivé.

Huv
06/09/2011, 10h45
Effectivement...
Merci lenogre :icon_smile:

lenogre
06/09/2011, 11h25
En fait, hier, je viens de découvrir que certains plugs étaient accessibles dans le menu Python et non plus dans le menu Plugins. LightLister en faisait partie...

Majoul
13/09/2011, 00h54
ha ouais spa mal ton truc là ^^
Mais du coup, tu comptes le faire, le vendre, le mettre à disposition, ou tu veux qu'on continu sur le principe de faire un plug collectif ?

Vue que c4d dispose maintenant des calques, Mr Vue devient un plugin secondaire de mon point de vue personnel.


Bonjour Majoul,
juste pour te signaler que la maj de "camera adjust" m'intéresse, et je pense ne pas être le seul; donc n'hésites pas à nous en dire plus!

Si je le finalise avant le passage du père noël, je l’emballerais dans un joli papier cadeau .

actarus
17/09/2011, 09h49
Vue que c4d dispose maintenant des calques, Mr Vue devient un plugin secondaire de mon point de vue personnel.



Si je le finalise avant le passage du père noël, je l’emballerais dans un joli papier cadeau .
:thumbup1: