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