X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fgraphlayout%2Fgraphlayout.cpp;h=81ea590598397ba993e4163abb4b6e456dcad680;hb=42b53baed61b6b06f33ecfa440a747382eb350df;hp=a111d7afe7b4354f71cc89391addc0e4badd16bf;hpb=9e823fb7b754713611b4bb45032d0f11dabba196;p=inkscape.git diff --git a/src/graphlayout/graphlayout.cpp b/src/graphlayout/graphlayout.cpp index a111d7afe..81ea59059 100644 --- a/src/graphlayout/graphlayout.cpp +++ b/src/graphlayout/graphlayout.cpp @@ -1,19 +1,22 @@ -/** \file - * Interface between Inkscape code (SPItem) and graphlayout functions. +/** @file + * @brief Interface between Inkscape code (SPItem) and graphlayout functions. */ /* -* Authors: -* Tim Dwyer -* -* Copyright (C) 2005 Authors -* -* Released under GNU GPL. Read the file 'COPYING' for more information. -*/ + * Authors: + * Tim Dwyer + * + * Copyright (C) 2005 Authors + * + * Released under GNU GPL. Read the file 'COPYING' for more information. + */ + #include #include #include #include #include +#include +#include #include #include "desktop.h" @@ -28,15 +31,15 @@ #include "style.h" #include "conn-avoid-ref.h" #include "libavoid/connector.h" +#include "libavoid/router.h" #include "libavoid/geomtypes.h" #include "libcola/cola.h" #include "libvpsc/generate-constraints.h" -#include "prefs-utils.h" +#include "preferences.h" using namespace std; using namespace cola; using namespace vpsc; - /** * Returns true if item is a connector */ @@ -48,6 +51,36 @@ bool isConnector(SPItem const *const i) { return path && path->connEndPair.isAutoRoutingConn(); } +struct CheckProgress : TestConvergence { + CheckProgress(double d,unsigned i,list& + selected,vector& rs,map& nodelookup) : + TestConvergence(d,i), selected(selected), rs(rs), nodelookup(nodelookup) {} + bool operator()(double new_stress, double* X, double* Y) { + /* This is where, if we wanted to animate the layout, we would need to update + * the positions of all objects and redraw the canvas and maybe sleep a bit + cout << "stress="<getDouble("/tools/connector/length", 100.0); double directed_edge_height_modifier = 1.0; - gchar const *directed_str = NULL, *overlaps_str = NULL; - directed_str = prefs_get_string_attribute("tools.connector", - "directedlayout"); - overlaps_str = prefs_get_string_attribute("tools.connector", - "avoidoverlaplayout"); - bool avoid_overlaps = false; - bool directed = false; - if (directed_str && !strcmp(directed_str, "true")) { - directed = true; - } - if (overlaps_str && !strcmp(overlaps_str, "true")) { - avoid_overlaps = true; - } + + bool directed = prefs->getBool("/tools/connector/directedlayout"); + bool avoid_overlaps = prefs->getBool("/tools/connector/avoidoverlaplayout"); for (list::iterator i(selected.begin()); i != selected.end(); ++i) { SPItem *iu=*i; - unsigned u=nodelookup[iu->id]; - GSList *nlist=iu->avoidRef->getAttachedConnectors(Avoid::runningFrom); - list connectors; - - connectors.insert >(connectors.end(),nlist,NULL); - for (list::iterator j(connectors.begin()); - j != connectors.end(); - ++j) { - SPItem *conn=*j; - SPItem *iv; - SPItem *items[2]; - assert(isConnector(conn)); - SP_PATH(conn)->connEndPair.getAttachedItems(items); - if(items[0]==iu) { - iv=items[1]; - } else { - iv=items[0]; - } - + map::iterator i=nodelookup.find(iu->id); + if(i==nodelookup.end()) { + continue; + } + unsigned u=i->second; + GSList *nlist=iu->avoidRef->getAttachedConnectors(Avoid::runningFrom); + list connectors; + + connectors.insert >(connectors.end(),nlist,NULL); + for (list::iterator j(connectors.begin()); + j != connectors.end(); + ++j) { + SPItem *conn=*j; + SPItem *iv; + SPItem *items[2]; + assert(isConnector(conn)); + SP_PATH(conn)->connEndPair.getAttachedItems(items); + if(items[0]==iu) { + iv=items[1]; + } else { + iv=items[0]; + } + if (iv == NULL) { // The connector is not attached to anything at the // other end so we should just ignore it. continue; } - // What do we do if iv not in nodelookup?!?! - map::iterator v_pair=nodelookup.find(iv->id); - if(v_pair!=nodelookup.end()) { - unsigned v=v_pair->second; - //cout << "Edge: (" << u <<","<style->marker[SP_MARKER_LOC_END].set) { - if(directed && strcmp(conn->style->marker[SP_MARKER_LOC_END].value,"none")) { - scy.push_back(new SimpleConstraint(v, u, + // If iv not in nodelookup we again treat the connector + // as disconnected and continue + map::iterator v_pair=nodelookup.find(iv->id); + if(v_pair!=nodelookup.end()) { + unsigned v=v_pair->second; + //cout << "Edge: (" << u <<","<style->marker[SP_MARKER_LOC_END].set) { + if(directed && strcmp(conn->style->marker[SP_MARKER_LOC_END].value,"none")) { + scy.push_back(new SimpleConstraint(v, u, (ideal_connector_length * directed_edge_height_modifier))); - } - } - } - } + } + } + } + } if(nlist) { g_slist_free(nlist); } @@ -182,7 +211,8 @@ void graphlayout(GSList const *const items) { for(unsigned i=0;iedges.size()<2) continue; - ConstrainedMajorizationLayout alg(c->rects,c->edges,eweights,ideal_connector_length); + CheckProgress test(0.0001,100,selected,rs,nodelookup); + ConstrainedMajorizationLayout alg(c->rects,c->edges,eweights,ideal_connector_length,test); alg.setupConstraints(NULL,NULL,avoid_overlaps, NULL,NULL,&c->scx,&c->scy,NULL,NULL); alg.run(); @@ -195,12 +225,15 @@ void graphlayout(GSList const *const items) { { SPItem *u=*it; if(!isConnector(u)) { - Rectangle* r=rs[nodelookup[u->id]]; - NR::Maybe item_box(sp_item_bbox_desktop(u)); - if(item_box) { - NR::Point const curr(item_box->midpoint()); - NR::Point const dest(r->getCentreX(),r->getCentreY()); - sp_item_move_rel(u, NR::translate(dest - curr)); + map::iterator i=nodelookup.find(u->id); + if(i!=nodelookup.end()) { + Rectangle* r=rs[i->second]; + Geom::OptRect item_box(sp_item_bbox_desktop(u)); + if(item_box) { + Geom::Point const curr(item_box->midpoint()); + Geom::Point const dest(r->getCentreX(),r->getCentreY()); + sp_item_move_rel(u, Geom::Translate(dest - curr)); + } } } } @@ -216,3 +249,14 @@ void graphlayout(GSList const *const items) { } // vim: set cindent // vim: ts=4 sw=4 et tw=0 wm=0 + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :