3d форум по Blender

Blender => Другое => Дополнения, скрипты => Тема начата: LanuHum от 03 Ноябрь 2014, 23:02:27

Название: Совсем не страшный питон.
Отправлено: LanuHum от 03 Ноябрь 2014, 23:02:27
Многие думают, что для того, чтобы мало помалу начать писать скрипты, нужно очень много изучить теории.
Сам я мало знаю теории, далеко не ас в программировании, как некоторые из присутствующих здесь на сайте, но кое-что могу и другим могу показать.
Питон в блендере - это не страшное животное, и его изучение может стать весьма интересным и полезным.
Итак, для начала вооружимся несколькими основными понятиями в языке программирования Python.

1. Код в обязательном порядке пишется на латинице за исключением названий объектов, материалов, текстур и прочих имён.

2. Всё, что пишется на одной строке после символа "#" - комментарий, который так же может быть написан на любом языке.
 Комментарий для исполнения программы не нужен. Его вы оставляете, чтобы помнить, зачем та или иная часть кода.

3. Переменные.
Это то, что несёт информацию от пользователя и применяется для вычислений.
Значения их могут меняться по ходу пьесы.
Переменная должна быть объявлена до действий над ней.(Чуть ниже в п 6.1 это будет понятно)
Пример переменных:
Код
a = 10          # Целое число
b = "Cube"      # Строка
c = 10.0        # Число с плавающей запятой
с = float(a)    # Превращает целое число в число с плавающей запятой
a = int(c)      # Округляет число с плавающей запятой до целого числа

4. Арифметика.
Код
d = a / c   # Разделить
e = a * c   # Умножить
g = a + c   # Сложить
h = a - c   # Вычесть
i = a ** c  # а возвести в степень с

5. Отступы. Если строчка заканчивается символом ":" (двоеточием), то начало следующей строчки должно быть смещено от начала строчки,
 в которой находится символ ":" на четыре отступа вправо.
Пример:
Код
if a > b:
    break
Это так же относится и к строчкам имеющим комментарий.
Пример:
Код
if a > b: # если a > b, то прекращаем цикл
    break

6. Ключевые слова. Это служебные слова, которые нельзя применять в обозначениях переменных.
В текстовом редакторе Блендера есть кнопка, включающая подсветку синтаксиса.
Если вы напишете
Код
k = a * g  
а ниже напишете
Код
float = i / e
то увидите, что float отличается цветом от k. Это значит, что слово float ключевое, и его необходимо заменить на любое другое, не отличающееся цветом от k

6.1 Ключевые слова if, elif, else, or, and задают условия. Часто при этом используются сравнения. Заданное условие заканчивается двоеточием
Код
c = 0 # Вспоминаем пункт 3 и заблаговременно объявляем переменные
g = 6
m = 100
if a == b:                  # Задаём условие: если (if) a равно(==) b 
    c = 1                   # То с равно(=) одному (не забываем про отступ и не путаем равенство со сравнением:
                            # если сравниваем, то ==, если присваиваем значение переменной, то =)   
elif a != b and b > 0:      # Продолжаем задавать условие: или если (elif) a не равно(!=) b и(and) b больше(>) нуля(0)
    с = 2                   # То с равно двум (не забываем про отступ)
elif a < g or a > m:        # Продолжаем задавать условие: или если (elif) a меньше(<), чем g или(or) а больше(>) чем m
    c = 3                   # То с равно трём  (не забываем про отступ)
else:                       # В противном случае, если ни одно условие не удовлетворилось (else)
    c = 4               # То с равно четырём
 
 
Другие сравнения:
a <= b    # а меньше или равно
a >= b    # а больше или равно

6.2 Ключевые слова for, in, range, break
Если нужно выполнить несколько однотипных действий запускается цикл.
Пример:
Код
a = 4
b = a ** 3
c = 5
for i in range(a,b):    # ключевое слово for запускает цикл: по порядку от а до b (i здесь переменная, значение которой с каждым проходом увеличивается на 1)
    с = (с + 3) / i           # к с прибавить 3 и разделить это на i
Понятно, что первый раз с будет равно (5 + 3)/4, то бишь 2, второй раз с будет равно (2 + 3)/5, то бишь 1, третий раз (1 + 3)/6, то бишь 0,666666666667 и так далее...
Код
a = 4
b = a ** 3
c = 5
for i in range(a,b):    # ключевое слово for запускает цикл: по порядку от а до b (i здесь переменная, значение которой с каждым проходом увеличивается на 1)
    с = (с + 3) / i           # к с прибавить 3 и разделить это на i
    if c == 0.001:
        break     # Прекратить цикл
7. Подключаемые модули. Сегодня random и bpy
Код
import random
a = random.random()         # Для переменной а генерируется случайное значение от нуля до одного
a = random.randint(1,10)    # Для переменной а генерируется случайное целое значение от одного до десяти

На первый раз мы много узнали и ничего не поняли бы, если бы не узнали кое-что про наш родной модуль bpy, связывающий Блендер с Питоном
Итак, первая заветная строчка нашего первого скрипта - это подключение нашего родимого модуля
Код
import bpy
Активные элементы -
Код
bpy.context
Определяем нужные так:
Код
scn = bpy.context.scene
ob = bpy.context.object
Из вышесказанного понимаем, что scn и ob - это переменные, а называем мы их так, чтобы приблизительно помнить, что есть что
Варианты sc, sce, obj, да какие угодно
Важно знать, что многие манипуляции над объектами производятся когда они либо активны
Код
scn.objects.active = ob
либо выделены
Код
ob.select = True
Напротив, чтобы объект остался нетронутым с него неплохо было бы снять выделение:
Код
ob.select = False
Создадим стенку из кирпичей, не используя array, чтобы кирпичи легли с небольшой неравномерностью.
Для этого поищем нужные операторы пройдя в меню Help > Operator Cheat Sheet. Кликнув,
мы создадим текстовой блок, который сможем отыскать в текстовом редакторе Блендера.
В строчках, начинающихся с bpy.ops поищем что-нибудь про bpy.ops.object и bpy.ops.transform. Ура! Здесь всё есть, что нам нужно!
Пишем скрипт зная, что у операторов Блендера переменные в скобках - по умолчанию, поэтому употребляем их, только, если наши значения с ними не совпадают:
Код
import bpy
import random
ob=bpy.context.object
for y in range(0,10):  # Цикл! Десять кирпичей в ряд!
    for z in range(0,5): # Цикл! Пять рядов!
        bpy.ops.object.duplicate(linked=False, mode='TRANSLATION')  # Копируем выделенный объект
        bpy.ops.transform.translate(value=(0, (y*2)+(y/10), (z*2)+(z/10))) # Перемещаем копию первый раз на длину одного кирпича плюс шов, далее на два и так далее...
        if z % 2 != 0:  # Если ряд нечётный
            bpy.ops.transform.translate(value=(0, 1, 0)) # сдвигаем кирпич ещё на полкирпича
        scale=random.randint(1,5)  # Задаём случайный масштаб
        bpy.ops.transform.resize(value=(1-(scale/10), 1, 1)) # Масштабируем по оси X
        angle=random.random()/10   # Задаём случайный угол
        bpy.ops.transform.rotate(value=angle, axis=(1, 1, 1))  # Вращаем по все осям
        obj=bpy.context.object # Определяем активный объект. После копирования им становится новый
        obj.select=False # Снимаем выделение с активного объекта
        bpy.context.scene.objects.active=ob # Делаем активным исходный объект, который мы взялись копировать
        ob.select=True  # Выделяем его, чтобы следующий проход цикла скопировал, именно, его, и от его координат разместил следующую копию

[вложение удалено Администратором]
Название: Re: Совсем не страшный питон.
Отправлено: bdancer от 04 Ноябрь 2014, 18:16:36
В примере лучше сдвигать кирпичи используя ob.dimensions (который bounding box), иначе придется менять скрипт, подгоняя параметры, если размеры кирпича изменятся:
Код
import bpy
import random

ob = bpy.context.object

obX = ob.dimensions[0]
obY = ob.dimensions[1]
obZ = ob.dimensions[2]

# Цикл! Десять кирпичей в ряд!
for y in range(0,10):
    # Цикл! Пять рядов!
    for z in range(0,5):
        # Копируем выделенный объект
        bpy.ops.object.duplicate(linked=False, mode='TRANSLATION')

        # Перемещаем копию первый раз на длину одного кирпича плюс шов, далее на два и так далее...
        bpy.ops.transform.translate(value=(0.0, y * obY, z * obZ))
       
        # Если ряд нечётный
        if z % 2 != 0:
            # сдвигаем кирпич ещё на полкирпича
            bpy.ops.transform.translate(value=(0.0, obY / 2.0, 0.0))
Название: Re: Совсем не страшный питон.
Отправлено: sungreen от 04 Ноябрь 2014, 19:12:56
... добавлю как этим пользоваться и как это выглядит :)  ...
... вот мувик ...
out 27



ps отец всегда говорил, что кирпич в кладке не главное, раствор - главное, он связывает, он держит ...
Название: Re: Совсем не страшный питон.
Отправлено: LanuHum от 04 Ноябрь 2014, 21:49:45
Цитировать
... добавлю как этим пользоваться и как это выглядит :)  ...
Он же не дописал до конца.  :) :) :)
 Там как раз проводится переназначение. Если этого ни сделать, то смещение как раз будет производиться ни от изначального, а от последнего продублированного.

Ну, расскажу сегодня про startswith.
Как нам быть, если нам нужно выделить только копии? Блендер копированным объектам присваивает то же название, но только с числовым индексом. Это очень хорошо, поскольку у Питона есть функция позволяющая сравнивать имена по их первым символам. Как это выглядит, мы увидим на примере созданных кирпичиков.
Давайте теперь снимем фаски на каждом кирпиче так же с небольшими отклонениями от определённой величины.
Теперь context.object нас не спасёт. Мы будем обращаться к общей базе данных
bpy.data.objects

Код
import bpy
import random
scene=bpy.context.scene
bpy.ops.object.select_all(action='DESELECT')  # Обязательно снимаем выделение со всех объектов, чтобы в дальнейшем цикл смог выделять их по одному и обрабатывать.
for ob in bpy.data.objects:    # По объекту в базе данных
    if ob.type == "MESH" and ob.name.startswith("Cube"):  # Если тип объекта Mesh и начало имени объекта "Cube"
        ob.select=True    # Выделяем объект
        scene.objects.active = ob  # Делаем его активным
        bpy.ops.object.mode_set(mode="EDIT")  # Переходим в режим редактирования меша, чтобы получить доступ к фейсам
        delta = 0.03+random.random()/10   # Задаём случайную величину фаски
        bpy.ops.mesh.bevel(offset_type='OFFSET', offset=delta, segments=1, profile=0.5, vertex_only=False)  # Применяем bevel, где назначаем offset
        bpy.ops.object.mode_set(mode="OBJECT")  # Переходим в объектный режим, чтобы дать возможность циклу работать со следующим объектом
        ob.select = False  # Снимаем выделение с объекта, чтобы следующий объект выделился один одинёшенек.
:)


[вложение удалено Администратором]
Название: Re: Совсем не страшный питон.
Отправлено: LanuHum от 05 Ноябрь 2014, 21:07:18
Ну, вот нам подкинули темку. Попробуем произвести рендер анимации, где анимироваться будут даже слои.
Разумеется, написанного выше будет очень недостаточно.
Нам нужно погуглить и отыскать руководство по пользованию модулем os
Нам нужно подключить аддон api-navigator, что в разделе development. Этот аддон помогает отыскивать пути к крутилкам, которыми мы пользуемся, используя мышку и клавиатуру. При наведении на крутилки вплывают подсказки, указывающие, цели, а навигатор напишет нам правильно путь.
Теперь прикинем, что мы будем писать в операторе:
Код
import os
import bpy
scn=bpy.context.scene
start=scn.frame_start
end=scn.frame_end
format=scn.render.image_settings.file_format.lower()
for i in range(start,end):
    scn.frame_set(i,0.0)
    scn.layers[0]=scn.lay_anim_0
    scn.layers[1]=scn.lay_anim_1
    scn.layers[2]=scn.lay_anim_2
    scn.layers[3]=scn.lay_anim_3
    scn.layers[4]=scn.lay_anim_4
    scn.layers[5]=scn.lay_anim_5
    scn.layers[6]=scn.lay_anim_6
    scn.layers[7]=scn.lay_anim_7
    scn.layers[8]=scn.lay_anim_8
    scn.layers[9]=scn.lay_anim_9
    scn.layers[10]=scn.lay_anim_10
    scn.layers[11]=scn.lay_anim_11
    scn.layers[12]=scn.lay_anim_12
    scn.layers[13]=scn.lay_anim_13
    scn.layers[14]=scn.lay_anim_14
    scn.layers[15]=scn.lay_anim_15
    scn.layers[16]=scn.lay_anim_16
    scn.layers[17]=scn.lay_anim_17
    scn.layers[18]=scn.lay_anim_18
    scn.layers[19]=scn.lay_anim_19
    scn.update()
    bpy.ops.render.render('INVOKE_REGION_WIN')
    image = bpy.data.images["Render Result"]
    filepath = "/tmp/RenderResult_%s.%s"%(i,format)
    if os.path.exists(filepath):
        os.remove(filepath)
    image.save_render(filepath=filepath, scene=None)
А, завтра, попробуем закончить. :)
Название: Re: Совсем не страшный питон.
Отправлено: mr.A от 28 Август 2015, 10:30:58
Как настроить автодополнение кода из blender api в среде разработки Eric6. Для этого нужны *.api файлы. Для python эти файлы уже есть, а вот для blender, их естественно нет. Как их сделать:
С программой eric поставляется много всего(даже свой браузер), в том числе скрипт eric6_api который может сам генерировать *.api файлы из заданных исходных файлов или каталога.
Следующая команда сгенерирует файл api:
Код
eric6_api -r -l Python3 -o Blender.api /usr/share/blender/2.75/scripts/startup /usr/share/blender/2.75/scripts/modules /usr/share/blender/2.75/scripts/addons/modules
Вот только не знаю все ли нужное я включил? Или что-то лишнее?

Вот часть из сгенерированного файла Blender.api чтобы было понятно что получается на выходе скрипта:
Код
bpy.utils.test_register?4(mod)
bpy.utils.test_reload?4(mod)
bpy.utils.time_from_frame?4(frame, fps=None, fps_base=None)
bpy.utils.time_to_frame?4(time, fps=None, fps_base=None)
bpy.utils.unregister_manual_map?4(manual_hook)
bpy.utils.unregister_module?4(module, verbose=False)
bpy.utils.unregister_module_call?4(mod)
bpy.utils.user_resource?4(resource_type, path="", create=False)
bpy_extras.anim_utils.bake_action?4(frame_start, frame_end, frame_step=1, only_selected=False, do_pose=True, do_object=True, do_visual_keying=True, do_constraint_clear=False, do_parents_clear=False, do_clean=False, action=None, )
bpy_extras.anim_utils.obj_frame_info?4(obj)
bpy_extras.anim_utils.pose_frame_info?4(obj)
bpy_extras.image_utils._image_load?5(path)
bpy_extras.image_utils._image_load_placeholder?5(path)

Полученный файл Blender.api скопировать куда-нибудь(я скопировал к остальным в /usr/share/qt/qsci/api/python). В настройках eric Редактор-Автозавершение поставить галочку Разрешить автозавершениеРедактор-Автозавершение-QScintilla из документов и файлов api
Редактор-API Поставить галочку Автоматически компилировать файлы api. выбрать сгенерированный файл Blender.api. Компилировать api. Ok
Теперь работает автодополнение.  Горячая клавиша Ctrl+Space.
Возможно я делаю что-то не так или совсем неправильно. Подскажите, если знаете.
 

[вложение удалено Администратором]
Название: Re: Совсем не страшный питон.
Отправлено: sungreen от 28 Август 2015, 11:05:47
>> Как настроить автодополнение кода из blender api в среде разработки Eric6
... нужная вещь ...
Название: Re: Совсем не страшный питон.
Отправлено: mr.A от 28 Август 2015, 11:24:38
Как добавить абсолютно все api? Например, bpy.data не подсказывает и не понимает.  Или я что-то не понимаю...


[вложение удалено Администратором]
Название: Re: Совсем не страшный питон.
Отправлено: LanuHum от 28 Август 2015, 19:17:56
Как добавить абсолютно все api? Например, bpy.data не подсказывает и не понимает.  Или я что-то не понимаю...
У меня eric6 не собирается.
Я тоже не понимаю, почему ты всё же выбрал Эрика?
Автодополнение кода работает в консоли Блендера. Для изучения API этого вполне достаточно.
Хотя, я не пользуюсь консолью и автодополнением.
И, не уверен, что ты настроишь своего Эрика так, чтобы он смог иметь доступ ко всему API Блендера.
К тому же, API постоянно изменяется. Это происходит не только от версии к версии, но и с каждым подключением - отключением отдельных аддонов, имеющих собственные элементы интерфейса. Ты будешь писать в Эрике завтра, используя сегодняшние файлы *.api, будешь получать ошибку и недоумевать.
И, на скриншоте навигатор обращается к модулю _bpy, но не к bpy



[вложение удалено Администратором]
Название: Re: Совсем не страшный питон.
Отправлено: mr.A от 28 Август 2015, 20:39:00
Я тоже не понимаю, почему ты всё же выбрал Эрика?
В нем удобно PyQt5. Хочу свои программки с гуи. Хотя я его еще не выбрал.
Цитировать
И, на скриншоте навигатор обращается к модулю _bpy, но не к bpy
Так это разные модули?
Название: Re: Совсем не страшный питон.
Отправлено: LanuHum от 28 Август 2015, 20:57:09
Так это разные модули?
Я плохо разбираюсь в том, что мне не нужно, но, предполагаю, что модуль _bpy - это С-ишный модуль, к которому обращается Py-модуль bpy

Название: Re: Совсем не страшный питон.
Отправлено: LanuHum от 28 Август 2015, 21:26:16
В нем удобно PyQt5. Хочу свои программки с гуи. Хотя я его еще не выбрал.
И, что, работает pyqt5?
https://www.google.ru/?gfe_rd=cr&ei=maLgVeCYCKSdwAPtqrPoBQ#newwindow=1&q=qopenglshaderprogram+could+not+create+shader+program
Название: Re: Совсем не страшный питон.
Отправлено: mr.A от 28 Август 2015, 23:14:04
И, что, работает pyqt5?
Да, работает. Это ты какой-то древний баг нашел. И связанный, видимо, с видео-драйверами.

[вложение удалено Администратором]
Название: Re: Совсем не страшный питон.
Отправлено: mr.A от 28 Август 2015, 23:50:16
Выполнить какой-нибудь скрипт в блендере не требующий визуального интерфейса можно так:
Код
blender   --background   -noaudio   --python   myscript.py

Например, можно добавть в Geany такую команду сборки, как на картинке.  Оператор print, вызываемый из скрипта, будет печатать в консоль все, что захочется.

[вложение удалено Администратором]
Название: Re: Совсем не страшный питон.
Отправлено: LanuHum от 29 Август 2015, 00:49:16
И, что, работает pyqt5?
Да, работает. Это ты какой-то древний баг нашел. И связанный, видимо, с видео-драйверами.
Это нынешний баг с примерами openGL в pyqt5
Название: Re: Совсем не страшный питон.
Отправлено: LanuHum от 29 Август 2015, 00:55:57
Выполнить какой-нибудь скрипт в блендере не требующий визуального интерфейса можно так:
Код
blender   --background   -noaudio   --python   myscript.py

Например, можно добавть в Geany такую команду сборки, как на картинке.  Оператор print, вызываемый из скрипта, будет печатать в консоль все, что захочется.
Вот, и первые твои открытия! А, вот, чтоб без конца не менять эти команды сборки, можно и на пикуте гуёвину сделать. Типа, выбираешь блендфайл, выбираешь скрипт, и пускай оно там в бэкграунде исполняется :)
Название: Re: Совсем не страшный питон.
Отправлено: Samovar от 29 Август 2015, 02:15:08
Раз такая "пьянка" пошла, то не подскажете где взять подобный  XML файл для Notepad++? Ссылка уже не работает :(
Название: Re: Совсем не страшный питон.
Отправлено: Samovar от 29 Август 2015, 02:46:50
 Еще один вопрос: что значат self и context ?
Название: Re: Совсем не страшный питон.
Отправлено: LanuHum от 29 Август 2015, 09:55:43
Еще один вопрос: что значат self и context ?
Цитировать
Первым аргументом каждого метода класса, включая __init__, всегда является текущий экземпляр класса. Общепринято всегда называть этот аргумент self. В методе __init__ self ссылается на только что созданный объект, в других методах — на экземпляр класса, для которого метод вызывается. Хотя и необходимо явно указывать self при определении метода, вы его не указываете, когда вызываете метод; Python добавит его автоматически.
http://ru.diveintopython.net/fileinfo_class.html

Context - активный объект интерфейса: активная сцена, активная вкладка, активный 3Д-объект, активный материал, активная текстура.
Например, если в скрипте написано
tex = bpy.context.object.active_material
Это значит, что переменной tex присвоен материал, который выделен, и, принадлежит этот материал активному объекту сцены.
Если создаём класс, то:
Код
class Test(operator):
    nt = IntProperty()
    def execute(self,context):
        n = self.nt     # переменной n присваиваем значение переменной nt, объявленной в этом классе
        k = len(context.object.data.vertices)    # переменной k присваиваем значение взятое у активного объекта
        print (k/n)
        return {FINISHED}
Название: Re: Совсем не страшный питон.
Отправлено: LanuHum от 29 Август 2015, 12:54:02
В Geany удобно размер шрифта изменять в редакторе: Ctrl - Scroll. Нужно, например, скриншот сделать, чтоб текст скрипта на PyQT5 в кадр влез, бац, и готово! :)


[вложение удалено Администратором]
Название: Re: Совсем не страшный питон.
Отправлено: bdancer от 29 Август 2015, 13:56:54
LanuHum,
Код
    scn.layers[0]=scn.lay_anim_0
    scn.layers[1]=scn.lay_anim_1
    scn.layers[2]=scn.lay_anim_2
    scn.layers[3]=scn.lay_anim_3
    scn.layers[4]=scn.lay_anim_4
    scn.layers[5]=scn.lay_anim_5
    scn.layers[6]=scn.lay_anim_6
    scn.layers[7]=scn.lay_anim_7
    scn.layers[8]=scn.lay_anim_8
    scn.layers[9]=scn.lay_anim_9
    scn.layers[10]=scn.lay_anim_10
    scn.layers[11]=scn.lay_anim_11
    scn.layers[12]=scn.lay_anim_12
    scn.layers[13]=scn.lay_anim_13
    scn.layers[14]=scn.lay_anim_14
    scn.layers[15]=scn.lay_anim_15
    scn.layers[16]=scn.lay_anim_16
    scn.layers[17]=scn.lay_anim_17
    scn.layers[18]=scn.lay_anim_18
    scn.layers[19]=scn.lay_anim_19

можно немного упростить:
Код
for i in range(20):
    scn.layers[i] = getattr(scn, 'lay_anim_%i' % i)
Название: Re: Совсем не страшный питон.
Отправлено: mr.A от 29 Август 2015, 13:58:01
Раз такая "пьянка" пошла, то не подскажете где взять подобный  XML файл для Notepad++? Ссылка уже не работает :(
Сгенерировать самому. Вот, например, такой скрипт http://sourceforge.net/projects/npp-python/files/1.2/ для второго питона. Переделать его в третий(2to3), правда нужно импорт править, у меня мало знаний. Сконфигурировать, по инструкции, файл my_imports.py  добавив ссылки на модули блендера. И, наверно, запустить так: 
Код
blender   --background   -noaudio   --python    generate_python_autocomplete.py  < my_imports.py >  python.xml
В итоге получиться нужный xml. Но это все теория.
Название: Re: Совсем не страшный питон.
Отправлено: LanuHum от 29 Август 2015, 14:27:45
LanuHum, можно немного упростить:
Код
for i in range(20):
    scn.layers[i] = getattr(scn, 'lay_anim_%i' % i)
Спасибо, bdancer! Действительно, совсем не так  уж давно я открыл для себя getattr, hasattr. Удобные фишки.
bdancer, а ты можешь посоветовать новичкам среду для написания Блендер скриптов? Ты используешь NotePad++ с его автодополнением?
Название: Re: Совсем не страшный питон.
Отправлено: Samovar от 29 Август 2015, 16:22:39
Пытаюсь врубиться в суть Классов, LahuHum. Спасибо за ответ.
mr.A, спасибо! Попробую.
PS. Мне тоже интересно чем bdancer пользуется.
Название: Re: Совсем не страшный питон.
Отправлено: bdancer от 29 Август 2015, 22:02:47
Я использую Sublime Text 3 без автодополнений, Atom тоже неплох, да, мне особо фичей и не надо.
Если нужно автодополнение - можно попробовать это http://wiki.blender.org/index.php/User:Ideasman42/BlenderAsPyModule или https://github.com/svenfraeys/SublimeBlender.
Название: Re: Совсем не страшный питон.
Отправлено: LanuHum от 29 Август 2015, 23:07:22
Blender as pymodule  у меня собрать не получилось, ошибок куча.
Название: Re: Совсем не страшный питон.
Отправлено: mr.A от 30 Август 2015, 13:53:13
Я собрал и установил Blender as pymodule. Но почему не работает?
Код
$ python -c "import bpy ; bpy.ops.render.render(write_still=True)"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python3.4/site-packages/2.75/scripts/modules/bpy/__init__.py", line 38, in <module>
    from _bpy import types, props, app, data, context
ImportError: No module named '_bpy'
Файл bpy.so и каталог 2.75 со всем добром лежат в /usr/lib/python3.4/site-packages. Что еще где добавить/поправить/прописать?
Для чего это нужно? Пошаговая отладка скрипта(в eric или idea) очень помагает понять как он работает или что там написл не так. С обычными скриптами проблем нет, а если есть import bpy и т.п. то никак не отладишь такой скрипт.
Blender as pymodule решил бы эту задачу.
Название: Re: Совсем не страшный питон.
Отправлено: LanuHum от 30 Август 2015, 14:22:35
Попробуй переименовать bpy.so в _bpy.so
Название: Re: Совсем не страшный питон.
Отправлено: mr.A от 30 Август 2015, 17:11:29
Переименовал, теперь другая ошибка:
Код
$ python -c "import bpy ; bpy.ops.render.render(write_still=True)"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python3.4/site-packages/2.75/scripts/modules/bpy/__init__.py", line 38, in <module>
    from _bpy import types, props, app, data, context
ImportError: dynamic module does not define init function (PyInit__bpy)
Погуглил, ничего понятного. Может собрал нет так. Да и этот метод вообще официально не поддерживатеся
Цитировать
The option to build Blender as a Python module is not officially supported, in the sense Blender.org isn't distributing it along with regular releases, Currently, its a build option you can enable, for your own use.
Название: Re: Совсем не страшный питон.
Отправлено: LanuHum от 30 Август 2015, 17:37:52
Переименовал, теперь другая ошибка:
Код
$ python -c "import bpy ; bpy.ops.render.render(write_still=True)"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python3.4/site-packages/2.75/scripts/modules/bpy/__init__.py", line 38, in <module>
    from _bpy import types, props, app, data, context
ImportError: dynamic module does not define init function (PyInit__bpy)

Открой Geany, создай чистый файл с расширением py, напиши в нём import bpy, запусти и почитай консоль.
По-моему, ты ерунду пишешь python -c "import bpy ; bpy.ops.render.render(write_still=True)"

До рендера нужно ещё строчек сколько-то кода.
import bpy
scene =bpy.data.scenes.new()
add camera
add lamp
add mesh
Не могу я соображать, что там писать, если у меня нету этого.
Скинь куда-то собранный модуль, чтоб его скачать, если 64-битное и линуксовое. :)
Название: Re: Совсем не страшный питон.
Отправлено: mr.A от 30 Август 2015, 19:14:37
Открой Geany, создай чистый файл с расширением py, напиши в нём import bpy, запусти и почитай консоль.
Скинь куда-то собранный модуль, чтоб его скачать, если 64-битное и линуксовое. :)
О, спасибо, так - работает, когда в geany да скриптом, а просто, в голой консоли, не хочет. Кстати, файл не надо переименовывать, вернул как было. Вот модуль, делал в archlinux x64  https://yadi.sk/d/jssgbEkyikgSh
Название: Re: Совсем не страшный питон.
Отправлено: LanuHum от 30 Август 2015, 22:53:18
Вот модуль, делал в archlinux x64  https://yadi.sk/d/jssgbEkyikgSh
Ни едет у меня. Требует libmvec из glibc-2.22, а у меня 2.20. Хотел пересобрать glibc, нет gcc5. Пересобирать gcc долго, а выходной закончился. :)
Так что, пока не помогу разобраться  с этим модулем.
Название: Re: Совсем не страшный питон.
Отправлено: mr.A от 30 Август 2015, 23:04:12
Да, в принципе оно вроде работает. Скрипты с import bpy запускаются. Я в eric6 могу пошагово отлаживать blender-python скрипт и смотреть на содержимое переменных. Красота!

[вложение удалено Администратором]
Название: Re: Совсем не страшный питон.
Отправлено: mr.A от 01 Сентябрь 2015, 01:19:10
Если скачать блендер с этой странички https://builder.blender.org/download/ то в скачаном архиве обнаружатся дополнительные аддоны, которых нет в официальноей сборке. Из них интересен text_intellisense.py правда он старенький, под версию блендера 2.57, но работает, автодополняет текст(и чуть глючит - блокирует иногда клавишу enter). Сделан он под windows - пути там folder\file , а в linux  folder/file. Наклонная черта не туда. Короче, я его сюда прикреплю, с правленной строкой №265 и обязательно подправте ее под свое имя(или систему  :P), почему-то ~ не прокатывае. Этот скрипт позволяет ставить бряк(breakpoint) в любом вышем скрипте прямо в блендере. При бряке (а блендер надо открыть из консоли) на нужной строчке прерывается скрипт и в консоле открывается такое приглашение: (Pdb) можно набрать help и посмотреть возможные команды отладчика, например s шаг вперед step. Я еще не разбирался с этой возможность отладки скриптов более детально, мне хватает эрика

[вложение удалено Администратором]
Название: Re: Совсем не страшный питон.
Отправлено: Striver от 01 Сентябрь 2015, 06:43:06
Сколько программил на питоне, так и не смог заставить себя пользоваться этими отладчиками. Всегда хватало простого print в консоль, или, если инфы много, то в логи.
Конечно, это дело вкуса...
Название: Re: Совсем не страшный питон.
Отправлено: mr.A от 01 Сентябрь 2015, 10:21:41
На начальном этапе освоения языка, я думаю, отладчики полезны. Например, когда есть чужой код, в котором хочется разобраться и на его основе научиться делать так же, а вот не сосем понятно, как он работает. Трассируешь по шагам и смотришь что происходит.  Но так-то print в консоль - мощьная вещь.
Название: Re: Совсем не страшный питон.
Отправлено: LanuHum от 11 Декабрь 2015, 22:41:59
Судя по ответам в этой теме, я ничего не открыл сверхестественного. Все всё знают.
Ну, тогда давайте упростим задачу.
Есть объект с системой частиц. У частиц есть параметры Size и Rotate. Нам нужно передать каждой частице scale и rotate какого-то объекта Fuck на данный кадр, Fuck мы используем объектом в системе частиц.
Можно предположить такой расклад. Сначала мы записываем по кадрам size/rotate объекта Fuck. Затем,  каждой частице, с момента её рождения нам нужно вставить size и rotate из запаисанных данных.
Кто тут соображает?
Название: Re: Совсем не страшный питон.
Отправлено: LanuHum от 11 Декабрь 2015, 23:02:56
Я вот пишу
Код
    def execute(self, context):
        scene = context.scene
        ob = context.object
        fs=scene.frame_start
        fc=scene.frame_current
        fe=scene.frame_end
        if ob.particle_systems:
            pSys = ob.particle_systems.active
            pSysName = ob.name+pSys.name
            parts = pSys.particles
            lifetime = int(pSys.settings.lifetime)
            dobject=pSys.settings.dupli_object
            alives = {}
            transes = []
            for i in range(1,lifetime+2):
                scene.frame_set(i, 0.0)
                dmatrix=dobject.matrix_world
                scale = dmatrix.to_scale()[:]
                rotate = tuple([degrees(e) for e in dmatrix.to_3x3().to_euler()])
                transes.append((scale[0],scale[1],scale[2],rotate[0],rotate[1],rotate[2]))
            for i in range(fs,fe):
                scene.frame_set(i, 0.0)
                bakeFile = open("/tmp/%s_%s.bda"%(pSysName,i),"w")
                for k,v in enumerate(parts):
                    if v.alive_state == 'ALIVE':
                        try:
                            if alives[k] > 0:
                                alives[k] += 1
                        except:
                            alives[k] = 1
                    else:
                        try:
                            if alives[k] > 0:
                                del(alives[k])
                        except:
                            pass
   
                for key in alives:
                    bakeFile.write('%s %s\n'%(k,transes[alives[k]]))
                bakeFile.close()
            scene.frame_set(fc, 0.0)

        return {'FINISHED'}
И, это не работает...
Питон не такая уж вкуснотень.
Название: Re: Совсем не страшный питон.
Отправлено: Striver от 12 Декабрь 2015, 21:27:50
Вот не понимаю, зачем Питон в такой задаче?
Всё-таки, когда можно обычными средствами обойтись - надо так и поступать...
Цитировать
Нам нужно передать каждой частице scale и rotate какого-то объекта Fuck на данный кадр, Fuck мы используем объектом в системе частиц.
Анимировал объект через арматуру, все частицы послушно за ним вращаются. Питон здесь вообще никаким боком не понадобился.

[вложение удалено Администратором]
Название: Re: Совсем не страшный питон.
Отправлено: LanuHum от 12 Декабрь 2015, 21:41:22
Вот не понимаю, зачем Питон в такой задаче?
Всё-таки, когда можно обычными средствами обойтись - надо так и поступать...
Цитировать
Нам нужно передать каждой частице scale и rotate какого-то объекта Fuck на данный кадр, Fuck мы используем объектом в системе частиц.
Анимировал объект через арматуру, все частицы послушно за ним вращаются. Питон здесь вообще никаким боком не понадобился.
Может, ты не понял?
Задача - 100 000 цветов,один на один не похожих...
Название: Re: Совсем не страшный питон.
Отправлено: R_M_S от 14 Сентябрь 2016, 14:39:10
Может не совсем по теме данной ветки, но где-то рядом.
Подскажите где можно ознакомиться с тем, какие значения необходимо вводить в идентификатор оператора при создании новой горячей клавиши.
Например: Захотел я "посадить" на хоткей команду, вызывающую управляющий элемент "вращение".
Нажав кнопку "Add New" мне предлагается ввести  идентификатор оператора. В случае с "Вращением" (и остальными инструментами трансформации) я знаю его идентификатор - view3d.enable_manipulator
Смело ввожу его в соответствующее поле и прописываю для этого действия горячую клавишу:
(https://s22.postimg.org/avzgmg01t/000.png)
Но если у меня возникает потребность Назначить хоткей на другой инструмент, то тут появляются затруднения с корректным вводом этого самого идентификатора.
Подскажите, где искать ответ?
Название: Re: Совсем не страшный питон.
Отправлено: sungreen от 14 Сентябрь 2016, 17:39:26
... попробуй добавить подсказки функций - {CTRL+ALT+U}, вкладка Interface, включить чек Python Tooltips ...
... далее в мень при наведении на конкретные пункты будет выпадать подсказка с наименованием в Python ...
Название: Re: Совсем не страшный питон.
Отправлено: R_M_S от 14 Сентябрь 2016, 18:30:10
при наведении на конкретные пункты будет выпадать подсказка с наименованием в Python ...
она выпадает. Я пробовал вводить то, что высвечивается в подсказках. Но синтаксис (насколько я понял) не совпадает с тем, что нужно вводить в индентификатор.
Название: Re: Совсем не страшный питон.
Отправлено: sungreen от 14 Сентябрь 2016, 20:30:20
... отбрасывай bpy.ops и пиши что идет после них ...
https://www.blender.org/api/blender_python_api_2_77_1/bpy.ops.html
Название: Re: Совсем не страшный питон.
Отправлено: Samovar от 14 Сентябрь 2016, 20:45:28
R_M_S и sungreen, по-моему вы полезли в дебри :) Python тут вообще не при чём...
ПКМ на менюшке или кнопке -> Add Shotrcut (или Change Shortcut, если функции назначены "горячие" клавиши)-> Нажать необходимую клавишу(ы)
Чтоб не пропало, надо это дело сохранить File -> User Preferences -> Input -> Export Key Configuration
Название: Re: Совсем не страшный питон.
Отправлено: R_M_S от 14 Сентябрь 2016, 22:41:43
R_M_S и sungreen, по-моему вы полезли в дебри :) Python тут вообще не при чём...
ПКМ на менюшке или кнопке -> Add Shotrcut
Вы не поняли вопроса.
Вся суть сводится к тому, что необходимо "посадить" на горячие клавиши те функции (команды), к которым не приставлены подобные возможности. Т.е. на них нельзя (через контекстное меню) назначить горячие клавиши.
Название: Re: Совсем не страшный питон.
Отправлено: Samovar от 14 Сентябрь 2016, 23:44:15
А можно  полюбопытствовать пример такой функции?
Название: Re: Совсем не страшный питон.
Отправлено: R_M_S от 15 Сентябрь 2016, 13:24:07
А можно  полюбопытствовать пример такой функции?
Пример я описал в первом свооём посте.
Он же в картинках:
Я привык к тому, что в максе все манипуляторы трансформации присутствуют в сцене на любом активном объекте:
(https://s11.postimg.io/5qb3m25lf/7_M_X_pe_XNM.jpg)
Такого же самого отображения (через теже самые горячие клавиши) я хотел видеть в Blender_е (сила привычки). Но попробуй назначить эти присловутые HotKeys через правый клик мыши и "Change ShortCut". ничего не получится!
Но это возможно, если добавить новую команду (Add New) в меню Input (Ctrl+Alt+U) и прописать там нужное имя идентификатора. В случае с инструментами трансформации (Move Rotate и Scale) это имя носит название view3d.enable_manipulator
(https://s21.postimg.org/eajm6jnhz/7_M_X_pe_XN.jpg)
(https://s15.postimg.org/3rmioiq9n/7_M_X_pe_XNM.jpg)
Именно этот синтаксис для остальных потенциално редактируемых команд мне и хочется узнать.
Надеюсь объяснил понятно.
Название: Re: Совсем не страшный питон.
Отправлено: LanuHum от 19 Сентябрь 2016, 16:58:21
Именно этот синтаксис для остальных потенциално редактируемых команд мне и хочется узнать.
Надеюсь объяснил понятно.
Список всех доступных операторов, включая самописные, можно получить нажав в меню Help кнопку Operator Cheat Sheet. В текстах появится файл OperatorList.txt, который можно найти и посмотреть в текстовом редакторе Блендера.