static BoundingBox labelBoundingBoxForNode(Graph *graph, node n) { IntegerProperty *viewShape = graph->getProperty<IntegerProperty>("viewShape"); LayoutProperty *viewLayout = graph->getProperty<LayoutProperty>("viewLayout"); SizeProperty *viewSize = graph->getProperty<SizeProperty>("viewSize"); BoundingBox renderingBox; GlyphsManager::getGlyph(viewShape->getNodeValue(n))->getTextBoundingBox(renderingBox); const Coord &pos = viewLayout->getNodeValue(n); const Size &size = viewSize->getNodeValue(n) * Size(renderingBox.width(), renderingBox.height(), renderingBox.depth()); return BoundingBox(pos - size/2.f, pos + size/2.f); }
bool importGraph() { unsigned int nbNodes = 30; if (dataSet!=NULL) { dataSet->get("nodes", nbNodes); } if (nbNodes < 3) nbNodes = 3; srand(clock()); LayoutProperty *newLayout = graph->getLocalProperty<LayoutProperty>("viewLayout"); SizeProperty *newSize = graph->getLocalProperty<SizeProperty>("viewSize"); newSize->setAllNodeValue(Size(1.0,1.0,1.0)); vector<Triangle> faces; Triangle f(graph->addNode(), graph->addNode(), graph->addNode()); faces.push_back(f); graph->addEdge(f.a, f.b); graph->addEdge(f.b, f.c); graph->addEdge(f.c, f.a); float val = static_cast<float>(nbNodes); newLayout->setNodeValue(f.a, Coord(-val, -val, 0)); newLayout->setNodeValue(f.b, Coord(0, val, 0)); newLayout->setNodeValue(f.c, Coord(val, -val, 0)); unsigned int nb = 3; while(nb<nbNodes) { //choose a Triangle randomly unsigned int i = rand()%faces.size(); Triangle f = faces[i]; node n = graph->addNode(); Coord tmp = newLayout->getNodeValue(f.a) + newLayout->getNodeValue(f.b) + newLayout->getNodeValue(f.c); tmp /= 3.0; newLayout->setNodeValue(n, tmp); //Split the triangle in three part graph->addEdge(n, f.a); graph->addEdge(n, f.b); graph->addEdge(n, f.c); //add the three new Triangle, remove the old one(replace) Triangle f1(f.a, f.b, n); Triangle f2(f.b, f.c, n); Triangle f3(f.c, f.a, n); faces[i] = f1; faces.push_back(f2); faces.push_back(f3); ++nb; } return pluginProgress->state()!=TLP_CANCEL; }
//============================================================================= PropertyInterface* SizeProperty::clonePrototype(Graph * g, const std::string& n) { if( !g ) return 0; // allow to get an unregistered property (empty name) SizeProperty * p = n.empty() ? new SizeProperty(g) : g->getLocalProperty<SizeProperty>( n ); p->setAllNodeValue( getNodeDefaultValue() ); p->setAllEdgeValue( getEdgeDefaultValue() ); return p; }
bool exportGraph(ostream &os) { os << "graph [" << endl; os << "directed 1" << endl; os << "version 2" << endl; LayoutProperty *layout = graph->getProperty<LayoutProperty>("viewLayout"); StringProperty *label = graph->getProperty<StringProperty>("viewLabel"); // IntegerProperty *shape =getProperty<IntegerProperty>(graph->getPropertyManager(),"viewShape"); ColorProperty *colors = graph->getProperty<ColorProperty>("viewColor"); SizeProperty *sizes = graph->getProperty<SizeProperty>("viewSize"); //Save Nodes Iterator<node> *itN=graph->getNodes(); if (itN->hasNext()) { for (; itN->hasNext();) { node itn=itN->next(); os << "node [" << endl; os << "id "<< itn.id << endl ; os << "label \"" << convert(label->getNodeValue(itn)) << "\"" << endl; os << "graphics [" << endl; printCoord(os,layout->getNodeValue(itn)); printSize(os,sizes->getNodeValue(itn)); os << "type \"rectangle\"" << endl; os << "width 0.12" << endl; os << "fill \"#"<< hex << setfill('0') << setw(2) <<(int)colors->getNodeValue(itn).getR() << hex << setfill('0') << setw(2) <<(int)colors->getNodeValue(itn).getG() << hex << setfill('0') << setw(2) <<(int)colors->getNodeValue(itn).getB() << "\""<< endl; // os << "outline \"#"<< hex << setfill('0') << setw(2) <<(int)colors->getNodeValue(itn).getR() // << hex << setfill('0') << setw(2) <<(int)colors->getNodeValue(itn).getG() // << hex << setfill('0') << setw(2) <<(int)colors->getNodeValue(itn).getB() << "\""<< endl; os << "outline \"#000000\"" << endl; os << dec << setfill(' ') << setw(6) << "]" << endl; os << ']' << endl; } } delete itN; //Save edges Iterator<edge> *itE=graph->getEdges(); for (; itE->hasNext();) { edge ite=itE->next(); os << "edge [" << endl; os << "source " << graph->source(ite).id << endl; os << "target " << graph->target(ite).id << endl; os << "id " << ite.id << endl; os << "label \"" << label->getEdgeValue(ite) << "\"" << endl; os << "graphics [" << endl; os << "type \"line\"" << endl; os << "arrow \"last\"" << endl; os << "width 0.1" << endl; os << "Line [" << endl; vector<Coord> lcoord; vector<Coord>::const_iterator it; lcoord=layout->getEdgeValue(ite); if (!lcoord.empty()) { node itn=graph->source(ite); printPoint(os,layout->getNodeValue(itn)); } for (it=lcoord.begin(); it!=lcoord.end(); ++it) { printPoint(os,*it); } if (!lcoord.empty()) { node itn=graph->target(ite); printPoint(os,layout->getNodeValue(itn)); } os << "]" << endl; os << "]" << endl; os << "]" << endl; } delete itE; os << "]" << endl; return true; }