В скриптах и аддонах импорта-экспорта форматов, не поддерживаемых в Blender по умолчанию, пользователю необходимо предоставить возможность выбора файлов при помощи браузера файлов “FileBrowser”.
Для того, чтобы открыть браузер файлов, а после указания пользователем необходимых файлов, получить путь к ним, нужно использовать классы ImportHelper и ExportHelper.
ImportHelper используется для выбора импортируемых файлов, ExportHelper – для экспортируемых.
Создадим оператор, который при вызове откроет окно файлового браузера, а после выбора пользователем файла, выведет полный путь к нему.
Импортируем необходимые для создания класса модули
1 2 |
from bpy_extras.io_utils import ImportHelper from bpy.types import Operator |
и оформим сам класс:
1 2 3 4 5 6 7 8 |
class TEST_OT_import_tst(Operator, ImportHelper): bl_idname = 'test.import_tst' bl_label = 'test import test' bl_options = {'PRESET', 'UNDO'} def execute(self, context): print('imported file: ', self.filepath) return {'FINISHED'} |
Для того чтобы наш класс выполнялся как оператор, мы наследовали его от класса “Operator”. Наследование от класса “ImportHelper” обеспечивает открытие окна “FileBrowser” для выбора файла перед выполнением метода “execute”.
После выбора пользователем файла и закрытия окна “FileBrowser” путь к нему будет сохранен в свойстве класса “filepath”.
Для правильной работы класса в нем необходимо переопределить свойство “filter_glob” – скрытое свойство типа “StringProperty” для указания фильтра из расширений, файлы с которыми будут отображаться в файловом браузере.
Полностью класс выглядит так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class TEST_OT_import_tst(Operator, ImportHelper): bl_idname = 'test.import_tst' bl_label = 'test import test' bl_options = {'PRESET', 'UNDO'} filename_ext = '.txt' filter_glob: StringProperty( default='*.txt', options={'HIDDEN'} ) def execute(self, context): print('imported file: ', self.filepath) return {'FINISHED'} |
Зарегистрируем его в API и вызовем как оператор для демонстрации работы.
1 2 3 4 5 6 |
import bpy from bpy.utils import register_class register_class(TEST_OT_import_tst) bpy.ops.test.import_tst('INVOKE_DEFAULT') |
Полный текст скрипта выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import bpy from bpy_extras.io_utils import ImportHelper from bpy.types import Operator from bpy.props import StringProperty from bpy.utils import register_class class TEST_OT_import_tst(Operator, ImportHelper): bl_idname = 'test.import_tst' bl_label = 'test import test' bl_options = {'PRESET', 'UNDO'} filename_ext = '.txt' filter_glob: StringProperty( default='*.txt', options={'HIDDEN'} ) def execute(self, context): print('imported file: ', self.filepath) return {'FINISHED'} register_class(TEST_OT_import_tst) bpy.ops.test.import_tst('INVOKE_DEFAULT') |
Откроем окно “Text Editor”, создадим новый скрипт и вставим в него этот код. При выполнении скрипта (нажатием на кнопку “Run Script”) откроется окно “FileBrowser” в котором будут показываться только файлы с расширением “*.txt”. После выбора любого из текстовых файлов, окно “FileBrowser” закроется и в консоль будет выведен полный путь к выбранному пользователем файлу.
Точно также для экспортируемых файлов.
Для экспорта необходимо переопределить еще одно свойство: “filename_ext” – расширение по умолчанию для сохраняемого файла.
Полный код для экспорта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import bpy from bpy_extras.io_utils import ExportHelper from bpy.types import Operator from bpy.props import StringProperty from bpy.utils import register_class class TEST_OT_export_tst(Operator, ExportHelper): bl_idname = 'test.export_tst' bl_label = 'test export test' bl_options = {'PRESET', 'UNDO'} filename_ext = '.txt' filter_glob: StringProperty( default='*.txt', options={'HIDDEN'} ) def execute(self, context): print('exported file: ', self.filepath) return {'FINISHED'} register_class(TEST_OT_export_tst) bpy.ops.test.export_tst('INVOKE_DEFAULT') |
Здесь, после закрытия окна “FileBrowser”, выведется путь к файлу с именем, заданным пользователем.