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
|
/**
*
* This file is part of Tulip (https://tulip.labri.fr)
*
* Authors: David Auber and the Tulip development Team
* from LaBRI, University of Bordeaux
*
* 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 <ogdf/tree/RadialTreeLayout.h>
#include <tulip2ogdf/OGDFLayoutPluginBase.h>
#include <tulip/StringCollection.h>
#include <tulip/TreeTest.h>
#define ROOTSELECTIONLIST "source;sink;center"
#define ROOTSOURCE 0
#define ROOTSINK 1
#define ROOTCENTER 2
using namespace tlp;
using namespace ogdf;
static const char *paramHelp[] = {
// levels distance
"The minimal required vertical distance between levels.",
// root selection
"This parameter indicates how the root is selected."};
static const char *rootSelectionValuesDescription =
"source <i>(Select a source in the graph)</i><br>"
"sink <i>(Select a sink in the graph)</i><br>"
"center <i>(Select the center of the tree</i><br>";
class OGDFRadialTree : public OGDFLayoutPluginBase {
public:
PLUGININFORMATION("Radial Tree (OGDF)", "Carsten Gutwenger", "02/02/2020",
"The radial tree layout algorithm. ", "1.2", "Tree")
OGDFRadialTree(const tlp::PluginContext *context)
: OGDFLayoutPluginBase(context, context ? new ogdf::RadialTreeLayout() : nullptr) {
addInParameter<double>("levels distance", paramHelp[0], "50");
addInParameter<StringCollection>("root selection", paramHelp[1], ROOTSELECTIONLIST, true,
rootSelectionValuesDescription);
}
~OGDFRadialTree() override {}
bool check(string &error) override {
if (!tlp::TreeTest::isTree(graph)) {
error += "graph is not a directed tree";
return false;
}
return true;
}
void beforeCall() override {
ogdf::RadialTreeLayout *layout = static_cast<ogdf::RadialTreeLayout *>(ogdfLayoutAlgo);
if (dataSet != nullptr) {
double dval = 0;
StringCollection sc;
if (dataSet->get("levels distance", dval))
layout->levelDistance(dval);
if (dataSet->get("root selection", sc)) {
switch (sc.getCurrent()) {
case ROOTSOURCE:
layout->rootSelection(RadialTreeLayout::RootSelectionType::Source);
break;
case ROOTSINK:
layout->rootSelection(RadialTreeLayout::RootSelectionType::Sink);
break;
default:
layout->rootSelection(RadialTreeLayout::RootSelectionType::Center);
}
}
}
}
};
PLUGIN(OGDFRadialTree)
|