Python for Blender. Вызов метода из другого метода того же класса
Сразу скажу, Питон я не знаю, только самые азы.
Удалось написать такой клас
bl_info = {
"name": "Outliner sorting",
"version": (1, 1),
"blender": (2, 80, 0),
"author": "Igor Yuchimenko"
}
import bpy
class OutlinerSort(bpy.types.Operator):
"""Tooltip"""
bl_idname = "outliner.sort"
bl_label = "Sort alphabetic"
def sort_collection(collection, case = False):
if collection.children is None: return
children = sorted (
collection.children,
key = lambda c: c.name if case else c.name.lower()
)
for child in children:
collection.children.unlink(child)
collection.children.link(child)
sort_collection(child)
def execute(self, context):
for scene in bpy.data.scenes:
sort_collection(scene.collection, False)
return {'FINISHED'}
def draw_method(self, context):
self.layout.operator(OutlinerSort.bl_idname)
def register():
bpy.utils.register_class(OutlinerSort)
bpy.types.OUTLINER_MT_context_menu.prepend(draw_method)
def unregister():
bpy.types.OUTLINER_MT_context_menu.remove(draw_method)
bpy.utils.unregister_class(OutlinerSort)
if __name__ == "__main__":
register()
При нажатии на кнопку меню происходит вызов execute, а уже из этого метода нужная функция сортировки. Блендер выкидывает ошибку, что sort_collection не существует, но если заменить на self.sort_collection(scene.collection, False) появляется другая ошибка, что указано 3 аргумента вместо 2, когда я добавил sort_collection(self, collection, case = False) опять получаю ошибку, что метода не существует. Что не так? С другими языками я такого поведения не встречал.
Ответы (1 шт):
def sort_collection(collection, case = False): должна принимать первым аргументом self, то есть как у тебя def execute(self, context): принимает первым self.
По сути тебе нужно написать:
... def sort_collection(self, collection, case = False):...\
И вызвать нужно в execute
self.sort_collection(collection, case)