6
$\begingroup$

Is there a way in bpy to get a list of all selected files from the file browser?

I have this code, but it is only for the active file selection:

selectedFile = ''
for screenArea in bpy.context.window.screen.areas:
   if screenArea.type == 'FILE_BROWSER':
        params = screenArea.spaces[0].params
        selectedFile = os.path.join(params.directory, params.filename)
        break
$\endgroup$
1

3 Answers 3

6
$\begingroup$

If you take the TextEditor Templates -> Python -> Operator File Import

  • add from bpy.props import CollectionProperty
  • and add this special property in the ImportSomeData operator

inside the importer class

class ImportSomeData(Operator, ImportHelper):

    # edit for brevity

    filename_ext = ".txt"
    files = CollectionProperty(type=bpy.types.PropertyGroup)

Then self.files, with 3 files selected, gives you

... <bpy_collection[3], IMPORT_TEST_OT_some_data.files>
>>> self.files[0]
... <bpy_struct, PropertyGroup("filename_mine2.txt")>

Then to get the fullpath of those files you use the self.path dirname

import os
dirname = os.path.dirname(self.filepath)
for f in self.files:
    print(os.path.join(dirname, f.name))

.../home/zeffii/filename_mine2.txt
.../home/zeffii/record_label_ep2.txt
.../home/zeffii/splines.txt
$\endgroup$
1
  • $\begingroup$ I see, it's the ImportHelper that gives the functionality that I need. I'm not around my computer for now, I will try it when I get a chance. Thank you, that looks promising. $\endgroup$
    – MakerDrone
    Commented May 11, 2015 at 20:05
6
$\begingroup$

Can use directory in conjunction with files

  • It is also possible to use directory` for the invoked filebrowsers current directory path,

  • and there is a propertygroup type for this already defined as bpy.types.OperatorFileListElement which is basically the same as bpy.types.PropertyGroup by a different name and used the same.

  • Used pathlib over os as another point of difference. https://blender.stackexchange.com/a/167527/15543

These changes applied to Fahads answer https://blender.stackexchange.com/a/183998/15543

import bpy
from pathlib import Path
from bpy_extras.io_utils import ImportHelper 
from bpy.types import Operator, OperatorFileListElement
from bpy.props import CollectionProperty, StringProperty

class OT_TestOpenFilebrowser(Operator, ImportHelper): 
    bl_idname = "test.open_filebrowser" 
    bl_label = "Open the file browser" 
    directory : StringProperty(subtype='DIR_PATH')
    files : CollectionProperty(type=OperatorFileListElement)
    
    def execute(self, context): 
        
        """Do something with the selected file(s)."""
        base = Path(self.directory)                
        for f in self.files:
            print(base / f.name)

        return {'FINISHED'}
    
def register(): 
    bpy.utils.register_class(OT_TestOpenFilebrowser) 

def unregister(): 
    bpy.utils.unregister_class(OT_TestOpenFilebrowser) 
    
if __name__ == "__main__": 
    register()

    # test call 
    bpy.ops.test.open_filebrowser('INVOKE_DEFAULT')
$\endgroup$
0
4
$\begingroup$

A simplified full code sample for better understanding:

import bpy
import os
from bpy_extras.io_utils import ImportHelper 
from bpy.types import Operator
from bpy.props import CollectionProperty

class OT_TestOpenFilebrowser(Operator, ImportHelper): 
    bl_idname = "test.open_filebrowser" 
    bl_label = "Open the file browser" 
    
    files : CollectionProperty(type=bpy.types.PropertyGroup) # Stores properties
    
    def execute(self, context): 
        
        """Do something with the selected file(s)."""
                        
        dirname = os.path.dirname(self.filepath)
        for f in self.files:
            print(os.path.join(dirname, f.name)) #get filepath properties from collection pointer
        
        return {'FINISHED'}
    


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

def unregister(): 
    bpy.utils.unregister_class(OT_TestOpenFilebrowser) 
    
if __name__ == "__main__": 
    register()

# test call 
bpy.ops.test.open_filebrowser('INVOKE_DEFAULT')
$\endgroup$
2
  • $\begingroup$ brilliant. I learned to use CollectionProperty(type=bpy.types.PropertyGroup) there is no such example in the blender help print(f) gives <bpy_struct, PropertyGroup("Untitled-1.py")> where f.name is Untitled-1.py (for noobs like me) $\endgroup$ Commented Jul 29, 2020 at 10:37
  • $\begingroup$ I used it in my addon so now this is possible to install/reload several addons at the same time. github.com/1C0D/Addon_Installer-Script_Runner-BlenderAddon/blob/… $\endgroup$ Commented Jul 29, 2020 at 13:36

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .