Addon Grill

Ici on parle des scripts

Modérateurs : frez, Yadoob, stilobique, Matpi, ModSquad

Re: Addon Grill

Message par Megeon » 01 Avr 2016, 15:01

je n'y arrive même pas


Code : Tout sélectionner
import bpy

class Truss(bpy.types.Operator):
    bl_idname = "mesh.truss"
    bl_label = "truss"
   
    #append
    blendfile = "E:/testgrill.blend"
    section   = "\\Action\\"
    object    = "C20T50"

    filepath  = blendfile + section + object
    directory = blendfile + section
    filename  = object

    bpy.ops.wm.append(
        filepath=filepath,
        filename=filename,
        directory=directory)

class AddTruss(bpy.types.Panel):
    bl_label = "Truss"
    bl_space_type = "View_3D"
    bl_region_type = "TOOLS"
   
    def draw(self, context):
        layout = self.layout
        row = Layout.row()
        row.operator("mesh.truss")

def register():
    bpy.utils.register_class(Truss)
    bpy.utils.register_class(AddTruss)

if __name__ == "__main__":
    register()


j'ai droit a ce message d'erreur !
Code : Tout sélectionner
AttributeError: expected Panel, AddTruss class to have an "draw" attribute


et d'après se que je comprend c'est parce que j'utilise une class !

le scarabée viens de passé sous une chaussure !
Avatar de l’utilisateur
Megeon
 
Message(s) : 634
Inscription : 04 Jan 2016, 15:34
Localisation : Lyon

Re: Addon Grill

Message par pistiwique » 01 Avr 2016, 16:36

Pour commencer, il te manque la fonction

Code : Tout sélectionner
def execute(self, context):

dans ton operateur ainsi que le

Code : Tout sélectionner
return {'FINISHED'}

à la fin.

Ensuite, dans ta class panel, il te manque le bl_idname

Après ces 2, 3 petites corrections ça donne ça:

Code : Tout sélectionner
import bpy
import os
 
class Truss(bpy.types.Operator):
    bl_idname = "mesh.truss"
    bl_label = "truss"
 
    def execute(self, context):
        #append
        blendfile = "E:/testgrill.blend" # le chemin ou tu vas chercher ton asset
        section   = "Object" # la section qui t'interesse, dans ton cas, il sagit d'un objet
        object    = "C20T50" # le nom de l'asset'
        directory = os.path.join(blendfile, section) # Chemin complet ou aller chercher ton asset
                                                    # La commande "os.path.join" te permet de ne plus te soucier
                                                    # de savoir si il faut / ou \ dans ton chemin selon l'os que tu utilises.
                                                    # Il faut cependant penser a importer le module "os" pour pouvoir l'utiliser
 
        bpy.ops.wm.append(
            filename=object,
            directory=directory)
 
        # a ce moment la, ton objet est bien importe mais il n'est pas l'objet actif de la scene.
        bpy.context.scene.objects.active = bpy.context.selected_objects[0] # pour le definir comme objet actif     
 
        return {'FINISHED'}
 
class AddTruss(bpy.types.Panel):
    bl_idname = "add_truss"
    bl_label = "Add Truss"
    bl_space_type = "VIEW_3D"
    bl_region_type = "TOOLS"
 
    def draw(self, context):
        layout = self.layout
        row = layout.row()
        row.operator("mesh.truss")
 
 
def register():
    bpy.utils.register_module(__name__)
 
def unregister():
    bpy.utils.unregister_module(__name__)
 
if __name__ == "__main__":
    register()
 


N'hésite pas à bidouiller (parce que c'est tout ce qu'on fait au départ, mais c'est des conneries qu'on fait qu'on apprend le plus :D ) ce bout de code pour tester différentes chose.
Pense aussi à t'afficher la console qui te donnera de précieuse info sur tes erreurs.
Avatar de l’utilisateur
pistiwique
 
Message(s) : 590
Inscription : 10 Août 2014, 10:35
Localisation : le sud ou il fait trop chaud

Re: Addon Grill

Message par Megeon » 01 Avr 2016, 16:51

je vien de testé et j'ai exactement la même erreur, après pour tout le draw il me dit qu'il y a un soucis avec l'indentation, pourtant j'ai vérifié !


Code : Tout sélectionner
>>>     def execute(self, context):
  File "<blender_console>", line 1
    def execute(self, context):
    ^
IndentationError: unexpected indent

>>>         #append
>>>         blendfile = "E:/testgrill.blend" # le chemin ou tu vas chercher ton asset
  File "<blender_console>", line 1
    blendfile = "E:/testgrill.blend" # le chemin ou tu vas chercher ton asset
    ^
IndentationError: unexpected indent

>>>         section   = "Object" # la section qui t'interesse, dans ton cas, il sagit d'un objet
  File "<blender_console>", line 1
    section   = "Object" # la section qui t'interesse, dans ton cas, il sagit d'un objet
    ^
IndentationError: unexpected indent

>>>         object    = "C20T50" # le nom de l'asset'
  File "<blender_console>", line 1
    object    = "C20T50" # le nom de l'asset'
    ^
IndentationError: unexpected indent

>>>         directory = os.path.join(blendfile, section) # Chemin complet ou aller chercher ton asset
  File "<blender_console>", line 1
    directory = os.path.join(blendfile, section) # Chemin complet ou aller chercher ton asset
    ^
IndentationError: unexpected indent

>>>         bpy.ops.wm.append(
  File "<blender_console>", line 1
    bpy.ops.wm.append(
    ^
IndentationError: unexpected indent

>>>             filename=object,
  File "<blender_console>", line 1
    filename=object,
    ^
IndentationError: unexpected indent

>>>             directory=directory)
  File "<blender_console>", line 1
    directory=directory)
    ^
IndentationError: unexpected indent
>>>         bpy.context.scene.objects.active = bpy.context.selected_objects[0] # pour le definir comme objet actif     
  File "<blender_console>", line 1
    bpy.context.scene.objects.active = bpy.context.selected_objects[0] # pour le definir comme objet actif
    ^
IndentationError: unexpected indent

>>> 
>>>         return {'FINISHED'}
  File "<blender_console>", line 1
    return {'FINISHED'}
    ^
IndentationError: unexpected indent


>>     def draw(self, context):
  File "<blender_console>", line 1
    def draw(self, context):
    ^
IndentationError: unexpected indent

>>>         layout = self.layout
  File "<blender_console>", line 1
    layout = self.layout
    ^
IndentationError: unexpected indent

>>>         row = layout.row()
  File "<blender_console>", line 1
    row = layout.row()
    ^
IndentationError: unexpected indent

>>>         row.operator("mesh.truss")
  File "<blender_console>", line 1
    row.operator("mesh.truss")
    ^
IndentationError: unexpected indent



et l'erreur

Code : Tout sélectionner
Traceback (most recent call last):
  File "C:\Users\Dessinateur\Downloads\blender-2.77-windows64\blender-2.77-windows64\2.77\scripts\modules\bpy\utils\__init__.py", line 603, in register_module
    register_class(cls)
AttributeError: expected Panel, AddTruss class to have an "draw" attribute
Avatar de l’utilisateur
Megeon
 
Message(s) : 634
Inscription : 04 Jan 2016, 15:34
Localisation : Lyon

Re: Addon Grill

Message par pistiwique » 01 Avr 2016, 18:16

Bizarre, je viens de re-tester chez moi et ça fonctionne.
Tu as Skype ?
Avatar de l’utilisateur
pistiwique
 
Message(s) : 590
Inscription : 10 Août 2014, 10:35
Localisation : le sud ou il fait trop chaud

Re: Addon Grill

Message par Megeon » 01 Avr 2016, 19:14

Non dsl et en plus c'est au taf du boulot

Edit : comme tu peux le constaté on est vendredi soir et je raconte des truc bizarre , mais donc j'ai tout au taf et j'ai oublié ma clef usb donx je retesterait lundi

Sinon j'ai a defaut de skype un sbook un twitter un instagrame un pintereste un blog linkedin viadeo youtube
Avatar de l’utilisateur
Megeon
 
Message(s) : 634
Inscription : 04 Jan 2016, 15:34
Localisation : Lyon

Re: Addon Grill

Message par Megeon » 02 Avr 2016, 10:02

je vien de tester chez moi sur mac et ça fonctionne pas de message d'erreur

ça fonctionne, je te tiendrai au courant lundi matin sur pc !


maintenant ajouter le choix entre les différent élément

je suppose que pour ça il faut que je fasse un append de tout les objet du blend et que je les ajoute dans une liste ?

donc que je fasse une boucle d'append ?

et ensuite apres avoir fait add truss on a un sous menu qu'i s'ouvre avec un sélectionneur (genre menu déroulant)
Avatar de l’utilisateur
Megeon
 
Message(s) : 634
Inscription : 04 Jan 2016, 15:34
Localisation : Lyon

Re: Addon Grill

Message par Megeon » 04 Avr 2016, 10:09

yop,

j'arrive a chager le scripte sur pc ( ouaiii) mais par contre quand je fait add truss, j'ai un message d'erreur :


location: <unknown location>: -1

indexError : list index out of range
File"\text", line 23, in execute
Traceback (most recent call last) :

EDIT: non ok j'ai trouver , ça fonctionne !!!!
Avatar de l’utilisateur
Megeon
 
Message(s) : 634
Inscription : 04 Jan 2016, 15:34
Localisation : Lyon

Re: Addon Grill

Message par Megeon » 04 Avr 2016, 15:26

bon je cherche, je cherche, mais je ne trouve pas, comment fait ton pour faire un append de tout un .blend ?
Avatar de l’utilisateur
Megeon
 
Message(s) : 634
Inscription : 04 Jan 2016, 15:34
Localisation : Lyon

Re: Addon Grill

Message par pistiwique » 04 Avr 2016, 16:57

Tu veux vraiment tout ce qui se trouve dans le .blend ou seulement les objets ?

Si tu ne veux que les objets, tu peux faire:

Code : Tout sélectionner
blendfile = join(chemin_de_ton_blend, "nom_du_blend.blend")
scn = bpy.context.scene
with bpy.data.libraries.load(blendfile) as (data_from, data_to):
    data_to.objects = data_from.objects
 
for obj in data_to.objects:
    if obj is not None:
        scn.objects.link(obj)


si au contraire tu veux vraiment tout:

Code : Tout sélectionner
with bpy.data.libraries.load(blendfile) as (data_from, data_to):
    for attr in dir(data_to):
        setattr(data_to, attr, getattr(data_from, attr))
 
for obj in data_to.objects:
    if obj is not None:
        scn.objects.link(obj)
Avatar de l’utilisateur
pistiwique
 
Message(s) : 590
Inscription : 10 Août 2014, 10:35
Localisation : le sud ou il fait trop chaud

Re: Addon Grill

Message par Megeon » 04 Avr 2016, 16:59

juste les objets,

par contre je vois

scn.object.link(obj)

ça me ferra un link ou un append ?
Avatar de l’utilisateur
Megeon
 
Message(s) : 634
Inscription : 04 Jan 2016, 15:34
Localisation : Lyon

Re: Addon Grill

Message par pistiwique » 04 Avr 2016, 18:59

Test et tu verras :D
Avatar de l’utilisateur
pistiwique
 
Message(s) : 590
Inscription : 10 Août 2014, 10:35
Localisation : le sud ou il fait trop chaud

Re: Addon Grill

Message par Megeon » 04 Avr 2016, 19:06

Je test mais la ca fonctionne pas je recommencerais demain la fin de journee pour moi
Avatar de l’utilisateur
Megeon
 
Message(s) : 634
Inscription : 04 Jan 2016, 15:34
Localisation : Lyon

Re: Addon Grill

Message par Megeon » 05 Avr 2016, 08:18

bon je deviens dingue.

déjà si je laisse la vigule entre le chemin d'acces et le nom du blend j'ai la partie apres la virgule surligné en rouge et ça me dit "script python fail'
et apres le test sous la console voici le défaut

Code : Tout sélectionner
Traceback (most recent call last):
  File "C:\Users\Dessinateur\Downloads\blender-2.77-windows64\blender-2.77-windows64\2.77\scripts\modules\bpy\utils\__init__.py", line 603, in register_module
    register_class(cls)
AttributeError: expected Panel, AddTruss class to have an "draw" attribute


en l'enlevant, ça me dit que Join n'est pas déffinis


le code en question

Code : Tout sélectionner
import bpy
import os
 
class Truss(bpy.types.Operator):
    bl_idname = "mesh.truss"
    bl_label = "truss"
 
    def execute(self, context):
            #append
        blendfile = join(E:\, "testgrill.blend")
        scn = bpy.context.scene
        with bpy.data.libraries.load(blendfile) as (data_from, data_to):
            data_to.objects = data_from.objects
 
        for obj in data_to.objects:
            if obj is not None:
                scn.objects.link(obj)
 
        bpy.ops.wm.append(
            filename=object,
            directory=directory)
 
        # a ce moment la, ton objet est bien importe mais il n'est pas l'objet actif de la scene.
        bpy.context.scene.objects.active = bpy.context.selected_objects[0] # pour le definir comme objet actif     
 
        return {'FINISHED'}
 
class AddTruss(bpy.types.Panel):
    bl_idname = "add_truss"
    bl_label = "Add Truss"
    bl_space_type = "VIEW_3D"
    bl_region_type = "TOOLS"
 
    def draw(self, context):
        layout = self.layout
        row = layout.row()
        row.operator("mesh.truss")
 
 
def register():
    bpy.utils.register_module(__name__)
 
def unregister():
    bpy.utils.unregister_module(__name__)
 
if __name__ == "__main__":
    register()



j'ai cherché pour savoir quelles ligne remplacé, mais la je tourne en rond !
j'ai cherché, en modifiant quelque truc sur la ligne join, mais en vain (avec ou sans virgule, avec ou sans les "" dans le nom du fichier...)
Avatar de l’utilisateur
Megeon
 
Message(s) : 634
Inscription : 04 Jan 2016, 15:34
Localisation : Lyon

Re: Addon Grill

Message par pistiwique » 05 Avr 2016, 11:31

Je t'ai un peu induits en erreur, désolé.
Dans ton cas, vu que tu connais le chemin d'accès a ton .blend, tu peux directement le déclarer ainsi:
Code : Tout sélectionner
blendfile = "E:\testgrill.blend"


Ensuite, tu n'as plus besoin de l'opérateur
Code : Tout sélectionner
bpy.ops.wm.append(
            filename=object,
            directory=directory


Puisque le code
Code : Tout sélectionner
blendfile = join(E:\, "testgrill.blend")
        scn = bpy.context.scene
        with bpy.data.libraries.load(blendfile) as (data_from, data_to):
            data_to.objects = data_from.objects
 
        for obj in data_to.objects:
            if obj is not None:
                scn.objects.link(obj)


Le fais déjà.

PS: Attention aux indentations, je suis sur mon téléphone et c'est un peu la misère de rédiger ce genre de truc la dessus^^
Avatar de l’utilisateur
pistiwique
 
Message(s) : 590
Inscription : 10 Août 2014, 10:35
Localisation : le sud ou il fait trop chaud

Re: Addon Grill

Message par Megeon » 05 Avr 2016, 11:36

hum ok
merci ça fonctionne je vais voir pour la suite !
Avatar de l’utilisateur
Megeon
 
Message(s) : 634
Inscription : 04 Jan 2016, 15:34
Localisation : Lyon

PrécédentSuivant

Retour vers Scripts - Python - OSL

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 2 invité(s)