<p>在发布了我之前的答案后,我在玛雅偶然发现了一个意想不到的行为。在</p>
<p>我发现,当我尝试从“Hypershade”窗口中选择一个shadingEngine节点(着色组节点)时,会在“属性编辑器”(attribute editor)中获得着色引擎属性,如下所示:
<a href="https://i.stack.imgur.com/5J1DI.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/5J1DI.png" alt="Shading Group Node selected in Hypershade Window"/></a></p>
<p>现在,如果单击“属性编辑器”(Attribute Editor)底部的“选择”(Select)按钮实际尝试并选择该着色器引擎节点,则会得到以下结果:
<a href="https://i.stack.imgur.com/uxzsF.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/uxzsF.png" alt="Selecting the Shading Group Node with code and inside Attribute Editor selects the assigned meshes!"/></a></p>
<p>实际上,Maya继续为我们选择了指定的网格对象。在</p>
<p>所以我试着用这一行代码做同样的事情:</p>
<p><code>select('aiHeiyuVarABelts2Shader', replace=True)</code></p>
<p>实际上,Maya继续并选择了着色器指定给的那些完全相同的网格节点。在</p>
<p>这正是我之前答案中的测试场景。在我之前的代码中,listConnections()返回连接到shadingenengine节点的变换节点列表,使用上面的两种新方法选择shadingenengine节点,Maya实际上为我们选择了网格对象。在</p>
<p>因此,利用这种看似不一致的行为,我可以修改我的代码,以明确地得到你所要求的网格的列表。在</p>
<pre><code>for shEngine in ls(type='shadingEngine'):
select(shEngine, replace=True)
print 'shading engine:', shEngine
for connection in ls(sl=True):
print '->', connection, '(%s)' % nodeType(connection)
print ''
</code></pre>
<p>在我上一次回复中的同一个示例场景中运行此程序,我得到:</p>
^{pr2}$
<p>现在代码变短了,所有选定的对象都是单独的网格对象。在</p>
<p>若要获取连接到shadingene节点的着色器节点/曲面材质,可以使用:</p>
<p><code>listConnections(shadingEngineNode, type=['shadingDependNode', 'THdependNode'])</code></p>
<p>就我个人而言,我倾向于远离这种方法,因为我觉得它并不优雅,必须依赖<code>select()</code>,然后是<code>ls(sl=True)</code>函数来检索选定的对象。在</p>
<p>我是偏执狂吗?使用这种方法,我也会感到不安全,总是担心Maya是否会在将来的版本中继续支持这种行为。在</p>
<p>我刚刚在玛雅2014年和玛雅2016年测试过这个。代码在两个版本中的工作方式完全相同。在</p>
<p>底线是,它起作用了。如果您愿意,请随时使用它:)</p>
<p><strong>编辑:</strong>
在进行了更多的挖掘和搜索之后,我意识到shadingEngine是objectSet的一个子类。当我们处理集合(选择集、渲染集、灯光链接集、变形器成员身份集等)时,这种“意外行为”实际上是一种标准的Maya行为。在</p>
<p>因此,我们可以直接使用<code>sets(setName, q=True)</code>来查询集合成员。与上面提到的依赖于<code>select()</code>命令,然后查询选择以获取集合成员的方法相比,这种方法更加合理、优雅和快速。在</p>
<p>下面是最后一段代码:</p>
<pre><code>from pymel.core import *
for shEngine in ls(type='shadingEngine'):
print 'shading engine:', shEngine
for connection in sets(shEngine,q=True):
print '\t->', connection, '(%s)' % nodeType(connection)
print ''
</code></pre>