Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Maya/Python中隐藏未选定项_Python_Maya - Fatal编程技术网

在Maya/Python中隐藏未选定项

在Maya/Python中隐藏未选定项,python,maya,Python,Maya,我在Maya中尝试了一段时间来解决这个问题: 例如,我想要一个可以隐藏我未选择的灯光的脚本,所以我想到的唯一不起作用的方法是: lt=cmds.ls(lt=True,sl=False) cmds.hide(lt) 我看到选择的参数False不起作用,所以我想了解其他一些方法…感谢阅读,它似乎既没有lt参数也没有sl参数,尽管它有灯光和选择 此外,选择参数似乎只用于返回所选参数,而不是过滤未选择的参数。 OTOH,hide方法接受一个参数 试试这个: lights= set(cmds.ls(li

我在Maya中尝试了一段时间来解决这个问题: 例如,我想要一个可以隐藏我未选择的灯光的脚本,所以我想到的唯一不起作用的方法是:

lt=cmds.ls(lt=True,sl=False)
cmds.hide(lt)
我看到选择的参数False不起作用,所以我想了解其他一些方法…感谢阅读,它似乎既没有lt参数也没有sl参数,尽管它有灯光和选择

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

试试这个:

lights= set(cmds.ls(lights=True)) - set(cmds.ls(selection=True))
for light in lights:
    cmds.hide(light)
读取时,它似乎既没有lt参数也没有sl参数,尽管它有灯光和选择

此外,选择参数似乎只用于返回所选参数,而不是过滤未选择的参数。 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)

这对你的情况有效

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)

@如果选择灯光形状,但不选择其变换,则“goncalops答案”将起作用

尝试:


@如果选择灯光形状,但不选择其变换,则“goncalops答案”将起作用

尝试:


我认为大多数答案都涉及到工程土地。问题是如何在操作结束时隐藏未选定的灯光,没有任何说明您无法将它们全部隐藏并将选定的灯光恢复。因此,从概念上讲,更容易做到,速度稍微快一点,但这与问题无关:

cmds.hide(cmds.ls(lights=True, dag=True))
cmds.showHidden()
一条评论:在这种情况下,不需要单独获取形状,因为它有一个dag标志。请参见概念上的Maya项目分别是变换和形状的数据包。但是,它非常常见,以至于您希望在图形和dag之间转换为图形,因此ls提供了一种使用dag和shapes标志进行转换的方法

第二条注释:如果不将列表传递给Maya,它将对选择进行操作,这就是showHidden在没有任何数据的情况下工作的原因


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

我认为大多数答案都涉及到工程领域。问题是如何在操作结束时隐藏未选定的灯光,没有任何说明您无法将它们全部隐藏并将选定的灯光恢复。因此,从概念上讲,更容易做到,速度稍微快一点,但这与问题无关:

cmds.hide(cmds.ls(lights=True, dag=True))
cmds.showHidden()
一条评论:在这种情况下,不需要单独获取形状,因为它有一个dag标志。请参见概念上的Maya项目分别是变换和形状的数据包。但是,它非常常见,以至于您希望在图形和dag之间转换为图形,因此ls提供了一种使用dag和shapes标志进行转换的方法

第二条注释:如果不将列表传递给Maya,它将对选择进行操作,这就是showHidden在没有任何数据的情况下工作的原因


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

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

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

当我们执行cmds.lstype='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节点类型,该节点类型能够在场景中具有父节点,代码将正常工作

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


隐藏选定的“摄像头”

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

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

当我们执行cmds.lstype='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节点类型,该节点类型能够在场景中具有父节点,代码将正常工作

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


隐藏选定的“摄影机”

lt是灯光的缩写,sl是选择的缩写…无论如何,如果我按照您所写的方式进行操作,它会隐藏场景中的所有灯光…感谢ReplyValue错误:没有对象与名称匹配:set[u'pointLightShape3',u'pointLightShape2',u'pointLightShape1']可能隐藏使用对象名称,不是对象名称的列表setcmds.lslights=True-setcmds.lsselection=True这一个根本不做减号,当我打印灯号时,它返回所有lightsls-type light返回形状;ls-sl返回所选内容,这通常意味着转换。这些列表不会相交。lt是灯光的缩写,sl是选择的缩写…无论如何,如果我按照您所写的方式进行操作,它会隐藏场景中的所有灯光…感谢ReplyValue错误:没有对象匹配名称:set[u'pointLightShape3',u'pointLightShape2',u'pointLightShape1']可能隐藏使用对象名称,不是对象名称的列表setcmds.lslights=True-setcmds.lsselection=True这一个根本不做减号,当我打印灯号时,它返回所有lightsls-type light返回形状;ls-sl返回所选内容,这通常意味着转换。这些列表不会相交。ls-lights-dag不够吗?不管怎样,最好的答案是3。ls-lights-dag还不够吗?不管怎样,最好的答案是3。@user2824004您应该接受其中一个答案,也可以投票赞成并投票赞成任何有用的答案。在评论中致谢是可选的,向上投票是回答者的目标。@user2824004您应该接受其中一个答案,也可以向上投票并向上投票任何有用的答案。在评论中致谢是可选的,投票是回答者们的目标。