# give a variable to an operator

For a workflow tool I made a panel in which it displays each separate library that is linked in my file. For each library I want to add some buttons that does stuff to the library in question.

So in this example I have my panel which shows for example 2 libraries and for each one it creates a "reload" button.

Now my question is.. How do I make it so the reload button only reloads the library I want to reload? I would probably have to give the button an id or something so it knows for which library it was created...

my code so far:

import bpy

libs = bpy.data.libraries

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

class LibPanel(bpy.types.Panel):
"""Creates a Panel in the scene context of the properties editor"""
bl_label = "Scene Libraries"
bl_idname = "SCENE_PT_layout"
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "scene"

def draw(self, context):
layout = self.layout
scene = context.scene
layout.label(text="Libraries:")

for i in libs:
layout.label(text= i.name.replace(".blend",""))
row = layout.row()
sub = row.row()

def register():
bpy.utils.register_class(LibPanel)

def unregister():
bpy.utils.unregister_class(LibPanel)

if __name__ == "__main__":
register()


Where the question marks are is where I should be able to make the difference between the first [0] or second [1] library in the libs[] array.

In future I would also like to ad an 'open' and an 'unlink' button for each library so I can make changes to the other file. But this works by the same principle as the reload button.

• Is reload_xref meant to be reload_lib? Nov 27, 2019 at 17:32
• Yes it was meant to be reload_lib I first started to make the script referring to the libraries as xrefs (from my autodesk background) I was just changing the xrefs to libraries because it was probably just better to simply use blenders' naming :) Nov 29, 2019 at 7:34
• The solution works as a charm though! Thank you very much!!! Nov 29, 2019 at 7:35

I'm presuming that reload_xref is meant to be reload_lib.

In your Reloadlib class you can create a StringProperty to pass the name of the library into:

class Reloadlib(bpy.types.Operator):

#2.8
library_name : bpy.props.StringProperty()
#2.79
#library_name = bpy.props.StringProperty()


Then in execute you can access this local property with self.library_name:

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


Then, when you display the operator you can pass in the name:

for i in libs:
layout.label(text= i.name.replace(".blend",""))
row = layout.row()
sub = row.row()
operator = sub.operator("my.reload_xref", icon = "FILE_REFRESH")
operator.library_name = i.name


(To be clear, I haven't tested the specific functionality of reloading libraries, but this is how you pass data generally.)

Full code:

import bpy

libs = bpy.data.libraries

#2.8
library_name : bpy.props.StringProperty()
#2.79
#library_name = bpy.props.StringProperty()

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

class LibPanel(bpy.types.Panel):
"""Creates a Panel in the scene context of the properties editor"""
bl_label = "Scene Libraries"
bl_idname = "SCENE_PT_layout"
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "scene"

def draw(self, context):
layout = self.layout
scene = context.scene
layout.label(text="Libraries:")

for i in libs:
layout.label(text= i.name.replace(".blend",""))
row = layout.row()
sub = row.row()
operator = sub.operator("my.reload_lib", icon = "FILE_REFRESH")
operator.library_name = i.name

def register():