Exemplo n.º 1
0
    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
Exemplo n.º 2
0
    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
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
    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
Exemplo n.º 5
0
    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
Exemplo n.º 6
0
    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
Exemplo n.º 7
0
    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
Exemplo n.º 8
0
    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
Exemplo n.º 9
0
    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
Exemplo n.º 10
0
    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
Exemplo n.º 11
0
    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
Exemplo n.º 12
0
    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