[英]How to show/hide items(?) in active view on maya with 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命令的文档 ,尽管它具有lights
和selection
,但似乎没有lt
或sl
参数。
此外,似乎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提供了一种使用dag和shape标志来实现此目的的方法。
第二条评论:如果不将列表传递给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.