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
Аватара
Сообщения: 2956



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

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

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

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



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

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

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

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



Сообщение #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
Аватара
Сообщения: 724

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

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



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

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

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

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

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



  • 1

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

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


Сообщение #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
Аватара
Сообщения: 2956



Сообщение #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
Аватара
Сообщения: 1195

Сообщение #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
Аватара
Сообщения: 1210

Сообщение #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
Аватара
Откуда: Новосибирск
Сообщения: 859



  • 1

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

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



Сообщение #57 Pavel » 21.11.2018, 22:50

Не знаю как попроще объяснить проблему... Начну с предыстории:
Места на ЖД не хватает, решил почистить диск. Заметил, что папка с блендеровскими сценами много весит. Решил её очистить. Там много весит кеш с симуляцией жидкости. Структура каталогов примерно такая:
Код: Выделить всё
название_сцены\
----rend\
----cache\
----tex\
----название_сцены.blend
Но не во всех папках есть подпапки cache, tex и rend. Чтобы быстрее найти папки с кешем и с отрендеренными PNG файлами, я использовал дерево каталогов в windows 7:
Изображение
Это дерево удобно тем, что треугольниками помечены папки, у которые есть вложенные другие папки. И не нужно вручную проверять каждую папку, а только те, что отмечены этими треугольниками. Но есть неудобство:
нужно на каждый треугольник тыкнуть, чтобы раскрыть содержимое папки. Мне нужно, чтобы при нажатии на клавишу + открывались бы все папки, которые находятся внутри выделенной папки. То есть, если посмотреть на рисунок выше, то мне нужно выделить папку flip_fluids и нажать клавишу +, после чего подпапки bunny, cascade, cascade_water_internet, chocolate, chocolate_2 и т. д. развернутся (как будто бы нажали на маленький треугольник на каждой папке). Если нажать второй раз на +, то развернутся уже подпапки второго уровня вложенности.

И ещё нужно, чтобы опционально можно было бы включить отображение файлов в этом дереве. Сейчас отображаются только папки.

Как это всё сделать на питоне? Вклиниться в стандартный проводник windows невозможно? Нужно писать отдельную программу? Если отдельную программу, то как можно создать такое дерево? В tkinter нету такого? Нужно, чтобы иконки файлов в дереве были тоже видны.

Вообще у меня не только папки с кешем много места занимают. Есть много похожих папок (со схожей структурой подкаталогов). Было бы удобно сделать так: открыл программу, выделил нужный каталог и нажал два-три раза клавишу + и посмотрел, не нужно ли подчистить эту папку.
Pavel M
Аватара
Сообщения: 1210

Сообщение #58 grayich » 21.11.2018, 23:00

а смотреть обязательно?
обычно просто делается очистка по тем или иным параметрам, без всяких мышетыканий.
если цель не просто чистка, а чистка именно занимаемого места, то лучше именно это и делать, искать большие файлы-каталоги, программ для этого должно быть много, в лине мне нравится ncdu
Последний раз редактировалось grayich 21.11.2018, 23:02, всего редактировалось 1 раз.
Linux
grayich M
Аватара
Откуда: Харьков
Сообщения: 5758

Сообщение #59 Pavel » 21.11.2018, 23:02

grayich писал(а):обычно просто делается очистка по тем или иным параметрам
Это как? С помощью поиска?

grayich писал(а):а смотреть обязательно?
не всегда, но желательно.
Pavel M
Аватара
Сообщения: 1210

Сообщение #60 grayich » 21.11.2018, 23:04

Pavel писал(а):Это как? С помощью поиска?
если поиск может то почему не им
я хз как в венде это делается обычно, в линухах на любом скриптовом языке делается, от sh до того-же питона
ну и про размер мне кажется тут важнее
Linux
grayich M
Аватара
Откуда: Харьков
Сообщения: 5758

Пред.След.

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

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

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