При использовании обработчика depsgraph_update выполнение действий с объектами, переданными в обработчик, не дает полного результата. Например, изменяя какие-нибудь свойства объекта обращаясь к нему через object.id, они могут быть изменены не полностью.
Определим обработчик depsgraph_update_post, внутри которого изменим какое-либо свойство объекта, например – цвет отображения объекта во вьюпорте.
1 2 3 4 5 6 7 8 |
def on_depsgraph_update(scene, depsgraph): for obj in depsgraph.updates: if isinstance(obj.id, Object): col = (0.0, 1.0, 1.0, 1.0) obj.id.color = col depsgraph_update_post.append(on_depsgraph_update) |
После регистрации обработчика и любого изменения текущего меша (для того чтобы обработчик сработал).
В данном примере для изменения цвета объекта мы обращались к нему через object.id:
1 |
obj.id.color = col |
Как мы видим, цвет объекта во вьюпорте изменяется, но цвет в параметре на панели свойств объекта остался прежним. После разрегистрации нашего обработчика при изменении меша его цвет восстанавливается в соответствии с тем, который был изначально в параметре.
Для того, чтобы избежать такого поведения, к объекту лучше обращаться по имени через список bpy.data.objects.
Тот же самый обработчик при обращении к объекту в bpy.data.objects меняет цвет объекта полностью и во вьюпорте и в параметре:
1 2 3 4 5 6 7 8 |
def on_depsgraph_update(scene, depsgraph): for obj in depsgraph.updates: if isinstance(obj.id, Object): col = (0.0, 1.0, 1.0, 1.0) bpy.data.objects[obj.id.name].color = col depsgraph_update_post.append(on_depsgraph_update) |
*.blend файл с примером кода для моих подписчиков на Patreon.