Python “一个对象是”意味着什么;“在黑社会?”;

Python “一个对象是”意味着什么;“在黑社会?”;,python,compiler-errors,maya,Python,Compiler Errors,Maya,我有以下代码: def block_stacks(num): stack = cmds.group(empty=True, name='Stacks#') size = num for var in range(num): i = 0 r_rot = random.uniform(0,359) block = cmds.polyCube(h=0.5, w=0.5, d=0.5, name='block#')

我有以下代码:

def block_stacks(num):
    stack = cmds.group(empty=True, name='Stacks#')
    size = num
    for var in range(num):
        i = 0
        r_rot = random.uniform(0,359)
        block = cmds.polyCube(h=0.5, w=0.5, d=0.5, name='block#')
        cmds.parent(block, stack)
        cmds.move(0, 5.38 + i, 0, 'block*')
        cmds.rotate(0, r_rot, 0, 'block*')
        rR= random.uniform(0, 1.0)
        rG= random.uniform(0, 1.0)
        rB= random.uniform(0, 1.0)
        cmds.polyColorPerVertex('block*', rgb=[rR,rG,rB], cdo = True)
        i+=0.5

block_stacks(5)
在Maya的脚本编辑器中。当我运行它时,随机旋转和随机颜色工作良好,块放置在正确的位置,但它只创建了1个块而不是5个块(就像我希望的那样),并说

“警告:无法为地下世界中的组件或对象设置父级。”


多次。我完全不知道这意味着什么,很明显,在整个互联网上,没有任何地方可以回答这个错误到底是什么。当我运行它时,它仍然会创建对象,并且不会给出任何红色错误消息。有人知道这意味着什么吗?为什么它只会使堆栈达到1个块高,而不是应该达到的5个块高?我已经尝试修复这个问题将近2个小时了,现在我几乎筋疲力尽了。

我相信这个错误意味着你不能将dg节点(没有转换的东西)作为dag节点的父节点。例如,尝试将对象集设置为变换的子对象。它不允许您这样做,因为dg节点本身没有变换,不能属于层次结构

现在它给了你这个错误,因为你正在尝试为多维数据集的polyCube输入设置父级,它没有转换!这是偶然发生的,因为您假设
cmds.polyCube
返回多维数据集的转换。事实并非如此。事实上,它返回一个包含两项的列表:多维数据集的转换和多维数据集的多立方体输入。由于
cmds.parent
可以在其第一个参数中接受一个列表,因此您实际上是在尝试将转换和多边形立方体设置为堆栈转换的父级。您可以通过如下方式获取命令的第一个索引来轻松避免此问题:
cmds.polyCube()[0]

另一个问题是所有的立方体都移动到同一个地方。这是因为
i
变量位于for循环内。因此每次迭代
i
都重置为0,而不是递增,因此它们都移动到相同的位置

另一个问题是,在许多命令中,您使用的是
“block*”
。这样做不会引用
block
变量,而是实际获取所有以名称
“block”
开头的转换。实际上,您根本不需要
“*”
,只需传递变量
块即可

考虑到所有这些,下面是工作代码:

import random
import maya.cmds as cmds


def block_stacks(num):
    stack = cmds.group(empty=True, name='Stacks#')
    i = 0  # Need to move this OUT of the loop otherwise it always resets to 0 and all of the blocks will move to the same place.

    for var in range(num):
        r_rot = random.uniform(0,359)
        block = cmds.polyCube(h=0.5, w=0.5, d=0.5, name='block#')[0]  # This command actually returns a list of 2 items, the transform and the polyCube input, so grab the first index.
        cmds.parent(block, stack)
        cmds.move(0, 5.38 + i, 0, block)  # Pass the variable.
        cmds.rotate(0, r_rot, 0, block)
        rR = random.uniform(0, 1.0)
        rG = random.uniform(0, 1.0)
        rB = random.uniform(0, 1.0)
        cmds.polyColorPerVertex(block, rgb=[rR, rG, rB], cdo=True)
        i += 0.5


block_stacks(5)

我相信这个错误意味着不能将dg节点(没有变换的东西)作为dag节点的父节点。例如,尝试将对象集设置为变换的子对象。它不允许您这样做,因为dg节点本身没有变换,不能属于层次结构

现在它给了你这个错误,因为你正在尝试为多维数据集的polyCube输入设置父级,它没有转换!这是偶然发生的,因为您假设
cmds.polyCube
返回多维数据集的转换。事实并非如此。事实上,它返回一个包含两项的列表:多维数据集的转换和多维数据集的多立方体输入。由于
cmds.parent
可以在其第一个参数中接受一个列表,因此您实际上是在尝试将转换和多边形立方体设置为堆栈转换的父级。您可以通过如下方式获取命令的第一个索引来轻松避免此问题:
cmds.polyCube()[0]

另一个问题是所有的立方体都移动到同一个地方。这是因为
i
变量位于for循环内。因此每次迭代
i
都重置为0,而不是递增,因此它们都移动到相同的位置

另一个问题是,在许多命令中,您使用的是
“block*”
。这样做不会引用
block
变量,而是实际获取所有以名称
“block”
开头的转换。实际上,您根本不需要
“*”
,只需传递变量
块即可

考虑到所有这些,下面是工作代码:

import random
import maya.cmds as cmds


def block_stacks(num):
    stack = cmds.group(empty=True, name='Stacks#')
    i = 0  # Need to move this OUT of the loop otherwise it always resets to 0 and all of the blocks will move to the same place.

    for var in range(num):
        r_rot = random.uniform(0,359)
        block = cmds.polyCube(h=0.5, w=0.5, d=0.5, name='block#')[0]  # This command actually returns a list of 2 items, the transform and the polyCube input, so grab the first index.
        cmds.parent(block, stack)
        cmds.move(0, 5.38 + i, 0, block)  # Pass the variable.
        cmds.rotate(0, r_rot, 0, block)
        rR = random.uniform(0, 1.0)
        rG = random.uniform(0, 1.0)
        rB = random.uniform(0, 1.0)
        cmds.polyColorPerVertex(block, rgb=[rR, rG, rB], cdo=True)
        i += 0.5


block_stacks(5)