X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fgraphlayout%2Fgraphlayout.cpp;h=00829dac889cdafce1590b08dc3bcdd28f28b7bc;hb=91e3e6e230eddb96b3fe5d2b9a5c547d03dd9649;hp=dff414895517ea6897c352234e6e920729540744;hpb=0de6fc9e848ea65c3ce1a36141634bab958ad9e5;p=inkscape.git diff --git a/src/graphlayout/graphlayout.cpp b/src/graphlayout/graphlayout.cpp index dff414895..00829dac8 100644 --- a/src/graphlayout/graphlayout.cpp +++ b/src/graphlayout/graphlayout.cpp @@ -9,6 +9,7 @@ * * Released under GNU GPL. Read the file 'COPYING' for more information. */ +#include "util/glib-list-iterators.h" #include "graphlayout/graphlayout.h" #include #include @@ -20,34 +21,49 @@ #include "sp-conn-end-pair.h" #include "conn-avoid-ref.h" #include "libavoid/connector.h" +#include "libavoid/geomtypes.h" #include #include #include -#include #include #include #include #include #include -#include using namespace boost; + // create a typedef for the Graph type typedef adjacency_list > Graph; typedef property_map::type WeightMap; typedef graph_traits::vertex_descriptor Vertex; -typedef std::vector > PositionVec; +typedef std::vector PositionVec; typedef iterator_property_map::type> PositionMap; -#endif // HAVE_BOOST_GRAPH_LIB -bool isConnector(SPItem *i) { +/** + * Returns true if item is a connector + */ +bool isConnector(SPItem const *const i) { SPPath *path = NULL; if(SP_IS_PATH(i)) { path = SP_PATH(i); } return path && path->connEndPair.isAutoRoutingConn(); } + +/** + * Scans the items list and places those items that are + * not connectors in filtered + */ +void filterConnectors(GSList const *const items, std::list &filtered) { + for(GSList *i=(GSList *)items; i!=NULL; i=i->next) { + SPItem *item=SP_ITEM(i->data); + if(!isConnector(item)) { + filtered.push_back(item); + } + } +} /** * Takes a list of inkscape items, extracts the graph defined by * connectors between them, and uses graph layout techniques to find @@ -57,52 +73,50 @@ void graphlayout(GSList const *const items) { if(!items) { return; } -#ifdef HAVE_BOOST_GRAPH_LIB - using Inkscape::Util::GSListConstIterator; std::list selected; - selected.insert >(selected.end(), items, NULL); + filterConnectors(items,selected); if (selected.empty()) return; - int n=selected.size(); - //Check 2 or more selected objects - if (n < 2) return; + int n=selected.size(); + std::cout<<"|V|="< nodelookup; - for (std::list::iterator it(selected.begin()); - it != selected.end(); - ++it) + for (std::list::iterator i(selected.begin()); + i != selected.end(); + ++i) { - SPItem *u=*it; - if(!isConnector(u)) { - std::cout<<"Creating node for id: "<id<id]=add_vertex(g); - } + SPItem *u=*i; + std::cout<<"Creating node for id: "<id<id]=add_vertex(g); } + //Check 2 or more selected objects + if (n < 2) return; + WeightMap weightmap=get(edge_weight, g); - int i=0; - for (std::list::iterator it(selected.begin()); - it != selected.end(); - ++it) + for (std::list::iterator i(selected.begin()); + i != selected.end(); + ++i) { using NR::X; using NR::Y; - SPItem *itu=*it; - Vertex u=nodelookup[itu->id]; - GSList *nlist=itu->avoidRef->getAttachedConnectors(Avoid::ConnRef::runningFrom); + SPItem *iu=*i; + std::cout<<"Getting neighbours for id: "<id<id]; + GSList *nlist=iu->avoidRef->getAttachedShapes(Avoid::runningFrom); std::list neighbours; neighbours.insert >(neighbours.end(),nlist,NULL); - for (std::list::iterator ne(neighbours.begin()); - ne != neighbours.end(); - ++ne) { + for (std::list::iterator j(neighbours.begin()); + j != neighbours.end(); + ++j) { - SPItem *itv=*ne; - Vertex v=nodelookup[itv->id]; + SPItem *iv=*j; + Vertex v=nodelookup[iv->id]; Graph::edge_descriptor e; bool inserted; tie(e, inserted)=add_edge(u,v,g); weightmap[e]=1.0; @@ -110,7 +124,7 @@ void graphlayout(GSList const *const items) { if(nlist) { g_slist_free(nlist); } - NR::Rect const item_box(sp_item_bbox_desktop(*it)); + NR::Rect const item_box(sp_item_bbox_desktop(*i)); NR::Point ll(item_box.min()); minX=std::min(ll[0],minX); @@ -129,7 +143,6 @@ void graphlayout(GSList const *const items) { kamada_kawai_spring_layout(g, position, weightmap, side_length(width)); graph_traits::vertex_iterator vi, vi_end; - i=0; for (std::list::iterator it(selected.begin()); it != selected.end(); ++it) @@ -143,7 +156,9 @@ void graphlayout(GSList const *const items) { sp_item_move_rel(u, NR::translate(dest - curr)); } } +} #else +void graphlayout(GSList const *const items) { std::cout<<"Connector network layout not available! Install boost graph library and recompile to enable."<