9. TUTORIAL 003 : Properties
Prev | Chapter 3. Tulip Library | Next

## 9. TUTORIAL 003 : Properties

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.

### 1. Header files and predefined properties

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

### 2. Creation of a property.

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.

### Warning

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");

### 3. Initialize all properties.

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 :

### 4. Iterating over properties.

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.

### Source Code

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

Prev | Up | Next
8. TUTORIAL 002 : Iterating over a graph (class Iterator and the macro forEach) | Home | 10. TUTORIAL 004 : Create your first subgraph.