====== Links ======
Mel dev ref resource:
* maya gui structure: install_dir/scripts/startup
* bonus tool mel dir: autodesk_install_dir/bonusTools
* http://caad.arch.ethz.ch/info/maya/manual/Commands/functionalCmdList.html
Mel scripting guide:
* 10 to do and not to do: http://xyz2.net/mel/mel.095.htm
* a solid mel outline tutorial: http://www.polyextrude.com/tutorials/MelScripting/index.html
some tools to study:
* point tweaker by nurbs: [[http://dissentgraphics.com/tools/zentools/|ZenTool]]
* A list of rigging tools by Supercrumbly: http://www.supercrumbly.com/3d.php
* A list of rigging tools by Zoo: http://www.macaronikazoo.com/
====== Access Maya object and Maya object concepts======
* Curve (Nurbs curve)
* Curve structure
* CV (control vertex, or control point) is the main fixed access to structure of curves, you can hook Locator to CV's position connectAttr ($tmpControlLocator+".worldPosition[0]") ($baseCurve+".cp["+$i+"]");
* EP (editable point) is a relative definited structure of curve, as curve must pass through all the Editable Points, good for curve build based on passed points, after rebuild curve, the curve will not fit perfect to the editable points, it is always a rough way to initial define the curve shape
* arcLen (arcLength) is measurement of the length of the curvature, good for stretch calculation of curve string $curveInfo = `arclen -ch true $baseCurve`;float $len_origin=`getAttr ($curveInfo+".arcLength")`;
* span is the segment of the curve defined by Editable points, int $seg_cnt=`getAttr ($baseCurve+".spans")`;
EP_count = span_cnt + 1;
CP_count = span_cnt + 3;
* parameter of curve is defining the U position (like UV poition of nurbs surface), rebuild curve into 0-1 parameter range will make read and see the point on curve position easier, or U number is always hard to mean anything ([[http://download.autodesk.com/us/maya/2010help/index.html?url=NURBS_overview_Parameterization_of_NURBS_curves_and_surfaces.htm,topicNumber=d0e228074|official ref]])
====== General Grammar ======
* comment // single comment
/*
line 1
line 2
*/
* undeclare a variable, no possible, ref: http://xyz2.net/mel/mel.076.htm
* eval
string $cmds="string $selected[]=`ls -sl`;print ($selected[0]+\".hellow\");"
eval($cmds);
* dynamic hotkey assign
global proc setHotKey(string $curName, string $curCmd, string $curKey, string $modkey)
{
string $cmds="string $hotKey = \`nameCommand -ann \""+$curName+"\" -c \""+$curCmd+"\"\`;hotkey -k \""+$curKey+"\" "+$modkey+" -name $hotKey;";
eval($cmds);
}
setHotKey("shiHome","move -rpr 0 1 0","x","-ctl");
* array operation ref: http://autodesk.com/us/maya/2011help/index.htm
// catenate (combine) 2 arrays
string $string1[] = {"light1", "light2"};
string $string2[] = {"light3","light4","light5"};
stringArrayCatenate($string1, $string2);
// Result: light1 light2 light3 light4 light5 //
// append array: appendStringArray(string $copyTo[], string $copyFrom[], int $copySize)
string $to[] = { "a", "b", "c" };
string $from[] = { "d", "e", "f" };
appendStringArray($to, $from, 2);
// $to == { "a", "b", "c", "d", "e" }
// remove from an array
string $removeBone[] = `ls -sl -type joint`;
string $Skinbones[] = stringArrayRemove($removeBone, $Skinbones);
//sort array
$listOfFloats={42.42, 1.2, 8.4, -3.4, -100};
$listOfFloats = `sort $listOfFloats`;
// Result: -100 -3.4 1.2 8.4 42.42 //
//empty array
string $tracks[]={};
clear($tracks);
//store array cmd
string $selected[]=`ls -sl`;
print $selected;
string $tP="string $selected[]={";
for($tS in $selected){$tP+=("\""+$tS+"\""+",");}
$tP+="};";
$tP=`substitute ",}" $tP "}"`;
print("\n"+$tP+"\n");
//------------------------------
// string array operation
//------------------------------
stringArrayToString({ "red", "blue", "green" }, "");
// Result: redbluegreen //
stringArrayToString({ "red", "blue", "green" }, ", ");
// Result: red, blue, green //
string $array[];
$array = stringToStringArray("red blue green", " ");
print ("// " + $array[0] + "\n");
print ("// " + $array[1] + "\n");
print ("// " + $array[2] + "\n");
// red
// blue
// green
* multi-dimension array
// maya mel array is 1 D array, for 2D, try matrix[][], for 3d and above, try
$table[]={car_4_2,plane_3_2}; // then combine with stringToStringArray and StringArrayToString method.
// also note: matrix cant be resized once defined, so use Array creatively for multi-D array
* string operation
// regex examples: http://ewertb.soundlinker.com/mel/mel.094.php
//match related operation
// abstract match, also good for finding and check string with pattern
if(`gmatch $autoObj "*_L"`) { $mirrorable=1; $autoTarget = `substitute "_L" $autoObj "_R"`; }
// pattern match
endsWith("abc", "bc"); // 1 true, 0 false, endsWith(string, subfix)
// absolute compare
string $s1="hello";
string $s2="goodbye";
int $compare = `strcmp $s1 $s2`;
// Result: 1 //
$compare = `strcmp $s2 $s1`;
// Result: -1 //
$compare = `strcmp "hello" $s1`;
// Result: 0 //
// break string
string $objectName="namespace:objName";
string $buffer[];
tokenize $objectName ":" $buffer;
string $namespace = $buffer[0] ; // "namespace"
// uppercase and lowercase
tolower "UnSatIsfIEd";
// Result:unsatisfied//
toupper "UnSatIsfIEd";
// Result:UNSATISFIED//
capitalizeString("maya")
// Result: "Maya" //
// search and replace substring
string $text = "one + two + three + four";
string $result = substituteAllString($text, "+", "plus");
print $result;
global proc stringToChars(string $charString){
string $array[];
for($index=1; $index <= size($charString); $index++)
{
$array[$index-1] = `substring ($charString) ($index) ($index)`;
}
return $array;
}
* simple sort step
string $selected[]=`ls -sl`;
for($i=0;$i<(size($selected)-1);$i++){
print $selected[$i];
print $selected[($i+1)];
if(strcmp($selected[$i],$selected[($i+1)])>0) {
print "small";
reorder -r 1 $selected[$i] ;
}
print "\n";
}
* file test filetest -f "vortex.xpm";
* get env variable getenv XBMLANGPATH;
* change namespacenamespace -mv "theNameSpace" ":" -force;
* try catch catch( `createNode -name myTransform transform` )
* trace and print for debug
// trace does what print does,but has option to give where is the command
trace -where ();
warning -showLineNumber 1 "Info here"; // Warning: Info here
error "No"; // Error: No
// get Type
whatIs "$aa"; // variable type
objectType $ball; // object type
* get Maya system and version
float $t=float(`about -version`);
about -operatingSystem; // win64
====== Mel with Maya objects ======
===== selection and info related =====
Note and Issues about Maya selection
- Maya does not store the vertex in selection order
* select none select -cl
* show short name and long name of objects ls -sl -l; ls-sl -sn;
* select pick navigate pickWalk -d down;
* save selection and restore selectionstring $select[] = `ls -sl`;
select -r $select;
for ( $node in $select ) // process each selection
{
/* … */
}
* select to shell ConvertSelectionToShell;
* face selection to selection border (Face > Outline Edge)
select -r `polyListComponentConversion -ff -te -bo`;
* last item from selection string $lastItem[] = `ls -sl -tl 1`;
* list vertex ls -sl -fl
ls -sl -flatten // individual list
ls -sl -type float3
* list by type ls -sl -showType
* list top group (transform) ls -as; //persp top front side Group
* list all sets string $sets[]=`ls -type objectSet`;
* get selected maskedstring $select[] = `ls -sl`;
// Result: pSphere1 nurbsSphereShape1 //
filterExpand -selectionMask 12; // Poly Mesh
// Result: pSphere1 //
filterExpand -selectionMask 10; // Nurbs Surfaces
// Result: nurbsSphere1;
Selection Mask Component Type
31 Polygon Vertices
32 Polygon Edges
34 Polygon Facets
35 Polygon UV Map Coordinates
46 Lattice Points
47 Particle Components
70 Polygon VtxFace
// select all poly geo from top node
$allChild = `listRelatives -ad "root_node"`;
$allGeo = `filterExpand -selectionMask 12 $allChild`;
* get/select children/parents string $children[] = `listRelatives -children pSphere1`; // all children
string $parent[] = `listRelatives -parent pSphere1`; // all parent
// Pick next object on same level
string newSelect[] = `pickWalk -direction right`;
// Pick previous object on same level
string newSelect[] = `pickWalk -direction left`;
// Move down to and select child
string newSelect[] = `pickWalk -direction down`;
// Move up to and select parent
string newSelect[] = `pickWalk -direction up`;
* getAllShape proc string[] getShapes( string $xform )
{
string $shapes[];
$shapes[0] = $xform;
if ( "transform" == `nodeType $xform` )
// If given node is not a transform, assume it is a shape
// and pass it through
{
$shapes = `listRelatives -fullPath -shapes $xform`;
}
return $shapes;
}
* get1stShape global proc string shi_getShape(string $dag)
{
string $rel[] = `listRelatives -pa -ni -s $dag`;
if (size($rel) > 1)
warning("Expected a single shape under transform " + $dag +
". Function may not behave as expected.");
if (size($rel) > 0)
$dag = $rel[0];
return $dag;
}
* getTransform proc string getTransform( string $shape )
{
string $transform = "";
if ( "transform" != `nodeType $shape` )
// If given node is already a transform, just pass on through
{
string $parents[] = `listRelatives -fullPath -parent $shape`;
$transform = $parents[0];
}
return $transform;
}
* polygon info mel tool
// topological information on polygonal objects
polyInfo -edgeToFace `ls -sl`; // -ef
polyInfo -vertexToFace `ls -sl`; //-vf
polyInfo -faceToEdge `ls -sl`; //-fe
polyInfo -faceToVertex(-fv); // -fv
polyInfo -faceNormals(-fn);
//required counts on the specified objects.
polyEvaluate -f;
polyEvaluate -e;
polyEvaluate -v;
polyEvaluate -uv;
polyEvaluate -shell;
polyEvaluate -b; //xmin xmax ymin ymax zmin zmax, ((xmin,xmax), (ymin,ymax), (zmin,zmax))
polyEvaluate -b2; // uv: xmin xmax ymin ymax ((xmin,xmax), (ymin,ymax), (zmin,zmax))
polyEvaluate -faceComponent; //-fc : about selected
polyEvaluate -bc; // about selected
polyEvaluate -bc2; // about selected
polyEvaluate -area; // about face area
polyEvaluate -worldArea;
// bounding box method
getAttr pCube1.center
getAttr pCube1.boundingBoxCenterX
getAttr pCube1.boundingBoxSizeZ
* get bounding box array
// can take poly object and group
float $getBoundArray[] = `xform -q -ws -bb`; //-x,-y,-z, x,y,z
// can take poly object and group
float $bbox[] = `exactWorldBoundingBox`; //-x,-y,-z, x,y,z
// can take poly object and group
getAttr ("object_or_grp"+".boundingBoxMin") //-x,-y,-z
getAttr ("object_or_grp"+".boundingBoxMax") //x,y,z
// require poly object input/selected, can't do group bb
polyEvaluate -b; // mel: -x x -y y -z z; py:(-x x) (-y y) (-z z)
* get namespace and work with namespace global proc string shi_getNamespace(string $object)
{
string $parts[];
int $num = `tokenize $object "|" $parts`;
$num = `tokenize $parts[$num-1] ":" $parts`;
string $namespace= "";
for ($i = 0; $i < $num-1; $i++)
{
$namespace += ":" + $parts[$i];
}
if (size($namespace) == 0)
$namespace = ":";
return $namespace;
}
* select without worry for namespace
`ls -recursive 1 "r_hand_CTRL"`;
* get namespace
string $objectName = "Character:r_arm_CTRL" ; // Our Object Name
string $buffer[] ; // Create Empty Array To Hold Tokens
tokenize $objectName ":" $buffer ; // Split $objectName by ":"
string $namespace = $buffer[0] ; // "Character"
string $object = $buffer[1] ; // "r_arm_CTRL"
// simplier and more accurate
string $objectWithoutNamespace = $buffer[size($buffer)-1] ;
* get workspace
workspace -q -rd // get workspace directory
* get current Manipulator display position
// create locator at move manipulator
float $moveManip[] = {};
// switch to translate mode
setToolTo $gMove;
// get manipulator position
$moveManip = `manipMoveContext -q -position Move `;
// create locator
string $locator[] = `spaceLocator -p 0 0 0`;
setAttr ($locator[0]+".translate") $moveManip[0] $moveManip[1] $moveManip[2];
* get member of a setstring $children[] = `sets -q $setName`;
* select all texture file node and list them
string $texes[]=`ls -type file`;
string $tex;
for ($tex in $texes){
print (`getAttr ($tex+".fileTextureName")`);
print "\n";
}
* a true fully-tested advanced renamer
* http://www.rodgreen.com/?p=117
* curve interaction and intersection
string $intersectNode=`createNode "curveIntersect"`;
connectAttr -f ($wheel_link+".worldSpace[0]") ($intersectNode+".inputCurve1");
connectAttr -f ($wheel_circle+".worldSpace[0]") ($intersectNode+".inputCurve2");
string $posOnCurveNode=`createNode "pointOnCurveInfo"`;
connectAttr -f ($wheel_link+".worldSpace[0]") ($posOnCurveNode+".inputCurve");
connectAttr -f ($intersectNode+".parameter1[0]") ($posOnCurveNode+".parameter");
string $loc_results[]=`spaceLocator -n ($prefix+"loc_result_pos")`;
string $loc_result=$loc_results[0];
connectAttr ($posOnCurveNode+".position") ($loc_result+".t");
code mel
===== object creation related =====
* create object with unique namespaceLocator -n "name#";
* check object or attribute exists
int $objTest = `objExists $myObject` ; // 1 or 0
if(`objExists "R_Arm_Ctrl.IKFK"`) print "It Exists!" ;
* create camera camera
* create annotation
* draw curve based on locator pos
string $locArray[]=`ls -sl`;
$i=0;
$curveGenCmd="curve -d 3 ";
for($i=0;$i
* draw polyFace based on locator pos
string $locArray[]; // after already stored
string $cmd = "polyCreateFacet -ch on -tx 1 -s 1";
for ($i=0; $i
* draw polyFace based on Curve (like Fill Color in illustrator)
string $selected[]=`ls -sl`;
string $curve=$selected[0];
$cvs = `getAttr ($curve+".spans")`;
string $cmd = "polyCreateFacet -ch on -tx 1 -s 1";
string $type="cv"; // cv / ep
if($type=="cv") $cvs+=2;
for ($n=0; $n<=$cvs; $n++)
{
$xyzPos = `xform -q -ws -t ($curve+"."+$type+"["+$n+"]")`;
$cmd = ($cmd+" -p "+$xyzPos[0]+" "+$xyzPos[1]+" "+$xyzPos[2]+" ");
}
string $newMesh[] = `eval ($cmd)`;
* block based instance generation (select a group of object to instant, run this, you can get a window for quick instance creation)
if ( `window -exists shiBlock` ) {
deleteUI shiBlock; // delete window when it exists
}
window -t "Block Lister by Shining" -wh 200 400 -mxb 0 shiBlock;
gridLayout -numberOfColumns 2 -cwh 100 40;
string $selected[]=`ls -sl`;
string $children[] = `listRelatives -children $selected[0]`;
int $count = size($children);
for($i=0;$i<$count;$i++){
string $buffer[] ;
clear($buffer);
tokenize $children[$i] ":" $buffer;
$label=$buffer[(size($buffer)-1)];
string $tcmd="$newBlock=`instance \""+$children[$i]+"\"`;parent -w $newBlock;move -ws -a 0 0 0 $newBlock;";
button -l $label -c $tcmd;
}
showWindow shiBlock;
* common ctrlShape curve creation
curve -d 1 -p -0.3093823805 -4.440892099e-16 4.999995973e-10 -p 0.3093823805 -4.440892099e-16 4.999995973e-10 -p 5.000000414e-10 -4.440892099e-16 4.999995973e-10 -p 5.000000414e-10 0.309382381 8.499999815e-09 -p 5.000000414e-10 -0.309382381 -8.500000259e-09 -p 5.000000414e-10 -4.440892099e-16 4.999995973e-10 -p 5.000000414e-10 7.999999774e-09 -0.3093823805 -p 5.000000414e-10 -9.000000301e-09 0.3093823805 -n "locator";
* Python sample code
selected=cmds.ls(sl=1)
deg=3
pos_list = [ cmds.xform(obj, q=1, ws=1, t=1) for obj in selected]
created = cmds.curve(d=deg, p=pos_list)
===== object tranform related =====
* get object position and apply transform
float $pos[3] = `xform -q -ws -a -rp $object`;
xform -ws -a -t $pos[0] $pos[1] $pos[2] $object2;
* get and move position of a vertex xform -a -ws -t 0 0 0 pCube1.vtx[0]; // move
float $vtxPos[3] = `xform -q -ws -t pCube1.vtx[0]`;
print $vtxPos; //get
* create a locator at selected vertex string $lastItem[] = `ls -sl -tl 1`;
float $pos[3] = `xform -q -ws -t $lastItem[0]`;
spaceLocator -p $pos[0] $pos[1] $pos[2];
// or move locator after create
string $lastItem[] = `ls -sl -tl 1`;
float $pos[3] = `xform -q -ws -t $lastItem[0]`;
spaceLocator; move -a $pos[0] $pos[1] $pos[2];
* get position and pivot position xform -q -ws -rp $selected[0];
xform -q -ws -t $selected[0];
* sync First selected object orientation axis to 2nd selected object
string $selected[]=`ls -sl`;
parent $selected[0] $selected[1];
makeIdentity -apply true -t 1 -r 1 -s 1 -n 0 -jointOrient $selected[0];
parent -w $selected[0];
* store current orientation axis
global proc shi_loc_pivot_rot(){
string $selected[] = `ls -sl`;
string $a;
for($a in $selected){
float $pos[3] = `xform -q -ws -rp $a`;
float $rot[3] = `xform -q -ws -ro $a`;
spaceLocator;
move -a $pos[0] $pos[1] $pos[2];
rotate -a -ws $rot[0] $rot[1] $rot[2];
}
}
* reset transformation and avoid attribute lock
if(!`getAttr -lock ($t+".sx")`) setAttr ($t+".sx") 1;
if(!`getAttr -lock ($t+".sy")`) setAttr ($t+".sy") 1;
if(!`getAttr -lock ($t+".sz")`) setAttr ($t+".sz") 1;
* transfer UV layout from srcModel to toModel
// object must be the same
string $srcNamespace = "srcModel"; // move newUV into oldModel
string $toNamespace = "toModel";
string $srcMesh[]=`ls -type "mesh" ($srcNamespace+":*")`;
for ($eachSrc in $srcMesh){
string $buffer[];
tokenize $eachSrc ":" $buffer;
string $objName = $buffer[size($buffer)-1];
if(`objExists($toNamespace+":"+$objName)`){
print($toNamespace + ":" + $objName+"\n");
print($eachSrc+"\n");
polyTransfer -uv 1 -ao $eachSrc ($toNamespace + ":" + $objName);
// identical topology, same vertex, edge, and face numbering.
// uv v vc
}
}
* get curve length ([[http://xyz2.net/mel/mel.073.htm|ref]])
float $curveLength = `arclen $curve`;
// If the ‘-constructionHistory’ flag is specified the command creates a "curveInfo" node downstream of the curve. This offers a persistent node which you can use to track changes to the curve.
string $curveInfo = `arclen -ch true $curve`;
// Result: curveInfo1 //
getAttr ( $curveInfo + ".arcLength" );
// Result: 5.335323 //
move -r -os -wd 0 0 1.0 ( $curve + ".cv[1]" );
getAttr ( $curveInfo + ".arcLength" );
// Result: 4.309423 //
* stop inherit parent transform
inheritTransform -off $ball;
* copy transformation from A to B
string $selected[] = `ls -sl`;
print ($selected[0]+" is positioned at "+$selected[1]+"\n");
float $pos[3] = `xform -q -ws -t $selected[1]`;xform -t $pos[0] $pos[1] $pos[2] $selected[0];
float $pos[3] = `xform -q -ws -ro $selected[1]`;xform -ro $pos[0] $pos[1] $pos[2] $selected[0];
// simple way
parent -r $grp $child; // xform -q all
parent -w $grp; // xform all
**locator and inform sampling**
* shi_loc_4in1_pose (orient obj in aim, facing, siding)
global proc string shi_loc_4in1_pose(){
print("\n\nselect 4 object center(left right), aim and up)\n");
string $object[] = `ls -sl -fl`;
float $crdFront[] = `xform -q -ws -t $object[0]`;
float $crdBack[] = `xform -q -ws -t $object[1]`;
float $crdLoc[];
$crdLoc[0] = ($crdFront[0] + $crdBack[0]) /2;
$crdLoc[1] = ($crdFront[1] + $crdBack[1]) /2;
$crdLoc[2] = ($crdFront[2] + $crdBack[2]) /2;
string $locs[] = `spaceLocator`;
move -ws $crdLoc[0] $crdLoc[1] $crdLoc[2] $locs[0];
string $cst[] = `aimConstraint -offset 0 0 0 -weight 1 -aimVector 1 0 0 -upVector 0 1 0 -worldUpType "object" -worldUpObject $object[3] $object[2] $locs[0]`;
delete $cst;
return $locs[0];
}
* aim by AimLoc-AimAxis, 2ndDirLoc-2ndDirAxis (Up) aimConstraint -offset 0 0 0 -weight 1 -aimVector 0 1 0 -upVector 0 0 1 -worldUpType "object" -worldUpObject $dir2ndLoc $aimLoc $obj;
===== Transform tool related =====
* move tool
// get move tool option example
manipMoveContext -q -orientJointEnabled Move
// set move tool option example
manipMoveContext -e -orientJointEnabled 0 Move;
===== Common Mel Tool =====
==== system detection ====
* add custom folder to script path, so sourcing the name directly can run the script
$old_path = `getenv "MAYA_SCRIPT_PATH"`;
putenv "MAYA_SCRIPT_PATH" ($old_path +";D:/myCustomScriptPath/;");
* detect os and source file
global proc loadScript(string $path){
string $command = "source \""+$path+"\"";
eval $command ;
}
//-------------------------------------
string $z_sys="";
// check os
// check os
string $checkOS = `about -os`;
if($checkOS == "windows" || $checkOS == "win64" ) $z_sys=system("echo %z_sys%"); // windows
else $z_sys=system("printf $z_sys"); // linux, osx (bash,csh) echo do the name but with new line
// remove new line
$a=stringToStringArray($z_sys,"\r"); // windows echo use \r newline
$aS=stringArrayToString($a,"");
$a=stringToStringArray($aS,"\n"); // linux echo use \n newline
$z_sys=$a[0];
$z_sys = substituteAllString($z_sys, "\\", "/"); // to normal directory format for windows
// make sure system environment got defined
if($z_sys!="") print $z_sys;
// another simple way is to use mel command to get z_system variable
$z_sys=`getenv "z_sys"`;
//-------------------------------------
string $rootPath=$z_sys+"/../dev/melTool/v1.0.3/";
loadScript($rootPath+"shiFun_info.mel");
* path format that works for both win, linux(mac)
global string $rootPath="/user_data/dev/melTool/v1.0.3/"; // linux, mac
global string $rootPath="D:/z_sys/xTool/resMaya/scripts/"; // windows
* get Maya version as float number
global proc float getMayaVersionAsFloat(){
float $version=2012;
if (`exists getApplicationVersionAsFloat`) return `getApplicationVersionAsFloat`;
string $versionString=`about -v`;
string $tempString[];
string $char;
tokenize $versionString $tempString;
//default to 2012, if versionString is not all numbers
for ($i=0;$i
* get script's own location, with this function inside
// Fully auto install, with Python script name inside this file name as "install_PythonFileName.mel"
global proc Tool_Locator (){} // a catcher empty functon for get cmd path
global proc string[] Tool_Location_v2 (){
string $whatIs=`whatIs Tool_Locator`; // actual main dir path get function
string $fullPath=`substring $whatIs 25 999`;
string $buffer[];
int $numTok=`tokenize $fullPath "/" $buffer`;
int $numLetters=size($fullPath);
int $numLettersLastFolder=size($buffer[ $numTok - 1 ]);
string $scriptLocation=`substring $fullPath 1 ($numLetters-$numLettersLastFolder)`;
string $script_name_mel = $buffer[ $numTok - 1 ];
string $bufferB[];
int $numTokB=`tokenize $script_name_mel "_." $bufferB`;
string $script_name = $bufferB[ $numTokB - 2 ];
return {$scriptLocation,$script_name};
}
string $tool_info[] = `Tool_Location_v2`; // file path, file name without extension
==== File operation ====
* load object catch(`loadPlugin "objExport.mll"`);
* load plugin if(`pluginInfo -q -loaded "fbxmaya"` == 1) print "loaded";
* file obj export // import eps
file -import -type "EPS" -mnc false -rpr "TMP_" -options "sc=1.1;group=on" "D:/z01_txt_v002.eps";
// export selected to obj
file -f -options "groups=1;ptgroups=1;materials=1;smoothing=1;normals=1" -typ "OBJexport" -pr -es "D:/zTxt_001_obj.obj";
// export selected to mb
file -f -options "v=0;" -typ "mayaBinary" -pr -es "D:/zTxt_KS_z01_v001.mb";
* get current mel working directory, normally the maya startup directory in cmd, used by chdir, system, fopen, and popen cmd pwd
* get workspace directory, normally defined by set project cmd workspace -q -dir
* workspace set workspace -dir "C:/Users"
* workspace in python
cmds.workspace (dir='C:/Users')
startingDir = cmds.workspace(q=True, rootDirectory=True)
destDir = QtGui.QFileDialog.getExistingDirectory(None,'Open working directory', startingDir, QtGui.QFileDialog.ShowDirsOnly)
startingDir = 'C:/Program Files'
dialog = QtGui.QFileDialog()
dialog.setFileMode( QtGui.QFileDialog.FileMode() )
dialog.getExistingDirectory( None, 'Open working directory', startingDir )
dialog.getOpenFileName( None, 'Open working directory', startingDir )
os.startfile(startingDir)
==== modeling mel tool ====
//select mode
SelectVertexMask
SelectEdgeMask
SelectFacetMask
SelectToggleMode
updateLockSelectionIcon; // select lock
// display mode
ToggleBackfaceGeometry;
DisplayWireframe;
DisplayShaded;
ToggleFaceNormalDisplay;
ShowManipulatorTool;
//mirror x
//delete history
delete -ch;
// bevel plus for curves
bevelPlus -ch 1 -js 1 -tol 0.01 -ns 4 -cap 4 -width 0.1 -depth 0.1 -ed 0.5 -bevelInside 0 -outerStyle 2 -innerStyle 2 -polygon 1 -no 1 -polyOutMethod 2 -polyOutExtrusionType 3 -polyOutExtrusionSamples 2 -polyOutCurveType 3 -polyOutCurveSamples 6 -polyOutUseChordHeightRatio 0 `ls -sl`;
// rebuild with reduce for curves
rebuildCurve -ch 1 -rpo 1 -rt 1 -end 1 -kr 0 -kcp 0 -kep 1 -kt 0 -s 4 -d 3 -tol 0.9 `ls -sl`;
^Loop |SplitEdgeRingTool |
^Brid |performPolyBridgeEdge 0 |
^Extr |performPolyExtrude 0 |
^Fill |FillHole |
^Spli |SplitPolygonTool |
^AveV |performPolyAverageVertex 0 |
^Cetr |MergeToCenter |
^Save |SaveScene |
^-0- |setAttr \"testMat.transparency\" -type double3 1 1 1 |
^-7- |setAttr \"testMat.transparency\" -type double3 0.7 0.7 0.7 |
^-%- |setAttr \"testMat.transparency\" -type double3 0 0 0 |
==== scripting mel tool ====
* check what is the command source code
// check where is the command
whatIs ScriptEditor; // check what is the ScriptEditor command
// if the result shows the file name, that means, the source code is there.
// if the result says "RunTimeCommand", check Hotkey Editor, the source code is there under its name. or use this cmd
runTimeCommand -q -c "PasteVertexSkinWeights";
// if the result says "Command", it is C++ compiled maya command or built-in maya command which written in C++.
* scripting history related
// toggle echo history
handleScriptEditorAction "echoAllCommands";
// scriptEditor clear upper
cmdScrollFieldReporter -e -clear $gCommandReporter;
* script running time related
// beginning of code
$startTime = `timerX`;
// process code here
// end of code
$totalTime = `timerX -startTime $startTime`;
print ("\nTotal Time: "+$totalTime); // it is in seconds
* get selected attributes
// one line code
$attrs = `selectedChannelBoxPlugs`;
// actual code of that function, It reads object attr, shape attr, history attr,
string $main[], $mainObjects[];
string $shape[], $shapeObjects[];
string $history[], $historyObjects[];
string $outputs[], $outputObjects[];
$main = `channelBox -q -selectedMainAttributes $gChannelBoxName`;
$shape = `channelBox -q -selectedShapeAttributes $gChannelBoxName`;
$history = `channelBox -q -selectedHistoryAttributes $gChannelBoxName`;
$outputs = `channelBox -q -selectedOutputAttributes $gChannelBoxName`;
string $attr;
$main = `channelBox -q -selectedMainAttributes $gChannelBoxName`;
$mainObjects = `channelBox -q -mainObjectList $gChannelBoxName`;
$shape = `channelBox -q -selectedShapeAttributes $gChannelBoxName`;
$shapeObjects = `channelBox -q -shapeObjectList $gChannelBoxName`;
$history = `channelBox -q -selectedHistoryAttributes $gChannelBoxName`;
$historyObjects = `channelBox -q -historyObjectList $gChannelBoxName`;
$outputs = `channelBox -q -selectedOutputAttributes $gChannelBoxName`;
$outputObjects = `channelBox -q -outputObjectList $gChannelBoxName`;
if( size( $main ) > 0 ) {
for( $object in $mainObjects ) {
for ($mattr in $main) {
$result[ size($result) ] = ($object+"."+$mattr);
}
}
}
if( size( $shape ) > 0 ) {
for( $object in $shapeObjects ) {
for ($mattr in $shape) {
$result[ size($result) ] = ($object+"."+$mattr);
}
}
}
if( size( $history ) > 0 ) {
for( $object in $historyObjects ) {
for ($mattr in $history) {
$result[ size($result) ] = ($object+"."+$mattr);
}
}
}
if( size( $outputs ) > 0 ) {
for( $object in $outputObjects ) {
for ($mattr in $outputs) {
$result[ size($result) ] = ($object+"."+$mattr);
}
}
}
==== material and hypershade mel tool ====
* connect nodes
connectAttr node1.attrA node2.attrB
connectAttr -f node1.attrA node2.attrB //force connection
* batch material creation and texture linking
int $i=10;
print $i;
$i++;
$newMat=`shadingNode -asShader blinn`;
$newTex=`shadingNode -asTexture file`;
setAttr -type "string" ($newTex+".fileTextureName") ("/robot/maya/sourceimages/v04/sepiaRobot_Diffuse.10"+$i+".tif");
connectAttr -f ($newTex+".outColor") ($newMat+".color");
rename $newMat ("robotMat"+$i);
rename $newTex ("robotTex"+$i);
* distanceBetween node, auto create distance measurer between 2 object
global proc createDistanceNodeFromTwo(){
string $selected[]=`ls -sl`;
string $newDist=`shadingNode -asUtility distanceBetween`;
string $dname =$selected[0] +"_distanceBetween";
rename $newDist $dname;
//connectAttr -f (`shi_getShape $selected[0]`+".worldPosition[0]") ($dname+".point1"); // for locator only
//connectAttr -f (`shi_getShape $selected[1]`+".worldPosition[0]") ($dname+".point2");
connectAttr -f ($selected[0]+".t") ($dname+".point1");
connectAttr -f ($selected[1]+".t") ($dname+".point2");
connectAttr -f ($selected[0]+".parentMatrix") ($dname+".inMatrix1");
connectAttr -f ($selected[1]+".parentMatrix") ($dname+".inMatrix2");
}
* setRange, animCurve, clamp: range mapping and linear or non-linear data value mapper
shadingNode -asUtility setRange;
// Result: setRange1 //
shadingNode -asUtility clamp;
// Result: clamp1 //
createNode animCurveUU;
setKeyframe -f 0 -v 0;
setKeyframe -f 1 -v 1;
//ref: http://download.autodesk.com/us/maya/2011help/Nodes/animCurve.html
// read and access this animCurve node:
// http://nccastaff.bournemouth.ac.uk/jmacey/RobTheBloke/www/mel/DATA_anim_curves.html
animCurveTL time distance
animCurveTA time angle
animCurveTT time time
animCurveTU time double
animCurveUL double distance
animCurveUA double angle
animCurveUT double time
animCurveUU double double
==== Rigging mel tool ====
* display local rotation axis setAttr ("MyJoint"+".displayLocalAxis") 1;
* override display color
# python
node = cmds.ls(sl=1)[0]
colorIndex = 1
cmds.setAttr(node+'.overrideEnabled',1)
cmds.setAttr(node+'.overrideColor', colorIndex)
# node, the transform node and shape node can have different override setting, so make sure you choose the right one you want
# color index
0,1,2,3: grey, black, dark grey, light grey
4,5,6: dark red blue, light blue
7,8: dark green, purple
9: magenta,
10,11,12: dark orange, brown, light brown
13,14,15: bright red, green, blue
16,17,18,19,20,21: white, yellow, cyan, green, pink, brown,
22,23,24, middle yellow, green, brown,
29-31 mud, mud green, mud deep green, mud blue, mud deep blue, mud purple, mud red
orange: 11
cyan:18
pink: 20
* un-template all the mesh or template all the mesh
string $mesh[]=`ls -sl -type transform`;
string $mesh[]=`ls -sl`;
int $i=0;
int $n=0;
for($i=0; $i
* delete constrains
string $constrain[]=`ls -sl`;
for($i=0;$i
* create constrains
select -r ($legSide + "HipFK") ;
select -tgl ($legSide + "Hip") ;
orientConstraint -offset 0 0 0 -weight 1;
poleVectorConstraint -weight 1;// PV constrain
* additional constrain plugin:
* decomposeMatrix (like Parent+Scale constrain)createNode decomposeMatrix;
//ref: http://www.sigillarium.com/blog/lang/en/186/
* visibility switch (expression)lod02.visibility=(mainCtrl.lod==1);
lod01.visibility=(mainCtrl.lod==0);
* data sampling
* curve length and position
float $pos[3]=`pointOnCurve -top true -pr ($i*1.0/$CurveBone_cnt) -p $tC`;
* distance
* skinCluster and weight related
// get all the skin cluster in the scene
ls -type "skinCluster"
// get affected geo
skinCluster -q -g "skinCluster1"
// bind
// bind skin for fixed parts
select -r $tj;
select -add $fix_geo_list;
SmoothBindSkin;
// bind
select -cl;
select -add ("bar_up_"+$i+"_env") ("bar_mid_"+$i+"_env") ("bar_low_"+$i+"_env") ("bar_btm_"+$i+"_env");
select -add $bar_geo_list[$i];
skinCluster -tsb -ih -mi 3 -omi false -dr 4 -rui false -name ("skinCluster_bar_"+$i);
string $SelectedMesh[] = `ls -sl -fl`;
string $SourceSkin = `findRelatedSkinCluster $SelectedMesh[0]`;
string $Skinbones[] = `skinCluster -q -wi $SelectedMesh[0]` ; // list non-zero weight bones
string $Skinbones[] = `skinCluster -q -inf $SelectedMesh[0]` ; // list all weight bones
print $Skinbones;print (size($Skinbones));
// one line bind all geo in selection with bones in selection
$tmpAll = `ls -sl`;
$tmpBones = `ls -sl -type joint`;
$tmpGeos = stringArrayRemove($tmpBones, $tmpAll);
for($each in $tmpGeos) skinCluster -n ($each+"_skinCluster") -tsb $tmpBones $each;
// skincluster normalize method
1. post: weight can go beyond 1, then affect based on total average
2. interactive: move on the fly, stay as 1
ref: http://chrislesage.com/character-rigging/how-to-stop-collapsing-vertices-in-maya-post-normalization/
// normalize weight
doNormalizeWeightsArgList 1 {"4"};
// back to bind pose
dagPose -reset -name bindPose1; // the bindPose node
* ik creation
string $selected[]=`ikHandle -sol ikRPsolver -sj $IKstart -ee $IKend`;
string $curIKhandle=$selected[0];
rename $curIKhandle ($skiBuild_prefix+"ik_handle");
* get Contraint weight attribute like w0, w1
$userAttr=`listAttr -ud $curLink`; // a way to get w0, w1, w2 from *Contraint object
* fix copy skin weight function not working in Maya in 2012, when there are objects with same short name in outliner
// Error: file: /apps/Linux64/aw/maya2012/scripts/others/findSkinClusterFromSelectedComponent.mel line 44: Could not find skin cluster node. //
// problem: copy skin weight give error saying can't find skinCluster since their code cant deal with 2 same short name in scene
// solution: by tracing the error, I found their code of line 35, the Mesh related in short name instead of long time
string $selMesh[] = `listRelatives -shapes -ni $selElems[0]`; // original line 35
// which instead of returning group2|pCube1|pCubeShape1 ; it returns pCubeShape1, which there is another group1|pCube1|pCubeShape1 ;
// corrected line 35
string $selMesh[] = `listRelatives -shapes -ni -pa $selElems[0]`;// full path returned
==== animation mel tool ====
* timeline navigation
currentTime 1
NextFrame
PreviousFrame
$pSolverRootFrame = `currentTime -q`;
$pSolverFrameStart = `playbackOptions -q -min`;
$pSolverFrameEnd = `playbackOptions -q -max`;
$pSolverFrameIncrement = `playbackOptions -q -by`;
* keyframe
keyframe -query -name ($ball+".tx"); // return linked node.
`isAnimCurve($nodes[0])` // check if anim curve
listAnimatable $ball; // return all attributes that keyable
keyframe -time 250 -query -eval ($ball+".tx"); // sample value at time on AnimCurve
* animation curve
setInfinity -q -preInfinite ($ball+".tx");
setInfinity -preInfinite "cycle" ($ball+".tx");
setInfinity -postInfinite "linear" ($ball+".tx"); // constant, linear, cycle, cycleRelative, oscillate
setKeyframe -time 1 -value -5 ($ball+".tx");
setKeyframe -time 48 -value 5 ($ball+".tx");
setKeyframe -insert -time 24 ($ball+".tx"); // add a key without change
keyframe -q -keyframeCount ($ball+".tx"); // return number of keys on the curve
// other key ref: http://download.autodesk.com/us/maya/2010help/Commands/keyframe.html
keyframe -edit -time 48 -timeChange 20 ($ball+".tx"); // move key from f48 to f20, -absolute/-relative
keyframe -edit -time 25 -valueChange 2 ($ball+".tx"); // move key value to 2, -absolute/-relative
// edit keys by key index, like key array index
keyframe -edit -index 0 -index 1 -relative -timeChange 10 ($ball+".tx"); // push value of 1st,2nd key up 10
// edit keys by frame range
keyframe -edit -time "0:12" -relative -valueChange 5 ($ball+".tx"); // or :20 or 20: or : for bound range
keyframe -edit -index "1:20" -valueChange 3 ($ball+".tx"); // key 2 to key 21 change
// get time of indexed key
keyframe -index 0 -q -timeChange ($ball+".tx"); // get frame of 1st key
// scale key range
scaleKey -timePivot 5 -time ":" -valueScale 0.5 ($ball+".tx");
scaleKey -timeScale 0.5 ($ball+".tx");
setDrivenKeyframe -driverValue 0 -value 0 -currentDriver ($ball+".tx") ($box+".tx"); // creation
setDrivenKeyframe -driverValue 2 -value 10 ($box+".tx"); // add
// align key on int frame
snapKey -timeMultiple 1 ($ball+".tx"); // 1 frame interval snap
// normal key and breakdown key, prime key vs procedure key
keyframe -time 1 -breakdown true ($ball+".tx");
// key tangents: (int, out) type, angle,weighting, locking
keyTangent -index 0 -outTangentType flat -inTangentType spline ($ball+".tx");
* copy and paste key
copyKey -index 0 ($ball+".tx");
pasteKey -time 12 -option insert ($ball+".tx");
cutKey -index 1 -option keys ($ball+".tx");
**Expression linking and Rigging mel**
// create a expression
expression -s "battery01.ty=batteryCover.rx/10.0*(-0.5);" -o battery01 -n "expBattery01move" -ae 1 -uc all ;
// update a expression
expression -e -s "battery01.ty=batteryCover.rx/10.0*(-0.5);" -o battery01 -ae 1 -uc all expBattery01move;
//delete a expression
delete expBattery01move;
* force a mel scripted animation refresh dgdirty -a;
==== camera mel tool ====
* Now you can just press down and hold \ key, and use middle mouse to 2D pan and right mouse to 2D zoom
// pan image plane
// -down
string $currentPanel = `getPanel -up`;
string $camera = `modelPanel -q -camera $currentPanel`;
float $verticalFilmOffset = `getAttr ($camera + ".verticalFilmOffset")`;
setAttr ($camera+ ".verticalFilmOffset") ($verticalFilmOffset - 0.02) ;
print ($camera + ".verticalFilmOffset = " +($verticalFilmOffset - 0.02) + "\n");
// -home
string $currentPanel = `getPanel -up`;
string $camera = `modelPanel -q -camera $currentPanel`;
setAttr ($camera + ".verticalFilmOffset") 0.0;
setAttr ($camera +".horizontalFilmOffset") 0.0;
setAttr ($camera + ".overscan") 1.0 ;
// -in
string $currentPanel = `getPanel -up`;
string $camera = `modelPanel -q -camera $currentPanel`; float $overscan =
`getAttr ($camera + ".overscan")`; setAttr ($camera + ".overscan")
($overscan - 0.1) ; print ($camera + ".overscan = " + ($overscan - 0.1) +
"\n");
// -left
string $currentPanel = `getPanel -up`;
string $camera = `modelPanel -q -camera $currentPanel`;
float $horizontalFilmOffset = `getAttr ($camera + ".horizontalFilmOffset")`;
setAttr ($camera + ".horizontalFilmOffset") ($horizontalFilmOffset - 0.02) ;
print ($camera +".horizontalFilmOffset = " + ($horizontalFilmOffset - 0.02) + "\n");
// -out
string $currentPanel = `getPanel -up`;
string $camera = `modelPanel -q -camera $currentPanel`; float $overscan =
`getAttr ($camera + ".overscan")`; setAttr ($camera + ".overscan")
($overscan + 0.1) ; print ($camera + ".overscan = " + ($overscan + 0.1) +
"\n");
// -right
string $currentPanel = `getPanel -up`;
string $camera = `modelPanel -q -camera $currentPanel`;
float $horizontalFilmOffset = `getAttr ($camera + ".horizontalFilmOffset")`;
setAttr ($camera + ".horizontalFilmOffset") ($horizontalFilmOffset + 0.02) ;
print ($camera +".horizontalFilmOffset = " + ($horizontalFilmOffset + 0.02) + "\n");
// -up
string $currentPanel = `getPanel -up`;
string $camera = `modelPanel -q -camera $currentPanel`;
float $verticalFilmOffset = `getAttr ($camera + ".verticalFilmOffset")`;
setAttr ($camera+ ".verticalFilmOffset") ($verticalFilmOffset + 0.02) ;
print ($camera + ".verticalFilmOffset = " +($verticalFilmOffset + 0.02 ) + "\n");
==== window mel tool ====
=== Windows and Its UIs===
// maya windows
ScriptEditor;
OutlinerWindow;
DisplayLayerEditorWindow;
toggleUIComponentVisibility "Channel Box / Layer Editor"
GraphEditor;
HypershadeWindow;
// render
PlayblastWindow;
RenderViewWindow;
unifiedRenderGlobalsWindow;
renderWindowRender redoPreviousRender renderView;
BatchRender;
// animation
toggleUIComponentVisibility "Time Slider";
toggleUIComponentVisibility "Range Slider";
PreferencesWindow;
SetProject; // set project window
file import; // import window
// layout
setNamedPanelLayout "Four View";
// advanced window
ReferenceEditor;
mentalrayApproxEditor;
* get modelPanel camera name (run in shelf button, or it will not work in script editor)
$panel=`getPanel -withFocus`;
$curCamShape=`modelPanel -q -cam $panel`;
$curCam="";
if( `nodeType $curCamShape` == "camera" )
{
$curCam=getTransform($curCamShape);
}
* get window layout and its child UIs
global proc string findWindowLayout( string $windowUI )
{
string $controls[] = `lsUI -l -controlLayouts`;
string $pattern = $windowUI + "*";
string $layout = "";
for ( $ui in $controls )
{
if ( `gmatch $ui $pattern` )
{
string $tokens[];
int $numTokens = `tokenize $ui "|" $tokens`;
if ( $numTokens > 1 )
{
$layout = $tokens[0] + "|" + $tokens[1];
break;
}
}
}
return $layout;
}
string $render_layout = findWindowLayout( "unifiedRenderGlobalsWindow" );
print($render_layout);
// dig into its child uis
string $ca[] = `layout -q -childArray $render_layout`;
print($ca);
//rgMainForm
string $ca[] = `layout -q -childArray "rgMainForm"`;
// rendererPlusLayerLayout tabForm rgCloseBtn
// continues
// query width and change layout size
layout -q -w ($render_layout+"|rgMainForm|tabForm|arnoldTabLayout|arnoldAOVsTab|arnoldAOVsScrollLayout");
// layout -e -width 800 -height 800 ($render_layout+"|rgMainForm|tabForm|arnoldTabLayout|arnoldAOVsTab|arnoldAOVsScrollLayout");
==== Menu ====
* get main window and attach menu
global string $custom_menu;
if (`menu -exists $custom_menu`) deleteUI $custom_menu;
global string $gMainWindow;
string $name="Custom";
$custom_menu = `menu -p $gMainWindow -to true -l $name`; // create menu, that can tear-off
menuItem -p $custom_menu -l "About Me" -c "print \"Cool!\"";
==== HUD mel tool ====
* Head-up-display tools
if(`headsUpDisplay -ex myHUD`) headsUpDisplay -rem myHUD;
* example and ref
* watch attributes: http://mayastation.typepad.com/maya-station/2010/01/watch-attribute-values-in-the-hud.html
==== maya preference setup ====
* get maya script path getenv MAYA_SCRIPT_PATH;
* mel path var and python sys var
// maya path var operation
string $mayaScriptPaths[];
string $mayaScriptPath = `getenv MAYA_SCRIPT_PATH`;
tokenize $mayaScriptPath ":" $mayaScriptPaths;
//Removing any paths that don't exist:
for ($pathToCheck in $mayaScriptPaths)
{
if (!`filetest -d $pathToCheck`)
$mayaScriptPaths = stringArrayRemove({$pathToCheck}, $mayaScriptPaths);
}
$mayaScriptPaths = stringArrayRemove({$path}, $mayaScriptPaths);
stringArrayInsertAtIndex(0, $mayaScriptPaths, $path);
$mayaScriptPath = stringArrayToString ($mayaScriptPaths, ":");
putenv MAYA_SCRIPT_PATH $mayaScriptPath;
// sys path var operation
python ("if '" + $path + "' in sys.path: sys.path.remove ('" + $path + "')");
python ("sys.path.insert ( 0, '" + $path + "')");
// APSC 1.5x crop DSLR (inch)
optionVar -floatValue cameraHorizAper 0.929;
optionVar -floatValue cameraVertAper 0.618;
// maya unit
optionVar -sv "workingUnitLinear" "cm" ;
// maya version
about -f
// getenv "varName"
// load maya rc file
if ( `filetest -r $myScriptFile` ) eval( "source \""+$myScriptFile+"\";" );
optionVar -sv "ViewImageDir" "xn_view";
optionVar -sv "ViewSequenceDir" "djv_view";
optionVar -sv "ViewImageCmdFormat" "%f %s-%e";
optionVar -sv "ViewSequenceCmdFormat" "%f %s-%e";
===== Render related scripting =====
* quick tool to turn curve render-friendly
* http://www.ldaustinart.com/paul/index.php?cat=scripts&type=maya
====== Maya GUI scripting ======
===== Maya UI interaction =====
* layer panel //built-in functions
global proc layerEditorLayerButtonVisibilityChange(string $layer)
{
int $visible = `getAttr ($layer + ".visibility")`;
if (0 == $visible) $visible = true;
else $visible = false;
setAttr ($layer + ".visibility") $visible;
}
global proc layerEditorLayerButtonTypeChange(string $layer)
{
int $type = `getAttr ($layer + ".displayType")`;
if (0 == $type) $type = 1;
else if (1 == $type) $type = 2;
else $type = 0;
setAttr ($layer + ".displayType") $type;
}
global proc layerEditorLayerButtonRenderabilityChange(string $layer)
{
int $renderable = `getAttr ($layer + ".renderable")`;
if (0 == $renderable) $renderable = true;
else $renderable = false;
setAttr ($layer + ".renderable") $renderable;
}
===== basic UI elements =====
* elements
// button
button -l "Do It" -c "print \"do it\"";
// dash line for seperation
separator -style "in" -hr false;
separator -st "none";
//text
text -label "Default";
// shelf button
shelfButton
-visible 1
-l "tMat"
-c "select -r \"testMat\""
-dcc "HypershadeWindow"
-width 34
-commandRepeatable 1
-mi "Assign" ("hyperShade -assign testMat;")
-mi "shade" ("setAttr \"testMat.transparency\" -type double3 0 0 0 ;")
-mi "30" ("setAttr \"testMat.transparency\" -type double3 0.3 0.3 0.3 ;")
-mi "50" ("setAttr \"testMat.transparency\" -type double3 0.5 0.5 0.5 ;")
-mi "70" ("setAttr \"testMat.transparency\" -type double3 0.7 0.7 0.7 ;")
-mi "line" ("setAttr \"testMat.transparency\" -type double3 1 1 1 ;")
-mi "create" ("shadingNode -n \"testMat\" -as lambert")
-st "iconOnly"
-imageOverlayLabel "T"
-image1 "render_lambert.xpm"
;
//
* layout format
// row layout, side by side
rowColumnLayout -numberOfColumns 5;
// buttons here
setParent ..;
// grid layout, grid box like
gridLayout -numberOfColumns 3;
===== built-in UI manipulation =====
* maya window title
// list all ui window
lsUI -windows; // list all window uis
// query
window -q -title $gMainWindow
// check exist and delete
if (`window -ex outlinerPanel1Window`) deleteUI outlinerPanel1Window;else OutlinerWindow; // toggle outliner
// change
$window=$gMainWindow
string $newT="Autodesk Maya 2009 x64 Unlimited: untitled | cool";
window -edit -title $newT $window;
// hide title bar (true no UI by: press ctrl+space; then run this cmd)
window -e -titleBar (!`window -q -titleBar $gMainWindow`) $gMainWindow;
* get panel reference getPanel -visiblePanels;
* dialog confirmDialog -title "Confirm" -message "Are you sure?"
-button "Yes" -button "No" -defaultButton "Yes"
-cancelButton "No" -dismissString "No";
* prompt
string $text;
string $result = `promptDialog
-title "Command Window"
-message "Enter your cmd: (like ?)"
-text "default answer here"
-button "move" -button "rotate" -button "scale" -button "Cancel"
-defaultButton "OK" -cancelButton "Cancel"
-dismissString "Cancel"`;
if ($result == "move") {
$text = `promptDialog -query -text`;
eval("move -"+$text);
}
* simple window guistring $windowName = "Maya_Weight_Tool";
if(`window -ex $windowName`) deleteUI $windowName;
window -t $windowName -rtf 1 -s 0 -mxb 0 -wh 180 250 -ip $windowName;
//resize-to-fit, res-izable, max button -interactivePlacement
// layout:gridLayout -numberOfColumns 3; columnLayout -adjustableColumn 1 ;
// add gui elements
* float channel box
//ref: http://download.autodesk.com/us/maya/2010help/Commands/channelBox.html
window;
formLayout form;
channelBox dave;
formLayout -e
-af dave "top" 0
-af dave "left" 0
-af dave "right" 0
-af dave "bottom" 0
form;
showWindow;
// Color all attributes names, which have an attribute name
// beginning with "T", white (with a black background) for
// all current and future nodes.
// Then, color all attributes beginning with "A", which are
// contained in nodes that have their names beginning with "D", black.
channelBox -attrRegex "T*" -attrColor 1.0 1.0 1.0 -attrBgColor 0.0 0.0 0.0 "cb1";
channelBox -e -nodeRegex "*" -attrRegex "A*" -attrColor 0 0 0 "cb1";
* open project in Explore (windows, mac, linux detectable)
global proc shi_openProjectInExplorer()
{
// get the current project
string $projectRootPath = `workspace -q -rd`;
string $nativeProjectRootPath = toNativePath($projectRootPath);
string $systemCommand="";
if(`about -os` == "nt") $systemCommand = "explorer /e,"+$nativeProjectRootPath;
if(`about -os` == "linux64") $systemCommand = "konqueror "+$nativeProjectRootPath;
system ($systemCommand);
}
===== QT Gui for Maya 2011 and above =====
* basic mel and QT gui design and interact:
* http://www.creativecrash.com/tutorials/maya-mel-qt-and-you-interfacing-with-the-qt-designer
* more GUI elements interaction:
* http://www.creativecrash.com/maya/tutorials/scripting/mel/c/using-qt-designer-for-mel-interfaces
* Another QT in Maya design example
* http://www.attackack.com/maya-tool-pg1
* QT ui and Maya mel ui
{{graphic:qt_ui.jpg?300 |}}
^ QT ^ MEL ^
|1-push Button (under Buttons group) | button |
|2-radio button (under Buttons group) | radioButton|
|3-check box(under Buttons group) | checkBox|
|4-combo box (under containers group) | optionMenu|
|5-line edit (under input widgets group) | textField|
|6-spin box (under input widgets group) | |
|7-double spine box (under input widgets group)| |
|8-dial (under input widgets group) | |
|9-list view (under item views model based) | textScrollList|
|10-horizontal slider (under input widgets) | intSlider|
|11-label (under display widgets group) | text |
|12-progress bar (under display widgets group) | progressBar|
|13-vertical slider (under input widgets) | intSlider|
|14-horizontal line (under input widgets) | |
|15-vertical line (under input widgets) | |
|16-group box (under containers group) | |
|17-tab widget (under container group) | tabLayout|
|18-main window | window|
* other maya mel ui
* scrollfield (like textArea)
* make QT dockable string $layout1=`paneLayout -cn "single" -p $gMainWindow`;
dockControl -aa "all" -a "right" -fl off -con $layout1 -l "MainWindow";
control -e -p $layout1 $dialog;
====== DIY Plugin related melscript======
* load and unload plugin
loadPlugin "/user_data/ARCHIVE/dev/mayadev/pickExample.so";
unloadPlugin "/user_data/ARCHIVE/dev/mayadev/pickExample.so";
unloadPlugin hellow
hellow cool
hello "yes"
pickExample
====== Mel ScriptJob and ScriptNode ======
I came across this when I was developing a rig system that requires how-condition-scripting and embeded script function for a on-server maya file.
* ScriptJob: run a maya mel function when "a condition happens" like attribute change or thing selected. (like a "EventListener")
* ScriptNode: contains a piece of mel code inside a node called ScriptNode (accessible in Expression Editor); it runs when a "Maya Event happens", like file open/close, gui open/close.
Short difference is:
* ScriptJob is normally running through the your working time
* ScriptNode is running at initialize or end stage.
ScriptNode<----ScriptJob---->ScriptNode
====== Math in 3D ======
* get camera to target (object to object direction)
//Get camera's position:
vector $camPos = `camera -query -position $cameraName`;
//Get camera's target's position:
vector $camTarget = `camera -query -worldCenterOfInterest $cameraName`;
//Calculate direction:
vector $cameraDir = $camTarget - $camPos;
//Normalize direction:
vector $normalizedDir = unit ($cameraDir);
print ("Direction: " + $normalizedDir);
* vector2rot
// script for converting vector into worldspace rotations.
// adrian@kolektiv.com Jun 20/04
// AWGUA Maya Seminar August 2004
// Description: An essential script for converting velocity and up vectors into
// Euler rotations.
// NOTE: If you're using this for particle instancing, make sure to convert rotational
// values in degrees to radians *twice*, due to a little legacy bug. Like this:
// vector $direction = worldVelocity;
// vector $up = normalPP;
// float $rot[] = `vector2rot $direction $up`;
// float $rotX = deg_to_rad( deg_to_rad( $rot[0] ) );
// float $rotY = deg_to_rad( deg_to_rad( $rot[1] ) );
// float $rotZ = deg_to_rad( deg_to_rad( $rot[2] ) );
// Special thanks goes out to Steve Hwan for providing the guts, I just Maya-nized it.
////
// main proc
global proc float[] vector2rot( vector $direction, vector $up ) {
// normalize vectors first
$direction = unit( $direction );
$up = unit( $up );
// calculate the side vector
vector $sideVec = cross( $up, $direction );
vector $upVec = cross( $direction, $sideVec );
float $cosY = sqrt( ($sideVec.x)*($sideVec.x) + ($sideVec.y)*($sideVec.y) );
// solve each angle
float $rotZ = atan2( ($sideVec.y), ($sideVec.x) );
float $rotY = atan2( -($sideVec.z), ( (($sideVec.x)+($sideVec.y)) / (cos( $rotZ ) + sin( $rotZ ) ) ) );
float $rotX = atan2( ($upVec.z), ($direction.z) );
// convert to degrees
$rotX = rad_to_deg( $rotX );
$rotY = rad_to_deg( $rotY );
$rotZ = rad_to_deg( $rotZ );
// return x,y,z rotations
return { $rotX, $rotY, $rotZ };
} // vector2rot
====== Common mel function lib ======
===== display func=====
* outliner show
// toggle show hide of outliner
global proc tOutliner()
{
if ( `window -exists outlinerPanel1Window` )
deleteUI -window outlinerPanel1Window;
else
tearOffPanel "Outliner" "outlinerPanel" false;
}
* toggle wireframe
// toggle wireOnShade of cursor below window
global proc tWireOnShade()
{
global int $g_tWireOnShade=0;
if ($g_tWireOnShade != 1){
setWireframeOnShadedOption 1 `getPanel -underPointer`;
$g_tWireOnShade = 1;
}
else{
setWireframeOnShadedOption 0 `getPanel -underPointer`;
$g_tWireOnShade = 0;
}
}
===== general edit=====
* rename selected prompt
global proc gxRename()
{
string $text;
string $result = `promptDialog
-title "Super Rename Window"
-message "Enter new Name:"
-button "OK" -button "Cancel"
-defaultButton "OK" -cancelButton "Cancel"
-dismissString "Cancel"`;
if ($result == "OK") {
// query the entry typed by the user
$text = `promptDialog -query -text`;
string $selected[] = `ls -sl`;
rename $selected[0] $text;
//print("HELLO to "+ $text +"\n");
}
else {
//print("fine. I won't say hello then :(\n");
}
}
* move 2nd selected object to 1st selected object
global proc gxMove2()
{
string $attributeList[] = {"tx", "ty", "tz", "rx", "ry", "rz", "sx", "sy", "sz"};
string $sel[] = `ls -sl`;
string $attribute;
for($attribute in $attributeList) {
setAttr ($sel[1] + "." + $attribute) `getAttr ($sel[0] + "." + $attribute)`;
}
}
* create a layer from selected
global proc gxNewObjLayer()
{
// create a layer from selected object and use first object's name + "Lyr" as layer name
to be added later
}
* manual tune a channel value
global proc gxTune(string $ch,float $val){
string $selected[] = `ls -sl`;
float $old=`getAttr ($selected[0]+"."+$ch)`;
setAttr ($selected[0]+"."+$ch) ($old+$val);
}
button -l "+001" -c "gxTune(\"ry\",0.001)";
button -l "-001" -c "gxTune(\"ry\",-0.001)";
button -l "-002" -c "gxTune(\"ry\",-0.002)";
===== select func=====
* set face-edge-point select mode
global proc tSelectMode(int $curMode)
{
global int $g_tSelectMode=0;
if ($g_tSelectMode != $curMode){
if ($curMode == 1) {SelectVertexMask;}
if ($curMode == 2) {SelectEdgeMask;}
if ($curMode == 3) {SelectFacetMask;}
if ($curMode == 0) {SelectToggleMode;}
$g_tSelectMode = $curMode;
}
else{
SelectToggleMode;
$g_tSelectMode = 0;
}
}
====== Rigging related function ======
===== Mesh-Joint weight map store and restore =====
// vtx
$selVtx=`ls -sl -fl`;
$countVtx=size($selVtx);
print ("vtx :"+$countVtx);
// bones
string $selJnt[]=`ls -sl`;
$countJnt=size($selJnt);
print ("jnt :"+$countJnt);
print $selJnt;
// matrix
string $declare = ( "matrix $wmap[" + $countJnt + "][" + $countVtx + "];" );
eval $declare;
// joint based store data
for ( $i = 0; $i < $countJnt ; $i++ ) {
print ("now storing $selJnt["+$i+"] : "+$selJnt[$i]+"\n");
for ( $j = 0; $j < $countVtx ; $j++ ) {
$tmpW=`skinPercent -t $selJnt[$i] -q skinCluster1 $selVtx[$j]`;
string $declare = ( "$wmap[" + $i + "][" + $j + "]="+$tmpW+";" );
eval $declare;
}
print ("Finished storing $selJnt["+$i+"] : "+$selJnt[$i]+"\n");
}
// test query
skinPercent -t $selJnt[0] -q skinCluster1 $selVtx[0];
print $wmap[0][0];
// apply weight, name the targe joint as jointName+"new"
// skinPercent -tv joint1 0.2 skinCluster1 pPlane1.cv[100];
// vtx base re-assign
float $tmpWt;
$countJnt1=$countJnt-1;
// vtx base re-assign, manual turn off all the holding
for ( $i = 0; $i < $countJnt1 ; $i++ ){
print ("now apply for $selJnt["+$i+"] : "+$selJnt[$i]+"\n");
$newJnt=($selJnt[$i]+"new"); // new jnt naming convention
for ( $j = 0; $j < $countVtx ; $j++ ) {
string $declare = ( "$tmpWt=$wmap[" + $i + "][" + $j + "];" );
eval $declare;
skinPercent -tv $newJnt $tmpWt skinCluster1 $selVtx[$j];
}
print ("Finished for $selJnt["+$i+"] : "+$selJnt[$i]+"\n");
// hold it
setAttr ($newJnt+".liw") 1;
}
print $wmap;
// test query
skinPercent -t $selJnt[0] -q skinCluster1 $selVtx[0];
====== OS-System related function ======
===== open project folder in OS File Manager =====
// expanded based on http://oy-maya-scripts.googlecode.com
global proc shi_openProjectInExplorer()
{
// get the current project
string $projectRootPath = `workspace -q -rd`;
string $nativeProjectRootPath = toNativePath($projectRootPath);
string $systemCommand="";
if(`about -os` == "nt") string $systemCommand = "explorer /e,"+$nativeProjectRootPath;
if(`about -os` == "linux64") string $systemCommand = "konqueror "+$nativeProjectRootPath;
system ($systemCommand);
}
* for os detection in python
import os
if os.name == 'nt' :
maya = 'maya.exe'
else :
maya = 'maya.bin'
* get mel proc file and the arguments
global proc printMelArgs(string $procedure)
{
string $scriptFile = `whatIs $procedure`;
int $fileId = 0;
$scriptFile = substitute(".* found in: ", $scriptFile, "");
$fileId = fopen($scriptFile, "r");
print("Found " + $procedure + " in file " + $scriptFile + ".\n");
if($fileId)
{
while(!feof($fileId))
{
$currentLine = fgetline($fileId);
if(`match (".*proc.*" + $procedure) $currentLine` != "")
print ($currentLine);
}
fclose $fileId;
}
}
====== Custom UI creation function ======
===== custom menu creation =====
global proc myMenu()
{
global string $showMyMenuCtrl;
if (`menu -exists $showMyMenuCtrl`)
deleteUI $showMyMenuCtrl;
string $name = "My Menu";
global string $gMainWindow;
$showMyMenuCtrl = `menu -p $gMainWindow -to true -l $name`;
menuItem -p $showMyMenuCtrl -l "Alpha" -c ("source \"alpha.mel\"; ");
menuItem -p $showMyMenuCtrl -l "Bravo" -c ("source \"bravo.mel\"; ");
menuItem -p $showMyMenuCtrl -l "Charlie" -c ("source \"charlie.mel\"; ");
};
myMenu;
===== Custom HUD creation =====
* read this guide from Maya Help file: [[http://download.autodesk.com/us/maya/2009help/index.html?url=PC_Create_a_custom_headsup_display_readout.htm,topicNumber=d0e82090|link]]
====== GUI mel for my own use ======
^ toolbox | shiShelfTool | |
^ markingmenu | mm_Sel_filter |
^ menu | vip_item_menu |
===== shiShelfTool =====
A floating shelf with built-in functions and Realtime Strategy Game like Commanding icons.
===== mm_shi_sel_filter =====
menuItem
-label "shiSelectPoly"
-command "setObjectPickMask \"All\" 0;selectType -polymesh 1;\n"
-radialPosition "N"
menuEditorMenuItem2;
menuItem
-label "shiSelectLocator"
-command "setObjectPickMask \"All\" 0;selectType -locator 1\n"
-radialPosition "NE"
menuEditorMenuItem8;
menuItem
-label "shiSelectCluster"
-command "setObjectPickMask \"All\" 0;selectType -cluster 1;\n"
-radialPosition "E"
menuEditorMenuItem4;
menuItem
-label "shiSelectLattice"
-command "setObjectPickMask \"All\" 0;selectType -lattice 1;\n"
-radialPosition "SE"
menuEditorMenuItem6;
menuItem
-label "shiSelectCurve"
-command "setObjectPickMask \"All\" 0;setObjectPickMask \"Curve\" 1;\n"
-radialPosition "S"
menuEditorMenuItem3;
menuItem
-label "shiSelectIK"
-command "setObjectPickMask \"All\" 0;selectType -ikHandle 1;\n"
-radialPosition "SW"
menuEditorMenuItem7;
menuItem
-label "shiSelectJoint"
-command "setObjectPickMask \"All\" 0;setObjectPickMask \"Joint\" true;\n"
-radialPosition "W"
-enableCommandRepeat 1
menuEditorMenuItem5;
menuItem
-label "shiSelectDeformer"
-command "setObjectPickMask \"All\" 0;setObjectPickMask \"Deformer\" true;\n"
-radialPosition "NW"
menuEditorMenuItem9;
menuItem
-label "shiSelectLight"
-command "setObjectPickMask \"All\" 0;selectType -light 1;\n"
menuEditorMenuItem10;
menuItem
-label "shiSelectCam"
-command "setObjectPickMask \"All\" 0;selectType -camera 1;\n"
menuEditorMenuItem11;
menuItem
-divider 1
menuEditorMenuItem12;
menuItem
-label "shiSelectMaskAll"
-command "setObjectPickMask \"All\" 1;\n"
menuEditorMenuItem13;
menuItem
-label "shiLockSelection"
-command "updateLockSelectionIcon;"
menuEditorMenuItem14;
setParent -m ..;
====== scripts for my own use ======
^ material |color_bucket_gen |mm_paint_list |
^ modeling |common_create |cube_softify |
===== ref creation =====
// ref: http://xyz2.net/mel/mel.103.htm
// usage: it create refPlane01, and refMat01, and load ref01.png under ref/ folder
// refPlane
polyPlane -ax 0 0 1 -w 10 -h 10 -sx 2 -sy 2 -n "refPlane01";
move -a 0 0 -5;
//refMat;
string $myRefMat = `shadingNode -asShader lambert -name "refMat01"`;
string $mySG = `sets -renderable true -noSurfaceShader true -empty -name "refMatSG01"`;
connectAttr -f ( $myRefMat + ".outColor" ) ( $mySG + ".surfaceShader" );
string $myFileNode = `shadingNode -asTexture file -name "refFile01"`;
connectAttr -f ( $myFileNode + ".outColor" ) ( $myRefMat + ".color" );
string $filepath = "ref/ref01.png";
setAttr -type "string" ( $myFileNode + ".fileTextureName" ) $filepath;
select refPlane01;
hyperShade -assign refMat01;
/* // link map png transparency
connectAttr -force refFile01.outTransparency refMat01.transparency;
*/
===== color bucket button set (Setup+UI) =====
// color bucket - create preset materials
// (red,blue,green,grey,white,black,yellow)
/*
color bucket
*/
global proc ccMatSetup()
{
string $myNewColor = `shadingNode -asShader lambert -name "ccRed"`;
setAttr -type double3 ( $myNewColor + ".color" ) 1 0 0;
string $myNewColor = `shadingNode -asShader lambert -name "ccGreen"`;
setAttr -type double3 ( $myNewColor + ".color" ) 0 1 0;
string $myNewColor = `shadingNode -asShader lambert -name "ccBlue"`;
setAttr -type double3 ( $myNewColor + ".color" ) 0 0 1;
string $myNewColor = `shadingNode -asShader lambert -name "ccWhite"`;
setAttr -type double3 ( $myNewColor + ".color" ) 1 1 1;
string $myNewColor = `shadingNode -asShader lambert -name "ccGrey"`;
setAttr -type double3 ( $myNewColor + ".color" ) 0.5 0.5 0.5;
string $myNewColor = `shadingNode -asShader lambert -name "ccBlack"`;
setAttr -type double3 ( $myNewColor + ".color" ) 0 0 0;
string $myNewColor = `shadingNode -asShader lambert -name "ccYellow"`;
setAttr -type double3 ( $myNewColor + ".color" ) 1 1 0;
}
/* please put this shelf button in your fav UI
shelfButton
-label "ccMat"
-imageOverlayLabel "ccMat"
-image "render_rampShader.xpm"
-image1 "render_rampShader.xpm"
-style "iconOnly"
-command "HypershadeWindow"
-mi "ccRed" ("hyperShade -assign ccRed;")
-mi "ccGreen" ("hyperShade -assign ccGreen;")
-mi "ccBlue" ("hyperShade -assign ccBlue;")
-mi "ccWhite" ("hyperShade -assign ccWhite;")
-mi "ccGrey" ("hyperShade -assign ccGrey;")
-mi "ccBlack" ("hyperShade -assign ccBlack;")
-mi "ccYellow" ("hyperShade -assign ccYellow;")
-mi "-----------" ("")
-mi "-----------" ("")
-mi "ccMatSetup" ("ccMatSetup")
-sourceType "mel"
-commandRepeatable 1
;
*/
/* setup guide - total manual way in hotkey editor
// yourMM_press
if (`popupMenu -exists tempMM`) { deleteUI tempMM; }
popupMenu -button 1 -ctl false -alt false -allowOptionBoxes true -parent viewPanes -mm 1 tempMM;
source "mm_shi_cc_assign.mel"; // only to change this
// yourMM_release
if (`popupMenu -exists tempMM`) { deleteUI tempMM; }
*/
menuItem -label "ccRed" -command "hyperShade -assign ccRed;" mmCCAmi_red;
menuItem -label "ccGreen" -command "hyperShade -assign ccGreen;" mmCCAmi_green;
menuItem -label "ccBlue" -command "hyperShade -assign ccBlue;" mmCCAmi_blue;
menuItem -label "ccWhite" -command "hyperShade -assign ccWhite;" mmCCAmi_white;
menuItem -label "ccGrey" -command "hyperShade -assign ccGrey;" mmCCAmi_grey;
menuItem -label "ccBlack" -command "hyperShade -assign ccBlack;" mmCCAmi_black;
menuItem -label "ccYellow" -command "hyperShade -assign ccYellow;" mmCCAmi_yellow;
menuItem -label "---------" -command "" mmCCAmi_dash;
menuItem -label "ccMatSetup" -command "ccMatSetup" mmCCAmi_ccMatSetup;
setParent -m ..;
===== Play with Cube =====
// title: random cube generator v0.1a
// usage: create random shaped cube
for($i=0;$i<10;$i++){
int $tmpVary=6;
int $tmpSize=10;
polyCube -w $tmpSize -h $tmpSize -d $tmpSize -cuv 4;
string $selected[]=`ls -sl`;
$tmpCube=$selected[0];
//move -5 -5 -5 ($tmpCube+".scalePivot") ($tmpCube+".rotatePivot") ;
move (50) (0+15*$i) 0;
$tmpP1=floor(rand(0,2));
$tmpP2=floor(rand(3,5));
$tmpP3=floor(rand(6,7));
select -r $tmpCube.vtx[$tmpP1] ;
move -r (rand($tmpVary)) (rand($tmpVary)) (rand($tmpVary));
select -r $tmpCube.vtx[$tmpP2] ;
move -r (rand($tmpVary)) (rand($tmpVary)) (rand($tmpVary));
select -r $tmpCube.vtx[$tmpP3] ;
move -r (rand($tmpVary)) (rand($tmpVary)) (rand($tmpVary));
}
select -cl;
// selected cubic soft edge script - v0.1
// shining 2011 mar
// able to handle multi cube selection, no cube as tmpCube
string $selected[] = `ls -sl`;
for ($selectedItem in $selected) { //loop 1 starts
rename $selectedItem "tmpCube" ;
// find rough size
$tmpSizeValue=`polyEvaluate -boundingBox tmpCube`;
float $tmpSizeValueX = ($tmpSizeValue[1]-$tmpSizeValue[0]);
float $tmpSizeValueY = ($tmpSizeValue[3]-$tmpSizeValue[2]);
float $tmpSizeValueZ = ($tmpSizeValue[5]-$tmpSizeValue[4]);
float $tmpCubeValue=0.1*min($tmpSizeValueX,min($tmpSizeValueY,$tmpSizeValueZ));
// scale in cube
move -r 0 ($tmpCubeValue) 0 tmpCube.vtx[0:1] tmpCube.vtx[6:7];
move -r 0 (-1*$tmpCubeValue) 0 tmpCube.vtx[2:5];
move -r 0 0 (-1*$tmpCubeValue) tmpCube.vtx[0:3];
move -r 0 0 ($tmpCubeValue) tmpCube.vtx[4:7];
move -r (-1*$tmpCubeValue) 0 0 tmpCube.vtx[1] tmpCube.vtx[3] tmpCube.vtx[5] tmpCube.vtx[7];
move -r ($tmpCubeValue) 0 0 tmpCube.vtx[0] tmpCube.vtx[2] tmpCube.vtx[4] tmpCube.vtx[6];
// extrube back cube
polyExtrudeFacet -constructionHistory 1 -keepFacesTogether 1 -divisions 1 -twist 0 -taper 1 -off 0 -lt 0 0 ($tmpCubeValue) -smoothingAngle 30 tmpCube.f[0] tmpCube.f[2];
polyExtrudeFacet -constructionHistory 1 -keepFacesTogether 1 -divisions 1 -twist 0 -taper 1 -off 0 -lt 0 0 ($tmpCubeValue) -smoothingAngle 30 tmpCube.f[4] tmpCube.f[5] tmpCube.f[7] tmpCube.f[9] tmpCube.f[11] tmpCube.f[13];
polyExtrudeFacet -constructionHistory 1 -keepFacesTogether 1 -divisions 1 -twist 0 -taper 1 -off 0 -lt 0 0 ($tmpCubeValue) -smoothingAngle 30 tmpCube.f[1] tmpCube.f[3] tmpCube.f[6] tmpCube.f[8] tmpCube.f[10] tmpCube.f[12] tmpCube.f[14:16] tmpCube.f[18:19] tmpCube.f[21:24] tmpCube.f[26:27] tmpCube.f[29];
polySmooth -mth 0 -dv 1 -c 1 -kb 1 -ksb 1 -khe 0 -kt 1 -kmb 1 -suv 1 -peh 0 -sl 1 -dpe 1 -ps 0.1 -ro 1 -ch 1 tmpCube;
polyDelEdge -cv true -ch 1 tmpCube.e[216:240] tmpCube.e[242] tmpCube.e[244] tmpCube.e[246] tmpCube.e[248] tmpCube.e[250] tmpCube.e[252] tmpCube.e[254] tmpCube.e[256] tmpCube.e[258] tmpCube.e[260] tmpCube.e[262] tmpCube.e[264] tmpCube.e[266] tmpCube.e[268] tmpCube.e[270] tmpCube.e[272] tmpCube.e[274] tmpCube.e[276] tmpCube.e[278] tmpCube.e[284] tmpCube.e[286] tmpCube.e[296] tmpCube.e[298] tmpCube.e[304] tmpCube.e[306] tmpCube.e[308] tmpCube.e[310] tmpCube.e[316] tmpCube.e[318] tmpCube.e[328] tmpCube.e[330] tmpCube.e[336] tmpCube.e[338] tmpCube.e[340] tmpCube.e[342] tmpCube.e[344] tmpCube.e[346] tmpCube.e[364] tmpCube.e[366] tmpCube.e[384] tmpCube.e[386] tmpCube.e[388] tmpCube.e[390] tmpCube.e[392] tmpCube.e[394] tmpCube.e[412] tmpCube.e[414];
rename tmpCube $selectedItem ;
}
//loop 1 ends
====== Portable hotkey ======
Mel hotkey initialize sequence
- userRunTimeCommands.mel (defining **a mel script** into alisa name)
- userNamedCommands.mel (give a link name to each alias command)
- userHotkeys.mel (assign keystroke to each link)
** Runtime command vs Name command**
* runtime command is more like "alias" in bash or "doskey" in dos, simply a one word short command for a multi-line commands
* if you use functions most, then you can ignore the alias
* runtime command is used for hokey editor registration,
* name command is more and enough for working with hotkey assigning, if you call from hotkey, you need a name command
===== Example of NameCommand-only way of shortcut =====
require "shi_fun.mel" load first for my personal cmds;
//-----------------------modeling
nameCommand -ann "NC_shiToggleMode_1" -c ("shiToggleMode(1)") NC_shiToggleMode_1;
hotkey -k "1" -ctl -n ("NC_shiToggleMode_1");
nameCommand -ann "NC_shiToggleMode_2" -c ("shiToggleMode(2)") NC_shiToggleMode_2;
hotkey -k "2" -ctl -n ("NC_shiToggleMode_2");
nameCommand -ann "NC_shiToggleMode_3" -c ("shiToggleMode(3)") NC_shiToggleMode_3;
hotkey -k "3" -ctl -n ("NC_shiToggleMode_3");
//------------------------ view port
nameCommand -ann "NC_view_tWireframe" -c ("shiToggleWireOnShade") NC_view_tWireframe;
hotkey -k "f" -ctl -alt -n ("NC_view_tWireframe");
//------------------------ windows
// outliner
nameCommand -ann "NC_win_outliner" -c ("if (`window -ex outlinerPanel1Window`) deleteUI outlinerPanel1Window;else OutlinerWindow;") NC_win_outliner;
hotkey -k "4" -ctl -n ("NC_win_outliner");
// script editor
nameCommand -ann "NC_win_scriptEditor" -c ("if (`window -ex scriptEditorPanel1Window`) deleteUI scriptEditorPanel1Window;else ScriptEditor;") NC_win_scriptEditor;
hotkey -k "x" -ctl -alt -n ("NC_win_scriptEditor");
// hyperShade
nameCommand -ann "NC_win_hyperShade" -c ("if (`window -ex hyperShadePanel1Window`) deleteUI hyperShadePanel1Window;else HypershadeWindow") NC_win_hyperShade;
hotkey -k "s" -ctl -alt -n ("NC_win_hyperShade");
// graph editor
nameCommand -ann "NC_win_graphEditor" -c ("if (`window -ex graphEditor1Window`) deleteUI graphEditor1Window;else GraphEditor") NC_win_graphEditor;
hotkey -k "g" -ctl -alt -n ("NC_win_graphEditor");
//------------------------ redo
nameCommand -ann "NC_fun01" -c ("fun01") NC_fun01;
hotkey -k "d" -ctl -alt -n ("NC_fun01");
===== Example of RunTimeCommand NameCommand way of shortcut =====
require "shi_fun.mel" load first for my personal cmds;
===== runtime cmd =====
//Maya Preference 2010 (Release 1)
//
//
runTimeCommand
-annotation ""
-category "User"
-commandLanguage "mel"
-command ("string $currentPanel = `getPanel -up`;\nstring $camera = `modelPanel -q -camera $currentPanel`;\nfloat $horizontalFilmOffset = `getAttr ($camera + \".horizontalFilmOffset\")`;\nsetAttr ($camera + \".horizontalFilmOffset\") ($horizontalFilmOffset + 0.02) ;\nprint ($camera +\".horizontalFilmOffset = \" + ($horizontalFilmOffset + 0.02) + \"\\n\"); ")
camRight;
runTimeCommand
-annotation ""
-category "User"
-commandLanguage "mel"
-command ("string $currentPanel = `getPanel -up`;\nstring $camera = `modelPanel -q -camera $currentPanel`;\nfloat $horizontalFilmOffset = `getAttr ($camera + \".horizontalFilmOffset\")`;\nsetAttr ($camera + \".horizontalFilmOffset\") ($horizontalFilmOffset - 0.02) ;\nprint ($camera +\".horizontalFilmOffset = \" + ($horizontalFilmOffset - 0.02) + \"\\n\"); ")
camLeft;
runTimeCommand
-annotation ""
-category "User"
-commandLanguage "mel"
-command ("string $currentPanel = `getPanel -up`;\nstring $camera = `modelPanel -q -camera $currentPanel`;\nfloat $verticalFilmOffset = `getAttr ($camera + \".verticalFilmOffset\")`;\nsetAttr ($camera+ \".verticalFilmOffset\") ($verticalFilmOffset + 0.02) ;\nprint ($camera + \".verticalFilmOffset = \" +($verticalFilmOffset + 0.02 ) + \"\\n\"); ")
camUp;
runTimeCommand
-annotation ""
-category "User"
-commandLanguage "mel"
-command ("string $currentPanel = `getPanel -up`;\nstring $camera = `modelPanel -q -camera $currentPanel`;\nfloat $verticalFilmOffset = `getAttr ($camera + \".verticalFilmOffset\")`;\nsetAttr ($camera+ \".verticalFilmOffset\") ($verticalFilmOffset - 0.02) ;\nprint ($camera + \".verticalFilmOffset = \" +($verticalFilmOffset - 0.02) + \"\\n\"); ")
camDown;
runTimeCommand
-annotation ""
-category "User"
-commandLanguage "mel"
-command ("string $currentPanel = `getPanel -up`;\nstring $camera = `modelPanel -q -camera $currentPanel`;\nsetAttr ($camera + \".verticalFilmOffset\") 0.0;\nsetAttr ($camera +\".horizontalFilmOffset\") 0.0;\nsetAttr ($camera + \".overscan\") 1.0 ; ")
camHome;
runTimeCommand
-annotation ""
-category "User"
-commandLanguage "mel"
-command ("string $currentPanel = `getPanel -up`;\nstring $camera = `modelPanel -q -camera $currentPanel`; float $overscan =\n`getAttr ($camera + \".overscan\")`; setAttr ($camera + \".overscan\")\n($overscan - 0.1) ; print ($camera + \".overscan = \" + ($overscan - 0.1) +\n\"\\n\");\n")
camIn;
runTimeCommand
-annotation ""
-category "User"
-commandLanguage "mel"
-command ("string $currentPanel = `getPanel -up`;\nstring $camera = `modelPanel -q -camera $currentPanel`; float $overscan =\n`getAttr ($camera + \".overscan\")`; setAttr ($camera + \".overscan\")\n($overscan + 0.1) ; print ($camera + \".overscan = \" + ($overscan + 0.1) +\n\"\\n\"); ")
camOut;
runTimeCommand
-annotation ""
-category "User"
-commandLanguage "mel"
-command ("shiRename")
shiRenameCmd;
runTimeCommand
-annotation ""
-category "User"
-commandLanguage "mel"
-command ("srcTool")
myToolWindow;
runTimeCommand
-annotation ""
-category "User"
-commandLanguage "mel"
-command ("GraphEditor")
winGraphEditor;
runTimeCommand
-annotation ""
-category "User"
-commandLanguage "mel"
-command ("HotkeyPreferencesWindow;")
winHotkeyEditor;
runTimeCommand
-annotation ""
-category "User"
-commandLanguage "mel"
-command ("HypershadeWindow;")
winHyperShade;
runTimeCommand
-annotation ""
-category "User"
-commandLanguage "mel"
-command ("shiToggleWireOnShade")
act_toggle_wire_on_shade;
runTimeCommand
-annotation ""
-category "User"
-commandLanguage "mel"
-command ("OutlinerWindow;")
winOutliner;
runTimeCommand
-annotation ""
-category "User"
-commandLanguage "mel"
-command ("ScriptEditor;")
winScriptEditor;
runTimeCommand
-annotation ""
-category "User"
-commandLanguage "mel"
-command ("srcShelf")
win_shiShelfTool;
runTimeCommand
-annotation ""
-category "User"
-commandLanguage "mel"
-command ("dnMePan")
cam_PanTool;
runTimeCommand
-annotation ""
-category "User"
-commandLanguage "mel"
-command ("OutlinerWindow")
win_outliner;
runTimeCommand
-annotation ""
-category "User"
-commandLanguage "mel"
-command ("shiToggleMode(1)")
fun_shiToggleMode_1;
runTimeCommand
-annotation ""
-category "User"
-commandLanguage "mel"
-command ("shiToggleMode(2)")
fun_shiToggleMode_2;
runTimeCommand
-annotation ""
-category "User"
-commandLanguage "mel"
-command ("shiToggleMode(3)")
fun_shiToggleMode_3;
===== name cmd =====
//Maya Preference 2010 (Release 1)
//
//
nameCommand
-annotation "camRightNameCommand"
-sourceType "mel"
-command ("camRight")
camRightNameCommand;
nameCommand
-annotation "camLeftNameCommand"
-sourceType "mel"
-command ("camLeft")
camLeftNameCommand;
nameCommand
-annotation "camUpNameCommand"
-sourceType "mel"
-command ("camUp")
camUpNameCommand;
nameCommand
-annotation "camDownNameCommand"
-sourceType "mel"
-command ("camDown")
camDownNameCommand;
nameCommand
-annotation "camHomeNameCommand"
-sourceType "mel"
-command ("camHome")
camHomeNameCommand;
nameCommand
-annotation "camInNameCommand"
-sourceType "mel"
-command ("camIn")
camInNameCommand;
nameCommand
-annotation "camOutNameCommand"
-sourceType "mel"
-command ("camOut")
camOutNameCommand;
nameCommand
-annotation "shiRenameCmdNameCommand"
-sourceType "mel"
-command ("shiRenameCmd")
shiRenameCmdNameCommand;
nameCommand
-annotation "myToolWindowNameCommand"
-sourceType "mel"
-command ("myToolWindow")
myToolWindowNameCommand;
nameCommand
-annotation "winGraphEditorNameCommand"
-sourceType "mel"
-command ("winGraphEditor")
winGraphEditorNameCommand;
nameCommand
-annotation "winHotkeyEditorNameCommand"
-sourceType "mel"
-command ("winHotkeyEditor")
winHotkeyEditorNameCommand;
nameCommand
-annotation "winHyperShadeNameCommand"
-sourceType "mel"
-command ("winHyperShade")
winHyperShadeNameCommand;
nameCommand
-annotation "act_toggle_wire_on_shadeNameCommand"
-sourceType "mel"
-command ("act_toggle_wire_on_shade")
act_toggle_wire_on_shadeNameCommand;
nameCommand
-annotation "winOutlinerNameCommand"
-sourceType "mel"
-command ("winOutliner")
winOutlinerNameCommand;
nameCommand
-annotation "winScriptEditorNameCommand"
-sourceType "mel"
-command ("winScriptEditor")
winScriptEditorNameCommand;
nameCommand
-annotation "win_shiShelfToolNameCommand"
-sourceType "mel"
-command ("win_shiShelfTool")
win_shiShelfToolNameCommand;
nameCommand
-annotation "cam_PanToolNameCommand"
-sourceType "mel"
-command ("cam_PanTool")
cam_PanToolNameCommand;
nameCommand
-annotation "win_outlinerNameCommand"
-sourceType "mel"
-command ("win_outliner")
win_outlinerNameCommand;
nameCommand
-annotation "fun_shiToggleMode_1NameCommand"
-sourceType "mel"
-command ("fun_shiToggleMode_1")
fun_shiToggleMode_1NameCommand;
nameCommand
-annotation "fun_shiToggleMode_2NameCommand"
-sourceType "mel"
-command ("fun_shiToggleMode_2")
fun_shiToggleMode_2NameCommand;
nameCommand
-annotation "fun_shiToggleMode_3NameCommand"
-sourceType "mel"
-command ("fun_shiToggleMode_3")
fun_shiToggleMode_3NameCommand;
===== hotkey binding =====
//Maya Preference 2010 (Release 1)
//
//
hotkey -keyShortcut "e" -ctl -name ("cam_PanToolNameCommand");
hotkey -keyShortcut "4" -ctl -name ("win_outlinerNameCommand");
hotkey -keyShortcut "1" -ctl -name ("fun_shiToggleMode_1NameCommand");
hotkey -keyShortcut "2" -ctl -name ("fun_shiToggleMode_2NameCommand");
hotkey -keyShortcut "3" -ctl -name ("fun_shiToggleMode_3NameCommand");
hotkey -keyShortcut "Right" -ctl -name ("camRightNameCommand");
hotkey -keyShortcut "Left" -ctl -name ("camLeftNameCommand");
hotkey -keyShortcut "Up" -ctl -name ("camUpNameCommand");
hotkey -keyShortcut "Down" -ctl -name ("camDownNameCommand");
hotkey -keyShortcut "Home" -name ("camHomeNameCommand");
hotkey -keyShortcut "Page_Up" -name ("camInNameCommand");
hotkey -keyShortcut "Page_Down" -name ("camOutNameCommand");
hotkey -keyShortcut "r" -ctl -name ("shiRenameCmdNameCommand");
hotkey -keyShortcut "w" -ctl -alt -name ("myToolWindowNameCommand");
hotkey -keyShortcut "r" -ctl -alt -name ("win_shiShelfToolNameCommand");
hotkey -keyShortcut "g" -ctl -alt -name ("winGraphEditorNameCommand");
hotkey -keyShortcut "h" -ctl -alt -name ("winHotkeyEditorNameCommand");
hotkey -keyShortcut "s" -ctl -alt -name ("winHyperShadeNameCommand");
hotkey -keyShortcut "x" -ctl -alt -name ("winHotkeyEditorNameCommand");
hotkey -keyShortcut "a" -ctl -alt -name ("winScriptEditorNameCommand");
hotkey -keyShortcut "f" -ctl -alt -name ("act_toggle_wire_on_shadeNameCommand");