sineNode.py

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

这个节点和表达式中的sin方法是同样的功能。

sin及表达式的使用
http://download.autodesk.com/us/maya/2010help/index.html?url=Useful_functions_sin.htm,topicNumber=d0e175415

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。
在线版
http://download.autodesk.com/us/maya/2010help/API/sine_node_8py-example.html

你可能感兴趣的:(html,python)