schi 发表于 2013-2-7 20:30:46

zoomCameraCmd

helixCmd是一个带命令参数的命令,但执行之后是无法撤销的,也无法重做。Maya是提供了撤销和重做机制的,但需要你去实现它们,不过有些类是自动提供这个功能的。
使用MPxCommand来自定义命令就需要重载redoIt来实现redo,重载undoIt来实现undo,并重载isUndoable来确定命令是可撤销,没有实现这些方法就无法撤销,也无法重做。所以有些插件的部分功能是无法撤销,也无法重做的,因为它们没实现这些方法,要实现这些方法会给开发方面带来更大的困难(比较复杂的插件),也会增加开发的时间。
下面就来看一个简单的例子zoomCameraCmd.py来实现redoIt、undoIt

这个插件会设置当前激活的视图的相机的focalLength,来达到放大两倍(redoIt)或缩小两倍(undoIt)。

zoomCameraCmd.py
# -*- coding: UTF-8 -*-## python:# import maya.cmds# maya.cmds.loadPlugin("zoomCameraCmd.py")# maya.cmds.spZoomCamera()## mel:# loadPlugin zoomCameraCmd.py;# spZoomCamera;import sysimport maya.OpenMaya as omimport maya.OpenMayaUI as omuiimport maya.OpenMayaMPx as ompx# 插件名称kPluginCmdName = "spZoomCamera"print "zoomCameraCmd.py has been imported...."# command# 定义命令class zoomCameraCmd( ompx.MPxCommand ):camera = om.MDagPath()def __init__( self ):super( zoomCameraCmd, self ).__init__()# 重载redoIt来实现redodef redoIt( self ):# 全局变量camera,会在doIt中先定义global camerafnCamera = om.MFnCamera( camera )# 获取相机的focalLengthf1 = fnCamera.focalLength()# 设置相机的focalLengthfnCamera.setFocalLength( f1 * 2.0 )# 重载undoIt来实现undodef undoIt( self ):global camerafnCamera = om.MFnCamera( camera )f1 = fnCamera.focalLength()fnCamera.setFocalLength( f1 * 0.5 )def doIt( self, args ):global cameracamera = om.MDagPath()try:# 获取当前激活的视图的相机omui.M3dView.active3dView().getCamera( camera )except:sys.stderr.write( "ERROR: getting camera \n" )else:self.redoIt()# 重载isUndoable来确定命令是可撤销def isUndoable( self ):return True# Cmd Creatordef cmdCreator():return ompx.asMPxPtr( zoomCameraCmd() )# Initialize the script plug-in def initializePlugin( obj ):    plugin = ompx.MFnPlugin( obj )    try:      plugin.registerCommand( kPluginCmdName, cmdCreator )    except:      sys.stderr.write( "Failed to register command: %s\n" % kPluginCmdName )      raise       # Uninitialize the script plug-in       def uninitializePlugin( obj ):plugin = ompx.MFnPlugin( obj )try:plugin.deregisterCommand( kPluginCmdName )except:sys.stderr.write( "Failed to unregister command: %s\n" % kPluginCmdName )raise
你可以在maya安装目录下的devkit/plug-ins/scripted找到zoomCameraCmd.py。
在线版
http://download.autodesk.com/us/maya/2010help/API/zoom_camera_cmd_8py-example.html
页: [1]
查看完整版本: zoomCameraCmd