récupérer les paramètres d'une fonction(gimp python)

Pour tous ceux qui veulent aller plus plus dans les aspects techniques de Gimp.

Modérateur : Ze Techos

Répondre
Avatar de l’utilisateur
michelk
Fou du clic droit
Messages : 94
Inscription : sam. mars 08, 2008 7:37 pm
Localisation : Mars

récupérer les paramètres d'une fonction(gimp python)

Message par michelk » ven. mars 28, 2008 5:13 pm

Bonjour à tous,

je cherche un moyen de récupérer les valeurs de paramètres d'un plugin entrées par l'utilisateur.
Du style:

Code : Tout sélectionner

code...
filtre=pdb.plug_in_plasma( Image,Layer,1,1,run_mode=0) #filtre plasma
recup= pdb.recup_de_parametres(filtre)#c'est cette fonction que je cherche
code...
Existe-t-il un moyen?


D'avance merci,

Michel.

passager
Jeune loup
Messages : 13
Inscription : mar. mars 11, 2008 10:09 pm

Message par passager » sam. mars 29, 2008 12:16 am

il est possible de faire :

pdb.plug_in_plasma( Image,Layer,1,1,run_mode=RUN_WITH_LAST_VAL)
l'équivalent de Ctrl + F dans le menu filtres

sinon il existe
s = gimp.get_data("plug_in_plasma")
gimpshelf.shelf["plug-in-plasma"]


il doit manquer quelque chose, gimpshelf.shelf["plug-in-plasma"] me retourne toujours des erreurs ?? :roll:

@+
edit
s = gimp.get_data("plug_in_plasma")
germe, arg2, turbulence, arg3, arg4 = unpack('LLdLL', s)

gimpshelf.shelf ne sert que pour les plug-ins python
!! si j'ai bien compris !!
pas encore trouvé comment "unpacker" data de manière certaine
(pour plasma, un peu de tâtonnements ...)

faut juste trouver comment gimp pack les datas .........

passager
Jeune loup
Messages : 13
Inscription : mar. mars 11, 2008 10:09 pm

Message par passager » sam. mars 29, 2008 3:35 pm

il semblerait qu'il suffit de regarder dans la pdb quels type d'arguments sont attendu par le plugin et "d'unpacker" selon
par ex pour "plug-in-despeckle" qui attend quatre INT32 (radius, type, black, white)
argsVal = gimp.get_data("plug-in-despeckle")
radius, type, black, white = unpack('LLLL', argsVal)

on retrouve les valeurs entrées par l'utilisateur

voir l'aide de python sur pack/unpack pour les correspondances entre types de gimp (du C je suppose) et les types de Python

passager
Jeune loup
Messages : 13
Inscription : mar. mars 11, 2008 10:09 pm

Message par passager » sam. mars 29, 2008 5:11 pm

il semblerait que tout ne soit pas aussi "simple"
les valeurs retournées ne sont pas forcément dans le même ordre
pour "plug-in-sinus" par ex.
il faut utiliser unpack('dddLLLLLLLddddddddd', argsVal) et non pas
unpack('dddLLLLddddddddLdLL', argsVal) comme on pourrait le supposer

n'y aurait-il pas un moyen plus sûr ?

Avatar de l’utilisateur
michelk
Fou du clic droit
Messages : 94
Inscription : sam. mars 08, 2008 7:37 pm
Localisation : Mars

Message par michelk » dim. mars 30, 2008 9:49 am

Merci pour les réponses,
Est-ce que tu aurais un exemple facile(je suis tout débutant)
J'ai essayé tes solutions, mais chez moi ça n'affiche rien. Je ne sais pas comment les utiliser et je ne les trouve pas dans la pdb. En fait, ce que je voudrais, c'est récupérer les paramètres sous forme de liste ou de variables pour les écrire ensuite dans un fichier et pouvoir les réutiliser.
L'exemple suivant ne fonctionne évidemment pas, c'est juste pour montrer le genre de code que je recherche

Code : Tout sélectionner

 def python_fu_essai_getData():
    new_image = gimp.Image(300, 400, RGB ) #Nouvelle image
    new_layer = gimp.Layer(new_image, "calque", 300, 100, RGB, 100, NORMAL_MODE) #nouveau calque
    new_image.add_layer(new_layer, 0) #On ajoute le calque
    ecrire=pdb.plug_in_plasma( new_image,new_layer,1,1) #filtre plasma
    Fichier = open('C:\Documents and Settings\michel\Mes documents\gimp\python\Monfichier.txt','a')
    Fichier.write(str(ecrire))#ecrit None dans le fichier
    Fichier.close()
    gimp.Display( new_image ) #affichage de l'image
Comment puis-je faire?

Merci,
Michel.

passager
Jeune loup
Messages : 13
Inscription : mar. mars 11, 2008 10:09 pm

Message par passager » dim. mars 30, 2008 7:57 pm

mis à part "plug_in_plasma", le reste ne se trouve pas dans la pdb
soit dans gimpfu : gimp.get_data()
soit du pur python : pack/unpack (il faut faire "from struct import *" pour les rendre accessibles dans le script

from gimpfu import *
from struct import *

...code ...
(l'utilisateur doit utiliser au moins une fois le plug-in-plasma) :P
pdb.plug_in_plasma( new_image,new_layer,1,1, run_mode = 0)

str = gimp.get_data("plug_in_plasma")
seed, arg1, turbulence, aleatoire, arg2 = unpack('LLdLL', str)

on récupère dans les variables "seed" et "turbulence" (éventuellement "aleatoire", pour les autres - "arg1" et "arg2" nous atteignons mes limites...) les valeurs entrées par l'utilisateur
si tu préfère une liste :
liste_retour = unpack('LLdLL', str)

tu peux les manipuler ensuite à ta guise,

Code : Tout sélectionner

def python_fu_essai_getData():
    new_image = gimp.Image(300, 400, RGB ) #Nouvelle image
    new_layer = gimp.Layer(new_image, "calque", 300, 100, RGB, 100, NORMAL_MODE) #nouveau calque
    new_image.add_layer(new_layer, 0) #On ajoute le calque
    pdb.plug_in_plasma( new_image,new_layer,1,1, run_mode = 0) #filtre plasma
    
    str = gimp.get_data("plug_in_plasma")
    seed, arg1, turbulence, aleatoire, arg2 = unpack('LLdLL', str)
    
    Fichier = open('C:\Documents and Settings\michel\Mes documents\gimp\python\Monfichier.txt','a')
    Fichier.write("seed : %d, turbulence : %f\n" %(seed, turbulence))
    Fichier.close()
    gimp.Display( new_image ) #affichage de l'image 
@+

Avatar de l’utilisateur
michelk
Fou du clic droit
Messages : 94
Inscription : sam. mars 08, 2008 7:37 pm
Localisation : Mars

Message par michelk » lun. mars 31, 2008 9:46 am

Génial, merci beaucoup!

:D :D :D :D :D
:D :D :D :D :D
:D :D :D :D :D
:D :D :D :D :D
:D :D :D :D :D
:D :D :D :D :D

Michel.

Avatar de l’utilisateur
michelk
Fou du clic droit
Messages : 94
Inscription : sam. mars 08, 2008 7:37 pm
Localisation : Mars

Message par michelk » lun. mars 31, 2008 9:49 pm

Le problème, maintenant, c'est que je n'arrive plus à récupérer mes variable.
J'ai essayé avec le module pickle, mais je n'y parviens pas. :?: :?: :?:

Comment faut-il faire?

passager
Jeune loup
Messages : 13
Inscription : mar. mars 11, 2008 10:09 pm

Message par passager » mar. avr. 01, 2008 3:45 pm

il faut formater les données de telle façon à pouvoir les récupérer ensuite
plusieurs façons de faire, en voici une mais c'est un peu l'artillerie lourde pour écraser une mouche, je pense
l'avantage est que c'est directement lisible par un humain (avec pickle, je ne crois pas ?)
avec le module xml.dom.minidom

écrire les données

Code : Tout sélectionner

from xml.dom.minidom import *

impl = getDOMImplementation()

doc = impl.createDocument(None, "plug-in-plasma", None)
top_element = doc.documentElement

seed = doc.createElement("seed")
val1 = doc.createTextNode("3")
seed.appendChild(val1)
top_element.appendChild(seed)

turb = doc.createElement("turbulence")
val2 = doc.createTextNode("1.2658")
turb.appendChild(val2)
top_element.appendChild(turb)

f = open("C:\Documents and Settings\michel\Mes documents\gimp\python\MesData.xml", "wb")
doc.writexml(f, newl="\n")
doc.unlink()
f.close()
les récupérer

Code : Tout sélectionner

from xml.dom.minidom import parse

dom1 = parse("C:\Documents and Settings\michel\Mes documents\gimp\python\MesData.xml")

for node in dom1.getElementsByTagName('seed'):
	print node.firstChild.data

for node in dom1.getElementsByTagName('turbulence'):
	print node.childNodes[0].data
prendre garde de transformer les données récupérées (string) dans le bon type
turbulence en float, seed en int

je me suis inspiré du chapitre 9 de "Dive into python"

@+

Avatar de l’utilisateur
michelk
Fou du clic droit
Messages : 94
Inscription : sam. mars 08, 2008 7:37 pm
Localisation : Mars

Message par michelk » mar. avr. 01, 2008 11:34 pm

Merci pour la réponse,
Honnêtement, je n'y comprend pas grand chose, ce n'est pas vraiment de mon niveau et je ne connais rien en xml.
J'ai essayé avec pickle, mais je n'y arrive pas non plus.
J'ai essayé sur un exemple simple(en dehors de gimp), mais je ne sais pas comment récupérer mes variables:

Code : Tout sélectionner

from pickle import *
f=open('fichier.txt','w')
x='Hello!'
Pickler(f).dump(x)

écrit ceci dans mon fichier:

Code : Tout sélectionner

S'Hello!'
p0
.
Sur des tuto j'ai aussi vu ça:
pickle.dump(x, f) me renvoie une erreur
x = pickle.load(f) aussi.

Bref, je ne comprends pas du tout comment ça fonctionne.

Merci pour les réponses,

Michel.

Avatar de l’utilisateur
michelk
Fou du clic droit
Messages : 94
Inscription : sam. mars 08, 2008 7:37 pm
Localisation : Mars

Message par michelk » mer. avr. 02, 2008 5:22 pm

Finalement, j'ai réussi à faire fonctionner pickle
envoi:

Code : Tout sélectionner

import pickle
f=open('fichier.txt','a')
a=5
b=10
Rx= pickle.dump(a,f)
Ry=pickle.dump(b,f)
f.close
réception:

Code : Tout sélectionner

import pickle

f=open('fichier.txt','r')
a= pickle.load(f)
b= pickle.load(f)
print a #renvoie 5
print b #renvoie 10
print a+b#renvoie 15
pickle.load(f) lit une variable à la fois et passe à la suivante lors d'un nouvel appel.
Ca fonctionne, mais ça suppose de connaître le nombre de variables contenues dans un ficher et l'ordre dans lequel elles sont disposées. Pas très pratique, surtout si on a beaucoup de variables!

passager
Jeune loup
Messages : 13
Inscription : mar. mars 11, 2008 10:09 pm

Message par passager » mer. avr. 02, 2008 7:14 pm

et tout simplement :D
pdb.gimp_gimprc_set("plug-in-plasma_seed", "3")

value = int(pdb.gimp_gimprc_query("plug-in-plasma_seed"))
etc...

@+

Répondre