Basic Structure
Booleans
Operation Result Notes
x or y -- if x is false, then y, else x
x and y -- if x is false, then x, else y
not x -- if x is false, then True, else False
"not" has a lower priority than non-Boolean operators, so not a == b is interpreted as not (a == b), and a == not b is a syntax error.
def toggleVisibility(obj):
cmds.setAttr (obj+'.visibility',
not cmds.getAttr (obj+'.visibility'))
toggleVisibility('pCube1')
(Jacob Borsting)
If/Else
Mel version
if ($blah == 1)
{
//do something
}
else if ($blah == 2)
{
//do something else
}
else
{
//last thing
}
Python version
if blah == 1:
#do something
elif blah == 2:
#do something else
else:
#last thing
what about an empty if or else?
if (i don't want anything to happen):
pass
else:
#do something
How do I check if an object exists?
if mc.objExists('myObject'):
print 'your object already exists!'
else:
#make myObject
Between two values
(from Stack Overflow)
if 78 <= grade <= 89: pass
For Loop
MEL Version
for ($s in $sel)
Python Version
for s in sel:
Mel Version
int $i;
for ($i = 0; $i < 4; i++)
Python Version
for i in range(4):
>>> range(-10, -100, -30)[-10, -40, -70]
In the above range case, the range betw. -10 and -100 is being evaluated by an increment of -30 (python.org)
While
Try/Except
It is possible to write programs that handle selected exceptions. Look at the following example, which asks the user for input until a valid integer has been entered, but allows the user to interrupt the program (using Control-C or whatever the operating system supports); note that a user-generated interruption is signalled by raising the KeyboardInterrupt exception.
>>> while True:... try:... x = int(raw_input("Please enter a number: "))... break... except ValueError:... print "Oops! That was no valid number. Try again..."...
The try statement works as follows.
First, the try clause (the statement(s) between the try and except keywords) is executed.
If no exception occurs, the except clause is skipped and execution of the try statement is finished.
If an exception occurs during execution of the try clause, the rest of the clause is skipped. Then if its type matches the exception named after the except keyword, the except clause is executed, and then execution continues after the try statement.
If an exception occurs which does not match the exception named in the except clause, it is passed on to outer try statements; if no handler is found, it is an unhandled exception and execution stops with a message as shown above.
(python.org)
Pass
The pass statement does nothing. It can be used when a statement is required syntactically but the program requires no action.
(python.org)
Break/Continue
The break statement, like in C, breaks out of the smallest enclosing for or while loop.
The continue statement, also borrowed from C, continues with the next iteration of the loop.
Loop statements may have an else clause; it is executed when the loop terminates through exhaustion of the list (with for) or when the condition becomes false (with while), but not when the loop is terminated by a break statement. This is exemplified by the following loop, which searches for prime numbers:
>>> for n in range(2, 10):... for x in range(2, n):... if n % x == 0:... print n, 'equals', x, '*', n/x... break... else:... # loop fell through without finding a factor... print n, 'is a prime number'...2 is a prime number3 is a prime number4 equals 2 * 25 is a prime number6 equals 2 * 37 is a prime number8 equals 2 * 49 equals 3 * 3
(from python.org)
Eval
Great post on Python eval vs. mel eval by Ryan Trowbridge
With
Understanding Python with (Fredrik Lundh)
def clickButton(value):
print "Value", value
import pymel.core as pm
with pm.window():
with pm.rowColumnLayout():
pm.button(label="First button", c=pm.Callback(clickButton, "klicked"))
Here you can see how the with statement works. And additionaly you can use the Callback() class to simplify the calling of callbacks. Really cool and much more efficient then in mel.
(haggi)
Decorators
Simple Decorator Example (Chris Evans)
Simple Math
Division
Dividing using a normal backslash will return a whole integer.
Therefore 4/2 will be 2, but 1/3 = 0!
To get a decimal number, put a point after one or both of the numbers in the division:
1./3 = 0.333333333
8./3. = 2.666666667
Rand
What is the equivalent of MEL rand in Python?
In MEL I can execute this:
float $randomize = rand(0,100);
print $randomize
In python I can execute this:
import random as rand
randomize = rand.uniform(0,100)
print randomize
(from cgtalk)
or, likesay,
random.randint(a, b) (but this only returns integers! :( )
random.uniform(a, b) (this returns float vals ^ - ^ )
raw_input
teste = raw_input('group name:' )
cmds.group(em=True,name=teste)
How to generate the same function using cmds.textField in a window?
Thanks to anyone who can help.
Michiel Duvekot <mduvekot@gmail.com> Dec 04 06:39PM -0800 ^
import maya.cmds as cmds
def doIt():
cmds.group(em=True,name=(cmds.textField('userInput', q=True,
tx=True)))
cmds.window()
cmds.columnLayout(adj=True)
cmds.textField('userInput')
cmds.button(l='group', c='doIt()')
cmds.showWindow()
Defining Empty Variables
myString = ''
myList = []
myInt = 0
5.1. Truth Value Testing
Any object can be tested for truth value, for use in an if or while condition or as operand of the Boolean operations below. The following values are considered false:
None
False
zero of any numeric type, for example, 0, 0L, 0.0, 0j.
any empty sequence, for example, '', (), [].
any empty mapping, for example, {}.
instances of user-defined classes, if the class defines a __nonzero__() or __len__() method, when that method returns the integer zero or bool value False. [1]
All other values are considered true — so objects of many types are always true.
Operations and built-in functions that have a Boolean result always return 0 or False for false and 1 or True for true, unless otherwise stated. (Important exception: the Boolean operations or and and always return one of their operands.)
(from python.org)