<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Samiam's Scribble Pad &#187; Maya API Python</title>
	<atom:link href="http://www.hodge.net.au/sam/blog/tag/maya-api-python/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.hodge.net.au/sam/blog</link>
	<description>Random Thoughts of Sam Hodge, about Life, Art and Technology</description>
	<lastBuildDate>Mon, 01 Dec 2025 07:20:55 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Maya Python API Learning Example, inMesh -&gt; outMesh</title>
		<link>http://www.hodge.net.au/sam/blog/2010/01/10/maya-python-api-learning-example-inmesh-outmesh/</link>
		<comments>http://www.hodge.net.au/sam/blog/2010/01/10/maya-python-api-learning-example-inmesh-outmesh/#comments</comments>
		<pubDate>Sun, 10 Jan 2010 11:53:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Feather System]]></category>
		<category><![CDATA[Maya API Python]]></category>
		<category><![CDATA[OpenMaya]]></category>

		<guid isPermaLink="false">http://www.hodge.net.au/sam/blog/?p=156</guid>
		<description><![CDATA[I made my first attempt at playing with the Maya API using Python as my C++ is still too sketchy, and doing stuff in python is far quicker, no need to reload Maya. Anyway the example is lifted from the animCubeNode.py from the maya dev kit I just added a new input plug. The intention [...]]]></description>
				<content:encoded><![CDATA[<p>I made my first attempt at playing with the Maya API using Python as my C++ is still too sketchy, and doing stuff in python is far quicker, no need to reload Maya.</p>
<p>Anyway the example is lifted from the animCubeNode.py from the maya dev kit</p>
<p>I just added a new input plug.</p>
<p>The intention is to add three mesh inputs, and output a final mesh using thier properties as a feather/scale system:</p>
<ol>
<li>feather/scale geo mesh, to define shape of scales geometry</li>
<li>skin mesh, to define UV, P and N</li>
<li>feather layout mesh, to define a vert for each quill, in proximity to the skin mesh</li>
</ol>
<p>This way you can simply use mesh editing tools to determine a placement of feathers and scales. I am still n00bing it up for now, but the maths should be fairly straight forward, cross products and barycentric coordinates should be as hardcore as it gets for now.</p>
<p>Adding a few mappable inputs should get interesting to control: scale and rotation.</p>
<p>Anyway this is the first step, if I do it outside of working hours it will appear here.</p>
<p>here are some links that helped me out on the learning curve:</p>
<ul>
<li><a href="http://www.rtrowbridge.com/blog/2009/02/15/maya-api-docs-demystified-for-python-users/">Ryan Trowbridge&#8217;s Guide to the API and Python</a></li>
<li><a href="http://download.autodesk.com/us/maya/2009help/API/hierarchy.html">The Maya API Class Heirarchy Docs</a></li>
<li><a href="http://download.autodesk.com/media/adn/DevTV_Introduction_to_Maya_Dependency_Graph_Programming.zip">DevTV about the Maya&#8217;s Dependancy Graph</a></li>
</ul>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#Sam Hodge's Lame Scripted Plugin</span>
&nbsp;
<span style="color: #483d8b;">&quot;&quot;&quot;
#TEST turn a pipe into a cube
import os
import maya
&nbsp;
&nbsp;
devPath = &quot;/home/samh/dev&quot;
&nbsp;
maya.cmds.file(new=True,force=True)
&nbsp;
for i in os.environ:
	if &quot;MAYA&quot; and &quot;PLUG&quot; in i:
		if devPath not in os.environ[i]:
			os.environ[i] =  &quot;%s:%s&quot; % (devPath ,os.environ[i])
			print &quot;Setup Dev: %s : %s&quot; % (i,os.environ[i])
		print &quot;Settings: %s : %s&quot; % (i,os.environ[i])
&nbsp;
maya.cmds.unloadPlugin(&quot;duplicator.py&quot;)
maya.cmds.loadPlugin(&quot;duplicator.py&quot;)
&nbsp;
&nbsp;
&nbsp;
cubeTrans = maya.cmds.polyCube(ch=0,o=1,w=12.380629,h=9.432578,d=7.009036,cuv=4)[0]
maya.cmds.createNode(&quot;shDuplicator&quot;)
pipeTrans = maya.cmds.polyPipe(ch=0,o=1,r=10.80581,h=22.165043)[0]
maya.cmds.connectAttr(&quot;pCubeShape1.outMesh&quot;,&quot;shDuplicator1.inputMesh&quot;,force=True)
maya.cmds.connectAttr(&quot;shDuplicator1.outputMesh&quot;,&quot;pPipeShape1.inMesh&quot;,force=True)
&quot;&quot;&quot;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">import</span> maya.<span style="color: black;">OpenMaya</span> <span style="color: #ff7700;font-weight:bold;">as</span> OpenMaya
<span style="color: #ff7700;font-weight:bold;">import</span> maya.<span style="color: black;">OpenMayaMPx</span> <span style="color: #ff7700;font-weight:bold;">as</span> OpenMayaMPx
&nbsp;
kPluginNodeName <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;shDuplicator&quot;</span>
kPluginNodeId <span style="color: #66cc66;">=</span> OpenMaya.<span style="color: black;">MTypeId</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0x8700B</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> meshReplicator<span style="color: black;">&#40;</span>OpenMayaMPx.<span style="color: black;">MPxNode</span><span style="color: black;">&#41;</span>:
	inputMesh <span style="color: #66cc66;">=</span> OpenMaya.<span style="color: black;">MObject</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	outputMesh <span style="color: #66cc66;">=</span> OpenMaya.<span style="color: black;">MObject</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		OpenMayaMPx.<span style="color: black;">MPxNode</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> dupeMesh<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> inMesh<span style="color: #66cc66;">,</span> outData<span style="color: black;">&#41;</span>:
		OpenMaya.<span style="color: black;">MFnMesh</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: #dc143c;">copy</span><span style="color: black;">&#40;</span>inMesh<span style="color: #66cc66;">,</span>outData<span style="color: black;">&#41;</span>
		meshFS <span style="color: #66cc66;">=</span> OpenMaya.<span style="color: black;">MFnMesh</span><span style="color: black;">&#40;</span>inMesh<span style="color: black;">&#41;</span>
		<span style="color: #808080; font-style: italic;">#Comment this out to hush the noise</span>
		<span style="color: #dc143c;">sys</span>.<span style="color: black;">stderr</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Edge Count :&quot;</span> + <span style="color: #dc143c;">repr</span><span style="color: black;">&#40;</span>meshFS.<span style="color: black;">numEdges</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>+<span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span>
		<span style="color: #dc143c;">sys</span>.<span style="color: black;">stderr</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Vert Count :&quot;</span> + <span style="color: #dc143c;">repr</span><span style="color: black;">&#40;</span>meshFS.<span style="color: black;">numVertices</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>+<span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span>
		<span style="color: #dc143c;">sys</span>.<span style="color: black;">stderr</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Poly Count :&quot;</span> + <span style="color: #dc143c;">repr</span><span style="color: black;">&#40;</span>meshFS.<span style="color: black;">numPolygons</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>+<span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">return</span> meshFS
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> compute<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> plug<span style="color: #66cc66;">,</span> data<span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">if</span> plug <span style="color: #66cc66;">==</span> meshReplicator.<span style="color: black;">outputMesh</span>:
			inputData <span style="color: #66cc66;">=</span> data.<span style="color: black;">inputValue</span><span style="color: black;">&#40;</span>meshReplicator.<span style="color: black;">inputMesh</span><span style="color: black;">&#41;</span>
			inMesh <span style="color: #66cc66;">=</span> inputData.<span style="color: black;">data</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
			<span style="color: #dc143c;">sys</span>.<span style="color: black;">stderr</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span>inMesh.<span style="color: black;">apiTypeStr</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span>
			outputHandle <span style="color: #66cc66;">=</span> data.<span style="color: black;">outputValue</span><span style="color: black;">&#40;</span>meshReplicator.<span style="color: black;">outputMesh</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
			dataCreator <span style="color: #66cc66;">=</span> OpenMaya.<span style="color: black;">MFnMeshData</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
			newOutputData <span style="color: #66cc66;">=</span> dataCreator.<span style="color: black;">create</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
			<span style="color: #008000;">self</span>.<span style="color: black;">dupeMesh</span><span style="color: black;">&#40;</span>inMesh<span style="color: #66cc66;">,</span> newOutputData<span style="color: black;">&#41;</span>
			outputHandle.<span style="color: black;">setMObject</span><span style="color: black;">&#40;</span>newOutputData<span style="color: black;">&#41;</span>
			data.<span style="color: black;">setClean</span><span style="color: black;">&#40;</span>plug<span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">else</span>:
			<span style="color: #ff7700;font-weight:bold;">return</span> OpenMaya.<span style="color: black;">kUnknownParameter</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> nodeCreator<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">return</span> OpenMayaMPx.<span style="color: black;">asMPxPtr</span><span style="color: black;">&#40;</span> meshReplicator<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> nodeInitializer<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
	inTypedAttr <span style="color: #66cc66;">=</span> OpenMaya.<span style="color: black;">MFnTypedAttribute</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	outTypedAttr <span style="color: #66cc66;">=</span> OpenMaya.<span style="color: black;">MFnTypedAttribute</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
	meshReplicator.<span style="color: black;">inputMesh</span> <span style="color: #66cc66;">=</span> inTypedAttr.<span style="color: black;">create</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;inputMesh&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">&quot;in&quot;</span><span style="color: #66cc66;">,</span> OpenMaya.<span style="color: black;">MFnData</span>.<span style="color: black;">kMesh</span><span style="color: black;">&#41;</span>
	meshReplicator.<span style="color: black;">outputMesh</span> <span style="color: #66cc66;">=</span> outTypedAttr.<span style="color: black;">create</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;outputMesh&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">&quot;out&quot;</span><span style="color: #66cc66;">,</span> OpenMaya.<span style="color: black;">MFnData</span>.<span style="color: black;">kMesh</span><span style="color: black;">&#41;</span>
&nbsp;
	meshReplicator.<span style="color: black;">addAttribute</span><span style="color: black;">&#40;</span>meshReplicator.<span style="color: black;">inputMesh</span><span style="color: black;">&#41;</span>
	meshReplicator.<span style="color: black;">addAttribute</span><span style="color: black;">&#40;</span>meshReplicator.<span style="color: black;">outputMesh</span><span style="color: black;">&#41;</span>
&nbsp;
	meshReplicator.<span style="color: black;">attributeAffects</span><span style="color: black;">&#40;</span>meshReplicator.<span style="color: black;">inputMesh</span><span style="color: #66cc66;">,</span> meshReplicator.<span style="color: black;">outputMesh</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;"># initialize the script plug-in</span>
<span style="color: #ff7700;font-weight:bold;">def</span> initializePlugin<span style="color: black;">&#40;</span>mobject<span style="color: black;">&#41;</span>:
	mplugin <span style="color: #66cc66;">=</span> OpenMayaMPx.<span style="color: black;">MFnPlugin</span><span style="color: black;">&#40;</span>mobject<span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">try</span>:
		mplugin.<span style="color: black;">registerNode</span><span style="color: black;">&#40;</span> kPluginNodeName<span style="color: #66cc66;">,</span> kPluginNodeId<span style="color: #66cc66;">,</span> nodeCreator<span style="color: #66cc66;">,</span> nodeInitializer<span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">except</span>:
		<span style="color: #dc143c;">sys</span>.<span style="color: black;">stderr</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span> <span style="color: #483d8b;">&quot;Failed to register node: %s&quot;</span> % kPluginNodeName <span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">raise</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># uninitialize the script plug-in</span>
<span style="color: #ff7700;font-weight:bold;">def</span> uninitializePlugin<span style="color: black;">&#40;</span>mobject<span style="color: black;">&#41;</span>:
	mplugin <span style="color: #66cc66;">=</span> OpenMayaMPx.<span style="color: black;">MFnPlugin</span><span style="color: black;">&#40;</span>mobject<span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">try</span>:
		mplugin.<span style="color: black;">deregisterNode</span><span style="color: black;">&#40;</span> kPluginNodeId <span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">except</span>:
		<span style="color: #dc143c;">sys</span>.<span style="color: black;">stderr</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span> <span style="color: #483d8b;">&quot;Failed to deregister node: %s&quot;</span> % kPluginNodeName <span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">raise</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.hodge.net.au/sam/blog/2010/01/10/maya-python-api-learning-example-inmesh-outmesh/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
