helixCmd.py

之前的helloWorldCmd.py只是一个单独的命令,没有任何命令参数。而helixCmd.py则是一个带参数的命令。
可能有不少人都会用到helix的曲线,但maya里的创建曲线菜单里是没有helix的。其实maya一直都有提供这个插件来创建helix的曲线,至于为什么不把它加入到创建菜单里我就不清楚了。
helix的数学算法
[url]http://en.wikipedia.org/wiki/Helix#cite_note-4[/url]
[img]http://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Helix.svg/410px-Helix.svg.png[/img]
[img]http://upload.wikimedia.org/math/4/a/6/4a6a275a0f18363673194ff846aa2f6a.png[/img]
[img]http://upload.wikimedia.org/math/c/5/3/c5395f18bb88980b749f130a7f7bf4e8.png[/img]
[img]http://upload.wikimedia.org/math/a/8/a/a8abc9d380fb7c4004e82d3fa406fcde.png[/img]
需要注意的是,maya的默认轴向和上面的是不同的,maya是Y向上的,而上面的是Z向上,所以要将Y和Z调换。

helixCmd.py
#!/usr/bin/env python
# -*- coding: UTF-8 -*-

'''
Created on Oct 25, 2009

@author: schi
'''

# 描述:
# 创建一个螺旋状的NURBS曲线
#
# 参数:
# p= #螺旋曲线的间距,默认是0.5
# r= #螺旋曲线的半径,默认是4.0
#
# 使用例子:
# python:
# import maya.cmds as cmds
# cmds.spHelix(p=0.3,r=7)
#
# Mel:
# spHelix -p 0.3 -r 7;

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

# 定义命令的名称
kPluginCmdName = 'spHelix'
# 定义参数的名称
kPitchFlag = '-p'
kPitchLongFlag = '-pitch'
kRadiusFlag = '-r'
kRadiusLongFlag = '-radius'

class SpHelixCmd( ompx.MPxCommand ):

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

def doIt( self, args ):
# 定义所需要的数值,如:cv点的数量,曲线的间距,半径等
deg = 3
ncvs = 20
spans = ncvs - deg
nknots = spans + 2 * deg - 1
radius = 4.0
pitch = 0.5

# 剖析参数
argData = om.MArgDatabase( self.syntax(), args )
# 查看在使用命令时是否设置-p和-r参数
# isFlagSet()是MArgParser的方法
# MArgDatabase继承MArgParser
# flagArgumentDouble()也一样
if argData.isFlagSet( kPitchFlag ):
pitch = argData.flagArgumentDouble( kPitchFlag, 0 )
if argData.isFlagSet( kRadiusFlag ):
radius = argData.flagArgumentDouble( kRadiusFlag, 0 )

controlVertices = om.MPointArray()
knotSequences = om.MDoubleArray()

# 给helix建立cv点
for i in range( 0, ncvs ):
controlVertices.append( om.MPoint( radius * math.cos( i ),
pitch * i,
radius * math.sin( i ) ) )

for i in range( 0, nknots ):
knotSequences.append( i )

# 创建曲线
curveFn = om.MFnNurbsCurve()
nullObj = om.MObject()

try:
# 这个插件是通过剖析cv点来创建曲线的。
# 通过ep点来创建曲线的方法也已经添加,
# 只要设置为False就行
if True:
curveFn.create( controlVertices,
knotSequences,
deg,
om.MFnNurbsCurve.kOpen,
0, 0,
nullObj )
else:
curveFn.create( controlVertices,
3,
om.MFnNurbsCurve.kOpen,
False, False, False )
except:
sys.stderr.write( '创建曲线时发生错误\n' )
raise

# Creator
def cmdCreator():
# Create the command
return ompx.asMPxPtr( SpHelixCmd() )

# Syntax creator
# 命令样式创建
def syntaxCreator():
syntax = OpenMaya.MSyntax()
syntax.addFlag( kPitchFlag, kPitchLongFlag, om.MSyntax.kDouble )
syntax.addFlag( kRadiusFlag, kRadiusLongFlag, om.MSyntax.kDouble )
return syntax

# 注册插件
def initializePlugin( mobject ):
mplugin = ompx.MFnPlugin( mobject )
try:
mplugin.registerCommand( kPluginCmdName, cmdCreator )
except:
sys.stderr.write( '插件 %s 注册失败\n' % kPluginCmdName )
raise

# 注销插件
def uninitializePlugin( mobject ):
mplugin = ompx.MFnPlugin( mobject )
try:
mplugin.deregisterCommand( kPluginCmdName )
except:
sys.stderr.write( '插件 %s 注销失败\n' % kPluginCmdName )
raise

之前忘了说明initializePlugin和uninitializePlugin这两个方法的作用,maya在加载插件时会调用initializePlugin方法,如果不存在将无法加载,如果加载出错会输出错误信息;同样当你不需要这个插件时可以卸载它,这时就会调用uninitializePlugin方法,否则无法卸载。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值