一半君的总结纸

听话只听一半君

#01 怎样找到Script Editor里出来的那些命令? 为什么有些命令在帮助里找不到!

首先应该去MAYA自带的MEL帮助里找: 把”MEL Functions: Alphabetical” 放到你的收藏夹上. 在这里你可以找到所有的MEL命令. 这里同时也列出了所有的 DG 节点.

有些”内部的” MEL 脚本你在这里是找不到的,比如被用来设置当前的tool, 创建窗口和对话框的一些脚本.

有一个办法可以看到,在Script Editor 菜单里勾上 “Echo All Commands” ,之后当你在Maya里操作的时候,你会看到Maya执行的所有操作对应的命令(勾上以后会显示很多,有些是和操作没有关系的比如刷新界面等其他一些辅助操作,不勾的时候一般只显示你执行的对物体的操作,比如只显示你把pCube1往上移了1格). Maya帮助里列出的MEL命令只是最基本的单个命令,如果某人用这些命令写成了一个myProc.mel脚本文件,在Maya里调用了,那你在Script Editor 里只会看到运行了MyProc,但是具体这个MyProc文件里运行了哪些MEL命令你是看不到的,你得去打开这个.mel文件才能看得到。

有很多 MEL 函数(procedure)的名字是和.mel文件的名字不一样的,比如你看到Script Editor里显示运行了 ‘PolySelectConvert’.但是你找不到一个叫做PolySelectConvert.mel的文件

此时如果你在Script Editor -> History 勾上 Echo All Commands 然后选择菜单:

Polygons -> Selection -> Convert Selection To Faces

你会在Script Editor里看到如下的命令:

PolySelectConvert 1

这不是一个MEL命令而且你在MEL DOC里是找不到的,在Maya2.5的时候,此外虽然有个.mel文件叫做”PolySelectConvert.mel”. 但其实这个函数(proc)的位置在下面的文件里:

MAYA_INSTALL_DIR/scripts/startup/PolygonsMenu.mel

如果你打开上面的文件去里面看,他实际执行的命令是:

polyListComponentConversion

这才是一个MEL命令而且你可以在MEL Doc里找到他.

在Maya 3 以后自动桌才把 PolySelectConvert proc 存到同名的.mel脚本里了.

当你不知道一个命令是不是”真的”MEL命令的时候,你可以用‘whatIs’ 命令. 他可以告诉你你查询的proc是一个MEL命令还是一个.mel脚本文件里的proc(如果是后者,他会显示出那个.mel文件在哪里):

whatIs PolySelectConvert;
// Result: Script found in: D:/AW/Maya2.5/scripts/startup/PolygonsMenu.mel //

whatIs PolySelectConvert;
// Result: Script found in: D:/AW/Maya3.0/scripts/others/PolySelectConvert.mel //

如果用上面的方法还是找不到某个proc,那你可能就要去Maya安装目录下搜索所有.mel文件了(有些工具可以搜索文件里的字符串,比如TextPad的Search Files 功能)Failing this, it may be necessary to search through all of Maya’s installed MEL scripts with some form of “Find In Files” function to find where and how a procedure is implemented (I use TextPad and its Search Files function). 比如你可以搜 procedure 的名字, 参数(arguments)的名字, 或者Maya的菜单上或窗口上的 text label . 你可以通过搜到的文件名来猜哪些proc和你要找的命令或者界面有关.

你也可以去邮件列表的旧档(Mailing List Archives )搜索 :

« http://www.highend3d.com/maya/archive/ » ( 这网站应该已经变成CreativeCrash了,不知道还有没有人用)

你可能经常发现找不到的命令,其实他们都是.mel文件里的某个proc. 多WhatIs几次就可以找到.

Monday, December 17, 2001

加强版:

当你whatIs xxx命令的时候,有以下3种情况:

  1. whatIs polyCube;
    // Result: Command //

    这说明polyCube是一个MEL命令,可以在DOC(Documentation的缩写,即帮助)里找到

  2. 当你想知道如何切换左侧toolbox的当前tool到移动或者选择,你可以勾选Echo All Commands,然后你会发现当你点移动工具的时候,Script Editor里显示如下的一行,如果你whatIs一下,结果显示是一个.mel文件的话
    changeToolIcon;
    whatIs changeToolIcon;
    // Result: Mel procedure found in: .../maya2012/scripts/startup/changeToolIcon.mel // 

    那说明changeToolIcon是这个mel文件里的一个带global的函数(proc),换句话说就是在这个mel文件里,有这么一大段

    global proc changeToolIcon() {
    // 切换工具的代码在此
    }

    如果你想知道Maya是怎么切换tool的,打开此文件看看就知道了。

  3. 当你想知道按4,5,6的时候Maya是如何切换材质显示的,同上所述,在Script Edtior里可以看到
    DisplayWireframe;
    displaySmoothness -full;
    {
        string $currentPanel = `getPanel -underPointer`;
        if ("" == $currentPanel) {
            $currentPanel = `getPanel -withFocus`;
        }
        if ("" != $currentPanel) {
            string $panelType = `getPanel -typeOf $currentPanel`;
            if ($panelType ==  "modelPanel") {
                modelEditor -edit -displayAppearance "wireframe"
                    -displayLights "default" $currentPanel;
            } else if (`isTrue "MayaCreatorExists"` && `scriptedPanel -exists $currentPanel`
                && `scriptedPanel -query -type $currentPanel` == "dynPaintScriptedPanelType") {
                dynPaintEditor -edit -displayAppearance "wireframe"
                    -displayLights "default" $gDynPaintEditorName;
            } else if ($panelType ==  "scriptedPanel") {
    			  string $cmd = "modelEditor -edit -displayAppearance \"wireframe\" -displayLights \"default\" ";
    			  scriptedPanelRunTimeCmd( $cmd, $currentPanel );
            }
        }
    };

    为什么会有这么大一段,其实只有第一行是需要的。当你WhatIs DisplayWireframe的时候,你会看到

    whatIs DisplayWireframe;
    // Result: Presumed Mel procedure; no definition seen yet. // 

    这段话的意思是DisplayWireframe可能是一个mel文件里的proc,但是他不是global的。但是这里是特殊情况,每当你看到命令的首字母是大写的,说明他有可能是一个runTimeCommand.

    runTimeCommand -q -c "DisplayWireframe";
    // Result: displaySmoothness -full;
    {
        string $currentPanel = `getPanel -underPointer`;
        if ("" == $currentPanel) {
            $currentPanel = `getPanel -withFocus`;
        }
        if ("" != $currentPanel) {
            string $panelType = `getPanel -typeOf $currentPanel`;
            if ($panelType ==  "modelPanel") {
                modelEditor -edit -displayAppearance "wireframe"
                    -displayLights "default" $currentPanel;
            } else if (`isTrue "MayaCreatorExists"` && `scriptedPanel -exists $currentPanel`
                && `scriptedPanel -query -type $currentPanel` == "dynPaintScriptedPanelType") {
                dynPaintEditor -edit -displayAppearance "wireframe"
                    -displayLights "default" $gDynPaintEditorName;
            } else if ($panelType ==  "scriptedPanel") {
    			  string $cmd = "modelEditor -edit -displayAppearance \"wireframe\" -displayLights \"default\" ";
    			  scriptedPanelRunTimeCmd( $cmd, $currentPanel );
            }
        }
    }
     //
     

    这说明了 DisplayWireframe 本身就等同于下面那一大段,runTimeCommand存在的原因是,有些常用的代码片段很短,不值得专门把它放在一个单独的.mel文件里,自动桌就沿用了这种方法(就和linux里嫌常用命令太长自己定义一个alias一样),还有很多其他这样的runTimeCommand,你可以用 runTimeCommand -q -commandArray 来显示所有的runTimeCommand。

    runTimeCommand是一个MEL命令,可以在帮助里找到

综上所述,所有的Script Editor里的命令都可以用上面的方法找到,有一种例外情况是,有些proc是在.mll插件里source的,你用了上面的方法还是找不到他的代码,这时候你只能去找插件的作者了。比如你先自己定义一个proc,然后你whatIs他的时候,你会看到:

proc myProc(){
print "yeah,myProc!";
}

whatIs myProc
// Result: Mel procedure entered interactively. //

有些插件很脑残比如syflex,如果你load他的时候勾了Echo All Commands,你可以看到他所有定义的proc的内容,他们只是source了一下而已。

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: