繁体   English   中英

在Maya / Python中隐藏未选择的

[英]Hide unselected in Maya/Python

我想花点时间在Maya中进行整理:我想要一个脚本,例如可以隐藏我未选择的灯光,所以想到的唯一方法(不起作用)是:

lt=cmds.ls(lt=True,sl=False)
cmds.hide(lt)

我看到带有选择的False参数不起作用,所以我想了解其他方法...谢谢

如果选择了灯光形状 ,而不是它们的变换,则@goncalops答案将起作用。

尝试:

lights = cmds.ls(type = 'light') or []
lights = set(cmds.listRelatives(*lights, p=True) or [])
for item in lights.difference(set(cmds.ls(sl=True))):
    cmds.hide(item)

阅读Maya 2011中ls命令文档 ,尽管它具有lightsselection ,但似乎没有ltsl参数。

此外,似乎selection参数仅用于返回选择的参数,而不是过滤未选择的参数。 OTOH, hide方法接受一个参数。

尝试这个:

lights= set(cmds.ls(lights=True)) - set(cmds.ls(selection=True))
for light in lights:
    cmds.hide(light)

这将适合您的情况

hide_light = set(cmds.ls(lights=True, l=True)) -  set(cmds.ls(sl=True, dag=True, l=True, leaf=True))
for each_lit in hide_light:
    cmds.setAttr("%s.visibility" % each_lit, 0)

我认为大多数答案都涉及到工程领域。 问题是如何在操作结束时隐藏未选中的灯,没有什么可以说不能隐藏所有这些并把选中的灯带回去。 因此,从概念上讲,这样做比较容易(并且速度稍快,但这是不重要的):

cmds.hide(cmds.ls(lights=True, dag=True))
cmds.showHidden()

一个评论:在这种情况下,无需单独获取形状,因为它具有dag标志。 从概念上看,Maya项目分别是变换包和形状包。 但是,它如此普遍,您想要在shape和dag之间转换为ls,因此ls提供了一种使用dagshape标志来实现此目的的方法。

第二条评论:如果不将列表传递给Maya,它将在选择上起作用,这就是为什么showHidden可以在没有任何数据的情况下工作的原因。

PS:从概念上讲,我的答案和@theodox答案在所有情况下均不起作用,因为您可能确实选择了形状。 但是大多数用户不会,因此通常会以这种方式工作。

让我们讨论一下这个问题:

有几件事要考虑。 当用户选择光源(从视口或大纲视图)时,大多数情况下,他们实际上是在选择光源的变换节点。

当我们执行cmds.ls(type='lights') ,实际上是在选择它们的形状节点 这与@theodox所说的一致。

我不了解您,但是当我手动隐藏灯光时,我在“大纲视图” /“视口”中选择了灯光。 当我隐藏它们(ctrl-h)时,它们在大纲视图中显示为灰色。 我所做的是隐藏了它们的变换节点(而不是形状节点)。

为了使事情变得更复杂,Maya实际上还允许我们隐藏形状节点。 但是,当隐藏形状节点时,变换节点不会变灰。

想象一下,如果我的脚本要隐藏光源形状节点,则在“大纲视图”中,如果没有将“大纲视图”设置为显示形状节点(这是“大纲视图”中的默认设置),则不会显示这些光源被隐藏。 如果没有用灰色表示灯光是隐藏的,那么许多艺术家(尤其是经验不足的艺术家)会假设在灯光已被禁用和隐藏时打开了灯光。 这将造成很多混乱,浪费时间,沮丧,这基本上不是我们想要的。

因此,当我编写这样的脚本时,我希望用户选择转换节点。 同样,当我隐藏灯光时,我将隐藏灯光的变换节点,而不是直接隐藏灯光形状。 那是我的游戏计划。

import maya.cmds as mc
def hideDeselected(targetNodeType):
    # selectedNodeTransforms will contain transform nodes 
    # of all target node type shapes that are selected
    selectedNodeTransforms = []
    for selNode in mc.ls(sl=True):
        if targetNodeType in mc.nodeType(selNode):
            # selected node is the correct type
            # add the transform node to selectedNodeTransforms
            selectedNodeTransforms.append(mc.listRelatives(selNode, parent=True))
        elif mc.listRelatives(selNode, children=True, type=targetNodeType):
            # selected node is a transform node 
            # with a child node of the correct type
            # add the transform node to selectedNodeTransforms
            selectedNodeTransforms.append(selNode)

    if selectedNodeTransforms:
        # only if something is selected, do the hiding thing.
        # If we do not do this check, and if nothing is selected
        # all transform nodes of targetNodeType will be hidden
        print 'selected objects:',selectedNodeTransforms
        for thisNode in mc.ls(type=targetNodeType): 
            # loops through all target shapes in the scene
            # get the transform node
            thisNodeTransform = mc.listRelatives(thisNode, parent=True)[0]
            if not thisNodeTransform in selectedNodeTransforms:
                print 'hiding', thisNodeTransform
                hide(thisNodeTransform)
    else:
        print 'nothing is selected'
hideDeselected('light')

在上面的代码中,我已经从中创建了一个函数,因此我们可以传入可以在场景中具有父级的任何dag节点类型,并且代码可以正常工作。

因此,要隐藏场景中当前未选择的所有其他摄像机,我们只需要使用camera节点类型调用该函数:

hideDeselected('camera')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM