(1) 2 »


Comment créer un script sur Blender ?
OverdOzed
Inscrit:
25/09/2011 16:56
De RODEZ
Post(s): 307
Bonjour à tous,

Je me suis lancer dans le scripting Blender.

Pour cette raison je voulais partager certain liens qui m'ont permis de démarrer sur des bases un peu plus solide.

Avant de s'attaquer à l'API sur le site de Blender qui est par moment décourageante commencez par aller sur ces liens :

Vous allez perdre une heure de votre vie avec ce lien mais vous allez en contre partie gagner un temps précieux dans l'utilisation du scripting --> Introduction au scripting Blender

Celui-ci pour un scripting de menu simple --> Créer un menu personnalisé

Ici comment importer d'autres librairie Python et interagir avec les objets Blender --> Assigner un material aléatoirement

Ici comment convertir un script en Add-ons --> Py2Add-ons

Bien entendu l'API Blender -->API Blender Python 2.59/2.60

Si vous voyez d'autres liens intéressants n'hésitez pas à les poster.

Bon blend à tous.

Contribution le : 06/11/2011 14:59
_________________
Le SHADERTOOLS NG:
- Github:ici
- FTP:ici
Créer un fichier PDF de la contribution Imprimer


Re: Comment créer un script sur Blender ?
OverdOzed
Inscrit:
08/11/2011 06:41
Post(s): 324
Salut Tinangel !
Je n'avais pas vu ce topic .
Très utile pour moi , et pour t'aider sur la ligne ( les lignes ... ) du front .

Si je trouve des infos utiles , je posterai ici .

Contribution le : 20/11/2011 14:46
Créer un fichier PDF de la contribution Imprimer


Re: Comment créer un script sur Blender ?
RegulatorZ
Inscrit:
01/07/2005 17:05
De Guyane francaise dans la jungeul
Post(s): 10993
Salut Tinangel, j'ai mis une agrafe sur ton post,
merci pour ses infos au niveau du forum "Python & Plugins".
++

Contribution le : 20/11/2011 16:23
Créer un fichier PDF de la contribution Imprimer


Re: Comment créer un script sur Blender ?
OverdOzed
Inscrit:
25/09/2011 16:56
De RODEZ
Post(s): 307
Avec plaisir.

Si je peux aider

++

Contribution le : 20/11/2011 19:52
_________________
Le SHADERTOOLS NG:
- Github:ici
- FTP:ici
Créer un fichier PDF de la contribution Imprimer


Re: Comment créer un script sur Blender ?
Fou Furieux du Clan
Inscrit:
27/09/2010 07:26
De On a été allemand autrefois!
Post(s): 113
Sympa ce shadertool, m'en vais me l'installer rapidement

Contribution le : 09/02/2012 12:02
_________________
Utilisateur et fan de depuis 1996!
Mes blends "montrables" sur Blendswap, Ma Galerie BlenderClan
Créer un fichier PDF de la contribution Imprimer


Re: Comment créer un script sur Blender ?
OverdOzed
Inscrit:
25/09/2011 16:56
De RODEZ
Post(s): 307
Salut,

Je me permet d'un moment de calme au boulot pour vous permettre d'organsier vos futurs scripts :

Voici les infos que vous devez placer dans l'entête :

******************************************************
bl_info = {
    "name": "ShaderTools Next Gen", #Nom du script
    "author": "GRETETE Karim (Tinangel)", #L'auteur du script
    "version": (0, 8, 5), #La version
    "blender": (2, 6, 0), #La version de blender
    "api": 41098, #La version de l'api utilisé (vous l'avez dans la Splash Screen au démarrage de Blender
    "location": "User Preferences", #Le panneau dans lequel est l'add-on est accessible/activable ici les Préférences Utilisateurs 
    "description": "Shader tools for blender", #Une description de l'add-on
    "warning": "Alpha version", #Permet de prévenir d'une chose importante. Ici le fait que ce soit une version Alpha et par conséquent non aboutie.
    "wiki_url": "http://noadress", #L'adresse du wiki/site/aide
    "tracker_url": "", #Il me semble que dans cette zone on peut préciser le SVN/Github ou autre. La communauté me reprendra surement car j'avoue avoir un doute sur cette option. 
    "support": 'COMMUNITY',#Ici c'est le type de support. Par défaut mettez COMMUNITY et je vous souhaite qu'ils prennent le statut d'OFFICIAL.
    "category": "System", #La catégorie dans laquelle votre script sera activable. Ici c'est la rubrique SYSTEM. 
}

******************************************************


******************************************************
Petite "astuce" pour la structure de vos scripts. Pour vous permettre de structurer au mieux votre travail (notamment lorsque vos scripts deviennent volumineux de créer ce que je vais appeler des sous-scripts (ou vos propres bibliothèques):

- Dans notre exemple nous disposons d'un répertoire contenant nos fichiers :
--> le dossier se nomme "shader_tools_ng" (du nom du dossier de l'add-on)

- Puis à l'intérieur nous disposons d'un fichier qui équivaut à la "racine" de notre script ou si vous préférez, le fichier qui sera éxécuter en premier:
--> ce fichier se nomme "__init__.py"

Au lancement du script c'est lui qui sera exécuter en premier. Voilà ce que contient pour le moment notre fichier :
bl_info = {
    "name": "ShaderTools Next Gen",
    "author": "GRETETE Karim (Tinangel)",
    "version": (0, 8, 5),
    "blender": (2, 6, 0),
    "api": 41098,
    "location": "User Preferences",
    "description": "Shader tools for blender",
    "warning": "Alpha version",
    "wiki_url": "http://noadress",
    "tracker_url": "",
    "support": 'COMMUNITY',
    "category": "System",
}

import bpy #Ici c'est la bibliothèque principale de Blender pour gérer les différents éléments de l'interface (bouton, barre de progression ...). C'est elle que l'on chargera en priorité pour travailler sous Blender.


Nous pourrions ajouter plusieurs bibliothèques comme ici :
import bpy, sqlite3, os, platform, locale, shutil, sys, time, shader_tools_ng.libs, threading, webbrowser
--> Pour plus de détails sur ces Bibliothèques je vous laisse chercher avec votre moteur de recherche préféré. ATTENTION : vous ne trouverez rien de particulier sur la bibliothèque "shader_tools_ng.libs" car elle a été créée de toute pièce par mes soins. C'est d'ailleurs cette bibliothèque qui va nous intéresser non pas qu'on va la décrire dans son intégralité mais juste voir ensemble le mécanisme entre le script principal "__init__.py" et cette bibliothèque.


Imaginons que nous voulions écrire une fonction conséquente qui aura pour objectif de gérer plusieurs paramètres par exemple :
--> 1 module dont l'objectif est de gérer une base de données conséquente
--> 1 module permettant de données des informations suivant les données sélectionner par l'utilisateur
--> 1 module permettant de faire une recherche dans la base de données
--> 1 module permettant d'enregistrer des données dans la base
--> etc ....

Là il existe 3 solutions :
1/ J'écris tout dans le fichier "__init__.py"
2/ Je déprime et ne me lance pas un truc aussi énorme
3/ Je créer un bibliothèque

Dans notre cas on va bannir les 2 premières solutions car la première rendrait notre code trop lourds (et serait par conséquent plus lent à s'exécuter). La seconde possibilité bein on est pas là pour faire dans la déprime donc à bannir .


Nous allons créer par exemple deux sous-scripts dans un répertoire que l'on appelle "libs":
--> 1 bibliothèque du nom de "open.py" contenant les fonctions pour ouvrir la base/les informations/ la recherche dans la base
--> 1 bibliothèque du nom de "save.py" contenant les fonctions de sauvegardes


Voilà à quoi peut ressembler notre fichier "open.py":
import bpy
def HelloWorld():
    print("Bonjour le monde : voici ma bibliothèque OPEN.PY")


Et ici voilà à quoi peut ressembler le fichier "save.py":
import bpy
def BonjourLeMonde():
    print("Bonjour le monde : voici ma bibliothèque SAVE.PY")


Donc à ce stade voilà ce que nous devrions avoir dans notre dossier "shader_tools-ng" :

shader_tools_ng
-> __init__.py et le dossier libs
----> puis dans le dossier libs : save.py et open.py

Cependant il nous manque encore un fichier pour lier tout ce petit monde. Nous allons dans le dossier "libs" puis nous allons créer un nouveau fichier "__init__.py" :
--> Nous avons dans le dossier "libs" les fichiers suivants : save.py, open.py et __init__.py

Pour lier tout se petit monde nous allons ouvrir ce fichier __init__.py nouvellement créé, voilà à quoi il devrait ressembler :

__all__ = ("open", "save",)

ou encore à ça (c'est juste une question de lisibilité):
__all__ = (
"open", 
"save",
)


A ce stade les liens sont correctement effectués. Il nous reste une dernière chose. Nous allons ouvrir le fichier __init__.py principal (celui qui est dans le dossier shader_tools_ng et pas dans le dossier libs puis d'ajouter au niveau du import notre nouvelle bibliothèque :
-->
import bpy, shader_tools_ng.libs


A partir de se moment là il est trés facile d'accéder à notre bibliothèque. Par exemple je veux accéder à ma fonction BonjourLeMonde() qui est dans mon fichier save.py bein rien de plus simple :
-->
 save.BonjourLeMonde()


Et voilà pour cette "astuce" qui vous permet de vous simplifiez la lisibilité de votre code source.

Cette méthode peut paraitre déroutante au premier abord mais pour un script volumineux c'est que du bonheur. Cela se traduit ensuite par un gain de temps non négligeable.
*******************************************************

En espérant que cela puisse aiguiller certains d'entre vous.

A++ le BC.

Contribution le : 24/09/2012 14:56
_________________
Le SHADERTOOLS NG:
- Github:ici
- FTP:ici
Créer un fichier PDF de la contribution Imprimer


Re: Comment créer un script sur Blender ?
OverdOzed
Inscrit:
25/09/2011 16:56
De RODEZ
Post(s): 307
Salut tout le monde,

Voici un petit script qui permettra aux devs de ne plus se prendre la tête avec la liste des Icones incluent dans Blender.

Je sais qu'il doit en exister d'autres qui vous permettent d'afficher la liste de tout les îcones de Blender mais celui-ci je vais le commenter :

Voilà notre code : ATTENTION JE NE METS PAS TOUTES LA LISTE D'ICONES (pour rendre le code plus facile à comprendre)

#Ici le bl_info que je n'ai plus besoin de commenter (voir plus haut dans les com's pour plus de détails
bl_info = {
    "name": "Icones list",
    "author": "GRETETE Karim (Tinangel)",
    "version": (1, 0, 0),
    "blender": (2, 6, 3),
    "api": 45996,
    "location": "User Preferences",
    "description": "Icones list",
    "warning": "",
    "wiki_url": "",
    "tracker_url": "",
    "support": 'COMMUNITY',
    "category": "System",}


import bpy #idem que pour le bl_info
from bpy.types import Panel # Ici par contre nous allons importer le bibliothèque permettant
                            # de gérer les panneaux 

#Icones keys
def IconesKeys(): # Ici une fonction contenant la liste de tous les îcones, 
                  # je l'ai volontairement raccourcis, le fichier en téléchargement est complet
    temp = \
        (
        "NONE", "QUESTION", "ERROR", "CANCEL", "TRIA_RIGHT", "TRIA_DOWN", "TRIA_LEFT", "TRIA_UP",  
        )
    return temp # ici je renvoie ma liste d'îcone
#end Icones keys

class ShowIcones(bpy.types.Operator):
    bl_idname = "object.icones_operator_show"
    bl_label = " "

    def draw(self, context):
        layout = self.layout
        
        create_row = 0 # ici je créé une variable contenant 0
        row = layout.row(align=True) # ici de créer une ligne pour pouvoir dessiner
        for e in IconesKeys(): # là je créer une boucle qui contient à chaque tour un élément
                               # de ma liste d'icônes
            if create_row >= 8: # Ici une condition qui créera une nouvelle ligne quand la variable
                                # create_row sera egal ou supérieur à 8
                row = layout.row(align=True)# là je créer une nouvelle ligne
                create_row = 0 # Je replace mon compteur à 0
            row.label(e, icon="%s" % e) # Ici je créer une zone texte dont le nom sera le nom de
                                        # l'icône de Blender et affichera l'image correspondant à 
                                        # l'icône en question (celle de la valeur 'e')
            create_row = create_row + 1 # Ici j'ajoute +1 à mon compteur on peut aussi utiliser cette
                                        # notation si mes souvenirs sont bons create_row += 1
                                        # (moi ça me parait plus clair comme je l'ai écris mais c'est
                                        #  une mauvaise habitude je sais) 
            
        row = layout.row(align=True) # Une fois la boucle terminé j'ajoute une ligne supplémentaire

    def invoke(self, context, event): # Zone qui va me permettre d'invoquer une fenêtre
        wm = context.window_manager.invoke_popup(self, width=1200) # Là j'ai opté pour une popup dont la 
                                                                   # largeur sera de 1200pixels
                                                                   
        return {'RUNNING_MODAL'} # Ici je renvois un Modal car la fenêtre n'est pas censé se faire de suite



    def execute(self, context): # une fois le curseur de la souris de l'utilisateur on exécutera ce bloc
        return {'FINISHED'} # Aucun code n'a été placé avant donc ce bloc se contentera de se refermer


class IconesOperator(Panel): #Ici je vais créer un panneau dans la zone TOOLS de Blender
                             # il s'agit de la zone à gauche de la vue 3D.
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'TOOLS'
    bl_context = "objectmode"
    bl_idname = "object.icones_operator"
    bl_label = "Icones list"

    def draw(self, context):
        layout = self.layout
        row = layout.row()
        row.operator("object.icones_operator_show", text="Show icons", icon="INFO" ) # ici je créer un 
                                                                  # bouton qui permettra à l'utilisateur
                                                                  # d'afficher la popup

    def execute(self, context):
        return {'FINISHED'}


MyReg = \
    (
     ShowIcones, IconesOperator, 
    )

def register():
    for c in MyReg: bpy.utils.register_class(c)
#end register
def unregister():
    for c in MyReg: bpy.utils.unregister_class(c)
#end unregister

if __name__ == "__main__":
    register()



Comme d'hab j'espère que ça en aidera certains.

Le script complet est téléchargeable ici -−> Icones list

Et ici la version optimisée et améliorée par mapleberry (merci à lui ): Version Optimisée (Mise à jour le 15/12/2012)

++ le BC

Contribution le : 13/10/2012 17:14
_________________
Le SHADERTOOLS NG:
- Github:ici
- FTP:ici
Créer un fichier PDF de la contribution Imprimer


Re: Comment créer un script sur Blender ?
OverdOzed
Inscrit:
13/02/2010 16:29
De Bruxelles
Post(s): 1313
Je ne crois pas m'être trompé de rubrique.

Creating a Blender 2.6 Python add-on

Contribution le : 09/11/2012 15:45
_________________
Win 10 AMD Ryzen 7 2700 Height-Core - 32 GB RAM - Gigabyte GTX 1080
Créer un fichier PDF de la contribution Imprimer


Re: Comment créer un script sur Blender ?
Fou Furieux du Clan
Inscrit:
20/08/2012 16:07
De France / Doubs
Post(s): 163
Merci pour ton script tinangel
Par contre tu sais si on peut rendre ca copiable ? genre tu cliques sur le nom et hop dans le clipboard ou au pire dans un champ texte sélectionnable sous tes 3 boutons...
devoir les retaper alors qu'on les a là sous le nez, c'est frustrant

Pour débuter en script ca c'est pas mal aussi:
http://wiki.blender.org/index.php/Dev:2.5/Py/Scripts/Cookbook/Code_snippets/Interface

Par contre j'ai une question, est-ce que quelqu'un sait comment ajouter un panneau pour le choix de paramètres dans un script d'export ?

merci
mapleberry.

EDIT:
Tu peux simplifier ton script en évitant d'appeler la même fonction copiée 3 fois (bouh c'est pas beau ) en utilisant les props
Dans ton ShowIcones()
ajoutes:
prop_ID = bpy.props.IntProperty() # defining the property


Ajoutes .prop_ID = 1, 2 ou 3 pour tes trois boutons avec le même "object.icones_operator_show":
row = layout.row()
row.operator("object.icones_operator_show", text="Show icons", icon="INFO").prop_ID = 1
row = layout.row()
row.operator("object.icones_operator_show", text="Show icons 2", icon="INFO" ).prop_ID = 2
row = layout.row()
row.operator("object.icones_operator_show", text="Show icons 3", icon="INFO" ).prop_ID = 3


et récupère cette propriété dans ShowIcones():
for e in IconesKeys(self.prop_ID):


ainsi tu peux effacer les autres showIconesTwo et Three()...

Je te passes le script bidouillé en MP si tu veux.
a+

Contribution le : 15/11/2012 19:38
_________________
Un blog sur Blender c'est ici: www.mapleberry.net
Ma chaine Youtube: mapleberry.net
Créer un fichier PDF de la contribution Imprimer


Re: Comment créer un script sur Blender ?
OverdOzed
Inscrit:
25/09/2011 16:56
De RODEZ
Post(s): 307
@mapleberry : effectivement tu as tout à fait raison les 3 lignes peuvent être simplifiées. Je voulais rester sur un code qui reste dans l'ensemble compréhensible par tout le monde. Ce code reste très basique. L'idée étant de donner les notions de bases aux nouveaux développeurs.

Par contre ce que tu peux faire c'est de poster ton code optimiser (je serais pas jaloux t'inquiètes et bien au contraire c'est comme ça qu'on avance) ou sinon effectivement je pourrais modifier le mien pour éviter les doublons.

C'est comme tu veux en tout c'est avec plaisir si j'ai pu aider.

A bientôt le clan.



[edit]
J'avais pas tout lu. Merci pour l'info par rapport au
prop_ID = bpy.props.IntProperty() # defining the property



Pour ce qui est du copiable: ça doit-être jouable avec un StringProperty() ou un Operator (qui aura pour seul objectif de copier).

Pour ta question : "Par contre j'ai une question, est-ce que quelqu'un sait comment ajouter un panneau pour le choix de paramètres dans un script d'export ?"
--> J'ai pas tout compris mais si c'est ce que je pense c'est en fait un code dans ce style :



class Export(bpy.types.Operator):
    bl_idname = "object.shadertoolsng_export"
    bl_label = "Blabla"   

    ctx = bpy.props
    creator_SP = ctx.StringProperty(name="Mon element", default="Veuillez saisir votre text")

    def draw(self, context):
        layout = self.layout
        row = layout.row(align=True)
        row.prop(self, "creator_SP")    

    def invoke(self, context, event):
        wm = context.window_manager
        wm.fileselect_add(self)
        return {'RUNNING_MODAL'}

    def execute(self, context):
        return {'FINISHED'}
 


A quelque chose près ça devrait-être ça (désolé j'ai pas pu tester, je suis au taf là )

Je sais pas si ça répond à ta question (sachant que la propriété StingProperty peut-être modifier par autre chose comme un
Enumerator ou autre ... tout dépend de ce dont tu as besoin)

++

[/edit]

Contribution le : 16/11/2012 13:09
_________________
Le SHADERTOOLS NG:
- Github:ici
- FTP:ici
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant
(1) 2 »




Enregistrer votre réponse
Compte*
Nom   Mot de passe   Authentification
Message:*



[Recherche avancée]



Sujets récemment répondus
Forums Sujets Réponses Lus Dernières contributions
Questions & Réponses [résolu] Problème IK : pied qui tourne au lieu d'être fixé au sol 5 96 Aujourd'hui 14:45:08
Okinage 
Questions & Réponses Vertex Weight après fusion de 2 objets 0 19 Aujourd'hui 13:51:56
Horemheb 
Moteur de jeu GameBlender et alternatives [WIP] DeadSigns FPS horreur - Date de sortie 1er juillet 2020    [1][2][3]...[51] 506 87145 Aujourd'hui 10:16:21
Bibi09 
Moteur de jeu GameBlender et alternatives hARMful engine    [1][2][3]...[7] 67 6385 Aujourd'hui 09:50:03
Bibi09 
Questions & Réponses appliquer une animation NLA 1 33 Hier 16:16:13
prometheusx 
Questions & Réponses affichage progressif bevel de courbe 5 119 Hier 10:25:23
jlf 
The Blender Clan 'tchat Free addon Modélisation procédurale par nodes 1 72 Hier 08:47:52
WinZs 
[WIP] et travaux terminés [WIP] Alpaga in love 7 179 Hier 00:20:08
Bibi09 
Questions & Réponses Problème de rendu (débutant) 1 67 30/05 16:16:59
Rimpotche 
Questions & Réponses Grosse différence d'éclairage sur le rendu final VS le mode Rendered 9 163 29/05 21:42:20
Crocodile_13 
Questions & Réponses Problème avec le nodes Color Ramp 5 191 29/05 20:59:01
JaAlVir657 
Python & Plugins Comment renommer "Key" ? (le chef des shapekeys)    [1][2] 18 492 29/05 19:06:29
lucky 
Questions & Réponses [résolu] théorie lowpoly / highpoly 3 89 29/05 17:53:57
moonboots 
[WIP] et travaux terminés Les fonds de mes rendus 4 169 29/05 14:05:18
Crocodile_13 
Python & Plugins [résolu] obtenir un résultat fixe suite au déplacement souris 1 114 28/05 14:28:07
Bibi09 
Moteurs de rendu rendu Povray sous Blender 2.6 + trace de log 7 12127 28/05 00:25:30
MauriceRaybaud 
Questions & Réponses [non résolu] Personnage et CAT5 - VRCHAT 0 91 27/05 22:31:10
Muffet 
Questions & Réponses Conseils pour modéliser un corps 4 195 27/05 17:48:43
moonboots 
Questions & Réponses Comment dupliquer une face autour d'un axe? 1 94 26/05 19:05:12
moonboots 
Questions & Réponses Comment faire une boucle infinie (animation) 9 194 26/05 13:00:46
3dlone 

Qui est en ligne
58 utilisateur(s) en ligne (dont 36 sur Forums)

Membre(s): 0
Invité(s): 58


plus...
Nouveaux membres
LuigiAbdul 1/6/2020
Ashton58J 1/6/2020
PERMAFROST 31/5/2020
Samux 30/5/2020
titisteph 29/5/2020
Muffet 27/5/2020
MadK 26/5/2020
Osziy_ 26/5/2020
Elliott42 25/5/2020
Ben3D 25/5/2020
Dernier Ajout
mirages-preview~0.jpg

Evènements à venir
Jui 30
Anniv des Jedi :-D
Jui 11
BUG de Lyon
Jui 23
Anniv du BlenderClan !
plus 270 plus d'élément(s)
 Par Mickaël Guédon [ebrain] © 2003-2020 The Blender Clan - hébergé par TuxFamily - Site déclaré à la CNIL sous le numéro 1155445