Example #1
0
QVariantMap WorkflowModel::getNode(int nodeId){
    QVariantMap data;
    try {
    if (_workflow.isValid()){
        SPWorkFlowNode node = _workflow->nodeById(nodeId)    ;
        if (!node)
            return data;
        IOperationMetaData op = node->operation();
        quint64 oid = op.isValid() ? op->id() : i64UNDEF;
        quint64 nid = node->id();
        BoundingBox box = node->box();
        data["name"] = node->name();
        data["label"] = node->label();
        data["description"]= node->description();
        data["operationid"] = QString::number(oid);
        data["nodeid"] = QString::number(nid);
        data["type"] = nodetype2string(node->type());
        data["x"] = box.min_corner().x;
        data["y"] = box.min_corner().y;
        data["w"] = box.xlength();
        data["h"] = box.ylength();
        if ( node->type()== WorkFlowNode::ntOPERATION){
            QVariantList parameters;
            for(int i=0; i < node->inputCount(); ++i){
                parameters.push_back(getParameter(node, i));
            }
            data["parameters"] = parameters;
        }else if ( hasType(node->type(), WorkFlowNode::ntCONDITION)){
            QVariantList test, operations, junctions;
            std::shared_ptr<WorkFlowCondition> condition = std::static_pointer_cast<WorkFlowCondition>(node);
            for(int i=0; i < condition->testCount(); ++i){
                WorkFlowCondition::Test tst = condition->test(i);
                QVariantMap t;
                t["pre"] = MathHelper::logicalOperator2string(tst._pre);
                t["post"] = MathHelper::logicalOperator2string(tst._post);
                t["operation"] = getNode(tst._operation->id());
                test.push_back(t);
            }
            std::vector<SPWorkFlowNode> subnodes = node->subnodes("operations");
            for(int i=0; i < subnodes.size(); ++i){
                operations.push_back(getNode(subnodes[i]->id()));
            }
            data["ownedoperations"] = operations;
            subnodes = node->subnodes("junctions");
            for(int i=0; i < subnodes.size(); ++i){
                junctions.push_back(getNode(subnodes[i]->id()));
            }
            data["ownedjunctions"] = junctions;
            data["tests"] = test;
        }if ( hasType(node->type(), WorkFlowNode::ntRANGE)){
              QVariantList operations, junctions, parameters;

              std::shared_ptr<RangeNode> range = std::static_pointer_cast<RangeNode>(node);
              QString def =  range->rangeDefinition();
              data["rangedefinition"] = def;
              parameters.push_back(getParameter(node, 0));
              data["parameters"] = parameters;
              std::vector<SPWorkFlowNode> subnodes = node->subnodes("operations");
              for(int i=0; i < subnodes.size(); ++i){
                  operations.push_back(getNode(subnodes[i]->id()));
              }
              subnodes = node->subnodes("junctions");
              for(int i=0; i < subnodes.size(); ++i){
                  junctions.push_back(getNode(subnodes[i]->id()));
              }
              data["ownedoperations"] = operations;
              data["ownedjunctions"] = junctions;
        }else if ( node->type() == WorkFlowNode::ntRANGEJUNCTION){
            QVariantList parameters;
            std::shared_ptr<RangeJunctionNode> junction = std::static_pointer_cast<RangeJunctionNode>(node);
            for(int i=0; i <4; ++i){
                parameters.push_back(getParameter(junction, i));
            }
            data["parameters"] = parameters;

        }else if ( node->type() == WorkFlowNode::ntJUNCTION){
            std::shared_ptr<JunctionNode> junction = std::static_pointer_cast<JunctionNode>(node);
            SPWorkFlowNode testNode =  junction->inputRef(WorkFlowCondition::cpTEST).inputLink();
            data["linkedcondition"] = testNode ? testNode->id() : i64UNDEF;
            data["linkedtrueoperation"] = getParameter(junction,WorkFlowCondition::cpTRUECASE);
            data["linkedfalseoperation"] = getParameter(junction,WorkFlowCondition::cpFALSECASE);
        }
    }
    } catch(ErrorObject&){}
    return data;
}