<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3870624054528827727</id><updated>2012-02-16T18:46:13.665-08:00</updated><title type='text'>cgtd*</title><subtitle type='html'>all of the trials non of the errors</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://cgtd.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://cgtd.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Paul Sultan</name><uri>http://www.blogger.com/profile/01859669861208266768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>19</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3870624054528827727.post-7452860548595734483</id><published>2011-03-16T07:04:00.000-07:00</published><updated>2011-04-22T15:38:33.056-07:00</updated><title type='text'>Maya wxWindow</title><content type='html'>This a a template to create interactive wxWindows in Maya.  The same UI can be ported to most applications using a python interpreter by only changing the makeCube method.  However, not all software and/or versions fully support wxWidgets.  The key difference you'll want to remember between a standard window and one from Maya is to omit initializing wx.app.MainLoop().&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;import wx&lt;br /&gt;import maya.cmds as cmds&lt;br /&gt;&lt;br /&gt;def getApp(kill = None):&lt;br /&gt; if kill:&lt;br /&gt;  if MyFrame.instance:&lt;br /&gt;   MyFrame.instance.Hide()&lt;br /&gt;   MyFrame.instance.Destroy()&lt;br /&gt;   MyFrame.instance = None&lt;br /&gt; else:&lt;br /&gt;  if MyFrame.instance:&lt;br /&gt;   MyFrame.instance.Show()&lt;br /&gt;  else:&lt;br /&gt;   MyFrame.create()&lt;br /&gt; &lt;br /&gt;class MyFrame(wx.Frame):&lt;br /&gt; instance = None&lt;br /&gt; &lt;br /&gt; @classmethod&lt;br /&gt; def create( cls, *args, **kw ):&lt;br /&gt;  app = wx.GetApp()&lt;br /&gt;&lt;br /&gt;  if app is None:&lt;br /&gt;   app = wx.App( redirect = False )&lt;br /&gt;  &lt;br /&gt;  frame = cls( None, app, *args, **kw )&lt;br /&gt;  frame.Show(True)&lt;br /&gt; &lt;br /&gt; def __init__(self, parent, app):&lt;br /&gt;  MyFrame.instance = self&lt;br /&gt;  wx.Frame.__init__(self, parent, wx.ID_ANY, "MyFrame", wx.DefaultPosition, wx.Size(500,500), wx.DEFAULT_FRAME_STYLE )&lt;br /&gt;  &lt;br /&gt;  self.panel = wx.Panel(self, -1)&lt;br /&gt;  self.sphereButton = wx.Button(self.panel, -1, "Sphere")&lt;br /&gt;  self.cubeButton = wx.Button(self.panel, -1, "Cube")&lt;br /&gt;   &lt;br /&gt;  self.Bind( wx.EVT_ICONIZE, self.OnMinimize )&lt;br /&gt;  self.Bind( wx.EVT_CLOSE, self.OnClose )&lt;br /&gt;  self.sphereButton.Bind(wx.EVT_BUTTON, self.makeSphere)&lt;br /&gt;  self.cubeButton.Bind(wx.EVT_BUTTON, self.makeCube)&lt;br /&gt;  &lt;br /&gt;  mainSizer = wx.BoxSizer(wx.VERTICAL)&lt;br /&gt;  panelSizer = wx.BoxSizer(wx.HORIZONTAL)&lt;br /&gt;  &lt;br /&gt;  panelSizer.Add(self.sphereButton, 0, 0, 0)&lt;br /&gt;  panelSizer.Add(self.cubeButton, 0, 0, 0)&lt;br /&gt;  self.panel.SetSizer(panelSizer)&lt;br /&gt;  mainSizer.Add(self.panel, 1, wx.EXPAND, 0)&lt;br /&gt;  &lt;br /&gt;  self.SetSizer(mainSizer)&lt;br /&gt;  mainSizer.Fit(self)&lt;br /&gt;  self.Layout()&lt;br /&gt; &lt;br /&gt; def makeSphere(self, evt):&lt;br /&gt;  cmds.polySphere()&lt;br /&gt;  &lt;br /&gt; def makeCube(self, evt):&lt;br /&gt;  cmds.polyCube()&lt;br /&gt; &lt;br /&gt; def OnClose(self,event):&lt;br /&gt;  self.Show(False)&lt;br /&gt;&lt;br /&gt; def OnMinimize(self, event):&lt;br /&gt;  self.Show(0);&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3870624054528827727-7452860548595734483?l=cgtd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/7452860548595734483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/7452860548595734483'/><link rel='alternate' type='text/html' href='http://cgtd.blogspot.com/2011/03/maya-wxwindow.html' title='Maya wxWindow'/><author><name>Paul Sultan</name><uri>http://www.blogger.com/profile/01859669861208266768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3870624054528827727.post-5884827738586295213</id><published>2011-03-16T07:02:00.000-07:00</published><updated>2011-04-17T13:15:59.821-07:00</updated><title type='text'>XSI Plugin</title><content type='html'>Creating XSI plugins in python is extremely easy.  This file will add a new menu and menuItem to the main toolbar.  You can actually attach a menuItem to many other XSI widgets besides the main toolbar using the RegisterMenu command.  Like most UI elements, they are not initialized until they are called the first time.&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;import win32com.client&lt;br /&gt;from win32com.client import constants&lt;br /&gt;&lt;br /&gt;def XSILoadPlugin( in_reg ):&lt;br /&gt; in_reg.Author = ""&lt;br /&gt; in_reg.Name = "myPlugin"&lt;br /&gt; in_reg.Email = ""&lt;br /&gt; in_reg.URL = ""&lt;br /&gt; in_reg.Major = 1&lt;br /&gt; in_reg.Minor = 0&lt;br /&gt; print in_reg.Name, "has been loaded."&lt;br /&gt; &lt;br /&gt; in_reg.RegisterMenu(constants.siMenuMainTopLevelID,"MenuTitle",0,0)&lt;br /&gt; in_reg.RegisterCommand("MenuItem","MenuItem") #command, scriptname&lt;br /&gt; return 1&lt;br /&gt;&lt;br /&gt;def XSIUnloadPlugin( in_reg ):&lt;br /&gt; print in_reg.Name, "has been unloaded."&lt;br /&gt; return 1&lt;br /&gt;&lt;br /&gt;def MenuTitle_Init( in_ctxt ):&lt;br /&gt; oMenu = in_ctxt.Source&lt;br /&gt; oMenu.AddCommandItem("MenuItem","MenuItem") #menuname, command&lt;br /&gt; return 1&lt;br /&gt;&lt;br /&gt;def MenuItem_Init( in_ctxt ):&lt;br /&gt; oCmd = in_ctxt.Source&lt;br /&gt; oCmd.Description = ""&lt;br /&gt; oCmd.ReturnValue = 1&lt;br /&gt; return 1&lt;br /&gt;&lt;br /&gt;def MenuItem_Execute(  ):&lt;br /&gt; print "Command to Run"&lt;br /&gt; return 1&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3870624054528827727-5884827738586295213?l=cgtd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/5884827738586295213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/5884827738586295213'/><link rel='alternate' type='text/html' href='http://cgtd.blogspot.com/2011/03/xsi-plugin.html' title='XSI Plugin'/><author><name>Paul Sultan</name><uri>http://www.blogger.com/profile/01859669861208266768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3870624054528827727.post-380238697350281033</id><published>2011-01-23T13:46:00.000-08:00</published><updated>2011-04-17T13:16:24.824-07:00</updated><title type='text'>Maya Globals</title><content type='html'>Here is a quick PyMEL script to get a list of Maya's global variables which you can use to easily grab some data without having to run your own commands or needing to query around the interface.&amp;nbsp; There are 750+ by default, and Mental Ray will add a handful as well.&amp;nbsp; Many values are actually not set, or are empty by default.&amp;nbsp; &lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;from pymel.core import *&lt;br /&gt;for index, eachEnv in enumerate(MelGlobals().keys()):&lt;br /&gt;    print "%s- %-50s %s" %(index, eachEnv, melGlobals[eachEnv])&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Some nice ones to keep in mind are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;$gMainPane&lt;/li&gt;&lt;li&gt;$gMainWindow&lt;/li&gt;&lt;li&gt;$panelName&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;There are also some humorous ones:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;$foobar &lt;/li&gt;&lt;li&gt;$WantProtein&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3870624054528827727-380238697350281033?l=cgtd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/380238697350281033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/380238697350281033'/><link rel='alternate' type='text/html' href='http://cgtd.blogspot.com/2011/01/maya-globals.html' title='Maya Globals'/><author><name>Paul Sultan</name><uri>http://www.blogger.com/profile/01859669861208266768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3870624054528827727.post-9014510503687807811</id><published>2011-01-07T23:41:00.000-08:00</published><updated>2011-04-22T15:39:01.140-07:00</updated><title type='text'>Passing Values Between Python and MEL</title><content type='html'>&lt;div style="color: red;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;MEL to Python&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;MEL:&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;$foo="Hi"&lt;br /&gt;&lt;/pre&gt;Python:&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;import maya.mel as mel&lt;br /&gt;foo=mel.eval("$temp=$foo")&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="color: red;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Python to MEL&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;Python:&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;bar="Hi"&lt;br /&gt;&lt;/pre&gt;MEL:&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;$bar=python("bar") &lt;/pre&gt;&lt;br /&gt;&lt;div style="color: red;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Python to/from MEL &lt;/span&gt;&lt;/b&gt;&lt;/div&gt;Plugin:&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;import maya.OpenMaya as om&lt;br /&gt;import maya.OpenMayaMPx as omMPx&lt;br /&gt;&lt;br /&gt;nodeId = om.MTypeId(0x101118)&lt;br /&gt;&lt;br /&gt;#node data&lt;br /&gt;class user(omMPx.MPxNode):&lt;br /&gt; INPUT = om.MObject()&lt;br /&gt;&lt;br /&gt; def __init__(self):&lt;br /&gt;  omMPx.MPxNode.__init__(self)&lt;br /&gt;def userCreator():&lt;br /&gt; return omMPx.asMPxPtr( user() )&lt;br /&gt;def userIniter():&lt;br /&gt; numAttr = om.MFnNumericAttribute()&lt;br /&gt; user.x = numAttr.create("x","x",om.MFnNumericData.kFloat,0.0)&lt;br /&gt; numAttr.setStorable(1)&lt;br /&gt; numAttr.setWritable(1)&lt;br /&gt; user.addAttribute(user.x)&lt;br /&gt;&lt;br /&gt;#plugin requires&lt;br /&gt;def initializePlugin(mobject):&lt;br /&gt; mplugin = omMPx.MFnPlugin(mobject)&lt;br /&gt; try:&lt;br /&gt;  mplugin.registerNode("user", nodeId, userCreator, userIniter)&lt;br /&gt; except:&lt;br /&gt;  print "Error loading"&lt;br /&gt;  raise&lt;br /&gt;def uninitializePlugin(mobject):&lt;br /&gt; mplugin = omMPx.MFnPlugin(mobject)&lt;br /&gt; try:&lt;br /&gt;  mplugin.deregisterNode( nodeId )&lt;br /&gt; except:&lt;br /&gt;  print "Error removing"&lt;br /&gt;  raise&lt;br /&gt;&lt;/pre&gt;MEL:&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;if(!size(`ls "userData"`)){&lt;br /&gt;    createNode "user" -name "userData";&lt;br /&gt;}&lt;br /&gt;setAttr "userData.x" 5;&lt;br /&gt;getAttr "userData.x";&lt;br /&gt;&lt;/pre&gt;Python:&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;import maya.cmds as cmds&lt;br /&gt;if not cmds.ls("userData"):&lt;br /&gt;    myUser=cmds.createNode("user", name="userData")&lt;br /&gt;cmds.setAttr("userData.x", 5)&lt;br /&gt;print cmds.getAttr("userData.x")&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3870624054528827727-9014510503687807811?l=cgtd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/9014510503687807811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/9014510503687807811'/><link rel='alternate' type='text/html' href='http://cgtd.blogspot.com/2011/01/passing-objects-between-python-and-mel.html' title='Passing Values Between Python and MEL'/><author><name>Paul Sultan</name><uri>http://www.blogger.com/profile/01859669861208266768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3870624054528827727.post-8824363060395429809</id><published>2011-01-02T01:45:00.000-08:00</published><updated>2011-04-17T13:17:00.158-07:00</updated><title type='text'>Useful Commands</title><content type='html'>&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;span style="color: red;"&gt;whatIs &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;whatIs script;   //mel only&lt;br /&gt;whatIs statusLineUpdateInputField;   &lt;br /&gt;// Result: Mel procedure found in: C:/Program Files/Autodesk/Maya2009/scripts/startup/statusLine.mel // &lt;/pre&gt;&lt;br /&gt;When you need to emulate a command from Maya and the script editor only gives feedback when &lt;i&gt;Echo All Commands&lt;/i&gt; is checked.&amp;nbsp; Maya most likely echoed a built in mel procedure that runs multiple mel commands in the background. Just open the file, find the procedure, and begin sifting through Maya's internals.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b style="color: red;"&gt;evalDeffered&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;cmds.evalDeferred("cmds.refresh(force=1)", lowestPriority=1)&amp;nbsp;&lt;br /&gt;cmds.evalDeferred(lambda : localCommand, lowestPriority=1) &lt;/pre&gt;&lt;br /&gt;Often a command will return a result before the intended process is complete.&amp;nbsp; This is often a result of commands firing idle scriptJobs.&amp;nbsp; The problem is your code continues while Maya is trying to play catch up.&amp;nbsp; evalDeferred will wait until Maya is completely idle (no more queued scriptJobs) before continuing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3870624054528827727-8824363060395429809?l=cgtd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/8824363060395429809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/8824363060395429809'/><link rel='alternate' type='text/html' href='http://cgtd.blogspot.com/2011/01/top-commands.html' title='Useful Commands'/><author><name>Paul Sultan</name><uri>http://www.blogger.com/profile/01859669861208266768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3870624054528827727.post-5986808614461989974</id><published>2011-01-02T01:11:00.000-08:00</published><updated>2011-04-17T13:17:26.761-07:00</updated><title type='text'>Attributes and Values</title><content type='html'>Here is a simple script to list all the attributes, attributeType, and values.&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;selection=cmds.ls(sl=1)[0]&lt;br /&gt;selection=cmds.ls(sl=1)[0]&lt;br /&gt;attributes=cmds.listAttr(selection)&lt;br /&gt;attributeList=[]&lt;br /&gt;print "\n"&lt;br /&gt;for eachAttr in attributes:&lt;br /&gt;   name=eachAttr,&lt;br /&gt;   try: type=cmds.nodeType(selection+"."+eachAttr),&lt;br /&gt;   except: type="Error"&lt;br /&gt;   try: value=cmds.getAttr(selection+"."+eachAttr)&lt;br /&gt;   except: value="Cannot Read"&lt;br /&gt;   attributeList.append([name[0], type[0], value])&lt;br /&gt;col1length=max([len(str(item[0])) for item in attributeList])&lt;br /&gt;col2length=max([len(str(item[1])) for item in attributeList])&lt;br /&gt;col3length=max([len(str(item[2])) for item in attributeList])&lt;br /&gt;print ("Attribute".ljust(col1length), &lt;br /&gt;       "Type".ljust(col2length), &lt;br /&gt;       "Value".ljust(col3length))&lt;br /&gt;for eachAttr in attributeList:&lt;br /&gt;   print str(eachAttr[0]).ljust(col1length),&lt;br /&gt;   print str(eachAttr[1]).ljust(col2length),&lt;br /&gt;   print str(eachAttr[2]).ljust(col3length)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3870624054528827727-5986808614461989974?l=cgtd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/5986808614461989974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/5986808614461989974'/><link rel='alternate' type='text/html' href='http://cgtd.blogspot.com/2011/01/attributes-and-values.html' title='Attributes and Values'/><author><name>Paul Sultan</name><uri>http://www.blogger.com/profile/01859669861208266768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3870624054528827727.post-1942350155593223271</id><published>2011-01-02T01:05:00.000-08:00</published><updated>2011-04-17T13:18:20.834-07:00</updated><title type='text'>materialInfo</title><content type='html'>Quite often, unintentionally, mesh will only display in wireframe.  More than often it is from accidentally deleting the connection from the mesh to the shading group.  However, if you are scripting a file translator or shader exporter you might have ignored the materialInfo node.  Almost invisible to the user it is necessary for hardware rendering of any shader.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_5yvxVvNYNnM/TSA9LHdTjQI/AAAAAAAAAQo/adhF8t9xMtQ/s1600/materialInfoShaded.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="230" src="http://2.bp.blogspot.com/_5yvxVvNYNnM/TSA9LHdTjQI/AAAAAAAAAQo/adhF8t9xMtQ/s400/materialInfoShaded.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_5yvxVvNYNnM/TSA9IvWvhcI/AAAAAAAAAQk/FtoQ3U-UY00/s1600/materialInfoHypershade.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_5yvxVvNYNnM/TSA9IvWvhcI/AAAAAAAAAQk/FtoQ3U-UY00/s1600/materialInfoHypershade.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;A: Correct Connections, B: MaterialInfo Error, C: Deleted ShadingGroup&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;As you can see the problem is indistinguishable in the hypershade.&amp;nbsp; The only way to tell if you've got this problem is to view B's material in the Attribute Editor.&amp;nbsp; If most of it's &lt;i&gt;Hardware Texturing&lt;/i&gt; features are disabled try the following. &lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;miNode=cmds.createNode("materialInfo")&lt;br /&gt;cmds.connectAttr("phong1SG.message", "%s.shadingGroup"%miNode)&lt;br /&gt;cmds.connectAttr("phong1.message", "%s.material"%miNode)&amp;nbsp;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3870624054528827727-1942350155593223271?l=cgtd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/1942350155593223271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/1942350155593223271'/><link rel='alternate' type='text/html' href='http://cgtd.blogspot.com/2011/01/materialinfo.html' title='materialInfo'/><author><name>Paul Sultan</name><uri>http://www.blogger.com/profile/01859669861208266768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_5yvxVvNYNnM/TSA9LHdTjQI/AAAAAAAAAQo/adhF8t9xMtQ/s72-c/materialInfoShaded.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-3870624054528827727.post-4791818147032137751</id><published>2011-01-01T22:27:00.000-08:00</published><updated>2011-04-17T13:18:00.576-07:00</updated><title type='text'>Other Extensions</title><content type='html'>If you've looked into the Python install dir you've most likely seen .pyc and .pyo files.  Unlike .pyw files which are simply renamed extension, .pyc and .pyo are encoded by the interpreter and are no longer human readable.&amp;nbsp; Typically compiled python (.pyc) are created by the interpreter once a .py file is run.&amp;nbsp; However, if the option was turned off during installation the following can create them for you. -O and -OO flags will optimize the code further.&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;python -m py_compile myFile.py&lt;br /&gt;python -m compileall -l .&lt;br /&gt;&lt;/pre&gt;Although it would be nice to get a speed boost from optimizing and compiling our code that is not the case.&amp;nbsp; You may find a minor improvement in the launch time, since the interpreter no longer needs to convert it to bytecode, but the main advantage is to have some code protection if you are distributing your program.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3870624054528827727-4791818147032137751?l=cgtd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/4791818147032137751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/4791818147032137751'/><link rel='alternate' type='text/html' href='http://cgtd.blogspot.com/2011/01/other-extensions.html' title='Other Extensions'/><author><name>Paul Sultan</name><uri>http://www.blogger.com/profile/01859669861208266768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3870624054528827727.post-2939567025939260073</id><published>2011-01-01T18:30:00.000-08:00</published><updated>2011-01-07T23:42:38.187-08:00</updated><title type='text'>Hidding the Console</title><content type='html'>As you have probably noticed the typical Python extension is .py.&amp;nbsp;  If you change this in explorer to .pyw pythonw.exe will execute the script instead of python.exe.&amp;nbsp; As a result the console window will be suppressed and any GUI windows will still come up.&amp;nbsp; Preventing the console looks more professional for a finished build, but during development it is still very useful for debugging.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_5yvxVvNYNnM/TR_jG9xAb5I/AAAAAAAAAQg/5AINkHTlZlo/s1600/pythonUI.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="158" src="http://1.bp.blogspot.com/_5yvxVvNYNnM/TR_jG9xAb5I/AAAAAAAAAQg/5AINkHTlZlo/s320/pythonUI.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;.py appication launches a shell.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3870624054528827727-2939567025939260073?l=cgtd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/2939567025939260073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/2939567025939260073'/><link rel='alternate' type='text/html' href='http://cgtd.blogspot.com/2011/01/hidding-console.html' title='Hidding the Console'/><author><name>Paul Sultan</name><uri>http://www.blogger.com/profile/01859669861208266768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_5yvxVvNYNnM/TR_jG9xAb5I/AAAAAAAAAQg/5AINkHTlZlo/s72-c/pythonUI.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-3870624054528827727.post-4736196254786948088</id><published>2010-09-06T19:28:00.000-07:00</published><updated>2011-07-26T10:04:37.376-07:00</updated><title type='text'>Kill Maya</title><content type='html'>There are plenty of times when Maya goes rogue and takes control of your system. Here are some methods of killing the frozen process.&lt;br /&gt;&lt;br /&gt;Linux has superior methods of handling this situation so we'll start here.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;First connect to an auxiliary terminal. &amp;nbsp; &lt;/li&gt;&lt;ul&gt;&lt;li&gt;Open a Virtual Console.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Press Ctrl+Alt+Fn.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ol&gt;&lt;ul&gt;&lt;li&gt;Connect from a remote terminal using a secure shell.&amp;nbsp; *The SSH server must be started on the client machine.&amp;nbsp; &lt;i&gt;service sshd start &lt;/i&gt;on fedora.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;ssh username@ip&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;ol&gt;&lt;ul&gt;&lt;li&gt;Connect from a remote OS using a VNC as an alternative user.&amp;nbsp; *The VNC server must be started on the client machine. &lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;Once connected to the local terminal identify and kill the process.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Use standard unix commands.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;ps -u paul | grep maya&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;kill -signal pid&lt;/li&gt;&lt;ul&gt;&lt;li&gt;9 SIGKILL -Hardest&lt;/li&gt;&lt;li&gt;15 SIGTERM -Softest&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;If installed use top.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;top&lt;/li&gt;&lt;ul&gt;&lt;li&gt;z: color&lt;/li&gt;&lt;li&gt;x: highlight column sort&lt;/li&gt;&lt;li&gt;&amp;lt;, &amp;gt; change sort column&amp;nbsp;&lt;/li&gt;&lt;li&gt;q: quit&lt;/li&gt;&lt;li&gt;u: username&lt;/li&gt;&lt;li&gt;R: reverse sort &lt;/li&gt;&lt;li&gt;k: kill process id&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;br /&gt;Windows on the otherhand does not have virtual consoles so all these methods require a auxiliary computer on the network.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Run a basic taskkill.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;taskkill /s ip /u username /p password /im maya.exe /f&amp;nbsp; [/pid process id]&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Connect using telnet. *The telnet server must be started on the client machine. Check &lt;i&gt;Telnet Client&lt;/i&gt; and &lt;i&gt;Telnet Server&lt;/i&gt; from &lt;i&gt;Control Panel-&amp;gt;Programs and Features-&amp;gt;Turn Windows features on or off.&lt;/i&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;telnet ip&lt;/li&gt;&lt;li&gt;taskkill /u username /p password /im maya.exe /f&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Connect from a remote OS using a VNC as an alternative user.&amp;nbsp; *The VNC server, or default Microsoft Terminal Server, must be started on the client machine.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;runas /user:username "taskkill /im maya.exe /f"&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3870624054528827727-4736196254786948088?l=cgtd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/4736196254786948088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/4736196254786948088'/><link rel='alternate' type='text/html' href='http://cgtd.blogspot.com/2010/09/kill-maya.html' title='Kill Maya'/><author><name>Paul Sultan</name><uri>http://www.blogger.com/profile/01859669861208266768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3870624054528827727.post-1054959340796815295</id><published>2010-09-03T21:01:00.000-07:00</published><updated>2010-09-03T21:01:58.660-07:00</updated><title type='text'>Hypergraph Colors</title><content type='html'>I'm sure we can all agree working in the hypergraph can sometimes be quite imbroglio.&amp;nbsp; Knowing what to look for in this tangled web can really help.&amp;nbsp; It would be nice to have a &lt;i&gt;hide connection lines on selected nodes&lt;/i&gt; feature like Nuke to help clean up the network.&amp;nbsp; But Maya only allows us to globally &lt;i&gt;merge multiple connections&lt;/i&gt;, which doesn't really help when we are interested in node specifics.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;It is therefor pretty valuable to remember how the hypergraph defines its line colors.&amp;nbsp; Here is my refined color chart from Maya's docs followed by an example of each.&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;img border="0" height="342" src="http://1.bp.blogspot.com/_5yvxVvNYNnM/TIG9AOjZ6dI/AAAAAAAAAP0/AkmA6V3pb14/s640/colors.png" style="margin-left: auto; margin-right: auto;" width="640" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;General&amp;nbsp;&amp;gt;&amp;nbsp;Basics&amp;nbsp;&amp;gt;&amp;nbsp;Basics Windows and Editors&amp;nbsp;&amp;gt;&amp;nbsp;Hypergraph&amp;nbsp;&amp;gt;&amp;nbsp;Hypergraph Overview&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_5yvxVvNYNnM/TIG9AOjZ6dI/AAAAAAAAAP0/AkmA6V3pb14/s1600/colors.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_5yvxVvNYNnM/TIG9CWdKX9I/AAAAAAAAAP8/BrfVPXlnyXE/s1600/lines.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="185" src="http://3.bp.blogspot.com/_5yvxVvNYNnM/TIG9CWdKX9I/AAAAAAAAAP8/BrfVPXlnyXE/s400/lines.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3870624054528827727-1054959340796815295?l=cgtd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/1054959340796815295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/1054959340796815295'/><link rel='alternate' type='text/html' href='http://cgtd.blogspot.com/2010/09/hypergraph-colors.html' title='Hypergraph Colors'/><author><name>Paul Sultan</name><uri>http://www.blogger.com/profile/01859669861208266768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_5yvxVvNYNnM/TIG9AOjZ6dI/AAAAAAAAAP0/AkmA6V3pb14/s72-c/colors.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-3870624054528827727.post-3093585895211920629</id><published>2010-08-25T21:00:00.000-07:00</published><updated>2010-08-25T21:00:07.667-07:00</updated><title type='text'>Setting up Subversion</title><content type='html'>&lt;object width="700" height="450"&gt;&lt;param name="movie" value="http://www.youtube.com/v/nTHhNR4o9ck?fs=1&amp;amp;hl=en_US&amp;amp;rel=0&amp;amp;color1=0x3a3a3a&amp;amp;color2=0x999999&amp;amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/nTHhNR4o9ck?fs=1&amp;amp;hl=en_US&amp;amp;rel=0&amp;amp;color1=0x3a3a3a&amp;amp;color2=0x999999&amp;amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="700" height="450"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3870624054528827727-3093585895211920629?l=cgtd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/3093585895211920629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/3093585895211920629'/><link rel='alternate' type='text/html' href='http://cgtd.blogspot.com/2010/08/setting-up-subversion.html' title='Setting up Subversion'/><author><name>Paul Sultan</name><uri>http://www.blogger.com/profile/01859669861208266768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3870624054528827727.post-7673785156008838625</id><published>2010-08-23T00:20:00.000-07:00</published><updated>2011-01-02T13:50:48.903-08:00</updated><title type='text'>Python Cheat Sheet</title><content type='html'>This is for everyone who, for whatever reason, are putting off learning Python.&amp;nbsp; Ideally, if you are coming from another language such as MEL or Perl, you should be able to skim through these demos and have no problem transitioning to Pythonic syntax.&amp;nbsp; The following Python snippets are selections from the online documentation at &lt;a href="http://docs.python.org/"&gt;http://docs.python.org/&lt;/a&gt;, which I modified whenever possible to fit into a Maya context.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Data Structures&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Strings&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;pre class="brush: python; toolbar: false;"&gt;myString="Hello"&lt;br /&gt;mySecondString="World"&lt;br /&gt;result=myString+mySecondString&lt;br /&gt;myMultilineString="""Hello World.&lt;br /&gt;What a beautiful world it is."""&lt;br /&gt;myRawString=r"C:/Users"&lt;br /&gt;  &lt;br /&gt;firstLetter=myString[1]&lt;br /&gt;lastLetter=myString[-1]&lt;br /&gt;firstWord=myString[0:4]&amp;nbsp;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Unicode: Since Maya is used internationally, multiple language packs are supported which require a unicode character set.  Think of unicode as the big brother of the standard ASCII model.  You will not see anything unusual as the result of MEL commands, however Maya will return Python commands in unicode notation.  As long as your in Maya the prefix u can be ignored, however, if you are writing output to a file they will have to be converted to ASCII. &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre class="brush: python; toolbar: false;"&gt;print cmds.ls(cameras=1)&lt;br /&gt;&amp;gt;&amp;gt;[u'frontShape', u'perspShape', u'sideShape', u'topShape']&lt;br /&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Lists&lt;/li&gt;&lt;/ul&gt;&lt;pre class="brush: python; toolbar: false;"&gt;print cmds.ls(cameras=1)&lt;br /&gt;&amp;gt;&amp;gt;[u'frontShape', u'perspShape', u'sideShape', u'topShape']&lt;br /&gt;&lt;br /&gt;myToys=["yoyo", "cup", "ball", "crayon"] #the names of your objects&lt;br /&gt;cmds.select(myToys)&lt;br /&gt;&lt;br /&gt;firstToy=myToys[1]  #yoyo&lt;br /&gt;numToys=len(myToys)  #3&lt;br /&gt;&lt;/pre&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;List Comprehensions: These are used to create lists from any iterable object.&amp;nbsp; The first time I used them was to retrieve the nth column in a matrix stored as vectors.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;pre class="brush: python; toolbar: false;"&gt;myMatrix=[[1,2,3,4],[1,2,3,4],[1,2,3,4]]&lt;br /&gt;thirdRow=myMatrix[2] #[1,2,3]&lt;br /&gt;thirdColumn=[x[2] for x in myMatrix] #[3,3,3]&lt;br /&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Tuples: Are similar to list except they cannot be modified, also known as immutable.&lt;/li&gt;&lt;/ul&gt;&lt;pre class="brush: python; toolbar: false;"&gt;myList=["Hello", 1]&lt;br /&gt;myList[1]=5 #can change the value&lt;br /&gt;&lt;br /&gt;myTuple=("Hello", 1) &lt;br /&gt;myTuple[1]=5 #ERROR&lt;br /&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Sets: Sets are GREAT.&amp;nbsp; They are just like lists but prevent duplicate elements.&lt;/li&gt;&lt;/ul&gt;&lt;pre class="brush: python; toolbar: false;"&gt;keyLight= cmds.lightlink(light="keyLight", query=1) #return all objects set to receive light from keyLight&lt;br /&gt;backLight= cmds.lightlink(light="backLight", query=1) #return all objects set to receive light from backLight&lt;br /&gt;&lt;br /&gt;lightsList=keyLight+backLight #12 items, lists duplicates&lt;br /&gt;lightsSet=set(keyLight+backLight) #8 items, returns only unique elements&lt;br /&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Dictionaries: Sometimes referred to as hashes or associative arrays, are used to store data in name, value pairs.&lt;/li&gt;&lt;/ul&gt;&lt;pre class="brush: python; toolbar: false;"&gt;myCameras=cmds.ls(cameras=1)&lt;br /&gt;myTextures=cmds.ls(textures=1)&lt;br /&gt;myScene={'cameras':myCameras, 'textures':myTextures} #myScene stores all the cameras and textures in the scene&lt;br /&gt;&lt;br /&gt;print myScene.keys()&lt;br /&gt;print myScene.values()&lt;br /&gt;print myScene["cameras"]&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;Control Flow&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;While Loops: Use extreme caution when using while loops. There is no way to close Maya if you get caught in an infinite loop.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre class="brush: python; toolbar: false;"&gt;while x&amp;lt;10:&lt;br /&gt;    print x&lt;br /&gt;    x+=1 #make sure to terminate the loop!&lt;br /&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;If Statement&lt;/li&gt;&lt;/ul&gt;&lt;pre class="brush: python; toolbar: false;"&gt;if (myValue==10 or myValue==20) and myValue!=30&lt;br /&gt;    print myValue&lt;br /&gt;elif myValue==0:&lt;br /&gt;    print "Cannot be 0"&lt;br /&gt;else: #all occurances&lt;br /&gt;    pass #pass keeps Pythonic syntax, useful as placeholders &lt;br /&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;For Statement&lt;/li&gt;&lt;/ul&gt;&lt;pre class="brush: python; toolbar: false;"&gt;for x in range(10):&lt;br /&gt;    print x, someList[x]&lt;br /&gt;&lt;br /&gt;for index, eachItem in enumerate(iterableItem):&lt;br /&gt;    print index, eachItem&lt;br /&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Exceptions&lt;/li&gt;&lt;/ul&gt;&lt;pre class="brush: python; toolbar: false;"&gt;sphereAttrs=cmds.listAttr('pSphere1')&lt;br /&gt;for eachAttr in sphereAttrs:&lt;br /&gt;    print eachAttr+":",&lt;br /&gt;    try:&lt;br /&gt;        print cmds.getAttr("pSphere1."+eachAttr)&lt;br /&gt;    except:&lt;br /&gt;        print "Cannot Read"&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;Functions&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;def myFunction(arg=None): #defines function myFunction that accepts an argument arg that defaults to None&lt;br /&gt;    print arg&lt;br /&gt;    return 1&lt;br /&gt;myFunction("Hello World") #calls myFunction&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;Classes&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;class newClass():&lt;br /&gt;    myInt=5 #class variables&lt;br /&gt;    @classmethod  #class method decorator&lt;br /&gt;    def getInt(cls): #class method&lt;br /&gt;        return cls.myInt&lt;br /&gt;    def __init__(self, arg): #gets automatically called when an object is instantiated&lt;br /&gt;        self.myString=arg  #self are instance variables, they are unique per object&lt;br /&gt;    def myFunction(self, arg):&lt;br /&gt;        print arg, self.myString&lt;br /&gt;&lt;br /&gt;myClass =newClass("Hello") #creates a new object from class newClass, objects are instances of a class&lt;br /&gt;myClass.myFunction("World") #Hello World&lt;br /&gt;print myClass.myFunction.myString #Hello&lt;br /&gt;print newClass.myInt #5&lt;br /&gt;print newClass.getInt() #5&lt;/pre&gt;I hope this will get you all started in the right direction.  The vast majority of all your scripts will come from topics discussed here, everything else beyond this cheat sheet will merit a dedicated post.  If you have further questions I find it's easiest to just to Google the topic.  Even though I am a member of &lt;a class="linkification-ext" href="http://www.python-forum.org/pythonforum/" title="Linkification: http://www.python-forum.org/pythonforum/"&gt;http://www.python-forum.org/pythonforum/&lt;/a&gt; I rarely, if ever have to create a new thread.  On the other hand I highly recommend the Maya Programming Forum on &lt;a class="linkification-ext" href="http://forums.cgsociety.org/" title="Linkification: http://forums.cgsociety.org/"&gt;http://forums.cgsociety.org/&lt;/a&gt; since Maya specifics sometimes get hazy. Hopefully you are all already members.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3870624054528827727-7673785156008838625?l=cgtd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/7673785156008838625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/7673785156008838625'/><link rel='alternate' type='text/html' href='http://cgtd.blogspot.com/2010/08/python-cheat-sheet.html' title='Python Cheat Sheet'/><author><name>Paul Sultan</name><uri>http://www.blogger.com/profile/01859669861208266768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3870624054528827727.post-9093967405483734868</id><published>2010-08-15T03:40:00.001-07:00</published><updated>2010-08-27T23:00:49.216-07:00</updated><title type='text'>Current Version</title><content type='html'>It is often necessary to know the exact Python version for debugging or installing modules.&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;import sys&lt;br /&gt;print sys.version_info&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_5yvxVvNYNnM/TF-0OxTr7jI/AAAAAAAAAOM/0nyOvA_MHiI/s1600/version.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_5yvxVvNYNnM/TF-0OxTr7jI/AAAAAAAAAOM/0nyOvA_MHiI/s320/version.png" /&gt;&lt;/a&gt;&lt;/div&gt;It is also sometimes important to know what Maya version is currently running, especially for backwards compatibility.&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;import maya.cmds as cmds&lt;br /&gt;print cmds.about(version=1)&lt;/pre&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_5yvxVvNYNnM/THilnka3KEI/AAAAAAAAAPk/2fAlweWMAGI/s1600/mayaVersion.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_5yvxVvNYNnM/THilnka3KEI/AAAAAAAAAPk/2fAlweWMAGI/s320/mayaVersion.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If you are using an IDE and want to make sure your code will execute as expected without having to worry about version control set its default Python interpreter to C:\Program Files\Autodesk\Maya2009\bin\mayapy.exe.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3870624054528827727-9093967405483734868?l=cgtd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/9093967405483734868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/9093967405483734868'/><link rel='alternate' type='text/html' href='http://cgtd.blogspot.com/2010/08/python-version.html' title='Current Version'/><author><name>Paul Sultan</name><uri>http://www.blogger.com/profile/01859669861208266768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_5yvxVvNYNnM/TF-0OxTr7jI/AAAAAAAAAOM/0nyOvA_MHiI/s72-c/version.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-3870624054528827727.post-6597077362678311393</id><published>2010-08-15T03:40:00.000-07:00</published><updated>2010-08-22T06:13:19.924-07:00</updated><title type='text'>External Editor</title><content type='html'>&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_5yvxVvNYNnM/TGOMdWtLGxI/AAAAAAAAAPU/MnYHaMWvUec/s320/scripteditor.png" style="margin-left: auto; margin-right: auto;" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Maya 2011 new features&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Although Maya 2011 added a slew of new features to the script editor, it is still best practice to program in a standalone IDE.&amp;nbsp; Some of the benefits include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Custom syntax highlighting.&lt;/li&gt;&lt;li&gt;Collapsible Code.&lt;/li&gt;&lt;li&gt;Regex Assistance.&lt;/li&gt;&lt;li&gt;File management, versioning, sharing is easier.&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Runs on an independent process. &lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;Fortunately,&amp;nbsp; Maya automatically saves your scripts on exit.&amp;nbsp; However, you WILL lose data if you solely rely on this feature.&amp;nbsp; This can occur if you are coding on multiple instances of Maya simultaneously, or more likely, Maya crashes.&amp;nbsp; Also, keep in mind, your scripts can easily, unintentionally trigger a crash themselves.&amp;nbsp; Programming on an independent process will allow you to force quit from Maya with no data lose. &lt;br /&gt;&lt;br /&gt;Again Python has the benefit over MEL in that it is an independent, open-source language.&amp;nbsp; Therefore IDE's are readily available.&amp;nbsp; Eclipse + PyDev [open-source], Komodo [commercial], PyCrust [commercial], etc.&amp;nbsp; In addition every Python interpreter comes with a bare bones editor called IDLE.&amp;nbsp; Install either version 2.5 or 2.6 (post Maya 2010).&amp;nbsp; &lt;a href="http://www.python.org/download/"&gt;http://www.python.org/download/&lt;/a&gt;&amp;nbsp; To launch the IDE go to Start &amp;gt; Python &amp;gt; IDLE.&amp;nbsp; You can also launch it through a shell using:&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;python C:/Python27/Lib/idlelib/idle.py&lt;/pre&gt;Yes, you are using a Python application to write your own Python scripts.&amp;nbsp; Once the Tk Python shell opens go to File &amp;gt; New Window.&amp;nbsp; Here you can type your code as if you were using Maya's Script Editor.&amp;nbsp; You will want to save your file to &lt;b&gt;~\Users\Paul\Documents\maya\scripts&lt;/b&gt; [Windows] or &lt;b&gt;~/Library/Preferences/Autodesk/maya/scripts&lt;/b&gt; [Mac] with a .py extension.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_5yvxVvNYNnM/TGOMXu6l6kI/AAAAAAAAAPE/qQxlV_1WjiE/s1600/idle.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="259" src="http://1.bp.blogspot.com/_5yvxVvNYNnM/TGOMXu6l6kI/AAAAAAAAAPE/qQxlV_1WjiE/s320/idle.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Then in order to execute this file from Maya type:&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;import filename&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_5yvxVvNYNnM/TGOMbpxsTwI/AAAAAAAAAPM/khbw5EdKajk/s1600/import.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_5yvxVvNYNnM/TGOMbpxsTwI/AAAAAAAAAPM/khbw5EdKajk/s320/import.png" /&gt;&lt;/a&gt;&lt;/div&gt;Once the file is imported successfully and you want to make changes you will need to run:&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;reload(filename)&lt;/pre&gt;There may be times while debugging when it may be more convenient to execute portions of your external script from Maya.&amp;nbsp; To interact with imported objects you must type the &lt;i&gt;filename &lt;/i&gt;. &lt;i&gt;variableName&lt;/i&gt;. &lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;import HelloWorld&lt;br /&gt;print HelloWorld.mySting  #call a variable defined in HelloWorld.py&lt;br /&gt;HelloWorld.myFunction()   #call a function defined in HelloWorld.py&lt;br /&gt;&lt;/pre&gt;*Maya can read Python documents created after Maya has launched, but cannot read new MEL files until it has been restarted.&amp;nbsp; &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_5yvxVvNYNnM/TGOMdWtLGxI/AAAAAAAAAPU/MnYHaMWvUec/s1600/scripteditor.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt; &lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3870624054528827727-6597077362678311393?l=cgtd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/6597077362678311393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/6597077362678311393'/><link rel='alternate' type='text/html' href='http://cgtd.blogspot.com/2010/08/external-editor.html' title='External Editor'/><author><name>Paul Sultan</name><uri>http://www.blogger.com/profile/01859669861208266768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_5yvxVvNYNnM/TGOMdWtLGxI/AAAAAAAAAPU/MnYHaMWvUec/s72-c/scripteditor.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-3870624054528827727.post-4140835608147580501</id><published>2010-08-15T03:39:00.000-07:00</published><updated>2011-01-02T13:57:55.378-08:00</updated><title type='text'>Alternative Importing</title><content type='html'>Using Maya's scripts folder is great if your working on a personal project, but isn't as handy for a company wide script.&amp;nbsp; In these cases you can assign Maya to look in a shared folder.&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;import sys&lt;br /&gt;sys.path.append("M:\mayascripts")&lt;br /&gt;import HelloWorld&lt;/pre&gt;&lt;br /&gt;Whereas the MEL source command allows for absolute paths:&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;source "C:/users/paul/desktop/something.mel"&lt;/pre&gt;Or set the environment variables MAYA_SCRIPT_PATH for MEL and the PYTHONPATH for Python to the scripts directory.&amp;nbsp; Also note Maya will automatically source all your MEL files, but Python scripts must always be manually imported.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_5yvxVvNYNnM/TF_Ool7szcI/AAAAAAAAAOs/kDhvSbSfV0A/s1600/envVariable.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_5yvxVvNYNnM/TF_Ool7szcI/AAAAAAAAAOs/kDhvSbSfV0A/s320/envVariable.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If you are going to be editing the env variables you will need to restart Maya for changes to take affect.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3870624054528827727-4140835608147580501?l=cgtd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/4140835608147580501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/4140835608147580501'/><link rel='alternate' type='text/html' href='http://cgtd.blogspot.com/2010/08/alternative-importing.html' title='Alternative Importing'/><author><name>Paul Sultan</name><uri>http://www.blogger.com/profile/01859669861208266768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_5yvxVvNYNnM/TF_Ool7szcI/AAAAAAAAAOs/kDhvSbSfV0A/s72-c/envVariable.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-3870624054528827727.post-3176203931046632514</id><published>2010-08-15T03:38:00.001-07:00</published><updated>2010-11-18T07:58:40.208-08:00</updated><title type='text'>History Menu</title><content type='html'>&lt;div style="color: #3d85c6;"&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_5yvxVvNYNnM/TGOJuxln7FI/AAAAAAAAAO8/9usaS02_p_o/s1600/history.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_5yvxVvNYNnM/TGOJuxln7FI/AAAAAAAAAO8/9usaS02_p_o/s320/history.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Script Editor &amp;gt; History&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;Batch Render Messages&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;MEL - Only effects messages detailing batch rendering progress.&lt;/li&gt;&lt;/ul&gt;&lt;div style="color: #3d85c6;"&gt;&lt;b&gt;Echo All Commands&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;MEL - Displays overly verbose detail for every action Maya takes.&amp;nbsp; You might think this is beneficial to have on but rarely is this information valuable. This is equivalent to:&lt;/li&gt;&lt;/ul&gt;&lt;pre class="brush: python; toolbar: false;"&gt;cmds.commandEcho(state=1)    #or 0&lt;br /&gt;&lt;/pre&gt;&lt;div style="color: #3d85c6;"&gt;&lt;b&gt;Line Numbers In Errors &lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;MEL &amp;amp; Python (2011) -&amp;nbsp; Displays the line the error occured. Pre 2011, or when Show Stack Trace is enabled, Python's interpreter outputs this information regardless.&lt;/li&gt;&lt;/ul&gt;&lt;div style="color: #3d85c6;"&gt;&lt;b&gt;Show Stack Trace&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;MEL &amp;amp; Python (2011) - Creates a separate stack output window for runtime errors.&amp;nbsp; Pre 2011 Python's interpreter outputs this information regardless.&amp;nbsp; This is equivalent to: &lt;/li&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;pre class="brush: python; toolbar: false;"&gt;stackTrace -state 1    #or 0&lt;br /&gt;print (12/0)           #try making a runtime error&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;*Manually setting the commandEcho, stackTrace state triggers toggling errors in the UI.&amp;nbsp; &lt;/li&gt;&lt;/ul&gt;&lt;div style="color: #3d85c6;"&gt;&lt;b&gt;Suppress Command Results&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;MEL - Toggles command results.&amp;nbsp; Will still display //Result in the command line. &lt;/li&gt;&lt;/ul&gt;&lt;pre class="brush: python; toolbar: false;"&gt;polySphere;&lt;br /&gt;&amp;gt;&amp;gt;// Result: pSphere3 polySphere3 // &lt;/pre&gt;&lt;div style="color: #3d85c6;"&gt;&lt;b&gt;Suppress Info Messages&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Toggles display of info messages, only generated by Maya internals. &lt;/li&gt;&lt;/ul&gt;&lt;div style="color: #3d85c6;"&gt;&lt;b&gt;Suppress Warning Messages&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;MEL &amp;amp; Python - Toggles display of purple (yellow 2011) warning messages(commands).&amp;nbsp; Will still display //Warning in the command line.&amp;nbsp; [Added to Python library in 2011]&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;pre class="brush: python; toolbar: false;"&gt;warning "You did something wrong.";&lt;br /&gt;&amp;gt;&amp;gt;// Warning: You did something wrong. // &lt;/pre&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div style="color: #3d85c6;"&gt;&lt;b&gt;Suppress Error Messages&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;MEL &amp;amp; Python - Toggles display of red error messages(commands).&amp;nbsp; Will still display //Error in the command line.&amp;nbsp; [Added to Python library in 2011] &lt;/li&gt;&lt;/ul&gt;&lt;div style="color: #3d85c6;"&gt;&lt;b&gt;Suppress Stack Window&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Toggling this from the menu takes no affect.&amp;nbsp; However, if &lt;i&gt;Show Stack Trace&lt;/i&gt; is on and you manually set suppressStackWindow the stack window is suppressed AND the &lt;i&gt;Suppress Stack Window&lt;/i&gt; menu reflects the change.&amp;nbsp; Querying this field defaults to off, otherwise it is the previously set state regardless of the UI display on startup.&lt;/li&gt;&lt;/ul&gt;&lt;pre class="brush: python; toolbar: false;"&gt;scriptEditorInfo -suppressStackWindow 1; &lt;/pre&gt;&lt;ul&gt;&lt;/ul&gt;*Manually setting the stackTrace state triggers toggling errors for selecting&lt;i&gt; Show Stack Trace&lt;/i&gt; from the UI.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3870624054528827727-3176203931046632514?l=cgtd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/3176203931046632514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/3176203931046632514'/><link rel='alternate' type='text/html' href='http://cgtd.blogspot.com/2010/08/history-menu.html' title='History Menu'/><author><name>Paul Sultan</name><uri>http://www.blogger.com/profile/01859669861208266768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_5yvxVvNYNnM/TGOJuxln7FI/AAAAAAAAAO8/9usaS02_p_o/s72-c/history.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-3870624054528827727.post-8816843747406372259</id><published>2010-08-15T03:38:00.000-07:00</published><updated>2010-08-16T01:21:56.505-07:00</updated><title type='text'>Basic Python in Maya</title><content type='html'>Lets cover some Python fundamentals to get us started.&lt;br /&gt;&lt;br /&gt;Since, out of the box, Python was not developed for Maya it does not understand how to interact with any of your scene's nodes.&amp;nbsp; Therefore, although you can always write pure Python code with no problem, whenever Python needs to interact with your scene you will need to import a module Maya provides to append all its MEL functions.&amp;nbsp; &lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;import maya.cmds&lt;br /&gt;maya.cmds.polySphere()&lt;br /&gt;&lt;/pre&gt;This will first execute the module maya.cmds from the current Python session.&amp;nbsp; This will import all of Maya's Python wrappers for its MEL commands.&amp;nbsp; To execute the Maya command you must write the module name followed by the command name.&amp;nbsp; To reduce the need to type &lt;i&gt;maya.cmds&lt;/i&gt; for every command it is most common to assign the module to a namespace.&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;import maya.cmds as cmds&amp;nbsp;&amp;nbsp;&amp;nbsp; #mc is also a frequently assigned namespace&lt;br /&gt;cmds.polySphere()&lt;br /&gt;&lt;/pre&gt;Another method is to bring all the &lt;i&gt;maya.cmds&lt;/i&gt; objects into the current &lt;b&gt;&lt;i&gt;main &lt;/i&gt;&lt;/b&gt;module:&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;from maya.cmds import *&lt;br /&gt;polySphere()&lt;br /&gt;&lt;/pre&gt;This requires no namespaces.&amp;nbsp; However, standard Python functions may be &lt;b&gt;overridden&lt;/b&gt;. Alternatively, since everything in Python are objects you can copy the function call to an object in the current module.&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;import maya.cmds as cmds&lt;br /&gt;polySphere=cmds.polySphere()&lt;br /&gt;polySphere()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&amp;nbsp;-----&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Most commands return feedback after a successful call.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;All commands in create mode return the name of the node created.&amp;nbsp;&lt;/li&gt;&lt;li&gt; Query commands return the attribute(s) designated.&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;Edit commands will return either 0 or 1.&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;Again, always have the docs open while programming to check available flags.&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;mySphere=cmds.polySphere() #stored the created nodes in mySphere&lt;br /&gt;print mySphere&lt;br /&gt;&amp;gt;&amp;gt;[u'pSphere1', u'polySphere1']&lt;br /&gt;&lt;/pre&gt;These are some of the most simple, essential commands that even non programmers should know.  You will return to these time and time again.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ls&lt;/li&gt;&lt;li&gt;select&lt;/li&gt;&lt;li&gt;delete&lt;/li&gt;&lt;li&gt;listAttr&lt;/li&gt;&lt;li&gt;setAttr&lt;/li&gt;&lt;li&gt;listConnections&lt;/li&gt;&lt;li&gt;listRelatives&lt;/li&gt;&lt;li&gt;nodeType&lt;/li&gt;&lt;li&gt;undo&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Example:&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;import maya.cmds as cmds&lt;br /&gt;stepTransforms=[]&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;#a python array&lt;br /&gt;for i in xrange(50):&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;#loop this code block 50 times&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; currentStep=cmds.polyCube(width=6, height=.2, depth=1, name="step%s" %i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmds.xform(currentStep, translation=[0,float(i)/5,0], rotation=[0,i*10,0])&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; stepTransform, stepMesh=currentStep&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #unpack the polyCube result into transforms and meshes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; stepTransforms.append(stepTransform)&lt;br /&gt;cmds.group(stepTransforms, name="stairs")&lt;br /&gt;&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_5yvxVvNYNnM/TGZKK7fGr5I/AAAAAAAAAPc/j0O5jUVpPkU/s1600/stairs.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_5yvxVvNYNnM/TGZKK7fGr5I/AAAAAAAAAPc/j0O5jUVpPkU/s320/stairs.png" /&gt;&lt;/a&gt;&lt;/div&gt;Writing Python procedures for Maya doesn't get much more complicated than that.&amp;nbsp; Play around with different commands, and remember the docs have examples on nearly everything.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3870624054528827727-8816843747406372259?l=cgtd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/8816843747406372259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/8816843747406372259'/><link rel='alternate' type='text/html' href='http://cgtd.blogspot.com/2010/08/basic-python-in-maya.html' title='Basic Python in Maya'/><author><name>Paul Sultan</name><uri>http://www.blogger.com/profile/01859669861208266768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_5yvxVvNYNnM/TGZKK7fGr5I/AAAAAAAAAPc/j0O5jUVpPkU/s72-c/stairs.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-3870624054528827727.post-6253511555645824646</id><published>2010-08-08T01:55:00.000-07:00</published><updated>2010-08-23T12:51:47.241-07:00</updated><title type='text'>Getting Started</title><content type='html'>Lets get started with an into to scripting in Maya.&amp;nbsp; &lt;br /&gt;Start off by opening the script editor: Windows &amp;gt; General &amp;gt; Script Editor&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_5yvxVvNYNnM/TF-w4CMgRnI/AAAAAAAAAN8/kPLlhQx1HwA/s1600/helloWorld.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_5yvxVvNYNnM/TF-w4CMgRnI/AAAAAAAAAN8/kPLlhQx1HwA/s320/helloWorld.png" /&gt;&lt;/a&gt;&lt;/div&gt;You should also always have the API open at the same time:&amp;nbsp; In the Maya Docs go to Technical Documentation &amp;gt; CommandsPython.&amp;nbsp; Now, if your new to scripting by thankful your starting off in Maya.&amp;nbsp; The documentation and interpreter feedback are the best in the business.&amp;nbsp; 90% of Maya's commands are echoed after execution and the API is extremely well documented.&amp;nbsp; All the commands have examples, and are both searchable and categorized. Luckily, &lt;i&gt;Maya Scripting&lt;/i&gt; IS NOT a two bit chapter in a thousand page pdf manual, more on those programs later.&lt;br /&gt;&lt;br /&gt;You could start off in MEL.&amp;nbsp; There are plenty of advantages in doing so:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;No need to import commands&lt;/li&gt;&lt;li&gt;Automatic sourcing &lt;/li&gt;&lt;li&gt;Maya's feedback is all in MEL&amp;nbsp;&lt;/li&gt;&lt;li&gt;Unicode support&lt;/li&gt;&lt;li&gt;Maya ASCII is all in MEL&lt;/li&gt;&lt;li&gt;Expressions, Render Options, and many nodes except MEL directly&lt;/li&gt;&lt;/ul&gt;However, whenever possible I will be making my scripts in Python.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Extremely expandable using modules.&amp;nbsp; NumPy, Django,...&lt;/li&gt;&lt;li&gt;Extensive UI development.&amp;nbsp; wxPython, PyQT&lt;/li&gt;&lt;li&gt;Compatible with many other CG applications.&amp;nbsp; Nuke, Houdini, Realflow, XSI, ...&lt;/li&gt;&lt;li&gt;Syntax highlighting/decoration.&lt;/li&gt;&lt;li&gt;Object Oriented. &lt;/li&gt;&lt;li&gt;Easily readable.&amp;nbsp; NO ; $ ` required.&lt;/li&gt;&lt;/ul&gt;&amp;nbsp;In either the MEL or Python tab type:&lt;br /&gt;&lt;pre class="brush: python; toolbar: false;"&gt;print "Hello World" &lt;br /&gt;&amp;gt;&amp;gt;Hello World&lt;br /&gt;&lt;/pre&gt;To execute your code it is best to highlight the portion you want to run, then hit Control+Enter.&amp;nbsp; Maya's interpreter will return Hello World and you have completed your first script.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3870624054528827727-6253511555645824646?l=cgtd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/6253511555645824646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3870624054528827727/posts/default/6253511555645824646'/><link rel='alternate' type='text/html' href='http://cgtd.blogspot.com/2010/08/getting-started.html' title='Getting Started'/><author><name>Paul Sultan</name><uri>http://www.blogger.com/profile/01859669861208266768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_5yvxVvNYNnM/TF-w4CMgRnI/AAAAAAAAAN8/kPLlhQx1HwA/s72-c/helloWorld.png' height='72' width='72'/></entry></feed>
