X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fobject-snapper.cpp;h=6b51f85085e44da72335c5db9f975c2658756b45;hb=9092fa64659033e70bf914a5d83d5470d31cbc27;hp=153abe4affe58a0d8027f8d1a495fdbfc171c537;hpb=f951374eef04129c6a0d213e7ab4d9ed2095ca69;p=inkscape.git diff --git a/src/object-snapper.cpp b/src/object-snapper.cpp index 153abe4af..6b51f8508 100644 --- a/src/object-snapper.cpp +++ b/src/object-snapper.cpp @@ -15,6 +15,7 @@ #include "document.h" #include "sp-namedview.h" #include "sp-path.h" +#include "sp-item-group.h" #include "display/curve.h" #include "desktop.h" #include "inkscape.h" @@ -37,8 +38,9 @@ void Inkscape::ObjectSnapper::_findCandidates(std::list& c, std::list const &it, NR::Point const &p) const { - for (SPObject* o = r->children; o != NULL; o = o->next) { - if (SP_IS_ITEM(o)) { + SPDesktop const *desktop = SP_ACTIVE_DESKTOP; + for (SPObject* o = sp_object_first_child(r); o != NULL; o = SP_OBJECT_NEXT(o)) { + if (SP_IS_ITEM(o) && !SP_ITEM(o)->isLocked() && !desktop->itemIsHidden(SP_ITEM(o))) { /* See if this item is on the ignore list */ std::list::const_iterator i = it.begin(); @@ -48,14 +50,17 @@ void Inkscape::ObjectSnapper::_findCandidates(std::list& c, if (i == it.end()) { /* See if the item is within range */ - NR::Rect const b = NR::expand(sp_item_bbox_desktop(SP_ITEM(o)), -getDistance()); - if (b.contains(p)) { - c.push_back(SP_ITEM(o)); + if (SP_IS_GROUP(o)) { + _findCandidates(c, o, it, p); + } else { + NR::Rect const b = NR::expand(sp_item_bbox_desktop(SP_ITEM(o)), -getDistance()); + if (b.contains(p)) { + c.push_back(SP_ITEM(o)); + } } } - } - _findCandidates(c, o, it, p); + } } } @@ -78,10 +83,10 @@ void Inkscape::ObjectSnapper::_snapNodes(Inkscape::SnappedPoint &s, int j = 0; NR::Matrix const i2doc = sp_item_i2doc_affine(*i); - while (sh->curve->bpath[j].code != NR_END) { + while (SP_CURVE_BPATH(sh->curve)[j].code != NR_END) { /* Get this node in desktop coordinates */ - NArtBpath const &bp = sh->curve->bpath[j]; + NArtBpath const &bp = SP_CURVE_BPATH(sh->curve)[j]; NR::Point const n = desktop->doc2dt(bp.c(3) * i2doc); /* Try to snap to this node of the path */ @@ -115,12 +120,18 @@ void Inkscape::ObjectSnapper::_snapPaths(Inkscape::SnappedPoint &s, NR::Matrix const i2doc = sp_item_i2doc_affine(*i); NR::Point const p_it = p_doc * i2doc.inverse(); + Path *livarot_path = Path_for_item(*i, true, true); + if (!livarot_path) + continue; + + livarot_path->ConvertWithBackData(0.01); + /* Look for the nearest position on this SPItem to our snap point */ - NR::Maybe const o = get_nearest_position_on_Path(*i, p_it); + NR::Maybe const o = get_nearest_position_on_Path(livarot_path, p_it); if (o != NR::Nothing() && o.assume().t >= 0 && o.assume().t <= 1) { /* Convert the nearest point back to desktop coordinates */ - NR::Point const o_it = get_point_on_Path(*i, o.assume().piece, o.assume().t); + NR::Point const o_it = get_point_on_Path(livarot_path, o.assume().piece, o.assume().t); NR::Point const o_dt = desktop->doc2dt(o_it * i2doc); NR::Coord const dist = NR::L2(o_dt - p); @@ -128,6 +139,8 @@ void Inkscape::ObjectSnapper::_snapPaths(Inkscape::SnappedPoint &s, s = SnappedPoint(o_dt, dist); } } + + delete livarot_path; } } @@ -136,6 +149,10 @@ void Inkscape::ObjectSnapper::_snapPaths(Inkscape::SnappedPoint &s, Inkscape::SnappedPoint Inkscape::ObjectSnapper::_doFreeSnap(NR::Point const &p, std::list const &it) const { + if ( NULL == _named_view ) { + return SnappedPoint(p, NR_HUGE); + } + /* Get a list of all the SPItems that we will try to snap to */ std::list cand; _findCandidates(cand, sp_document_root(_named_view->document), it, p); @@ -155,7 +172,7 @@ Inkscape::SnappedPoint Inkscape::ObjectSnapper::_doFreeSnap(NR::Point const &p, Inkscape::SnappedPoint Inkscape::ObjectSnapper::_doConstrainedSnap(NR::Point const &p, - NR::Point const &c, + ConstraintLine const &c, std::list const &it) const { /* FIXME: this needs implementing properly; I think we have to do the