0

我遇到一个问题,当从辅助函数中调用时,由 MDataHandle.data() 返回的 MObject 是空指针。

我有一个带有几个通用属性(支持 kDouble、k3Double 和 k3Float)的自定义节点,需要根据它们是简单的数字数据还是数组数据来进行不同的处理。我在自定义节点类中创建了一个定义为 @classmethod 的辅助函数,用于根据需要从通用属性中提取数据。将适当属性的 MDataHandle 传递给函数(传递 MDataBlock 会更好吗?),并使用 isGeneric() 检查属性。如果发现它是非数字的(在本例中为数组),则调用 MDataHandle.data() 函数以获取 MObject 以附加到 MFnNumericData 对象,这就是问题出现的地方。

@classmethod
def getDataHandleValue(obj, dataHandle):

    print 'getDataHandleValue called'  # DEBUG

    # Script util objects for creating pointers
    isNumericUtil = OpenMaya.MScriptUtil(False)
    isNullUtil = OpenMaya.MScriptUtil(False)

    isNumericPtr = isNumericUtil.asBoolPtr()
    isNullPtr = isNullUtil.asBoolPtr()

    if dataHandle.isGeneric(isNumericPtr, isNullPtr):

        if isNumericUtil.getBool(isNumericPtr):

            print 'Generic data is numeric'  # DEBUG

            return dataHandle.asGenericDouble()

        else:

            print 'Generic data is not numeric'  # DEBUG

            dataObj = dataHandle.data()

            print 'Got data object'  # DEBUG

            nDataFn = OpenMaya.MFnNumericData()

            print 'Attempting to set object...'  # DEBUG
            nDataFn.setObject(dataObj)

            val0 = 0.0
            val1 = 0.0
            val2 = 0.0

            print [val0, val1, val2]  # DEBUG

            nDataFn.getData3Double(val0, val1, val2)

            return [val0, val1, val2]

    else:

        raise ValueError('Data handle to non-generic attribute')

当我尝试通过从 MDataHandle.data() 传递 MObject 来创建函数集时,我得到一个空指针错误......

我想知道是否存在某种范围问题,因为文档中提到 MDataBlock 仅在节点的计算功能期间有效,但我认为在计算功能中运行的辅助函数是可以的。

任何帮助将非常感激。谢谢!

更新:看起来我的问题可能是通用属性尚未初始化为默认值,因此,该属性的数据句柄是一个空指针。如果是这样,为通用属性设置默认值的最佳方法是什么?

4

1 回答 1

0

据我所知,将 MDataHandle 获取到尚未使用某些值初始化的通用属性会导致返回 Null 指针。

于 2017-06-21T19:09:51.527 回答