В прошлый раз мы написали небольшой скрипт для быстрого перемещения ориджина объекта к центру выделения. Теперь мы можем быстро выполнять эту операцию, но для этого нужно держать открытой дополнительную рабочую область с текстом скрипта. Чтобы избавиться от этого неудобства, превратим наш скрипт в аддон и назначим его на удобный кейбинд.
Для начала определим словарь с обязательным именем bl_info, в котором укажем базовые данные нашего аддона.
|
1 2 3 4 5 6 |
bl_info = { 'name': 'origin2', 'category': 'All', 'version': (1, 0, 0), 'blender': (4, 5, 0), } |
Здесь мы указали имя аддона “origin2”, под этим именем он будет находится в списке аддонов, общую категорию “All”, версию нашего аддона и версию Blender – 4.5, для которой он предназначен.
Определим класс для оператора из которого будет выполняться код нашего скрипта.
|
1 2 3 4 |
class Origin2_OT_selection(bpy.types.Operator): bl_idname = 'origin2.selection' bl_label = 'Origin2selection' bl_options = {'REGISTER', 'UNDO'} |
Название класса оператора мы определяем сами, однако добавляем в него обязательную вставку _OT_, что укажет API Блендера, что мы хотим создать именно оператор.
В параметре bl_idname мы задаем уникальный идентификатор для нашего оператора. Через него будет происходить вызов в API.
bl_label – текстовое обозначение оператора.
А в bl_options мы задаем параметры регистрации нашего оператора в Blender API и включения его вызовов в систему глобальной отмены (чтобы его действия отменялось по нажатию клавиш Ctrl+z).
Основной выполняемый код, который мы практически в точности копируем из нашего предыдущего скрипта, мы помещаем в функцию оператора execute.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
def execute(self, context): cursor_src_location = context.scene.cursor.location.copy() area = next((area for area in context.screen.areas if area.type == 'VIEW_3D')) with context.temp_override(area=area): bpy.ops.view3d.snap_cursor_to_selected() bpy.ops.object.mode_set(mode = 'OBJECT') bpy.ops.object.origin_set(type='ORIGIN_CURSOR') bpy.ops.object.mode_set(mode = 'EDIT') context.scene.cursor.location = cursor_src_location return {'FINISHED'} |
Возвращаемое значение из функции execute всегда должно быть {“FINISHED”}, это особенность операторов Blender.
Так как в параметрах функции мы передаем context, в нашем коде мы можем обращаться к контексту не через глобальный указатель bpy.context, а через указатель, переданный в параметре функции.
Теперь подвяжем выполнение оператора на нажатие комбинации клавиш.
Определим для этого класс KeyMap
|
1 2 3 |
class Origin2_KeyMap: _keymaps = [] |
И создадим в нем список, пока пустой, в которой поместим привязку вызова оператора к нажатию клавиш на клавиатуре.
Определим две функции, register() и unregister() для создания привязки к нажатию клавиш и ее удалению.
|
1 2 3 4 5 6 |
@classmethod def register(cls, context): if context.window_manager.keyconfigs.addon: keymap = context.window_manager.keyconfigs.addon.keymaps.new(name='Screen', space_type='EMPTY') keymap_item = keymap.keymap_items.new('origin2.selection', 'C', 'PRESS', shift=True, ctrl=True) cls._keymaps.append((keymap, keymap_item)) |
В функции register() мы сначала создаем новый keymap – список привязок операторов на нажатие клавиш, а потом добавляем в него собственно привязку keymap_item.
В параметрах привязки мы указываем bl_idname нашего оператора, код клавиши, на которую вешается вызов оператора, а так же дополнительные параметры, например требование одновременно зажимать дополнительные функциональные клавиши Ctlr, Alt или Shift.
В нашем примере мы создаем привязку на нажатие (“PRESS”) клавиши “c” с одновременным нажатием клавиш Shift и Ctrl.
Созданный кеймап мы помещаем в список, чтобы иметь возможность его удалить, при удалении аддона.
Определим функцию unregister().
|
1 2 3 4 5 6 |
@classmethod def unregister(cls): # clear keys for keymap, keymap_item in cls._keymaps: keymap.keymap_items.remove(keymap_item) cls._keymaps.clear() |
Она будет вызываться при удалении или деактивации нашего аддона.
Код этой функции просто удаляет все привязки, которые мы создали для кеймапа, после чего удаляет сам кеймап.
Остался последний момент – определим две функции для регистрации и разрегистрации нашего аддона в Blender Python API.
|
1 2 3 4 5 6 7 |
def register(): bpy.utils.register_class(Origin2_OT_selection) Origin2_KeyMap.register(context=bpy.context) def unregister(): Origin2_KeyMap.unregister() bpy.utils.unregister_class(Origin2_OT_selection) |
В функции register() мы регистрируем в Blender API наш оператор и вызываем функцию для регистрации нашего кеймапа.
В функции unregister() мы делаем обратные действия, которые удаляют оператор из Blender API и снимают привязку вызова оператора к нажатию клавиш.
Сохраним наш аддон в файл origin2.py.
И установим его в Blender стандартным образом: откроем рабочую область Preferences, переключимся на вкладку Add-ons, нажмем на стрелочку в правом верхнем углу и выберем Install from Disk… .
Теперь в поле поиска начнем набирать “origin”, пока не увидим строку с нашим аддоном. Отметим галочку в этой строке, чтобы активировать аддон. Нажмем “Save Preferences” (если у вас отключено автоматическое сохранение настроек), чтобы при следующем запуске Blender аддон активировался самостоятельно.
На этом все.
В рабоче область 3D вьюпорта в режиме редактирования при нажатии на сочетание клавиш Ctrl + Shift + c ориджин будет мгновенно переставлен в центр выделенной геометрии.

.py file on Patreon