Example #1
0
std::vector<QString> GenerateScriptNode::executeOperation(const OperationExpression &expression, const std::map<quint64, int> &idmap, QStringList& script, const QString& whitespace)
{
    auto getValue = [&](const WorkFlowParameter& parm, const OperationExpression& expression, const std::map<quint64, int>& idmap)-> QVariant{
        auto iter = idmap.find(parm.id());
        if  ( iter != idmap.end())       {
            int idx = (*iter).second;
            QString value =  expression.parm(idx).value();
            if ( hasType(parm.valueType(), itILWISOBJECT)){
                if ( value.indexOf("?input") != 0){
                    if ( value.indexOf("://") != -1){
                        value = "'"     + value + "'";
                    }
                }
            }
            return value;
        }
        return parameterValue(parm.order());
    };
    int inputCount = _node->inputCount();
    for(int i=0; i < inputCount; ++i){
        WorkFlowParameter& parameter = _node->inputRef(i);
        if ( parameterValue(i) == sUNDEF){
            if (parameter.inputLink()) {
                GenerateScriptNode exNode(parameter.inputLink());
                auto outs = exNode.execute(expression, idmap, script,whitespace);
                if ( parameter.outputParameterIndex() < outs.size())
                    _parameterValues[i] = outs[parameter.outputParameterIndex()];
            }
        }
    }

    SPOperationNode opNode = std::static_pointer_cast<OperationNode>(_node);
    IOperationMetaData metadata = opNode->operation();
    QString expr = "ilwis.Engine.do('"+ metadata->name()  + "',";
    QString parms;
    for(int i=0; i < inputCount; ++i){
        WorkFlowParameter& inParam = _node->inputRef(i);
        if ( parms != "")
            parms += ",";
        if ( hasType(inParam.valueType(),itILWISOBJECT)){
            parms += getValue(inParam, expression, idmap).toString();
        }else if ( hasType(inParam.valueType(), itINTEGER | itFLOAT | itDOUBLE )) {
            QString val = getValue(inParam,expression, idmap).toString();
            bool ok;
            val.toDouble(&ok); // some parms can be strings or numbers; we test what it actually is
            if (!ok)
                val = "\'" + val + "\'";
            parms += val;
        } else if (hasType(inParam.valueType(),itSTRING)){
            parms += "\'" + getValue(inParam,expression, idmap).toString() + "\'";
        }else
            parms += getValue(inParam,expression, idmap).toString();
    }
    std::vector<QString> names;
    QString nameslist;
    for(int i=0; i < opNode->operation()->outputParameterCount(); ++i){
        QString name = opNode->operation()->name() + "_" + QString::number(_node->id()) + "_" + QString::number(i);
        names.push_back(name);
        nameslist = nameslist + (i==0 ? "" : ",") + name;
    }
    expr = nameslist + (nameslist!="" ? "=" : "") + expr;
    expr = expr + parms + ")";
    if(!script.contains(expr)){

        script.append(whitespace + expr);
    }

    return names;

}