Вопросы по написанию плагинов

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

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

Сообщение #1 Pavel » 07.03.2014, 16:42

Тема для вопросов и помощи по написанию плагинов для блендера.

Добавлено спустя 4 минуты 33 секунды:
Как мешу добавить текстурные координаты, имея их при себе в виде списка (list)?
Pavel M
Аватара
Сообщения: 726

Сообщение #2 Pavel » 01.11.2014, 21:09

Подскажите, возможно ли к группам вершин добавить собственные свойства (например, IntProperty)?
И к вершинам, полигонам, рёбрам?

Я делал свой скрипт, добавляю свойство к bpy.types.VertexGroups своё свойство, но группы вершин его не получают.
Pavel M
Аватара
Сообщения: 726

как енто сделать?

Сообщение #3 grayich » 04.11.2014, 12:25

к примеру есть такой скрипт
Код: Выделить всё
import bpy
 
class TEST
(bpy.types.Panel):
    bl_label = "Test"
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'TOOLS'
 
    def draw
(self, context):
        self.layout.operator("mesh.primitive_cube_add", text="Кубик")
        self.layout.operator("bpy.context.user_preferences.system.dpi=120", text="Дпи")

def register():
    bpy.utils.register_class(TEST)

def unregister():
    bpy.utils.unregister_class(TEST)

if __name__ == "__main__":
    register()
с кубиком всё ок, а вот вторая кнопка даже не появляется, как правильно это сделать?


и еще воспрос
когда добавляешь свою панельку туда где уже есть чего-то, то она добавляется в самый конец, есть ли способ указать ей место появления?
x64 Linux
grayich M
Аватара
Откуда: Харьков
Сообщения: 4605

  • 1

Сообщение #4 Pavel » 04.11.2014, 20:06

Попробуй так
Код: Выделить всё
import bpy


class TEST(bpy.types.Panel):
    bl_label = "Test"
    bl_category = 'My Category'
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'TOOLS'

    def draw(self, context):
        self.layout.operator("mesh.primitive_cube_add", text="Cube")
        self.layout.prop(bpy.context.user_preferences.system, 'dpi', text='dPi')

def register():
    bpy.utils.register_class(TEST)

def unregister():
    bpy.utils.unregister_class(TEST)

if __name__ == "__main__":
    register()


Pavel M
Аватара
Сообщения: 726

Сообщение #5 grayich » 05.11.2014, 01:57

Pavel, дело в том, что мне нужна кнопка при нажатии на которую выполнится моя функция или применится конкретное значение типа bpy.context.user_preferences.system.dpi=120

этот же вариант просто форму введения выдаёт
x64 Linux
grayich M
Аватара
Откуда: Харьков
Сообщения: 4605

  • 1

Сообщение #6 girafenok » 05.11.2014, 02:36

Код: Выделить всё
import bpy
 
class TEST(bpy.types.Panel):
    bl_label = "Test"
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'TOOLS'
 
    def draw(self, context):
        self.layout.operator("my.set_dpi", text="DPI")

class dpiOP(bpy.types.Operator):
    bl_idname = "my.set_dpi"
    bl_label = "Set DPI Operator"
    def execute(self, context):
        bpy.context.user_preferences.system.dpi=72
        return {"FINISHED"}


def register():
    bpy.utils.register_class(dpiOP)
    bpy.utils.register_class(TEST)

def unregister():
    bpy.utils.unregister_class(TEST)
    bpy.utils.unregister_class(dpiOp)

if __name__ == "__main__":
    register()
girafenok
рендер-фермер
рендер-фермер
Сообщения: 653

Сообщение #7 grayich » 05.11.2014, 07:09

girafenok, благодарю
x64 Linux
grayich M
Аватара
Откуда: Харьков
Сообщения: 4605

Сообщение #8 grayich » 06.11.2014, 04:54

и всётаки, кто подскажет, как или возможно вообще? Создать\переместить элемент на панели

к примеру
Код: Выделить всё
import bpy
from bpy
.types import Header
 
class TEST
(Header):
    bl_space_type = "INFO"
 
    def draw
(self, context):
        self.layout.operator("mesh.primitive_monkey_add", text="click")

def register():
    bpy.utils.register_class(TEST)

def unregister():
    bpy.utils.unregister_class(TEST)

if __name__ == "__main__":
    register() 
создаёт кнопку в самом хвосте INFO панели и в итоге оно просто не помещается в видимой области панели, да и переместить невыходит, мне-же нужна эта кнопка в самом начале панели или сразу после меню.

или может быть есть другое место, куда можно разместить свою кнопку которая всегда будет на виду, INFO панель потому и выбрал, что она (за редким исключением) всегда на виду.
x64 Linux
grayich M
Аватара
Откуда: Харьков
Сообщения: 4605

Сообщение #9 Pavel » 06.11.2014, 19:28

По моему панели добавляются в том порядке, в котором они регистрируются. К примеру, элемент А будет левее элемента Б, если он зарегистрирован раньше.

Попробуй добавить свой элемент в \scripts\startup\bl_ui\space_info.py в начало.
Pavel M
Аватара
Сообщения: 726

Сообщение #10 grayich » 06.11.2014, 19:36

Pavel, это уже костыль, мне нужно, чтоб у народа автоматом всё срабатывало, при установке дополнения.
ну да ладно, выложу ка плагин как есть, т.к. похоже этот вопрос нерешаем на данный момент. :)
x64 Linux
grayich M
Аватара
Откуда: Харьков
Сообщения: 4605

Сообщение #11 ilalexey » 22.04.2015, 14:03

"Тема для вопросов и помощи по написанию плагинов для блендера."
---
Привет всем. Как понял из заголовка, можно спрашивать тут и не плодить новой темы.
Вопрос мой таков: как в отдельно взятом ".label" менять размер шрифта?
Хочу несколько окошек с координатами сделать, чтобы в каждом цифры были большими.
Вложения
Box_font.png
Box_font.png (2.65 КБ) Просмотров: 3462
ilalexey M
Аватара
Откуда: Львов
Сообщения: 4

Сообщение #12 ilalexey » 22.04.2015, 14:18

"Тема для вопросов и помощи по написанию плагинов для блендера."
---
Привет всем. Как понял из заголовка, можно спрашивать тут и не плодить новой темы.
Вопрос мой таков: как в отдельно взятом ".label" менять размер шрифта?
Хочу несколько окошек с координатами сделать, чтобы в каждом цифры были большими.
---
п.с.: написал пред этим, но не понял куда сообщение отправилось.
ilalexey M
Аватара
Откуда: Львов
Сообщения: 4

Сообщение #13 acvarium » 26.04.2015, 17:44

Я уже некоторое время обдумываю создание плагина для легкого добавления в сцену кастомизируемых с помощью драйверов, арматуры, модификаторов, ключей формы и еще бог знает чего подобного, из предварительно подготовленных библиотек. Что-то подобное, что сделали в Fluid Designer но без доработки интерфейса блендера.
Основная проблема, которая мне пришла на ум, это драйверы. Идентификатор/имя объекта, который служит драйвером для кастомизируемого объекта должен изменятся соответственно. Например, есть у меня в сцене лампочка типа 'POINT' с именем 'Point' и куб с именем 'Cube'. Значение Disatance у лампочки связано с масштабом куба по оси Z. При создании в сцене очередной копии пары объектов куб-лампочка в поле DriverTarget.id для Disatance новой лампочки нужно записать имя соответствующего куба из пары, например Cube.001.

Я начал решать эту задачу в коде, упростив ее до минимума. Но вот возникла странная проблема, после выполнения строчки, которая изменяет идентификатор, все существующие на данный момент пары объектов перемещаются в координату 0,0,0.

Если кто-то может помочь разобраться с этой проблемой, или даже дать совет по данной теме, буду очень признателен.
Файл с моим неудачным первым экспериментом тут:
https://yadi.sk/d/s9kk83ligFjED

Если лень качать файл, ниже мой код:
Код: Выделить всё
import bpy

bpy.ops.object.select_all(action='DESELECT')
bpy.data.objects['Cube'].select = True
bpy.data.objects['Point'].select = True

bpy.context.scene.cursor_location
bpy.ops.object.duplicate()
bpy.ops.object.location_clear()
newObjects = bpy.context.selected_objects
driverName = ''
for obj in newObjects:
    bpy.ops.object.select_all(action='DESELECT')
    if obj.name[0] == 'C':
        print(obj.name)
        obj.location = bpy.context.scene.cursor_location
        driverName = obj.name
    elif obj.name[0] == 'P':
        newLamp = obj
        print(newLamp.name)
       
newLamp.data.animation_data.drivers[0].driver.variables[0].targets[0].id = bpy.data.objects['Cube']
acvarium M
Аватара
Откуда: От туда
Сообщения: 22

Сообщение #14 Korchy » 11.06.2015, 21:07

Кто-нибудь делал рендер нескольких кадров с помощью скриптов?
Пытаюсь реализовать простую задачу - отрендерить несколько ракурсов т.е.: отрендерил - сдвинул камеру - отрендерил - сдвинул камеру - отрендерил.
Но если делать рендер с показом на втором проходе все просто останавливается. Вот код:

Код: Выделить всё
@persistent
def onrenderfinished(scene):
    # Обработчик после завершения рендера
    print('render finished')
    # удалить обработчик события
    bpy.app.handlers.render_complete.remove(onrenderfinished)
    bpy.app.handlers.render_cancel.remove(onrenderfinished)

    sceneupdateposthadler = bpy.app.handlers.scene_update_post
    if onsceneupdatepost not in sceneupdateposthadler:
        sceneupdateposthadler.append(onsceneupdatepost)
    return {'FINISHED'}

@persistent
def onsceneupdatepost(scene):
    # Обработчик события - обновлние сцены
    print('scene update')
    # удалить слушатель
    bpy.app.handlers.scene_update_post.remove(onsceneupdatepost)
    # Отработать следующую точку
    if Panorama360.CurrentPoint < len(Panorama360.TargetPoints):
        Panorama360.CurrentPoint = Panorama360.CurrentPoint + 1
        Panorama360.RenderToCurrentPoint(None)
    else:
        Panorama360.CurrentPoint = 0
    return {'FINISHED'}

class Panorama360(bpy.types.Operator):
    """Panorama360"""
    bl_idname = "render.panorama360"   # уникальный id
    bl_label = "Panorama360"           # уникальное имя
    TargetPoints = []
    CurrentPoint = 0

    def execute(self, context):
        # исполняемый модуль
        # выбор направляющей сетки
        bpy.ops.object.select_all(action='DESELECT')
        PanoramaPointer = bpy.data.objects['PanoramaPointsSphere']
        Panorama360.TargetPoints = [(PanoramaPointer.matrix_world * v.co) for v in PanoramaPointer.data.vertices]
        Panorama360.RenderToCurrentPoint(None)
        return {'FINISHED'}

    def RenderToCurrentPoint(self):
        CameraTarget = bpy.data.objects['CameraTarget']
        CameraTarget.location = Panorama360.TargetPoints[Panorama360.CurrentPoint]
        # зарегистрировать обработчик после завершения рендера
        rendercompletehadler = bpy.app.handlers.render_complete
        if onrenderfinished not in rendercompletehadler:
            rendercompletehadler.append(onrenderfinished)
        rendercancelhadler = bpy.app.handlers.render_cancel
        if onrenderfinished not in rendercancelhadler:
            rendercancelhadler.append(onrenderfinished)
        # запустить рендер
        print('render start')

#        # закомментированный кусок работает - но без показа процесса рендера
#        for st in range(0, len(Panorama360.TargetPoints)):
#            bpy.data.objects['CameraTarget'].location = Panorama360.TargetPoints[Panorama360.CurrentPoint]
#            bpy.data.scenes["Scene"].render.filepath = '//_%d.jpg' % Panorama360.CurrentPoint
#            Panorama360.CurrentPoint = Panorama360.CurrentPoint + 1
#            bpy.ops.render.render(write_still=True)

        bpy.ops.render.render('INVOKE_DEFAULT')
        return {'FINISHED'}
В консоли выдается:
render start
render finished
scene update
render start

т.е. получается на втором заходе при вызове
bpy.ops.render.render('INVOKE_DEFAULT')
все просто стопорится.

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



Сообщение #15 shevelew » 13.06.2015, 11:08

Привет. Скажите, пожалуйста, есть ли для блендера плагин, который позволяет образмеривать объекты, как в кад-подобных программах? Пример:Изображение.
Спасибо.
shevelew M
Откуда: Тюмень
Сообщения: 8


Сообщение #16 Korchy » 13.06.2015, 14:21

Ерунда какая-то получается :(
Случайно обнаружил, что если ставлю размер итогового рендера в панели Render большим - 2300х2300 и более, все нормально отрабатывается. А на меньшем разрешении не работает :(
Может есть какое-то ограничение на рендер с превью по времени или еще какое-то?
Korchy M
Аватара
Сообщения: 2302



Сообщение #17 grayich » 13.06.2015, 15:49

shevelew, вопрос както не в той теме
http://cwolf3d.korostyshev.net/index.php/portfoli ... pt-for-blender-added-dimension мб это подойдет?
ещё что-то - http://blenderartists.org/forum/showthread.php?268103-Blender-Caliper-for-2-6x
x64 Linux
grayich M
Аватара
Откуда: Харьков
Сообщения: 4605

  • 1

Сообщение #18 NAGRIS » 13.06.2015, 19:49

NAGRIS
Откуда: Беларусь
Сообщения: 73


Сообщение #19 shevelew » 14.06.2015, 09:41

grayich, NAGRIS, спасибо за подсказки.
shevelew M
Откуда: Тюмень
Сообщения: 8


Сообщение #20 Mega_Myr » 09.09.2015, 22:57

Блендер очень сильно привязан к клавиатуре. Если без мыши еще можно моделировать, то обходится одной только мышью не получиться. Потому что в интерфейсе не предусмотрено кнопок для команд, активируемых по Ctrl/ALt/Shift + одна из кнопок мыши. Выход я вижу в том, чтобы добавить на T-панель 3 чекбокса (квадратик с галочкой), каждый из которых в включенном состоянии эмулирует зажатой одну из клавиш: Alt, Ctrl или Shift.

На данный момент я не понимаю как это сделать и в какую сторону копать. речь о виртуальной клавиатуре не идет. Мне кажется, что это немного другое. А вот для ввода числовых значений как раз нужна цифровая клавиатура. Но я думал этим заняться позже.

P.S. Буду рад любой помощи по делу.
WIP Windows 10 x64

В общении со мной результат всегда непредсказуем. Он не всегда плохой, но всегда непредсказуемый.
Mega_Myr M
Аватара
Сообщения: 28

След.

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

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

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