상세 컨텐츠

본문 제목

WheelNode Plugin 강좌

Maya API/Maya_PythonAPI 구문들

by hwano 2013. 12. 16. 01:21

본문

#-*- coding: cp949 -*-
import sys
import maya.OpenMaya as om
import maya.OpenMayaMPx as omMPx

nodeName = 'WheelNode'
nodeId = om.MTypeId(0x100fff)

class WheelNode( omMPx.MPxNode ):
    
    inRadius = om.MObject()
    inTranslate = om.MObject()
    outRotate = om.MObject()
    
    def __init__( self ):
        omMPx.MPxNode.__init__(self)

    #____ 노드의 계산이 이뤄진다
    def compute( self, plug, dataBlock ):
        '''
        rotate = randlate/( 2 * 3.14 * radius ) * ( -360 )
        '''
        if plug == WheelNode.outRotate:
            dataHandleRadius = dataBlock.inputValue( WheelNode.inRadius )
            dataHandleTranslate = dataBlock.inputValue( WheelNode.inTranslate )
            
            inRadiusVal = dataHandleRadius.asFloat()
            inTranslateVal = dataHandleTranslate.asFloat()
            
            outRotate = float( inTranslateVal ) / ( 2 * 3.14 * inRadiusVal ) * ( - 360 )
            
            datahandleRotate = dataBlock.outputValue( WheelNode.outRotate )
            
            datahandleRotate.setFloat( outRotate )
            
            dataBlock.setClean( plug )
        else:
            return om.kUnknownParameter
            
def nodeCreator():
    return omMPx.asMPxPtr( WheelNode() )

#____ 플러그인을 로드할 때 한번 실행되는 함수
def nodeInitializer():

    #____ 1. numeric attrbutes의 function set을 만든다
    mFnAttr = om.MFnNumericAttribute()
    
    #____ 2. attribute를 만든다
    WheelNode.inRadius = mFnAttr.create( 'raius',
                         'r', om.MFnNumericData.kFloat, 0.0 )
    mFnAttr.setReadable( 1 )
    mFnAttr.setWritable( 1 )
    mFnAttr.setStorable( 1 )
    mFnAttr.setKeyable( 1 )
    
    WheelNode.inTranslate = mFnAttr.create( 'translate',
                            't', om.MFnNumericData.kFloat, 0.0 )
                            
    mFnAttr.setReadable( 1 )
    mFnAttr.setWritable( 1 )
    mFnAttr.setStorable( 1 )
    mFnAttr.setKeyable( 1 )    
    
    WheelNode.outRotate = mFnAttr.create( 'rotate',
                          'rot', om.MFnNumericData.kFloat )
    
    mFnAttr.setReadable( 1 )
    mFnAttr.setWritable( 0 )
    mFnAttr.setStorable( 0 )
    mFnAttr.setKeyable( 0 )
    
          
    #____ 3. 노드에 attribute를 붙인다
    WheelNode.addAttribute( WheelNode.inRadius )
    WheelNode.addAttribute( WheelNode.inTranslate )
    WheelNode.addAttribute( WheelNode.outRotate )

    #____ 4. circuitry( 회로, 작동방식 )을 정한다
    WheelNode.attributeAffects( WheelNode.inRadius,
                                WheelNode.outRotate )
    WheelNode.attributeAffects( WheelNode.inTranslate,
                                WheelNode.outRotate )
    
def initializePlugin( mobject ):
    mplugin = omMPx.MFnPlugin( mobject )
    try:
        mplugin.registerNode( nodeName, nodeId, nodeCreator, nodeInitializer )
    except:
        sys.stderr.write( 'Failed to register command: %s\n' %nodeName )

def uninitializePlugin( mobject ):
    mplugin = omMPx.MFnPlugin( mobject )
    try:
        mplugin.registerCommand( commandName )
    except:
        sys.stderr.write( 'Failed to register command: %s\n' %nodeName )

 
   


관련글 더보기