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; }