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