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