sineNode.py

前面的helloWorldCmd.py和helixCmd.py展示了自定义命令及带参数命令的写法,我们接下来看看自定义节点的写法。

这个节点和表达式中的sin方法是同样的功能。
[img]http://download.autodesk.com/us/maya/2010help/images/MED/Stargate/English/MEL/cm.tySintx.png[/img]
sin及表达式的使用
[url]http://download.autodesk.com/us/maya/2010help/index.html?url=Useful_functions_sin.htm,topicNumber=d0e175415[/url]

sineNode.py
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#
# python:
# import maya
# maya.cmds.loadPlugin("sineNode.py")
# maya.cmds.createNode("spSineNode")
# maya.cmds.getAttr("spSineNode1.output")
#
# Mel:
# loadPlugin sineNode;
# createNode spSineNode;
# getAttr spSineNode1.output;

import math, sys
import maya.OpenMaya as om
import maya.OpenMayaMPx as ompx

# 定义节点名称以及ID
kPluginNodeTypeName = 'spSineNode'
sineNodeId = om.MTypeId( 0x8700 )

# node definition
# 定义节点
class sineNode( ompx.MPxNode ):
'''
sine node
'''

# class variables
input = om.MObject()
output = om.MObject()

def __init__( self ):
super( sineNode, self ).__init__()

# 节点的计算函数
# plug是MPlug的实例
# dataBlock是MDataBlock的实例
def compute( self, plug, dataBlock ):
# 需要更新的属性sineNode.output
if ( plug == sineNode.output ):
# 想要接收的属性sineNode.input
# 用它来创建数据区段,返回数据柄
dataHandle = dataBlock.inputValue( sineNode.input )

# 将数据柄的数据转为浮点数
# 需MDataHandle来处理
inputFloat = dataHandle.asFloat()
# 通过计算,得出我们需要的结果
result = math.sin( inputFloat ) * 10.0
# 用sineNode.output来创建数据区段,用来写入数据
outputHandle = dataBlock.outputValue( sineNode.output )
# 将result写入数据区段
outputHandle.setFloat( result )
# 更新节点
dataBlock.setClean( plug )

# creator
# 创建节点
def nodeCreator():
return ompx.asMPxPtr( sineNode() )

# initializer
# 初始化节点
def nodeInitializer():
# input
# 输入
nAttr = om.MFnNumericAttribute()
# 创建input属性
sineNode.input = nAttr.create( 'input', 'in',
om.MFnNumericData.kFloat, 0.0 )
nAttr.setStorable( 1 )

# output
# 输出
nAttr = om.MFnNumericAttribute()
# 创建output属性
sineNode.output = nAttr.create( 'output', 'out',
om.MFnNumericData.kFloat, 0.0 )
nAttr.setStorable( 1 )
nAttr.setWritable( 1 )
# add attributes
# 将创建的属性添加给节点
sineNode.addAttribute( sineNode.input )
sineNode.addAttribute( sineNode.output )
# input属性会影响output属性
sineNode.attributeAffects( sineNode.input, sineNode.output )

# initialize the script plug-in
def initializePlugin( mobject ):
mplugin = ompx.MFnPlugin( mobject )
try:
mplugin.registerNode( kPluginNodeTypeName,
sineNodeId,
nodeCreator,
nodeInitializer )
except :
sys.stderr.write( "Failed to register node: %s" %
kPluginNodeTypeName )
raise
# uninitialize the script plug-in
def uninitializePlugin( mobject ):
mplugin = ompx.MFnPlugin( mobject )
try:
mplugin.deregisterNode( sineNodeId )
except :
sys.stderr.write( 'Failed to register node: %s' %
kPluginNodeTypeName )
raise

你可以在maya安装目录下的devkit/plug-ins/scripted找到sineNode.py。
在线版
[url]http://download.autodesk.com/us/maya/2010help/API/sine_node_8py-example.html[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值