This tutorial will show you how to add / create properties to a Graph. For local or inherited properties, see tututorial 005. An instance of a property is owned by a graph and is an association table between the elements of graph (nodes and edges) and values of a predefined type.
In tulip API, every type of property is declared in its own header file. Following is a list of those header files and the type of value which can be associated to an element of the graph:
DoubleProperty : tulip/DoubleProperty.h / value type for edge = double, node = double
BooleanProperty : tulip/BooleanProperty.h / value type for edge = bool, node = bool
IntegerProperty: tulip/IntegerProperty.h / value type for edge = int, node = int
LayoutProperty : tulip/LayoutProperty.h / value type for edge = Coord(), node = vector<Coord>()
ColorProperty : tulip/ColorProperty.h / value type for edge = Color(), node = Color()
SizeProperty : tulip/SizeProperty.h / value type for edge = Size(), node = Size()
StringProperty : tulip/StringProperty.h / value type for edge = string, node = string
GraphProperty : tulip/GraphProperty.h / value type for edge = graph, node = graph
The creation of a property is accomplished by the function Graph::getLocalProperty<TypeProperty>("name of the property"). This function returns a pointer to a property. The real type of the property is given with the template parameter. If the property of the given name does not yet exists, a new one is created and returned.
Using of delete on that property will cause a segmentation violation (use delLocalProperty instead).
Following is a sample of code that creates 8 properties :
//Get and create several properties
DoubleProperty *metric = graph->getLocalProperty<DoubleProperty>("firstMetric");
BooleanProperty *select = graph->getLocalProperty<BooleanProperty>("firstSelection");
LayoutProperty *layout = graph->getLocalProperty<LayoutProperty>("firstLayout");
IntegerProperty *integer = graph->getLocalProperty<IntegerProperty>("firstInteger");
ColorProperty *colors = graph->getLocalProperty<ColorProperty>("firstColors");
SizeProperty *sizes = graph->getLocalProperty<SizeProperty>("firstSizes");
GraphProperty *meta = graph->getLocalProperty<GraphProperty>("firstMeta");
StringProperty *strings = graph->getLocalProperty<StringProperty>("firstString");
One property has to be initialized for both edges and nodes. It is done with the functions setAllNodeValue(value) and setAllEdgeValue(value) which are both member functions of the property.
Following is an example :
//initialize all the properties
metric->setAllNodeValue(0.0);
metric->setAllEdgeValue(0.0);
select->setAllNodeValue(false);
select->setAllEdgeValue(false);
layout->setAllNodeValue(Coord(0,0,0)); //coordinates
layout->setAllEdgeValue(vector<Coord>());//Vector of bends
integer->setAllNodeValue(0);
integer->setAllEdgeValue(0);
sizes->setAllNodeValue(Size(0,0,0)); //width, height, depth
sizes->setAllEdgeValue(Size(0,0,0)); //start_size, end_size, arrow_size
colors->setAllNodeValue(Color(0,0,0,0));//Red, green, blue, alpha
colors->setAllEdgeValue(Color(0,0,0,0));//Red, green, blue, alpha
strings->setAllNodeValue("first");
strings->setAllEdgeValue("first");
meta->setAllNodeValue(graph); //an existing graph
Following is the display (in the tulip GUI) of the list of a node associated values for the properties previously created :

Once again, iteration is made with Iterators. The class graph has a member function Iterator< std::string >* getLocalProperties () that returns an iterator on the local properties.
Following is an example :
cout << "List of the properties present in the graph:" << endl;
Iterator<string> *it=graph->getLocalProperties();
while (it->hasNext()) {
cout << it->next() << endl;
} delete it;
You can also use the macro forEach.
#include <iostream>
#include <tulip/BooleanProperty.h>
#include <tulip/ColorProperty.h>
#include <tulip/DoubleProperty.h>
#include <tulip/GraphProperty.h>
#include <tulip/IntegerProperty.h>
#include <tulip/LayoutProperty.h>
#include <tulip/SizeProperty.h>
#include <tulip/StringProperty.h>
/**
* Tutorial 003
*
* Create a graph and a properties of each type
* And display properties present in the graph
*/
using namespace std;
using namespace tlp;
void buildGraph(Graph *graph) {
//add three nodes
node n1=graph->addNode();
node n2=graph->addNode();
node n3=graph->addNode();
//add three edges
graph->addEdge(n2,n3);
graph->addEdge(n1,n2);
graph->addEdge(n3,n1);
}
int main() {
//create an empty graph
Graph *graph=tlp::newGraph();
//build the graph
buildGraph(graph);
//Get and create several properties
DoubleProperty *metric=graph->getLocalProperty<DoubleProperty>("firstMetric");
BooleanProperty *select=graph->getLocalProperty<BooleanProperty>("firstSelection");
LayoutProperty *layout=graph->getLocalProperty<LayoutProperty>("firstLayout");
IntegerProperty *integer=graph->getLocalProperty<IntegerProperty>("firstInteger");
ColorProperty *colors=graph->getLocalProperty<ColorProperty>("firstColors");
SizeProperty *sizes=graph->getLocalProperty<SizeProperty>("firstSizes");
GraphProperty *meta=graph->getLocalProperty<GraphProperty>("firstMeta");
StringProperty *strings=graph->getLocalProperty<StringProperty>("firstString");
//initialize all the properties
metric->setAllNodeValue(0.0);
metric->setAllEdgeValue(0.0);
select->setAllNodeValue(false);
select->setAllEdgeValue(false);
layout->setAllNodeValue(Coord(0,0,0)); //coordinates
layout->setAllEdgeValue(vector<Coord>());//Vector of bends
integer->setAllNodeValue(0);
integer->setAllEdgeValue(0);
sizes->setAllNodeValue(Size(0,0,0)); //width, height, depth
sizes->setAllEdgeValue(Size(0,0,0)); //start_size, end_size, arrow_size
colors->setAllNodeValue(Color(0,0,0,0));//Red, green, blue
colors->setAllEdgeValue(Color(0,0,0,0));//Red, green, blue
strings->setAllNodeValue("first");
strings->setAllEdgeValue("first");
meta->setAllNodeValue(graph); //an existing graph
cout << "List of the properties present in the graph:" << endl;
Iterator<string> *it=graph->getLocalProperties();
while (it->hasNext()) {
cout << it->next() << endl;
} delete it;
tlp::saveGraph (graph, "tutoproper.tlp");
delete graph;
return EXIT_SUCCESS;
}