`
schi
  • 浏览: 205229 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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 sys
import maya.OpenMaya as om
import maya.OpenMayaUI as omui
import 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来实现redo
	def redoIt( self ):
		# 全局变量camera,会在doIt中先定义
		global camera
		fnCamera = om.MFnCamera( camera )
		# 获取相机的focalLength
		f1 = fnCamera.focalLength()
		# 设置相机的focalLength
		fnCamera.setFocalLength( f1 * 2.0 )
		
	# 重载undoIt来实现undo
	def undoIt( self ):
		global camera
		fnCamera = om.MFnCamera( camera )
		f1 = fnCamera.focalLength()
		fnCamera.setFocalLength( f1 * 0.5 )
		
	def doIt( self, args ):
		global camera
		camera = 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 Creator
def 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
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics