我遇到一个问题,当从辅助函数中调用时,由 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 仅在节点的计算功能期间有效,但我认为在计算功能中运行的辅助函数是可以的。
任何帮助将非常感激。谢谢!
更新:看起来我的问题可能是通用属性尚未初始化为默认值,因此,该属性的数据句柄是一个空指针。如果是这样,为通用属性设置默认值的最佳方法是什么?