Forum : 7 - Développer/traduire/documenter/annoncer une application

problème graphique de création des boutons (knob)

pierrotlo utilisateur non connecté Suisse
Salut tous,

j'ai développé un script-fu Gimp pour la création de boutons rotatifs.

Souvent on développe le logiciel, ce qui est déjà un gros truc, mais en plus il faut veiller à ce que le logiciel aie un look. (c'est important le look chez les jeunes.)

Bref je me suis basés sur les boutons de calf ou de phasex (réseau d'images) et j'ai développé un script pour gimp qui facilite pas la choses. 15 minutes dès que l'on a l'image de base.

SWi ça intéresse du monde, faites le moi savoir. je vous l'envoi par mail. Il suffit de créer le bouton dans un canvas carré sous gimp et de lancer le script.


On peut soit vouloir la rotation du curseur soit créer le réseau de la couronne immobile et ça roule. A la fin du script, il fusionne tous les calques.

Voilà le script, à copier dans le répertoire caché .gimp.../script de votre home avec l'extension .scm

Pierrotlo

;  Rotator
;   Rotates the selected layer with a given angle, creating new layers for each step
;   Based on the ani-rotate script made by Eric Coutier.

(define (script-fu-rotator img inLayer inTotAngle inIncCount  rot )
	(let* 
      (
      (pi 3.141592654)

	  ;duplicate the original image
	  (img (car (gimp-channel-ops-duplicate img)))  
	  (width (car (gimp-image-width img)))
	  (offsetx (car (gimp-image-width img)))
	  (height (car (gimp-image-height img)))
	  (centerx (/ width 2))
	  (centery (/ height 2))
	  (srcLayer (car (gimp-image-get-active-layer img)))
	  (layers (car(cdr (gimp-image-get-layers img))))
	  (nLayers (car (gimp-image-get-layers img)))
      (i 0)
	  (layer 0)
	  (layerpos 0)
	  (counter 0)
	  (a 0)
	  (inc (/ inTotAngle inIncCount))
	  (aRad 0)
	  (newLayer 0)
      (whiteLayer 0)
      (resLayer 0)
	  )
	  ;(set! offsety 0)
	;it begins here
	(gimp-undo-push-group-start img)
	
	;hide all layers
	(while (< i nLayers)
	  (set! layer (aref layers i))
	  (gimp-layer-set-visible layer 0)
	  (set! i (+ i 1))
	)
	;Agrandi le canvas à la taille du réseau d'image
	(gimp-image-resize img (* offsetx inIncCount) height 0 0)
	;do the frames
	(while (< counter inIncCount)
		(set! aRad (* (/ a 180) pi))
		(set! newLayer (car (gimp-layer-copy srcLayer FALSE)))
		(set! layerpos (+ layerpos 1))
		(gimp-image-add-layer img newLayer 0)
		
		(gimp-layer-set-visible newLayer TRUE)

		;Par défaut l'axe de rotation se trouve au centre. Division de la largeur et hauteur par 2.
		(if (equal? centerx 0)
		  (set! centerx (/ width 2))
		)
		(if (equal? centery 0)
		  (set! centery (/ height 2))
		)
		(set! centery (/ height 2))
                ;rotates the new layer
                ;Si la case à cocher est à TRUE, il effectue la rotation du calque, sinon il le laisse tel quel.
                (if (equal? rot TRUE)
               
		;(gimp-rotate newLayer TRUE aRad) fonction obsolète remplacée par une nouvelle
		(gimp-item-transform-rotate newLayer aRad FALSE centerx centery)
		)
		;add background layer
		(set! whiteLayer (car (gimp-layer-new img width height 1 "rotation layer" 100 0)))
		(gimp-image-add-layer img whiteLayer 0)
		(gimp-layer-set-visible whiteLayer TRUE)
		(gimp-selection-all img)
		(gimp-edit-clear whiteLayer)
		(gimp-selection-none img)

		(set! resLayer (car (gimp-image-merge-visible-layers img 1)))
		
					
				
		
 
    	
    	
    	
		(gimp-layer-set-visible resLayer FALSE)

		(set! a (+ a inc))
		(set! counter (+ counter 1))
	)

	(gimp-image-remove-layer img srcLayer)

	;ordonne la position des claques en commençant par la fin (sinon ils sont inversés) + tous les calques visibles 
	(set! layers (car(cdr (gimp-image-get-layers img))))
	
	(set! nLayers (car (gimp-image-get-layers img)))
	(set! i 0)
	(set! layerpos (- (* offsetx inIncCount) offsetx))
	(while (< i nLayers)
		(set! layer (aref layers i))
		
		(gimp-layer-translate (aref layers i) layerpos 0)
		(gimp-layer-set-visible layer 1)
		
		(set! i (+ i 1))
		(set! layerpos (- layerpos offsetx ))
	)
	
	;(gimp-image-merge-visible-layers img EXPAND-AS-NECESSARY)
	;it ends here
	(gimp-image-merge-visible-layers img 0)
	(gimp-undo-push-group-end img)
	(gimp-display-new img)
    )
    
)

(script-fu-register "script-fu-rotator"
		    "/Script-Fu/Transforms/Knob Rotator..."
		    "Rotates the selected layer with a given angle, creating new layers for each step"
		    "Joacim Breiler 2006-09-23"
		    "Pierre Lo Ciceror"
		    "2013 V 1.1"
		    ""
		    SF-IMAGE "image" 0
		    SF-DRAWABLE "drawable" 0
		    SF-ADJUSTMENT "total angle" '(360 0 360 1 10  0 0)
		    SF-ADJUSTMENT "inc number" '(15 2 360 1 2  0 1)
		    ;SF-ADJUSTMENT "Déplacement du calque en x" '(0 -9999 9999 1 10 0 1)		    
 		    ;SF-ADJUSTMENT "Déplacement du calque en  y" '(0 -9999 9999 1 10 0 1)
 		    SF-TOGGLE "Rotation ?"  FALSE
 		     ;SF-ADJUSTMENT "Center X" '(0 -99999 99999 1 10 0 1)
 		      ;SF-ADJUSTMENT "Center Y" '(0 -99999 99999 1 10 0 1)
 		   
		    ;SF-TOGGLE "vertical" FALSE
		    ;SF-TOGGLE "add background to each frame" TRUE
		    ;SF-TOGGLE "flatten before anim" TRUE
)


Samuel utilisateur non connecté Allemagne
Salut,

je comprends pas tout, j'ai copié le script dans le répertoire des scripts, mais je ne le vois pas dans gimp.

Tu peux détailler comment faire s'il te plait ?

pierrotlo utilisateur non connecté Suisse
Salut Samuel,

donc tu copie le fichier dans :
/home/utilisateur/.gimp-2.8/scripts/

N'oublie pas de mettre l'extension :
nomdefichier.scm

le .gimp-2.8 est valable pour moi, mais tu peux avoir autre chose dépendant de la version de gimp que tu utilises.

Si ton gimp est déjà ouvert il faut que tu ailles dans :
Filtres->Script-fu->Actualiser les scripts


Ensuite tu as un menus Script-fu->Transform->Knob Rotator

Je t'envoie ici le dessin d'un bouton que tu peux utiliser
Image Image
Le premier c'est le bouton qui va tourner, donc tu coche la rotation dans la boite de dialogue
Le second c'est la couronne immobile, donc il faut décocher (par défaut) la rotation.
Ensuite une fois que cela est fait, tu obtient pour chacun d'eux le réseau. Tu fais le copier coller d'une image sur l'autre et si ton dessin est précis, le bouton central tourne, la couronne reste immobile. Pour Phasex par exemple tu enregistres en png avec transparence sous le nom : knob-60x60.png et tu le copie dans :
/usr/share/phasex/pixmaps/Dark/

Si tu testes, donne moi un feedback et ce qu'il serait bien d'ajouter. J'ai quelques idées


pierrotlo utilisateur non connecté Suisse
L'idée serait aussi et dans la foulée de pondre automatiquement un code en C++ ou en C Gtk ou Qt qui permette d'avoir des widgets directement utilisable.

Mais voilà, mes expériences de C++ et de C remontent à loin, et je ne connais pas Gtk ou Qt. Si tu connais quelqu'un qui pourrait me tuyauter.


pierrotlo utilisateur non connecté Suisse
J'ai essayé avec zynaddsubfx à l'aide d'un bouton trouvé sur le net et retouché.

Image
Image
Image
A gauche la version normale et à droite la version avec les bouton modifiés et plus à droite, un peu moins brouillons.

Bon je ne suis pas graphiste.


Samuel utilisateur non connecté Allemagne
T'es pas graphiste mais le résultat est super.

par contre le script n'apparait pas chez moi. Dans le menu filtres>script-fu, j'ai console, actualiser et démarrer le serveur.
Le fichier est bien dans ~.gimp2.8/scripts avec l'extension .scm
Le chemin est bien répertorié, j'ai un autre script qui apparait et fonctionne. Est ce possible que le menu transform (qui n'apparait pas chez moi) soit la cause ?


pierrotlo utilisateur non connecté Suisse
Salut Camuel,

non, non ce n'est pas dans le menu Filtre, mais dans le menu Script-fu
Image

Pour ZynAddSubFx, j'en ai fait une autre version plus propre (C'est la nouvelle version de Zyn basée sur ntk au lieu de lftk que j'ai compilée hier):
Image


Samuel utilisateur non connecté Allemagne
Ok, merci.
Le menu script-fu n'apparait pas chez moi, va falloir que je cherche ce qui se passe. Bizarre quand meme.

je te tiens au courant


pierrotlo utilisateur non connecté Suisse
Tu as quelle version ?
Je pose la question quoique, normalement cela devrait fonctionner sur presque toutes.
Est-ce que dans le menu filtre tu as un sous-menu Script-fu ?