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

sierpinski triangle 2d maya plug-in(with python API 2.0)

阅读更多
因为python API 2.0可用的类很少,OpenMayaMpx模块里的类被整合到OpenMaya里面了,这个模块不再存在,里面的一些方法也被丢弃了,所以使用python API 2.0来写插件和1.0是有区别的,我这里就以sierpinski triangle 2d为例来看看怎么使用python API 2.0来写插件.

首先,我们的插件是一个命令插件,就是创建一mel命令,命令只有一个-times(-t)参数可使用,接受的数据类型是int,和一个以上的三角形节点,使用方法
sierpinskiTriangle -t 5 objects;

或是
from maya import cmds
cmds.sierpinskiTriangle(objects, t=5)

sierpinskiTriangleCmd.py
import sys
import maya.api.OpenMaya as om
from maya import cmds

def maya_useNewAPI():
    pass

class STCmd(om.MPxCommand):
    
    cmdName = "sierpinskiTriangle"
    timeFlag = "-t"
    timeLongFlag = "-times"
    
    def __init__(self):
        super(STCmd, self).__init__()
    
    def doIt(self, args):
        times = 1
        timeFlagIndex = args.flagIndex(STCmd.timeFlag, STCmd.timeLongFlag)
        if timeFlagIndex != om.MArgList.kInvalidArgIndex:
            times = args.asInt(timeFlagIndex+1)
        argData = om.MArgDatabase(self.syntax(), args)
        objList = argData.getObjectList()
        if objList.isEmpty():
            self.displayError("No objects pass to the command or nothing is selected.")
        for i in range(objList.length()):
            objPath = objList.getDagPath(i)
            if objPath.apiType() == om.MFn.kMesh:
                obj = objPath
            else:
                obj = objPath.child(0)
                if obj.apiType() != om.MFn.kMesh:
                    continue
            
            meshFn = om.MFnMesh(obj)
            if meshFn.numEdges == 3:
                name = meshFn.name()
                for j in range(times):
                    for k in range(meshFn.numPolygons):
                        cmds.select("%s.f[%d]" % (name, k), r=1)
                        edges = cmds.polyInfo(fe=1)[0].split()[-3:]
                        meshFn.syncObject()
                        meshFn.split(((meshFn.kOnEdge, int(edges[2]), 0.5), (meshFn.kOnEdge, int(edges[1]), 0.5), (meshFn.kOnEdge, int(edges[0]), 0.5), (meshFn.kOnEdge, int(edges[2]), 0.5)))
                        meshFn.deleteFace(meshFn.numPolygons - 1)
                        meshFn.updateSurface()
        cmds.select(cl=1)

def cmdCreator():
    return STCmd()

def syntaxCreator():
    syntax = om.MSyntax()
    syntax.addFlag(STCmd.timeFlag, STCmd.timeLongFlag, syntax.kUnsigned)
    syntax.setObjectType(syntax.kSelectionList)
    syntax.useSelectionAsDefault(True)
    return syntax

def initializePlugin(mobject):
    mplugin = om.MFnPlugin(mobject, "mack stone", "0.1")
    try:
        mplugin.registerCommand(STCmd.cmdName, cmdCreator, syntaxCreator)
    except:
        sys.stderr.write("Failed to register command: %s\n" % STCmd.cmdName)
        raise

def uninitializePlugin(mobject):
    mplugin = om.MFnPlugin(mobject)
    try:
        mplugin.deregisterCommand(STCmd.cmdName)
    except:
        sys.stderr.write("Failed to unregister command: %s\n" % STCmd.cmdName)
        raise

要让maya知道你的插件是使用python API 2.0来写,必须要定义这个函数,不知道以后会不会有所改变
def maya_useNewAPI():
    pass

然后其它的基本一样,因为OpenMayaMpx模块被丢弃了,所以你只需要返回你命令类的实例就行了
def cmdCreator():
    return STCmd()
分享到:
评论
8 楼 schi 2013-06-17  
很多人都觉得python慢,其实不管你用什么语言,运行速率都跟硬件和算法有关,但大部分情况下都会假设硬件已经足够快,所以只需要更快的算法就能达到我们的目的,算法可以是很简单也可以是很复杂。
例如:
哪个更快
1 + 1
1 - 1
1 + -1


或是我们要反转一个列表
mylist = []
for i in xrange(1000):
    mylist.insert(0, i)


mylist = []
for i in xrange(1000):
    mylist.append(i)
mylist.revers()

哪个更快?
7 楼 376832814 2013-06-16  
最近写的
几个脚本
都比较崩溃于速度上。。。
前几天 有写一个 后台导入 massive 导出的骨骼的脚本
本以为 Standalone
打开maya 导入骨骼
会快
但是 也并不明显
不知道 怎样能 提高 运行的速度
6 楼 376832814 2013-06-16  
嘿嘿
想请教下
前几天 写一个
获取流体盒子
dencity
写出文件
的脚本
使用 是getFluidAttr命令获取的每个voxel的dencity

发现 真正使用起来
速度有点。。
想请教下有什么方法 加快运行速度?

其实一直有疑惑的是
写的maya脚本
cpu使用率都不高?
5 楼 schi 2013-06-13  
  1. 不是,看你的需求
  2. 应该是一样的,某些情况下直接用更快
  3. 对的,使用MDGModifier,它会帮你记录所有(可以undo和redo)的操作,不用的话需要自己实现undo和redo
4 楼 376832814 2013-06-12  
嘿嘿
非常感谢你上次的回答
这次
还想请教下
1
因为很多资料都是c++的  而我并不是很了解c++
在c++Api中实现mel 那些普通命令必须要
OpenMaya.MDGModifier().commandToExecute(mel)对么


2
就像你说的 pyApi强大在于
我可以所以使用普通命令
这样会不会影响速度呢?
我也想
OpenMaya.MDGModifier().commandToExecute(mel) 会更快么?

3
还想请教下
OpenMaya.MDGModifier().commandToExecute(mel)
OpenMaya.MGlobal().executeCommand(mel)
这两个不同
这是与 undo 有关么?
3 楼 schi 2013-06-07  
376832814 写道
嘿嘿
想请教
发现 如果
使用 python 调用的话
输入的参数 会无用
不知道。。。

对的,python写的插件有时候会出现这种情况的,我没做太多的测试
376832814 写道
再请教下
自己
参照你这个写了下
完成的是
《Complete Maya Programing》
里面的 第一个例子
就是 post 那个沿曲线创建圆柱的例子
有两个问题
1.发现好像2.0没有OpenMaya.MFnNurbsCurve()
  这就是你所说的缺少很多类对么? 那这样的话
  就必须要别的办法来实现里面的方法对么?
2 不知道为什么 脚本中
  只要加入argData = om.MArgDatabase(self.syntax(), args) 
  这一句 一运行命令 maya 就会崩溃。。。

  1. 是的,你可以使用1.0的API来实现曲线的创建,或是用普通命令,pyhton for maya的强大之处就是可以将你需要的任何模块整合在一起
  2. 你用错了吧
2 楼 376832814 2013-06-02  
再请教下
自己
参照你这个写了下
完成的是
《Complete Maya Programing》
里面的 第一个例子
就是 post 那个沿曲线创建圆柱的例子
有两个问题
1.发现好像2.0没有OpenMaya.MFnNurbsCurve()
  这就是你所说的缺少很多类对么? 那这样的话
  就必须要别的办法来实现里面的方法对么?
2 不知道为什么 脚本中
  只要加入argData = om.MArgDatabase(self.syntax(), args) 
  这一句 一运行命令 maya 就会崩溃。。。
1 楼 376832814 2013-06-02  
嘿嘿
想请教
发现 如果
使用 python 调用的话
输入的参数 会无用
不知道。。。

相关推荐

Global site tag (gtag.js) - Google Analytics