Blender动画节点插件开发文档介绍

数据湖
• 阅读 497

推荐:将 NSDT场景编辑器 加入你的3D开发工具链。

https://ted.sinoccdc.cn/

附加组件
创建一个目录,其加载项名称以 为前缀,即 。目录应遵循以下基础 结构:an_an_<your_extension_name>

an_<your_extension_name>/
├── __init__.py
├── auto_load.py
├── ui/
│ ├── __init__.py
│ ├── node_menu.py
├── sockets/
│ ├── __init__.py
│ ├── ...
├── nodes/
│ ├── __init__.py
│ ├── ...
不要在扩展名称中使用。animation_nodes

稍后我们将解释需要在这些文件中添加的内容。可以从动画节点复制文件auto_load.py源在没有任何更改的情况下,文件位于目录中。这 文件将帮助我们自动注册和加载类,所以它不是 强制性的,但建议使用。要使自动加载正常工作,每个 具有定义 Blender 类的文件的目录需要有一个空文件,即您在上面的子目录中看到的文件。animation_nodes__init__.py

此结构适用于简单扩展。更复杂的扩展, 利用Cython应该遵循更复杂的结构。此结构是 稍后在赛通中描述部分.

初始化
在顶级文件中,我们需要做三件事:__init__.py

确保动画节点已加载且可用。
初始化自动加载程序并注册/注销类。
更新套接字信息。仅当您定义新套接字时,才需要这样做。
'''
Copyright (C) 2020 <YOUR NAME>
<YOUR EMAIL>

Created by <YOUR NAME>

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

'''

bl_info = {

"name": "Animation Nodes Test Extension",
"author": "<YOUR NAME>",
"version": (1, 0, 0),
"blender": (2, 90, 0),
"location": "Animation Nodes",
"description": "A Test Extension For Animation Nodes.",
"warning": "",
"doc_url": "",
"tracker_url": "",
"category": "Nodes",

}

import bpy
import addon_utils
from . import auto_load

try: import animation_nodes
except:

animation_nodes = addon_utils.enable("animation_nodes", default_set = False, persistent = True)
if not animation_nodes:
    raise Exception("Could not load Animation Nodes.")

auto_load.init()

animation_nodes.sockets.info.updateSocketInfo()

def register():

auto_load.register()

def unregister():

auto_load.unregister()

Nodes
将节点添加到目录或其任何子目录中。这 目录及其子目录应各自有一个空文件 正如我们之前提到的。检查nodes__init__.py节点开发指南 有关如何创建节点或检查动画节点源的信息 有关如何编写节点的示例。

笔记
绝对进口
在动画节点源中,动画节点对象是相对导入的。 这不适用于扩展。您必须绝对从 模块。因此,如果您在 动画节点源:animation_nodes

from .. perlin_noise cimport perlinNoise1D
它应该翻译成:

from animation_nodes.algorithms.perlin_noise cimport perlinNoise1D
执行代码中的扩展模块
您可以使用该模块(别名也为 -) 节点的执行代码。那是因为它是默认导入的。挨次 要使用扩展模块,您必须告诉动画节点通过导入它 重写方法。所以代码应该是:animation_nodesANgetUsedModules

def getUsedModules(self):
        return ["an_<your_extension_name>"]

插座
在目录或其任何子目录中添加套接字。这 目录及其子目录应各自有一个空文件 正如我们之前提到的。sockets__init__.py

用户界面
为了将您的节点添加到菜单中。在目录中的文件中,定义一个绘制函数,该函数绘制其他菜单或绘制节点 直接插入运算符。然后,在寄存器函数中,附加此绘制 函数到任何动画节点菜单或直接添加菜单。为 实例中,以下文件定义一个新菜单并绘制节点插入 其中的运算符。然后,定义一个绘制此菜单的绘制函数,即 然后追加到菜单,即节点添加菜单。菜单 将位于您追加到的菜单的末尾。node_menu.pyuiNODE_MT_add

import bpy
from animation_nodes.ui.node_menu import insertNode

class TestExtensionMenu(bpy.types.Menu):

bl_idname = "AN_MT_test_extension_menu"
bl_label = "Test Extension Menu"

def draw(self, context):
    layout = self.layout
    insertNode(layout, "an_TestExtensionNode", "Test Extension Node")

def drawMenu(self, context):

if context.space_data.tree_type != "an_AnimationNodeTree": return

layout = self.layout
layout.operator_context = "INVOKE_DEFAULT"

layout.separator()
layout.menu("AN_MT_test_extension_menu", text = "Test Extension Menu", icon = "SCRIPTPLUGINS")

def register():

bpy.types.NODE_MT_add.append(drawMenu)

def unregister():

bpy.types.NODE_MT_add.remove(drawMenu)

如果我想将菜单添加到动画节点中的矢量菜单中,我会 而是附加到菜单。有关完整列表 菜单和有关如何定义更复杂的菜单的更多示例,请检查动画节点源中的文件AN_MT_vector_menunode_menu.py这里.

Cython
如果您想编写自己的Cython代码并定义自己的Cython。 结构,您可以使用动画节点中的设置脚本,在这种情况下, 您的项目应遵循以下基础结构:

an_<your_extension_name>/
├── setup.py
├── _export_c_setup.py
├── conf.default.json
├── an_<your_extension_name>/
│ ├── ...
├── _setuputils/
│ ├── ...
内部目录是上面所示的目录。 目录、、 和应从动画节点复制an_<your_extension_name>_setuputilssetup.py_export_c_setup.pyconf.default.json源.您需要进行的唯一更改是将变量更改为 文件。需要做的最后一件事是设置 标头。addonNamean_<your_extension_name>setup.py_export_c_setup.py

头文件
为了构建你的扩展,Cython需要查看 动画节点。因此,首先从animation_nodes_headers.zip发布页面、解压缩并配置 构建系统通过将提取的目录的路径添加到 文件中命名的数组条目。通知 此文件是在您第一次构建后生成的,但您可以添加它 在此之前,您自己到根目录。示例如下所示:Cython Include Pathsconf.jsonconf.json

{

"Copy Target" : "/path/to/your/blender/addon/directory",
"Cython Include Paths" : ["/path/to/the/extracted/directory/animation_nodes_headers/"]

}
附加组件
创建一个目录,其加载项名称以 为前缀,即 。目录应遵循以下基础 结构:an_an_<your_extension_name>

an_<your_extension_name>/
├── __init__.py
├── auto_load.py
├── ui/
│ ├── __init__.py
│ ├── node_menu.py
├── sockets/
│ ├── __init__.py
│ ├── ...
├── nodes/
│ ├── __init__.py
│ ├── ...
不要在扩展名称中使用。animation_nodes

稍后我们将解释需要在这些文件中添加的内容。可以从动画节点复制文件auto_load.py源在没有任何更改的情况下,文件位于目录中。这 文件将帮助我们自动注册和加载类,所以它不是 强制性的,但建议使用。要使自动加载正常工作,每个 具有定义 Blender 类的文件的目录需要有一个空文件,即您在上面的子目录中看到的文件。animation_nodes__init__.py

此结构适用于简单扩展。更复杂的扩展, 利用Cython应该遵循更复杂的结构。此结构是 稍后在赛通中描述部分.

初始化
在顶级文件中,我们需要做三件事:__init__.py

确保动画节点已加载且可用。
初始化自动加载程序并注册/注销类。
更新套接字信息。仅当您定义新套接字时,才需要这样做。
'''
Copyright (C) 2020 <YOUR NAME>
<YOUR EMAIL>

Created by <YOUR NAME>

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

'''

bl_info = {

"name": "Animation Nodes Test Extension",
"author": "<YOUR NAME>",
"version": (1, 0, 0),
"blender": (2, 90, 0),
"location": "Animation Nodes",
"description": "A Test Extension For Animation Nodes.",
"warning": "",
"doc_url": "",
"tracker_url": "",
"category": "Nodes",

}

import bpy
import addon_utils
from . import auto_load

try: import animation_nodes
except:

animation_nodes = addon_utils.enable("animation_nodes", default_set = False, persistent = True)
if not animation_nodes:
    raise Exception("Could not load Animation Nodes.")

auto_load.init()

animation_nodes.sockets.info.updateSocketInfo()

def register():

auto_load.register()

def unregister():

auto_load.unregister()

Nodes
将节点添加到目录或其任何子目录中。这 目录及其子目录应各自有一个空文件 正如我们之前提到的。检查nodes__init__.py节点开发指南 有关如何创建节点或检查动画节点源的信息 有关如何编写节点的示例。

笔记
绝对进口
在动画节点源中,动画节点对象是相对导入的。 这不适用于扩展。您必须绝对从 模块。因此,如果您在 动画节点源:animation_nodes

from .. perlin_noise cimport perlinNoise1D
它应该翻译成:

from animation_nodes.algorithms.perlin_noise cimport perlinNoise1D
执行代码中的扩展模块
您可以使用该模块(别名也为 -) 节点的执行代码。那是因为它是默认导入的。挨次 要使用扩展模块,您必须告诉动画节点通过导入它 重写方法。所以代码应该是:animation_nodesANgetUsedModules

def getUsedModules(self):
        return ["an_<your_extension_name>"]

插座
在目录或其任何子目录中添加套接字。这 目录及其子目录应各自有一个空文件 正如我们之前提到的。sockets__init__.py

用户界面
为了将您的节点添加到菜单中。在目录中的文件中,定义一个绘制函数,该函数绘制其他菜单或绘制节点 直接插入运算符。然后,在寄存器函数中,附加此绘制 函数到任何动画节点菜单或直接添加菜单。为 实例中,以下文件定义一个新菜单并绘制节点插入 其中的运算符。然后,定义一个绘制此菜单的绘制函数,即 然后追加到菜单,即节点添加菜单。菜单 将位于您追加到的菜单的末尾。node_menu.pyuiNODE_MT_add

import bpy
from animation_nodes.ui.node_menu import insertNode

class TestExtensionMenu(bpy.types.Menu):

bl_idname = "AN_MT_test_extension_menu"
bl_label = "Test Extension Menu"

def draw(self, context):
    layout = self.layout
    insertNode(layout, "an_TestExtensionNode", "Test Extension Node")

def drawMenu(self, context):

if context.space_data.tree_type != "an_AnimationNodeTree": return

layout = self.layout
layout.operator_context = "INVOKE_DEFAULT"

layout.separator()
layout.menu("AN_MT_test_extension_menu", text = "Test Extension Menu", icon = "SCRIPTPLUGINS")

def register():

bpy.types.NODE_MT_add.append(drawMenu)

def unregister():

bpy.types.NODE_MT_add.remove(drawMenu)

如果我想将菜单添加到动画节点中的矢量菜单中,我会 而是附加到菜单。有关完整列表 菜单和有关如何定义更复杂的菜单的更多示例,请检查动画节点源中的文件AN_MT_vector_menunode_menu.py这里.

赛通
如果您想编写自己的Cython代码并定义自己的Cython。 结构,您可以使用动画节点中的设置脚本,在这种情况下, 您的项目应遵循以下基础结构:

an_<your_extension_name>/
├── setup.py
├── _export_c_setup.py
├── conf.default.json
├── an_<your_extension_name>/
│ ├── ...
├── _setuputils/
│ ├── ...
内部目录是上面所示的目录。 目录、、 和应从动画节点复制an_<your_extension_name>_setuputilssetup.py_export_c_setup.pyconf.default.json源.您需要进行的唯一更改是将变量更改为 文件。需要做的最后一件事是设置 标头。addonNamean_<your_extension_name>setup.py_export_c_setup.py

头文件
为了构建你的扩展,Cython需要查看 动画节点。因此,首先从animation_nodes_headers.zip发布页面、解压缩并配置 构建系统通过将提取的目录的路径添加到 文件中命名的数组条目。通知 此文件是在您第一次构建后生成的,但您可以添加它 在此之前,您自己到根目录。示例如下所示:Cython Include Pathsconf.jsonconf.json

{

"Copy Target" : "/path/to/your/blender/addon/directory",
"Cython Include Paths" : ["/path/to/the/extracted/directory/animation_nodes_headers/"]

}

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Stella981 Stella981
3年前
Cocos Creator基础教程(9)—优化代码编辑器
CocosCreator游戏开发主要是使用JavaScript语言,这里向大家推荐VisualStudioCode和Webstorm两款JavaScript神级编辑器。这两款编辑器的安装都很简单,这里主要介绍在CocosCreator项目中如何调整编辑器配置,以提升开发效率。1\.排除干扰文件我们知道CocosCre
Easter79 Easter79
3年前
Tomcat NIO(2)
在上一篇(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzI0MDE3MjAzMg%3D%3D%26mid%3D2648393620%26idx%3D1%26sn%3Db01162a67817a46f86218c07190c
Stella981 Stella981
3年前
FFmpeg + OpenGL ES 实现 3D 全景播放器
!(https://oscimg.oschina.net/oscnet/d1020a46dbca480c8182261315bad94d.jpg"FFmpegOpenGLES实现3D全景播放器")FFmpegOpenGLES实现3D全景播放器FFmpeg开发系列连载:FFmpe
Stella981 Stella981
3年前
Postman 使用方法详细介绍
1,下载安装:https://www.getpostman.com/apps2,打开Postman,如图所示:!(https://oscimg.oschina.net/oscnet/00f434cd831f2f74fea6f6d7b86bc46a751.png)3,创建一个接口项目!(https://oscimg.oschina.
Wesley13 Wesley13
3年前
JDK14祭出新特性,Lombok要被终结了!
99套Java企业级实战项目(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAxNDMwMTMwMw%3D%3D%26mid%3D2247494978%26idx%3D1%26sn%3D46ae99739689436a24
Wesley13 Wesley13
3年前
C++创建动态库C#调用(二)
前言上一篇《C创建动态库C调用(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzA4Nzk0NTU0Nw%3D%3D%26mid%3D2247486189%26idx%3D1%26sn%3D46a4d0
Stella981 Stella981
3年前
Nginx反向代理upstream模块介绍
!(https://oscimg.oschina.net/oscnet/1e67c46e359a4d6c8f36b590a372961f.gif)!(https://oscimg.oschina.net/oscnet/819eda5e7de54c23b54b04cfc00d3206.jpg)1.Nginx反
Stella981 Stella981
3年前
Hadoop 气数已尽!逃离复杂性,拥抱云计算
!(https://oscimg.oschina.net/oscnet/355facaec00d46ee851ad87cfdfa754a.gif)作者|MattAsay,译者|杨志昂来源:高效开发运维导读:虽然大数据依然如日中天,但该领域曾经的领头羊Cloudera、Hortonworks和MapR三家公司最近步履
Stella981 Stella981
3年前
CocosCreator 代码组件(创建销毁节点、访问节点和组件) (第四篇)
前言:在游戏开发中,我么都是通过代码来控制场景中的节点,下面讲解怎么用代码,创建节点、销毁节点、访问节点、访问组件。一、创建和销毁节点1\.创建新节点除了通过场景编辑器创建节点外,我们也可以在脚本中动态创建节点。通过newcc.Node()并将它加
美凌格栋栋酱 美凌格栋栋酱
4个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(