1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
/**
*
* This file is part of Tulip (www.tulip-software.org)
*
* Authors: David Auber and the Tulip development Team
* from LaBRI, University of Bordeaux 1 and Inria Bordeaux - Sud Ouest
*
* Tulip is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* Tulip is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
#include "ReachableSubGraphSelection.h"
using namespace tlp;
BOOLEANPLUGIN(ReachableSubGraphSelection,"Reachable Sub-Graph","David Auber","01/12/1999","Alpha","1.0");
namespace {
const char * paramHelp[] = {
// direction
HTML_HELP_OPEN() \
HTML_HELP_DEF( "type", "int" ) \
HTML_HELP_DEF( "values", "{0,1,2}" ) \
HTML_HELP_DEF( "default", "0" ) \
HTML_HELP_BODY() \
"This parameter defines the navigation direction. Following values are corrects :" \
"<ul><li>0: follow ouput edges (directed);</li>" \
"<li>1: follow input edges (reverse-directed);</li>" \
"<li>2: all edges (undirected).</li></ul>" \
HTML_HELP_CLOSE(),
// startingNodes
HTML_HELP_OPEN() \
HTML_HELP_DEF( "type", "Selection" ) \
HTML_HELP_DEF( "default", "\"viewSelection\"" ) \
HTML_HELP_BODY() \
"This parameter defines the starting set of nodes used to walk in the graph." \
HTML_HELP_CLOSE(),
// maxdepth
HTML_HELP_OPEN() \
HTML_HELP_DEF( "type", "int" ) \
HTML_HELP_DEF( "values", "[0,1000000]" ) \
HTML_HELP_DEF( "default", "10" ) \
HTML_HELP_BODY() \
"This parameter defines the maximal distance of reachable nodes." \
HTML_HELP_CLOSE(),
};
}
ReachableSubGraphSelection::ReachableSubGraphSelection(const tlp::PropertyContext &context):BooleanAlgorithm(context) {
addParameter<int> ("direction",paramHelp[0],"0");
addParameter<BooleanProperty> ("startingnodes",paramHelp[1],"viewSelection");
addParameter<int> ("distance",paramHelp[2],"5");
}
ReachableSubGraphSelection::~ReachableSubGraphSelection() {}
///===========================================================
bool ReachableSubGraphSelection::run() {
unsigned int maxDistance = 5;
unsigned int direction = 0;
BooleanProperty * startNodes=graph->getProperty<BooleanProperty>("viewSelection");
if ( dataSet!=0) {
dataSet->get("distance", maxDistance);
dataSet->get("direction", direction);
dataSet->get("startingnodes", startNodes);
}
booleanResult->setAllEdgeValue(false);
booleanResult->setAllNodeValue(false);
if (startNodes) {
Iterator<node>* itN = startNodes->getNodesEqualTo(true);
std::set<node> reachables;
// iterate on startNodes add them and their reachables
while (itN->hasNext()) {
node current = itN->next();
reachables.insert(current);
reachableNodes(graph, current, reachables, maxDistance,
(EDGE_TYPE) direction);
}
delete itN;
std::set<node>::const_iterator itr = reachables.begin();
std::set<node>::const_iterator ite = reachables.end();
// select nodes
while (itr != ite) {
booleanResult->setNodeValue((*itr), true);
++itr;
}
// select corresponding edges
Iterator<edge> *itE = graph->getEdges();
while(itE->hasNext()) {
edge e = itE->next();
const std::pair<node, node>& ends = graph->ends(e);
if (booleanResult->getNodeValue(ends.first) &&
booleanResult->getNodeValue(ends.second))
booleanResult->setEdgeValue(e, true);
}
delete itE;
}
return true;
}
|