COIN-OR::LEMON - Graph Library

Changeset 190:2cac5b936a2b in glemon-0.x


Ignore:
Timestamp:
02/20/07 18:45:44 (12 years ago)
Author:
Hegyi Péter
Branch:
default
Phase:
public
Convert:
svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/glemon/trunk@3194
Message:

Working tooltips are added. No segmentation fault is occured if empty graphs are redesigned.

Files:
3 edited

Legend:

Unmodified
Added
Removed
  • graph_displayer_canvas.cc

    r187 r190  
    324324void GraphDisplayerCanvas::reDesignGraph()
    325325{
    326   double max_coord=50000;
    327   double min_dist=20;
    328   double init_vector_length=25;
    329 
    330   if(!was_redesigned)
    331     {
    332       NodeIt i((mytab.mapstorage).graph);
    333 
    334       dim2::Point<double> init(init_vector_length*rnd(),
    335                                init_vector_length*rnd());
    336       moveNode(init.x, init.y, nodesmap[i], i);
    337       was_redesigned=true;
    338     }
    339 
    340   double attraction;
    341   double propulsation;
    342   int iterations;
    343 
    344   (mytab.mapstorage).get_design_data(attraction, propulsation, iterations);
    345 
    346   //iteration counter
    347   for(int l=0;l<iterations;l++)
    348     {
    349       Graph::NodeMap<double> x(mytab.mapstorage.graph);
    350       Graph::NodeMap<double> y(mytab.mapstorage.graph);
    351       XYMap<Graph::NodeMap<double> > actual_forces;
    352       actual_forces.setXMap(x);
    353       actual_forces.setYMap(y);
    354 
    355       //count actual force for each nodes
    356       for (NodeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
    357         {
    358           //propulsation of nodes
    359           for (NodeIt j((mytab.mapstorage).graph); j!=INVALID; ++j)
    360             {
    361               if(i!=j)
     326  NodeIt firstnode((mytab.mapstorage).graph);
     327  //is it not an empty graph?
     328  if(firstnode!=INVALID)
     329    {
     330      double max_coord=50000;
     331      double min_dist=20;
     332      double init_vector_length=25;
     333
     334      if(!was_redesigned)
     335        {
     336          NodeIt i((mytab.mapstorage).graph);
     337
     338          dim2::Point<double> init(init_vector_length*rnd(),
     339                                   init_vector_length*rnd());
     340          moveNode(init.x, init.y, nodesmap[i], i);
     341          was_redesigned=true;
     342        }
     343
     344      double attraction;
     345      double propulsation;
     346      int iterations;
     347
     348      (mytab.mapstorage).get_design_data(attraction, propulsation, iterations);
     349
     350      //iteration counter
     351      for(int l=0;l<iterations;l++)
     352        {
     353          Graph::NodeMap<double> x(mytab.mapstorage.graph);
     354          Graph::NodeMap<double> y(mytab.mapstorage.graph);
     355          XYMap<Graph::NodeMap<double> > actual_forces;
     356          actual_forces.setXMap(x);
     357          actual_forces.setYMap(y);
     358
     359          //count actual force for each nodes
     360          for (NodeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
     361            {
     362              //propulsation of nodes
     363              for (NodeIt j((mytab.mapstorage).graph); j!=INVALID; ++j)
     364                {
     365                  if(i!=j)
     366                    {
     367                      lemon::dim2::Point<double> delta =
     368                        ((mytab.mapstorage).coords[i]-
     369                         (mytab.mapstorage).coords[j]);
     370
     371                      const double length_sqr=std::max(delta.normSquare(),min_dist);
     372
     373                      //normalize vector
     374                      delta/=sqrt(length_sqr);
     375
     376                      //calculating propulsation strength
     377                      //greater distance menas smaller propulsation strength
     378                      delta*=propulsation/length_sqr;
     379                   
     380                      actual_forces.set(i,(actual_forces[i]+delta));
     381                    }
     382                }
     383              //attraction of nodes, to which actual node is bound
     384              for(OutEdgeIt ei((mytab.mapstorage).graph,i);ei!=INVALID;++ei)
    362385                {
    363386                  lemon::dim2::Point<double> delta =
    364387                    ((mytab.mapstorage).coords[i]-
    365                      (mytab.mapstorage).coords[j]);
    366 
    367                   const double length_sqr=std::max(delta.normSquare(),min_dist);
    368 
    369                   //normalize vector
    370                   delta/=sqrt(length_sqr);
    371 
    372                   //calculating propulsation strength
    373                   //greater distance menas smaller propulsation strength
    374                   delta*=propulsation/length_sqr;
    375                    
    376                   actual_forces.set(i,(actual_forces[i]+delta));
    377                 }
    378             }
    379           //attraction of nodes, to which actual node is bound
    380           for(OutEdgeIt ei((mytab.mapstorage).graph,i);ei!=INVALID;++ei)
    381             {
    382               lemon::dim2::Point<double> delta =
    383                 ((mytab.mapstorage).coords[i]-
    384                  (mytab.mapstorage).coords[mytab.mapstorage.
    385                                            graph.target(ei)]);
     388                     (mytab.mapstorage).coords[mytab.mapstorage.
     389                                               graph.target(ei)]);
    386390               
    387                 //calculating attraction strength
    388                 //greater distance means greater strength
    389                 delta*=attraction;
     391                  //calculating attraction strength
     392                  //greater distance means greater strength
     393                  delta*=attraction;
    390394               
    391                 actual_forces.set(i,actual_forces[i]-delta);
    392             }
    393           for(InEdgeIt ei((mytab.mapstorage).graph,i);ei!=INVALID;++ei)
    394             {
    395               lemon::dim2::Point<double> delta =
    396                 ((mytab.mapstorage).coords[i]-
    397                  (mytab.mapstorage).coords[mytab.mapstorage.
    398                                            graph.source(ei)]);
     395                  actual_forces.set(i,actual_forces[i]-delta);
     396                }
     397              for(InEdgeIt ei((mytab.mapstorage).graph,i);ei!=INVALID;++ei)
     398                {
     399                  lemon::dim2::Point<double> delta =
     400                    ((mytab.mapstorage).coords[i]-
     401                     (mytab.mapstorage).coords[mytab.mapstorage.
     402                                               graph.source(ei)]);
    399403               
    400                 //calculating attraction strength
    401                 //greater distance means greater strength
    402                 delta*=attraction;
     404                  //calculating attraction strength
     405                  //greater distance means greater strength
     406                  delta*=attraction;
    403407               
    404                 actual_forces.set(i,actual_forces[i]-delta);
    405             }
    406         }
    407       for (NodeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
    408         {
    409           if(((mytab.mapstorage).coords[i].x)+actual_forces[i].x>max_coord)
    410             {
    411               actual_forces[i].x=max_coord-((mytab.mapstorage).coords[i].x);
    412               std::cout << "Correction! " << (((mytab.mapstorage).coords[i].x)+actual_forces[i].x) << std::endl;
    413             }
    414           else if(((mytab.mapstorage).coords[i].x)+actual_forces[i].x<(0-max_coord))
    415             {
    416               actual_forces[i].x=0-max_coord-((mytab.mapstorage).coords[i].x);
    417               std::cout << "Correction! " << (((mytab.mapstorage).coords[i].x)+actual_forces[i].x) << std::endl;
    418             }
    419           if(((mytab.mapstorage).coords[i].y)+actual_forces[i].y>max_coord)
    420             {
    421               actual_forces[i].y=max_coord-((mytab.mapstorage).coords[i].y);
    422               std::cout << "Correction! " << (((mytab.mapstorage).coords[i].y)+actual_forces[i].y) << std::endl;
    423             }
    424           else if(((mytab.mapstorage).coords[i].y)+actual_forces[i].y<(0-max_coord))
    425             {
    426               actual_forces[i].y=0-max_coord-((mytab.mapstorage).coords[i].y);
    427               std::cout << "Correction! " << (((mytab.mapstorage).coords[i].y)+actual_forces[i].y) << std::endl;
    428             }
    429           moveNode(actual_forces[i].x, actual_forces[i].y, nodesmap[i], i);
    430         }
    431     }
    432 }
    433 
     408                  actual_forces.set(i,actual_forces[i]-delta);
     409                }
     410            }
     411          for (NodeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
     412            {
     413              if(((mytab.mapstorage).coords[i].x)+actual_forces[i].x>max_coord)
     414                {
     415                  actual_forces[i].x=max_coord-((mytab.mapstorage).coords[i].x);
     416                  std::cout << "Correction! " << (((mytab.mapstorage).coords[i].x)+actual_forces[i].x) << std::endl;
     417                }
     418              else if(((mytab.mapstorage).coords[i].x)+actual_forces[i].x<(0-max_coord))
     419                {
     420                  actual_forces[i].x=0-max_coord-((mytab.mapstorage).coords[i].x);
     421                  std::cout << "Correction! " << (((mytab.mapstorage).coords[i].x)+actual_forces[i].x) << std::endl;
     422                }
     423              if(((mytab.mapstorage).coords[i].y)+actual_forces[i].y>max_coord)
     424                {
     425                  actual_forces[i].y=max_coord-((mytab.mapstorage).coords[i].y);
     426                  std::cout << "Correction! " << (((mytab.mapstorage).coords[i].y)+actual_forces[i].y) << std::endl;
     427                }
     428              else if(((mytab.mapstorage).coords[i].y)+actual_forces[i].y<(0-max_coord))
     429                {
     430                  actual_forces[i].y=0-max_coord-((mytab.mapstorage).coords[i].y);
     431                  std::cout << "Correction! " << (((mytab.mapstorage).coords[i].y)+actual_forces[i].y) << std::endl;
     432                }
     433              moveNode(actual_forces[i].x, actual_forces[i].y, nodesmap[i], i);
     434            }
     435        }
     436    }
     437}
     438
  • main_win.cc

    r184 r190  
    230230  {
    231231    static_cast<Gtk::Toolbar*>(toolbar)->set_toolbar_style(Gtk::TOOLBAR_ICONS);
     232    static_cast<Gtk::Toolbar*>(toolbar)->set_tooltips(true);
    232233    //hbox.pack_start(*toolbar, Gtk::PACK_EXPAND_WIDGET);
    233234
     
    270271  table.attach(table2, 1, 2, 0, 2, Gtk::SHRINK, Gtk::SHRINK);
    271272
    272   tooltips.set_tip(*(uim->get_widget("/ToolBar/CreateNode")),"Create Node");
    273   tooltips.enable();
     273  tooltips=Gtk::manage(new Gtk::Tooltips());
     274  if(tooltips)
     275    {
     276      tooltips->set_tip(*zoom_track, "If on, edge widths and node radiuses are constant, independent from zooming");
     277      tooltips->set_tip(*auto_scale, "If on, glemon automatically determines the size of edges and nodes");
     278      tooltips->set_tip(*radius_size, "Sets maximum node radius, if auto-scale is off");
     279      tooltips->set_tip(*edge_width, "Sets maximum edge width, if auto-scale is off");
     280
     281      static_cast<Gtk::ToolItem*>(uim->get_widget("/ToolBar/FileNew"))->set_tooltip(*tooltips, "Inserts new tab");
     282      static_cast<Gtk::ToolItem*>(uim->get_widget("/ToolBar/FileOpen"))->set_tooltip(*tooltips, "Lets you open a file");
     283      static_cast<Gtk::ToolItem*>(uim->get_widget("/ToolBar/FileSave"))->set_tooltip(*tooltips, "Saves the graph on the active tab");
     284      static_cast<Gtk::ToolItem*>(uim->get_widget("/ToolBar/Close"))->set_tooltip(*tooltips, "Closes the active tab");
     285      static_cast<Gtk::ToolItem*>(uim->get_widget("/ToolBar/ViewZoomIn"))->set_tooltip(*tooltips, "Zoom in the graph");
     286      static_cast<Gtk::ToolItem*>(uim->get_widget("/ToolBar/ViewZoomOut"))->set_tooltip(*tooltips, "Zoom out the graph");
     287      static_cast<Gtk::ToolItem*>(uim->get_widget("/ToolBar/ViewZoom100"))->set_tooltip(*tooltips, "Shows actual size of graph");
     288      static_cast<Gtk::ToolItem*>(uim->get_widget("/ToolBar/ViewZoomFit"))->set_tooltip(*tooltips, "Fits graph into window");
     289      static_cast<Gtk::ToolItem*>(uim->get_widget("/ToolBar/MoveItem"))->set_tooltip(*tooltips, "Moves the clicked item (edge/node)");
     290      static_cast<Gtk::ToolItem*>(uim->get_widget("/ToolBar/CreateNode"))->set_tooltip(*tooltips, "Adds new node");
     291      static_cast<Gtk::ToolItem*>(uim->get_widget("/ToolBar/CreateEdge"))->set_tooltip(*tooltips, "Lets you create new edge");
     292      static_cast<Gtk::ToolItem*>(uim->get_widget("/ToolBar/EraseItem"))->set_tooltip(*tooltips, "Erases the clicked item (edge/node)");
     293      static_cast<Gtk::ToolItem*>(uim->get_widget("/ToolBar/EditEdgeMap"))->set_tooltip(*tooltips, "Lets you edit the values written on the items");
     294      static_cast<Gtk::ToolItem*>(uim->get_widget("/ToolBar/AddMap"))->set_tooltip(*tooltips, "Adds edge/nodemap");
     295      static_cast<Gtk::ToolItem*>(uim->get_widget("/ToolBar/DesignGraph"))->set_tooltip(*tooltips, "Redesigns your graph, supposing elastic edges and propulsation of nodes.");
     296
     297      tooltips->enable();
     298    }
    274299
    275300  active_tab=-1;
  • main_win.h

    r184 r190  
    118118
    119119  ///Tooltips
    120   Gtk::Tooltips tooltips;
     120  Gtk::Tooltips * tooltips;
    121121
    122122  //Call-backs of buttons
Note: See TracChangeset for help on using the changeset viewer.