我正在尝试从omnet ++中提取网络图,并将节点和链接的信息提供给Lemon图。问题的一部分很容易处理。使用代码:
cTopology *topo = new cTopology("topo");
std::vector<std::string> nedTypes;
nedTypes.push_back("inet.node.inet.StandardHost");
topo->extractByNedTypeName(nedTypes);
int numNodes = topo->getNumNodes();
EV << "cTopology found " << topo->getNumNodes() << " nodes\n";
ListDigraph g;
ListDigraph::NodeMap<std::string> nodeName(g);
for (ListDigraph::NodeIt n(g); n != INVALID; ++n)
{
int i = 0;//counter
int numOutLinks = topo->getNode(i)->getNumOutLinks();
g.addNode();
std::vector<std::string> nodeList;
nodeName[n] = topo->getNode(i)->getModule()->getName();
nodeList.push_back(nodeName[n]);
for(int j = 0; j<numOutLinks; j++)
{
cTopology::LinkOut* lOut = topo->getNode(i)->getLinkOut(j);
cTopology::Node *rNode = lOut->getRemoteNode();
for (auto& nlist : nodeList)
{
auto nodeFound = std::find(std::begin(nlist), std::end(nlist), rNode);
if(nodeFound != std::end(nlist)){
g.addNode();
g.addArc(g.nodeFromId(i), g.nodeFromId(i+1));
}
}
} i++;
不知何故,我得到了节点列表,现在我也试图获取链接信息。也就是说,节点和它们之间的链接也是如此。如何获取链接信息并将其提供给Lemon图表以及我在代码中使用的方法有什么问题?
答案 0 :(得分:1)
方法extractByNedTypeName()
需要完全限定的NED类型名称,即包括包。在INET
中,StandardHost
通常位于inet.node.inet
包中,因此您应该写:
nedTypes.push_back("inet.node.inet.StandardHost");
修改强>
永远不会执行循环for (ListDigraph::NodeIt n(g); n != INVALID; ++n)
,因为刚创建了图g
并且它是空的。外循环应该类似于:for(int j = 0; j<numOutLinks; j++)
。
<强> EDIT2 强>
由于find
缺少NodeMap
,因此必须编写自己的函数,例如:
ListDigraph::NodeIt::Node findNodeMap(const ListDigraph::NodeMap<std::string> & map, const ListDigraph & g,
std::string txt) {
ListDigraph::NodeIt it(g);
for (; it != INVALID; ++it) {
if (map[it] == txt)
break;
}
return it;
}
使用它的一个例子:
ListDigraph::NodeMap<std::string> nodeName(g);
// ... filling nodeName
std::string str = "node1";
ListDigraph::NodeIt::Node node = findNodeMap(nodeName, g, str);
if (node != INVALID) {
// node with name from str was found
}