Python вопросы

Список разделов Blender 3D Плагины

Описание: Обсуждение расширений для Blender
Модератор: exooman

Сообщение #41 Korchy » 08.12.2016, 21:53

Еще одна проблема вылезла :(
Создаю ноды в композиторе через скрипт:
Код: Выделить всё
bl_info = {
    "name": "Tmp Addon",
    "category": "All"
}
import bpy
 
class tmpAddon(bpy.types.Operator):
    bl_idname = "tmp.tmp_addon"
    bl_label = "tmpAddon"
    bl_options = {"REGISTER", "UNDO"}
 
    def execute(self, context):
        if not bpy.context.scene.use_nodes:
            bpy.context.scene.use_nodes = True
        nodesField = bpy.context.scene.node_tree
        for currentNode in nodesField.nodes:
            nodesField.nodes.remove(currentNode)
        bpy.ops.image.open(filepath="d:/Blender/_TMP/Addon_tmp/p_1.png", directory = "d:/Blender/_TMP/Addon_tmp/")
        currentImageNode = nodesField.nodes.new(type = 'CompositorNodeImage')
        currentImageNode.image = bpy.data.images['p_1.png']
        currentImageNode.location = (0, 0)
        currentImageNode.name = 'p_1.png'
        currentOutputNode = nodesField.nodes.new(type = 'CompositorNodeComposite')
        currentOutputNode.location = (200, 0)
        nodesField.links.new(nodesField.nodes['p_1.png'].outputs['Image'], currentOutputNode.inputs['Image'])
        return {'FINISHED'}
 
def register():
  bpy.utils.register_class(tmpAddon)
 
def unregister():
  bpy.utils.unregister_class(tmpAddon)
 
if __name__ == "__main__":
  register()
  bpy.ops.tmp.tmp_addon()

ноды создаются, но почему-то не активные:

Изображение

Если что-нибудь с ними сделать, они апдейтнутся и начнут работать нормально (например убрал галочку на выходном ноде use alpha):

Изображение

А как-то можно заставить ноды начать работать через скрипт?
Korchy M
Аватара
Сообщения: 2291



Сообщение #42 denis8424 » 08.12.2016, 22:18

Код: Выделить всё
bpy.ops.node.select_all(action = 'TOOGLE')
Понятия не имею, что с нодами сделать, может попробуешь выбрать их пару раз?
denis8424
Аватара
Сообщения: 711

Сообщение #43 Korchy » 08.12.2016, 22:55

Код: Выделить всё
bpy.ops.node.select_all(action = 'TOOGLE')
Ругается на некорректный контекст.
Korchy M
Аватара
Сообщения: 2291



Сообщение #44 denis8424 » 08.12.2016, 23:19

Это как?
denis8424
Аватара
Сообщения: 711

Сообщение #45 Korchy » 08.12.2016, 23:31

denis8424 писал(а):Это как?
RunetimeError: Operator bpy.ops.node.select_all.poll() failed, context is nicorrect
Korchy M
Аватара
Сообщения: 2291



Сообщение #46 denis8424 » 08.12.2016, 23:43

Наверно, чтобы блендер не ругался надо тип выбора поменять вместо переключения на SELECT/DESELECT
https://www.blender.org/api/blender_python_api_2_70_release/bpy.ops.node.html#bpy.ops.node.select_all
denis8424
Аватара
Сообщения: 711

Сообщение #47 Korchy » 09.12.2016, 10:52

Насколько я понимаю, предложенный тобой оператор ругается потому, что он выполняется в контексте 3d-view окна, а переключение нодов должно выполняться в контексте окна node editor.
Korchy M
Аватара
Сообщения: 2291



Сообщение #48 Korchy » 10.12.2016, 11:51

В продолжение вопроса - обнаружил, что если окно с нодами композитинга открыто в момент исполнения скрипта - ноды нормально обновляются. Пробую переключать программно одно из окон на композитинг

Код: Выделить всё
bpy.context.window_manager.windows[0].screen.areas[0].type = 'NODE_EDITOR'

а как установить программно галочку типа редактора нодов в "compositing" ?

Изображение
Korchy M
Аватара
Сообщения: 2291



  • 1

Сообщение #49 jstas » 10.12.2016, 16:25

Korchy, в последнем сообщении изображение не видно.
Эх, как бы мне это бы тоже, по обмену премудростями?
jstas M
Аватара
Сообщения: 475


Сообщение #50 Korchy » 10.12.2016, 18:15

jstas,
Исправил.
На этот вопрос подсказали на stackexchange

Код: Выделить всё
bpy.context.window_manager.windows[0].screen.areas[0].spaces‌​.active.tree_type = 'CompositorNodeTree'

Но чего-то общая проблема пока не решается. Пробую переключить одно из существующих окон в режим NODE_EDITOR и композитинга. Если оставляю его в таком виде - оно перерисовывается и ноды обновляются. Если в скрипте после построения нодов возвращаю окно в прежний тип - ноды опять не обновляются :(
Korchy M
Аватара
Сообщения: 2291



Сообщение #51 БодрыйШурик » 18.02.2017, 22:47

Не знаю можно ли задавать здесь вопросы по языку в целом, но надеюсь можно.

Суть проблемы.
Есть маленький модуль swampy, написанный, как я понял под версии питона менее третьей версии.
При запуске он обращается к модулю Tkinter. Однако в версии 3.6 этот модуль уже называется tkinter.
И пишет вот это:
Traceback (most recent call last):
File "C:\Users\Антон\Desktop\swampy-2.1.7\swampy\TurtleWorld.py", line 8, in <module>
from Tkinter import TOP, BOTTOM, LEFT, RIGHT, END, LAST, NONE, SUNKEN
ModuleNotFoundError: No module named 'Tkinter'

Вопрос: Как нормально запустить swampy?
import tkinter as Tkinter почему-то не помогает.

import tkinter as Tkinter
help(Tkinter)
Выдаёт справку нормально.

Заранее спасибо.
БодрыйШурик
Сообщения: 25

  • 1

Сообщение #52 andreymal » 18.02.2017, 23:06

Открыть "TurtleWorld.py" и исправить импорт в line 8, не? :)

Добавлено спустя 1 минуту 56 секунд:
Между прочим, swampy для третьего питона гуглится http://www.greenteapress.com/thinkpython/swampy/swampy-2.1.5.python3.zip
(правда, там написано, что эта версия никак не поддерживается)
Читая эту подпись, вы впустую потратили 5 секунд своей жизни.
andreymal M
Аватара
Сообщения: 1077

Сообщение #53 БодрыйШурик » 18.02.2017, 23:17

Я пробовал исправлять в ручную.
Дальше начинают всё равно лезть ошибки такого рода.
Не может найти то, ошибки синтаксиса в этом.

Спасибо большое.
Я был на этом сайте, но как-то пропустил :P

Надеюсь дальше подобного возникать не будет.
БодрыйШурик
Сообщения: 25

Сообщение #54 Pavel » 23.04.2018, 22:32

Как узнать родительский класс? Например, есть такой код:
Код: Выделить всё
class A:
    pass

class B(A):
    pass


Нужно узнать программным способом, какой класс является родительским для класса B.
Мне это нужно для того, чтобы узнать базовый класс для определённых объектов в блендере. Например, для bpy.types.ShaderNodeBackground.
Pavel M
Аватара
Сообщения: 720

Сообщение #55 Levitanus » 23.04.2018, 22:45

Pavel, блин, из головы вылетело. Ну через isinstance перебором точно можно, а вообще где-то в магических методах должно быть, типа __classes__ можно через dir(object) поглядеть

Добавлено спустя 38 секунд:
>>> class Base(object):
... pass
...
>>> class Derived(Base):
... def print_base(self):
... for base in self.__class__.__bases__:
... print base.__name__
...
>>> foo = Derived()
>>> foo.print_base()
Base

Добавлено спустя 1 минуту 37 секунд:
соответственно, ты можешь использовать
Код: Выделить всё
for object.c__class_.__bases__:
    print(base.__name__)
пишу музыку, примеры тут
Levitanus M
Аватара
Откуда: Новосибирск
Сообщения: 863



  • 1

Сообщение #56 Korchy » 23.04.2018, 22:55

__mro__
Korchy M
Аватара
Сообщения: 2291



Пред.

Вернуться в Плагины

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 1 гость