10/19/2019

Файловый браузер Blender с Python

Встречайте ImportHelper
Importhelper - это смешанный класс в подмодуле bpy_extras . Он включает функцию invoke (), которая вызывает браузер файлов, и несколько вспомогательных функций, используемых в аддонах импортеров Blender

Время от времени аддон требует, чтобы пользователь выбирал определенный файл или путь. Конечно, вы могли бы просто дать пользователям простой ввод строки и позволить им копировать / вставлять в нее, но насколько круче было бы, чтобы они могли выбрать файл из браузера файлов?
К счастью, Blender предоставляет удобный класс, который делает почти все для нас.

Встречайте ImportHelper

Importhelper - это смешанный класс в подмодуле bpy_extras . Он включает функцию invoke (), которая вызывает браузер файлов, и несколько вспомогательных функций, используемых в аддонах импортеров Blender. Чтобы использовать это все, что нам нужно сделать, это расширить его в нашем операторе. Начнем с импорта ImportHelper и Operator .
from bpy_extras.io_utils import ImportHelper
from bpy.types import Operator
Теперь мы можем пойти дальше и создать оператора:
class OT_TestOpenFilebrowser(Operator, ImportHelper):

    bl_idname = "test.open_filebrowser"
    bl_label = "Open the file browser (yay)"

    def execute(self, context):
        """Do something with the selected file(s)."""

        return {'FINISHED'}
Да, это так. Наш новый оператор уже имеет функцию invoke (), которая вызывает браузер файлов, и когда пользователь выбирает файл, он сохраняет путь к файлу в self.filepath . Обратите внимание, что это обычный StringProperty внутри ImportHelper, который мы унаследовали, когда создали его подкласс.

Чтобы отфильтровать типы файлов, показанные пользователю, мы должны добавить  свойство filter_glob в наш класс. Это  StringProperty со списком расширений, которые мы хотим показать. Каждое расширение написано в стиле подстановочных знаков и разделено точкой с запятой. Обратите внимание, что строки длиннее 255 могут быть обрезаны (так как это внутренний размер буфера).
filter_glob = StringProperty(
    default='*.jpg;*.jpeg;*.png;*.tif;*.tiff;*.bmp',
    options={'HIDDEN'}
)
Также имейте в виду, что пользователи могут отключить фильтрацию в пользовательском интерфейсе и выбрать любой тип файла. Вы можете отказаться от файла или сделать что-то другое в зависимости от полученного расширения. Вы можете позаботиться об этом с помощью старого доброго splitext () .
filename, extension = os.path.splitext(self.filepath)
А как насчет добавления настроек на экран файлового браузера? Все, что вам нужно сделать, это добавить свойства к оператору как обычно, и они будут отображаться в браузере.
    some_boolean = BoolProperty(
            name='Do a thing',
            description='Do a thing with the file you\'ve selected',
            default=True,
            )

Финальный код

import bpy
import os

from bpy.props import StringProperty, BoolProperty
from bpy_extras.io_utils import ImportHelper
from bpy.types import Operator


class OT_TestOpenFilebrowser(Operator, ImportHelper):

    bl_idname = "test.open_filebrowser"
    bl_label = "Open the file browser (yay)"
    
    filter_glob = StringProperty(
        default='*.jpg;*.jpeg;*.png;*.tif;*.tiff;*.bmp',
        options={'HIDDEN'}
    )
    
    some_boolean = BoolProperty(
        name='Do a thing',
        description='Do a thing with the file you\'ve selected',
        default=True,
    )

    def execute(self, context):
        """Do something with the selected file(s)."""

        filename, extension = os.path.splitext(self.filepath)
        
        print('Selected file:', self.filepath)
        print('File name:', filename)
        print('File extension:', extension)
        print('Some Boolean:', self.some_boolean)
        
        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')
Есть также класс ExportHelper, который включает в себя некоторые утилиты для проверки существующих файлов и установки имени файла по умолчанию в браузере.

Комментариев нет:

Отправить комментарий