def __init__(self, name, solverTypeName, extension, alwaysEval=False): super(SpliceOperator, self).__init__(name) self.solverTypeName = solverTypeName self.extension = extension self.alwaysEval = alwaysEval # This is for Softimage only to force eval. # Load the Fabric Engine client and construct the RTVal for the Solver ks.loadCoreClient() ks.loadExtension('Kraken') if self.extension != 'Kraken': ks.loadExtension(self.extension) self.solverRTVal = ks.constructRTVal(self.solverTypeName) self.args = self.solverRTVal.getArguments('KrakenSolverArg[]') # Initialize the inputs and outputs based on the given args. for i in xrange(len(self.args)): arg = self.args[i] if arg.connectionType == 'in': if str(arg.dataType).endswith('[]'): self.inputs[arg.name] = [] else: self.inputs[arg.name] = None else: if str(arg.dataType).endswith('[]'): self.outputs[arg.name] = [] else: self.outputs[arg.name] = None
def __init__(self, name, solverTypeName, extension): super(KLOperator, self).__init__(name) self.solverTypeName = solverTypeName self.extension = extension # Load the Fabric Engine client and construct the RTVal for the Solver ks.loadCoreClient() ks.loadExtension('Kraken') if self.extension != 'Kraken': ks.loadExtension(self.extension) self.solverRTVal = ks.constructRTVal(self.solverTypeName) self.args = self.solverRTVal.getArguments('KrakenSolverArg[]') # Initialize the inputs and outputs based on the given args. for i in xrange(len(self.args)): arg = self.args[i] argName = arg.name.getSimpleType() argDataType = arg.dataType.getSimpleType() argConnectionType = arg.connectionType.getSimpleType() if argConnectionType == 'In': if argDataType.endswith('[]'): self.inputs[argName] = [] else: self.inputs[argName] = None else: if argDataType.endswith('[]'): self.outputs[argName] = [] else: self.outputs[argName] = None
def __init__(self, name, solverTypeName, extension, metaData=None): super(KLOperator, self).__init__(name, metaData=metaData) self.solverTypeName = solverTypeName self.extension = extension # Load the Fabric Engine client and construct the RTVal for the Solver ks.loadCoreClient() ks.loadExtension('Kraken') if self.extension != 'Kraken': ks.loadExtension(self.extension) self.solverRTVal = ks.constructRTVal( '%s::%s' % (self.extension, self.solverTypeName)) # logger.debug("Creating kl operator object [%s] of type [%s] from extension [%s]:" % (self.getName(), self.solverTypeName, self.extension)) self.args = self.solverRTVal.getArguments('Kraken::KrakenSolverArg[]') # Initialize the inputs and outputs based on the given args. for i in xrange(len(self.args)): arg = self.args[i] argName = arg.name.getSimpleType() argDataType = arg.dataType.getSimpleType() argConnectionType = arg.connectionType.getSimpleType() # Note, do not create empty arrays here as we need to know later whether or not # to create default values if input/output is None if argConnectionType == 'In': self.inputs[argName] = None else: self.outputs[argName] = None
def evaluate(self): """invokes the Canvas node causing the output values to be computed. Returns: bool: True if successful. """ def getRTVal(obj): if isinstance(obj, Object3D): return obj.xfo.getRTVal().toMat44('Mat44') elif isinstance(obj, Attribute): return obj.getRTVal() portVals = [] for port in self.graphDesc['ports']: portName = port['name'] portConnectionType = port['execPortType'] portDataType = port['typeSpec'] if portDataType == '$TYPE$': return if portDataType == 'EvalContext': portVals.append(ks.constructRTVal(portDataType)) continue if portName == 'time': portVals.append(ks.constructRTVal(portDataType)) continue if portName == 'frame': portVals.append(ks.constructRTVal(portDataType)) continue if portConnectionType == 'In': if str(portDataType).endswith('[]'): rtValArray = ks.rtVal(portDataType[:-2]+'Array') rtValArray.resize(len(self.inputs[portName])) for j in xrange(len(self.inputs[portName])): rtValArray[j] = getRTVal(self.inputs[portName][j]) portVals.append(rtValArray) else: portVals.append(getRTVal(self.inputs[portName])) else: if str(portDataType).endswith('[]'): rtValArray = ks.rtVal(portDataType[:-2]+'Array') rtValArray.resize(len(self.outputs[portName])) for j in xrange(len(self.outputs[portName])): rtValArray[j] = getRTVal(self.outputs[portName][j]) portVals.append(rtValArray) else: portVals.append(getRTVal(self.outputs[portName])) host = ks.getCoreClient().DFG.host binding = host.createBindingToPreset(self.canvasPresetPath, portVals) binding.execute() # Now put the computed values out to the connected output objects. def setRTVal(obj, rtval): if isinstance(obj, Object3D): obj.xfo.setFromMat44(Mat44(rtval)) elif isinstance(obj, Attribute): obj.setValue(rtval) for port in self.graphDesc['ports']: portName = port['name'] portConnectionType = port['execPortType'] portDataType = '$TYPE$' if portConnectionType != 'In': outVal = binding.getArgValue(portName) if portDataType.endswith('[]'): for j in xrange(len(outVal)): setRTVal(self.outputs[portName][j], outVal[j]) else: setRTVal(self.outputs[portName], outVal) return True
def evaluate(self): """Invokes the KL operator causing the output values to be computed. Returns: bool: True if successful. """ super(KLOperator, self).evaluate() def getRTVal(obj, asInput=True): if isinstance(obj, Object3D): if asInput: return obj.globalXfo.getRTVal().toMat44('Mat44') else: return obj.xfo.getRTVal().toMat44('Mat44') elif isinstance(obj, Xfo): return obj.getRTVal().toMat44('Mat44') elif isinstance(obj, MathObject): return obj.getRTVal() elif isinstance(obj, Attribute): return obj.getRTVal() elif type(obj) in (int, float, bool, str): return obj def validateArg(rtVal, argName, argDataType): """Validate argument types when passing built in Python types. Args: rtVal (RTVal): rtValue object. argName (str): Name of the argument being validated. argDataType (str): Type of the argument being validated. """ # Validate types when passing a built in Python type if type(rtVal) in (bool, str, int, float): if argDataType in ('Scalar', 'Float32', 'UInt32', 'Integer'): if type(rtVal) not in (float, int): raise TypeError( self.getName() + ".evaluate(): Invalid Argument Value: " + str(rtVal) + " (" + type(rtVal).__name__ + "), for Argument: " + argName + " (" + argDataType + ")") elif argDataType == 'Boolean': if type(rtVal) != bool: raise TypeError( self.getName() + ".evaluate(): Invalid Argument Value: " + str(rtVal) + " (" + type(rtVal).__name__ + "), for Argument: " + argName + " (" + argDataType + ")") elif argDataType == 'String': if type(rtVal) != str: raise TypeError( self.getName() + ".evaluate(): Invalid Argument Value: " + str(rtVal) + " (" + type(rtVal).__name__ + "), for Argument: " + argName + " (" + argDataType + ")") argVals = [] debug = [] for i in xrange(len(self.args)): arg = self.args[i] argName = arg.name.getSimpleType() argDataType = arg.dataType.getSimpleType() argConnectionType = arg.connectionType.getSimpleType() if argDataType == 'EvalContext': argVals.append(ks.constructRTVal(argDataType)) continue if argName == 'time': argVals.append(ks.constructRTVal(argDataType)) continue if argName == 'frame': argVals.append(ks.constructRTVal(argDataType)) continue if argConnectionType == 'In': if str(argDataType).endswith('[]'): rtValArray = ks.rtVal(argDataType) rtValArray.resize(len(self.inputs[argName])) for j in xrange(len(self.inputs[argName])): rtVal = getRTVal(self.inputs[argName][j]) validateArg(rtVal, argName, argDataType[:-2]) rtValArray[j] = rtVal argVals.append(rtValArray) else: rtVal = getRTVal(self.inputs[argName]) validateArg(rtVal, argName, argDataType) argVals.append(rtVal) else: if str(argDataType).endswith('[]'): rtValArray = ks.rtVal(argDataType) rtValArray.resize(len(self.outputs[argName])) for j in xrange(len(self.outputs[argName])): rtVal = getRTVal(self.outputs[argName][j], asInput=False) validateArg(rtVal, argName, argDataType[:-2]) rtValArray[j] = rtVal argVals.append(rtValArray) else: rtVal = getRTVal(self.outputs[argName], asInput=False) validateArg(rtVal, argName, argDataType) argVals.append(rtVal) debug.append({ argName: [{ "dataType": argDataType, "connectionType": argConnectionType }, argVals[-1]] }) try: self.solverRTVal.solve('', *argVals) except: errorMsg = "Possible problem with KL operator '" + \ self.getName() + "' arguments:" print errorMsg pprint.pprint(debug, width=800) raise Exception(errorMsg) # Now put the computed values out to the connected output objects. def setRTVal(obj, rtval): if isinstance(obj, Object3D): obj.xfo.setFromMat44(Mat44(rtval)) elif isinstance(obj, Xfo): obj.setFromMat44(Mat44(rtval)) elif isinstance(obj, Mat44): obj.setFromMat44(rtval) elif isinstance(obj, Attribute): obj.setValue(rtval) else: if hasattr(obj, '__iter__'): print "Warning: Trying to set a KL port with an " + \ "array directly." print "Warning: Not setting rtval: %s\n\tfor output object: \ %s\n\ton port: %s\n\tof KL object: %s\n." % \ (rtval, obj, self.getName()) for i in xrange(len(argVals)): arg = self.args[i] argName = arg.name.getSimpleType() argDataType = arg.dataType.getSimpleType() argConnectionType = arg.connectionType.getSimpleType() if argConnectionType != 'In': if str(argDataType).endswith('[]'): for j in xrange(len(argVals[i])): setRTVal(self.outputs[argName][j], argVals[i][j]) else: setRTVal(self.outputs[argName], argVals[i]) return True
def evaluate(self): """invokes the Splice operator causing the output values to be computed. Returns: bool: True if successful. """ def getRTVal(obj): if isinstance(obj, Object3D): return obj.xfo.getRTVal().toMat44('Mat44') elif isinstance(obj, Attribute): return obj.getRTVal() argVals = [] for i in xrange(len(self.args)): arg = self.args[i] argName = arg.name.getSimpleType() argDataType = arg.dataType.getSimpleType() argConnectionType = arg.connectionType.getSimpleType() if argDataType == 'EvalContext': argVals.append(ks.constructRTVal(argDataType)) continue if argName == 'time': argVals.append(ks.constructRTVal(argDataType)) continue if argName == 'frame': argVals.append(ks.constructRTVal(argDataType)) continue if argConnectionType == 'In': if str(argDataType).endswith('[]'): rtValArray = ks.rtVal(argDataType[:-2] + 'Array') rtValArray.resize(len(self.inputs[argName])) for j in xrange(len(self.inputs[argName])): rtValArray[j] = getRTVal(self.inputs[argName][j]) argVals.append(rtValArray) else: argVals.append(getRTVal(self.inputs[argName])) else: if str(argDataType).endswith('[]'): rtValArray = ks.rtVal(argDataType[:-2] + 'Array') rtValArray.resize(len(self.outputs[argName])) for j in xrange(len(self.outputs[argName])): rtValArray[j] = getRTVal(self.outputs[argName][j]) argVals.append(rtValArray) else: argVals.append(getRTVal(self.outputs[argName])) self.solverRTVal.solve('', *argVals) # Now put the computed values out to the connected output objects. def setRTVal(obj, rtval): if isinstance(obj, Object3D): obj.xfo.setFromMat44(Mat44(rtval)) elif isinstance(obj, Attribute): obj.setValue(rtval) for i in xrange(len(argVals)): arg = self.args[i] argName = arg.name.getSimpleType() argDataType = arg.dataType.getSimpleType() argConnectionType = arg.connectionType.getSimpleType() if argConnectionType != 'In': if argDataType.endswith('[]'): for j in xrange(len(argVals[i])): setRTVal(self.outputs[argName][j], argVals[i][j]) else: setRTVal(self.outputs[argName], argVals[i]) return True
def evaluate(self): """Invokes the KL operator causing the output values to be computed. Returns: bool: True if successful. """ # logger.debug("\nEvaluating kl operator [%s] of type [%s] from extension [%s]..." % (self.getName(), self.solverTypeName, self.extension)) super(KLOperator, self).evaluate() def getRTVal(obj, asInput=True): if isinstance(obj, Object3D): if asInput: return obj.globalXfo.getRTVal().toMat44('Mat44') else: return obj.xfo.getRTVal().toMat44('Mat44') elif isinstance(obj, Xfo): return obj.getRTVal().toMat44('Mat44') elif isinstance(obj, MathObject): return obj.getRTVal() elif isinstance(obj, Attribute): return obj.getRTVal() elif type(obj) is bool: return ks.rtVal('Boolean', obj) elif type(obj) is int: return ks.rtVal('Integer', obj) elif type(obj) is float: return ks.rtVal('Scalar', obj) elif type(obj) is str: return ks.rtVal('String', obj) else: return obj # def validateArg(rtVal, argName, argDataType): """Validate argument types when passing built in Python types. Args: rtVal (RTVal): rtValue object. argName (str): Name of the argument being validated. argDataType (str): Type of the argument being validated. """ # Validate types when passing a built in Python type if type(rtVal) in (bool, str, int, float): if argDataType in ('Scalar', 'Float32', 'UInt32', 'Integer'): if type(rtVal) not in (float, int): raise TypeError( self.getName() + ".evaluate(): Invalid Argument Value: " + str(rtVal) + " (" + type(rtVal).__name__ + "), for Argument: " + argName + " (" + argDataType + ")") elif argDataType == 'Boolean': if type(rtVal) != bool: raise TypeError( self.getName() + ".evaluate(): Invalid Argument Value: " + str(rtVal) + " (" + type(rtVal).__name__ + "), for Argument: " + argName + " (" + argDataType + ")") elif argDataType == 'String': if type(rtVal) != str: raise TypeError( self.getName() + ".evaluate(): Invalid Argument Value: " + str(rtVal) + " (" + type(rtVal).__name__ + "), for Argument: " + argName + " (" + argDataType + ")") argVals = [] debug = [] for i in xrange(len(self.args)): arg = self.args[i] argName = arg.name.getSimpleType() argDataType = arg.dataType.getSimpleType() argConnectionType = arg.connectionType.getSimpleType() if argDataType == 'EvalContext': argVals.append(ks.constructRTVal(argDataType)) continue if argName == 'time': argVals.append(ks.constructRTVal(argDataType)) continue if argName == 'frame': argVals.append(ks.constructRTVal(argDataType)) continue if argConnectionType == 'In': if str(argDataType).endswith('[]'): if argName in self.inputs and self.inputs[ argName] is not None: rtValArray = ks.rtVal(argDataType) rtValArray.resize(len(self.inputs[argName])) for j in xrange(len(self.inputs[argName])): if self.inputs[argName][j] is None: continue rtVal = getRTVal(self.inputs[argName][j]) validateArg(rtVal, argName, argDataType[:-2]) rtValArray[j] = rtVal else: rtValArray = self.getDefaultValue(argName, argDataType, mode="arg") argVals.append(rtValArray) else: if argName in self.inputs and self.inputs[ argName] is not None: rtVal = getRTVal(self.inputs[argName]) else: rtVal = self.getDefaultValue(argName, argDataType, mode="arg") validateArg(rtVal, argName, argDataType) argVals.append(rtVal) elif argConnectionType in ('IO', 'Out'): if str(argDataType).endswith('[]'): if argName in self.outputs and self.outputs[ argName] is not None: rtValArray = ks.rtVal(argDataType) rtValArray.resize(len(self.outputs[argName])) for j in xrange(len(self.outputs[argName])): if self.outputs[argName][j] is None: continue rtVal = getRTVal(self.outputs[argName][j], asInput=False) validateArg(rtVal, argName, argDataType[:-2]) rtValArray[j] = rtVal else: rtValArray = self.getDefaultValue(argName, argDataType, mode="output") argVals.append(rtValArray) else: if argName in self.outputs and self.outputs[ argName] is not None: rtVal = getRTVal(self.outputs[argName], asInput=False) else: rtVal = self.getDefaultValue(argName, argDataType, mode="output") validateArg(rtVal, argName, argDataType) argVals.append(rtVal) else: raise Exception("Operator:'" + self.getName() + " has an invalid 'argConnectionType': " + argConnectionType) debug.append({ argName: [{ "dataType": argDataType, "connectionType": argConnectionType }, argVals[-1]] }) try: # argstr = [str(arg) for arg in argVals] # logger.debug("%s.solve('', %s)" % (self.solverTypeName, ", ".join(argstr))) self.solverRTVal.solve('', *argVals) except Exception as e: errorMsg = "\nPossible problem with KL operator [%s]. Arguments:\n" % self.getName( ) errorMsg += pprint.pformat(debug, indent=4, width=800) logger.error(errorMsg) raise e # Now put the computed values out to the connected output objects. def setRTVal(obj, rtval): if isinstance(obj, Object3D): obj.xfo.setFromMat44(Mat44(rtval)) elif isinstance(obj, Xfo): obj.setFromMat44(Mat44(rtval)) elif isinstance(obj, Mat44): obj.setFromMat44(rtval) elif isinstance(obj, Attribute): if ks.isRTVal(rtval): obj.setValue(rtval.getSimpleType()) else: obj.setValue(rtval) else: if hasattr(obj, '__iter__'): logger.warning( "Warning: Trying to set a KL port with an array directly." ) logger.warning("Not setting rtval: %s\n\tfor output object: %s\n\tof KL object: %s\n." % \ (rtval, obj.getName(), self.getName())) for i in xrange(len(argVals)): arg = self.args[i] argName = arg.name.getSimpleType() argDataType = arg.dataType.getSimpleType() argConnectionType = arg.connectionType.getSimpleType() if argConnectionType != 'In': if argName in self.outputs and self.outputs[ argName] is not None: if str(argDataType).endswith('[]'): for j in xrange(len(argVals[i])): if len(self.outputs[argName]) > j and self.outputs[ argName][j] is not None: setRTVal(self.outputs[argName][j], argVals[i][j]) else: setRTVal(self.outputs[argName], argVals[i]) return True
def evaluate(self): """Invokes the Canvas node causing the output values to be computed. Returns: bool: True if successful. """ super(CanvasOperator, self).evaluate() def getRTVal(obj, asInput=True): if isinstance(obj, Object3D): if asInput: return obj.globalXfo.getRTVal().toMat44('Mat44') else: return obj.xfo.getRTVal().toMat44('Mat44') elif isinstance(obj, Xfo): return obj.getRTVal().toMat44('Mat44') elif isinstance(obj, MathObject): return obj.getRTVal() elif isinstance(obj, Attribute): return obj.getRTVal() elif type(obj) in (int, float, bool, str): return obj def validateArg(rtVal, portName, portDataType): """Validate argument types when passing built in Python types. Args: rtVal (RTVal): rtValue object. portName (str): Name of the argument being validated. portDataType (str): Type of the argument being validated. """ # Validate types when passing a built in Python type if type(rtVal) in (bool, str, int, float): if portDataType in ('Scalar', 'Float32', 'UInt32', 'Integer'): if type(rtVal) not in (float, int): raise TypeError(self.getName() + ".evaluate(): Invalid Arg Value: " + str(rtVal) + " (" + type(rtVal).__name__ + "), for Argument: " + portName + " (" + portDataType + ")") elif portDataType == 'Boolean': if type(rtVal) != bool: raise TypeError(self.getName() + ".evaluate(): Invalid Argument Value: " + str(rtVal) + " (" + type(rtVal).__name__ + "), for Argument: " + portName + " (" + portDataType + ")") elif portDataType == 'String': if type(rtVal) != str: raise TypeError(self.getName() + ".evaluate(): Invalid Argument Value: " + str(rtVal) + " (" + type(rtVal).__name__ + "), for Argument: " + portName + " (" + portDataType + ")") portTypeMap = { 0: 'In', 1: 'IO', 2: 'Out' } debug = [] for i in xrange(self.node.getExecPortCount()): portName = self.node.getExecPortName(i) portConnectionType = portTypeMap[self.node.getExecPortType(i)] rtVal = self.binding.getArgValue(portName) portDataType = rtVal.getTypeName().getSimpleType() portVal = None if portDataType == '$TYPE$': return if portDataType in ('EvalContext', 'time', 'frame'): portVal = ks.constructRTVal(portDataType) self.binding.setArgValue(portName, portVal, False) continue if portConnectionType == 'In': if str(portDataType).endswith('[]'): rtValArray = ks.rtVal(portDataType) rtValArray.resize(len(self.inputs[portName])) for j in xrange(len(self.inputs[portName])): rtVal = getRTVal(self.inputs[portName][j]) validateArg(rtVal, portName, portDataType[:-2]) rtValArray[j] = rtVal portVal = rtValArray self.binding.setArgValue(portName, portVal, False) else: rtVal = getRTVal(self.inputs[portName]) validateArg(rtVal, portName, portDataType) self.binding.setArgValue(portName, rtVal, False) else: if str(portDataType).endswith('[]'): rtValArray = ks.rtVal(portDataType) rtValArray.resize(len(self.outputs[portName])) for j in xrange(len(self.outputs[portName])): rtVal = getRTVal(self.outputs[portName][j], asInput=False) validateArg(rtVal, portName, portDataType[:-2]) rtValArray[j] = rtVal portVal = rtValArray self.binding.setArgValue(portName, portVal, False) else: rtVal = getRTVal(self.outputs[portName], asInput=False) validateArg(rtVal, portName, portDataType) self.binding.setArgValue(portName, rtVal, False) portDebug = { portName: [ { "portDataType": portDataType, "portConnectionType": portConnectionType }, portVal ] } debug.append(portDebug) try: self.binding.execute() except: errorMsg = "Possible problem with Canvas operator '" + \ self.getName() + "' port values:" print errorMsg pprint.pprint(debug, width=800) raise Exception(errorMsg) # Now put the computed values out to the connected output objects. def setRTVal(obj, rtval): if isinstance(obj, Object3D): obj.xfo.setFromMat44(Mat44(rtval)) elif isinstance(obj, Xfo): obj.setFromMat44(Mat44(rtval)) elif isinstance(obj, Mat44): obj.setFromMat44(rtval) elif isinstance(obj, Attribute): obj.setValue(rtval) else: if hasattr(obj, '__iter__'): print "Warning: Trying to set a canvas port item with an \ array directly." print "Warning: Not setting rtval: %s\n\tfor output object: \ %s\n\ton port: %s\n\tof canvas object: %s\n." % \ (rtval, obj, portName, self.getName()) for i in xrange(self.node.getExecPortCount()): portName = self.node.getExecPortName(i) portConnectionType = portTypeMap[self.node.getExecPortType(i)] rtVal = self.binding.getArgValue(portName) portDataType = rtVal.getTypeName().getSimpleType() if portConnectionType != 'In': outVal = self.binding.getArgValue(portName) if str(portDataType).endswith('[]' or hasattr(outVal.getSimpleType(), '__iter__')): for j in xrange(len(outVal)): setRTVal(self.outputs[portName][j], outVal[j]) else: setRTVal(self.outputs[portName], outVal) return True
def evaluate(self): """invokes the Canvas node causing the output values to be computed. Returns: bool: True if successful. """ def getRTVal(obj): if isinstance(obj, Object3D): return obj.xfo.getRTVal().toMat44('Mat44') elif isinstance(obj, Attribute): return obj.getRTVal() portVals = [] for port in self.graphDesc['ports']: portName = port['name'] portConnectionType = port['execPortType'] portDataType = port['typeSpec'] if portDataType == '$TYPE$': return if portDataType == 'EvalContext': portVals.append(ks.constructRTVal(portDataType)) continue if portName == 'time': portVals.append(ks.constructRTVal(portDataType)) continue if portName == 'frame': portVals.append(ks.constructRTVal(portDataType)) continue if portConnectionType == 'In': if str(portDataType).endswith('[]'): rtValArray = ks.rtVal(portDataType[:-2] + 'Array') rtValArray.resize(len(self.inputs[portName])) for j in xrange(len(self.inputs[portName])): rtValArray[j] = getRTVal(self.inputs[portName][j]) portVals.append(rtValArray) else: portVals.append(getRTVal(self.inputs[portName])) else: if str(portDataType).endswith('[]'): rtValArray = ks.rtVal(portDataType[:-2] + 'Array') rtValArray.resize(len(self.outputs[portName])) for j in xrange(len(self.outputs[portName])): rtValArray[j] = getRTVal(self.outputs[portName][j]) portVals.append(rtValArray) else: portVals.append(getRTVal(self.outputs[portName])) host = ks.getCoreClient().DFG.host binding = host.createBindingToPreset(self.canvasPresetPath, portVals) binding.execute() # Now put the computed values out to the connected output objects. def setRTVal(obj, rtval): if isinstance(obj, Object3D): obj.xfo.setFromMat44(Mat44(rtval)) elif isinstance(obj, Attribute): obj.setValue(rtval) for port in self.graphDesc['ports']: portName = port['name'] portConnectionType = port['execPortType'] portDataType = '$TYPE$' if portConnectionType != 'In': outVal = binding.getArgValue(portName) if portDataType.endswith('[]'): for j in xrange(len(outVal)): setRTVal(self.outputs[portName][j], outVal[j]) else: setRTVal(self.outputs[portName], outVal) return True
def evaluate(self): """invokes the Splice operator causing the output values to be computed. Return: Boolean, True if successful. """ def getRTVal(obj): if isinstance(obj, Object3D): return obj.xfo.getRTVal().toMat44('Mat44') elif isinstance(obj, Attribute): return obj.getRTVal() argVals = [] for i in xrange(len(self.args)): arg = self.args[i] if arg.dataType == 'EvalContext': argVals.append(ks.constructRTVal(arg.dataType)) continue if arg.name == 'time': argVals.append(ks.constructRTVal(arg.dataType)) continue if arg.name == 'frame': argVals.append(ks.constructRTVal(arg.dataType)) continue if arg.connectionType == 'in': if str(arg.dataType).endswith('[]'): rtValArray = ks.rtVal(arg.dataType[:-2]+'Array') rtValArray.resize(len(self.inputs[arg.name])) for j in xrange(len(self.inputs[arg.name])): rtValArray[j] = getRTVal(self.inputs[arg.name][j]) argVals.append(rtValArray) else: argVals.append(getRTVal(self.inputs[arg.name])) else: if str(arg.dataType).endswith('[]'): rtValArray = ks.rtVal(arg.dataType[:-2]+'Array') rtValArray.resize(len(self.outputs[arg.name])) for j in xrange(len(self.outputs[arg.name])): rtValArray[j] = getRTVal(self.outputs[arg.name][j]) argVals.append(rtValArray) else: argVals.append(getRTVal(self.outputs[arg.name])) self.solverRTVal.solve('', *argVals) # Now put the computed values out to the connected output objects. def setRTVal(obj, rtval): if isinstance(obj, Object3D): obj.xfo.setFromMat44(Mat44(rtval)) elif isinstance(obj, Attribute): obj.setValue(rtval) for i in xrange(len(argVals)): arg = self.args[i] if arg.connectionType != 'in': if str(arg.dataType).endswith('[]'): for j in xrange(len(argVals[i])): setRTVal(self.outputs[arg.name][j], argVals[i][j]) else: setRTVal(self.outputs[arg.name], argVals[i]) return True