Обновление модулей для автокомплита fake-bpy-modules для Blender Python API

Обновление модулей автокомплита Blender Python API от Nutti — добавлена ветка для Blender 2.81a.

Последний релиз от 2020.01.11.

GitHub автора: https://github.com/nutti/fake-bpy-module

Файлы отдельно (без установки через pip) https://github.com/Korchy/blender_autocomplete

Назначение вертексам дополнительных свойств

При работе с геометрией меша может появится необходимость назначить каждому вертексу дополнительные свойства или данные, которые должны записываться в blend-файл при сохранении, и к которым нужно иметь доступ.

Однако попытка назначить вертексам нужные данные стандартным способом, через создание кастомных свойств, оборачивается неудачей. Вместо кастомного свойства для вертекса создается лишь кортеж со ссылкой на тип задаваемого свойства.

Читать далее «Назначение вертексам дополнительных свойств»

Как разделить и объединить окна в Blender через python API

Для манипуляций с размерами и положением интерфейсных окон в Blender предусмотрен ряд операторов.

Чтобы разделить текущее (с текущим context) окно на два в заданном соотношении, нужно выполнить оператор:

Где:

  • direction указывает на направление разбиения — по горизонтали ‘HORIZONTAL’ или по вертикали ‘VERTICAL’
  • factor — процентное соотношение разделенный окон по выбранному направлению

Читать далее «Как разделить и объединить окна в Blender через python API»

Создание кастомного свойства

API Blender предоставляет для использования набор простых типов свойств, описанных в bpy.props (IntProperty,  BoolProperty и т.д.). Но базовых типов не всегда хватает, иногда нужны более сложные. API Blender позволяет группировать простые свойства, создавая таким образом более сложные.

Рассмотрим создание такого свойства на примере матрицы 3х3.

Читать далее «Создание кастомного свойства»

Как узнать текущую версию Blender через Python API

Для того, чтобы получить текущую версию Blender, нужно выполнить команду:

или

Читать далее «Как узнать текущую версию Blender через Python API»

Рисование в окне вьюпорта

API Blender предоставляет возможность рисовать в окне вьюпорта (3D Viewport) при помощи модуля gpu.

Для примера нарисуем в центре сцены упрощенный виджет системы координат, состоящий из трех линий разного цвета.

Читать далее «Рисование в окне вьюпорта»

Как привязать к нажатию кнопки вызов функции, а не оператора

К нажатию кнопки в пользовательском интерфейсе обычно привязывают вызов нужного оператора. Однако часто действия, которые нужно выполнить при нажатии на кнопку, достаточно просты и не требуют оформления в виде отдельного оператора. Да и забивать стек зарегистрированных операторов множеством специфических операторов, рассчитанных на выполнение одной конкретной узкоспециализированной функции не имеет смысла. Гораздо удобнее было бы связать нажатие кнопки с вызовом отдельной функции, однако API Blender позволяет связывать кнопки только с вызовом оператора.

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

Читать далее «Как привязать к нажатию кнопки вызов функции, а не оператора»

Как получить все возможные значения свойства Enum

Для корректного задания значений свойству типа EnumProperty необходимо знать все его возможные варианты.

Если попытаться задать значение, которого нет в перечислимом свойстве, Blender выдаст ошибку вида:

TypeError: bpy_struct: item.attr = val: enum «xxx» not found in (‘value_001′, value_002’, …)

где:

xxx — значение, которые мы попытались задать свойству EnumProperty

value_001, value_002, … — возможные значения, которые может принимать данное свойство EnumProperty

Читать далее «Как получить все возможные значения свойства Enum»

Как переместить курсор к нужному вертексу

Для того, чтобы передвинуть курсор к определенному вертексу меша нужно выполнить следующий код:

Умножение на матрицу мира должно осуществляться именно в таком порядке (матрица слева).

Добавление объекта в сцену в Blender 2.80 Python API

В API Blender 2.79 созданный объект добавляется в сцену через:

Попытка добавить объект в сцену таким образом в Blender 2.80, приводит к ошибке:

‘bpy_prop_collection’ object has no attribute ‘link’

В Blender 2.80 API добавлять объект нужно не в саму сцену, а в ее коллекции.

Добавить объект в активную коллекцию:

Добавить объект в коллекцию по ее имени:

 

Как поставить курсор в начало или в конец активного стрипа в Blender VSE

Чтобы поставить курсор в начало активного стрипа в Blender VSE нужно выполнить команду:

Чтобы переместить курсор в конец активного стрипа:

 

Передача параметров в оператор

При создании собственных операторов иногда бывает нужно передавать в них определенные значения — вызывать операторы с параметрами.

Передаваемый параметр должен быть определен, как свойство оператора.

Читать далее «Передача параметров в оператор»

Перенос выделения с UV-развертки на меш

Для переноса выделения с UV-развертки на меш достаточно вспомнить, что развертка напрямую связана с мешем через мешлупы.

Чтобы перенести выделение с развертки на меш нужно пройти по полигонам меша, проверить, какие мешлупы выделены и выделить соответствующие им точки на самом меше.

Читать далее «Перенос выделения с UV-развертки на меш»

Как получить список вертексов, входящих в группу в Vertex Groups

Список вертексов, входящих в группу с определенным именем можно получить следующим образом:

 

Fake-bpy-module

Автокомплит кода сильно упрощает работу при написании скриптов или разработке аддонов для Blender. Один из лучших на сегодня модулей автокомплита разрабатывается Nutti. Последнее обновление: 20190718.

Проект размещается на GitHub автора: https://github.com/nutti/fake-bpy-module

Для удобства установки модули распространяются через pip или в виде pre-generated zip-архива. Так же автор предоставляет генератор модулей, с помощью которого можно собрать модули автокомплита самостоятельно.

Декоратор для отложенного обновления нодового дерева

Если в панелях интерфейса аддона присутствует поле, значение которого меняет что-то в нодовом дереве, при изменении значения в этом поле нодовое дерево каждый раз перекомпилируется. Если пользователь меняет значение в таком поле зажав и двигая мышкой, слишком частая перекомпиляция нодового дерева приведет к заметным подвисаниям Blender.

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

Автор кода: Skarn

Читать далее «Декоратор для отложенного обновления нодового дерева»

Класс для создания нодов по их типу

Класс для удобного создания нодов по их типу.

Автор кода: Skarn

Читать далее «Класс для создания нодов по их типу»

Как узнать, включен ли режим просмотра Local View в окне 3D View

Следующая команда вернет список окон 3D_VIEW в которых включен режим работы Local View:

 

Как управлять видимостью объектов во вьюпорте и при рендере

Самый простой способ заставить нужный объект появляться и исчезать — назначить ему ключи анимации. Для этого нужно навести курсор на значок глаза (видимость во вьюпорте) или фотоаппарата (видимость при рендере) в окне «Outliner», нажать клавишу «i» и далее в Graph Editor управлять созданным ключом так же, как с обычными ключами анимации.

Но такой способ доступен не всегда. Например, для коллекций нельзя назначить ключи анимации видимости, Blender выдаст ошибки вида:

«hide_viewport» property cannot be animated

или

«hide_render» property cannot be animated

Однако с помощью Blender Python API видимостью таких объектов можно управлять.

Читать далее «Как управлять видимостью объектов во вьюпорте и при рендере»

Модули для автокомплита Blender API

Nutti, автор проекта fake-bpy-modules, перевел установку модулей автокомплита Blender Python API на платформу pip. Установка через pip быстрее и проще, однако иногда бывает нужно просто скопировать файлы модулей автокомплита в нужное место, а на GitHib Nutti они теперь не размещаются.

Копии файлов автокомплита для Blender версий 2.79 и 2.80 можно скачать отсюда напрямую: https://github.com/Korchy/blender_autocomplete

Как получить глобальные координаты вертекса

Чтобы получить координаты вертекса в глобальной системе координат сцены если мастшаб объекта не применялся, нужно умножить локальные координаты вертекса на матрицу трансформации объекта:

 

Правила наименования классов в Blender 2.8 API

В API Blender 2.8 ужесточаются требования к наименованию классов и их идентификаторов. Имя класса должно соответствовать следующему шаблону:

Где {SEPARATOR} — две буквы, обозначающие принадлежность класса к определенному типу (от какого типа наследуется класс):

  • HT — Заголовок
  • MT — Меню
  • OT — Оператор
  • PT — Панель
  • UL — Список UI

Идентификатор класса «bl_idname» должен соответствовать имени класса.

Читать далее «Правила наименования классов в Blender 2.8 API»

Изменения в регистрации аддонов через API в Blender 2.8

В Blender 2.7 регистрация и разрегистрация аддонов через Python API производилась через Window manager — wm:

В Blender 2.8 API операторы работы с аддонами перенесены в preferences:

 

Положение 3D курсора в Blender 2.8 Python API

Свойство, указывающее на местоположение 3D-курсора

в Blender 2.8 перенесено в объект курсора

При попытке обращения к позиции курсора через «context.scene.cursor_location» Blender выдаст ошибку:

‘Scene’ object has no attribute ‘cursor_location’

Создание свойств для аддона

При разработке аддонов часто бывает необходимо предоставить пользователю возможность задавать ряд параметров, влияющих на общую работу аддона. Например, пользователь может указать постоянную директорию для загрузки/сохранения файлов или задать тот или иной режим работы аддона. Конечно, интерфейс для задания подобных параметров можно разместить и в рабочей панели аддона, но гораздо удобнее поместить его в отдельную панель свойств аддона, которая размещается под панелью инсталляции аддона в окне Preferences.

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

Создадим простейший аддон и добавим ему глобальный параметр, поместив его в панель свойств аддона:

Читать далее «Создание свойств для аддона»