summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDiederik van Lierop <mail@diedenrezi.nl>2015-10-14 19:47:34 +0000
committerDiederik van Lierop <mail@diedenrezi.nl>2015-10-14 19:47:34 +0000
commite49ce373b61fba07422c156090b0ee7553cde18f (patch)
tree708570cc84fa85d99767c61d669ad8138353db8f /src
parentimproved results of roughen LPE (diff)
downloadinkscape-e49ce373b61fba07422c156090b0ee7553cde18f.tar.gz
inkscape-e49ce373b61fba07422c156090b0ee7553cde18f.zip
Fix snapping while rotating a selection
Fixed bugs: - https://launchpad.net/bugs/1479167 (bzr r14411)
Diffstat (limited to 'src')
-rw-r--r--src/2geom/path-sink.cpp4
-rw-r--r--src/object-snapper.cpp43
-rw-r--r--src/pure-transform.cpp2
3 files changed, 9 insertions, 40 deletions
diff --git a/src/2geom/path-sink.cpp b/src/2geom/path-sink.cpp
index 3b8d407f8..77301b716 100644
--- a/src/2geom/path-sink.cpp
+++ b/src/2geom/path-sink.cpp
@@ -73,8 +73,8 @@ void PathSink::feed(Rect const &r) {
void PathSink::feed(Circle const &e) {
Coord r = e.radius();
Point c = e.center();
- Point a = c + Point(0, c[Y] + r);
- Point b = c + Point(0, c[Y] - r);
+ Point a = c + Point(0, +r);
+ Point b = c + Point(0, -r);
moveTo(a);
arcTo(r, r, 0, false, false, b);
diff --git a/src/object-snapper.cpp b/src/object-snapper.cpp
index 634d56aa6..7302f9de6 100644
--- a/src/object-snapper.cpp
+++ b/src/object-snapper.cpp
@@ -637,7 +637,6 @@ void Inkscape::ObjectSnapper::_snapPathsConstrained(IntermSnapResults &isr,
constraint_line.appendNew<Geom::LineSegment>(p_max_on_cl);
constraint_path.push_back(constraint_line);
}
- // Length of constraint_path will always be one
bool strict_snapping = _snapmanager->snapprefs.getStrictSnapping();
@@ -646,45 +645,15 @@ void Inkscape::ObjectSnapper::_snapPathsConstrained(IntermSnapResults &isr,
for (std::vector<SnapCandidatePath >::const_iterator k = _paths_to_snap_to->begin(); k != _paths_to_snap_to->end(); ++k) {
if (k->path_vector && _allowSourceToSnapToTarget(p.getSourceType(), (*k).target_type, strict_snapping)) {
// Do the intersection math
- Geom::CrossingSet cs = Geom::crossings(constraint_path, *(k->path_vector));
- // Store the results as intersection points
- unsigned int index = 0;
- for (Geom::CrossingSet::const_iterator i = cs.begin(); i != cs.end(); ++i) {
- if (index >= constraint_path.size()) {
- break;
- }
- // Reconstruct and store the points of intersection
- for (Geom::Crossings::const_iterator m = (*i).begin(); m != (*i).end(); ++m) {
- intersections.push_back(constraint_path[index].pointAt((*m).ta));
- }
- index++;
- }
-
- //Geom::crossings will not consider the closing segment apparently, so we'll handle that separately here
- //TODO: This should have been fixed in rev. #9859, which makes this workaround obsolete
- for(Geom::PathVector::iterator it_pv = k->path_vector->begin(); it_pv != k->path_vector->end(); ++it_pv) {
- if (it_pv->closed()) {
- // Get the closing linesegment and convert it to a path
- Geom::Path cls;
- cls.close(false);
- cls.append(it_pv->back_closed());
- // Intersect that closing path with the constrained path
- Geom::Crossings cs = Geom::crossings(constraint_path.front(), cls);
- // Reconstruct and store the points of intersection
- index = 0; // assuming the constraint path vector has only one path
- for (Geom::Crossings::const_iterator m = cs.begin(); m != cs.end(); ++m) {
- intersections.push_back(constraint_path[index].pointAt((*m).ta));
- }
- }
- }
+ std::vector<Geom::PVIntersection> inters = constraint_path.intersect(*(k->path_vector));
- // Convert the collected points of intersection to snapped points
- for (std::vector<Geom::Point>::iterator p_inters = intersections.begin(); p_inters != intersections.end(); ++p_inters) {
+ // Convert the collected intersections to snapped points
+ for (std::vector<Geom::PVIntersection>::const_iterator i = inters.begin(); i != inters.end(); ++i) {
// Convert to desktop coordinates
- (*p_inters) = dt->doc2dt(*p_inters);
+ Geom::Point p_inters = dt->doc2dt(i->point());
// Construct a snapped point
- Geom::Coord dist = Geom::L2(p.getPoint() - *p_inters);
- SnappedPoint s = SnappedPoint(*p_inters, p.getSourceType(), p.getSourceNum(), k->target_type, dist, getSnapperTolerance(), getSnapperAlwaysSnap(), true, false, k->target_bbox);
+ Geom::Coord dist = Geom::L2(p.getPoint() - p_inters);
+ SnappedPoint s = SnappedPoint(p_inters, p.getSourceType(), p.getSourceNum(), k->target_type, dist, getSnapperTolerance(), getSnapperAlwaysSnap(), true, false, k->target_bbox);
// Store the snapped point
if (dist <= tolerance) { // If the intersection is within snapping range, then we might snap to it
isr.points.push_back(s);
diff --git a/src/pure-transform.cpp b/src/pure-transform.cpp
index aa89c8a8e..9c7054b9f 100644
--- a/src/pure-transform.cpp
+++ b/src/pure-transform.cpp
@@ -63,7 +63,7 @@ void PureTransform::snap(::SnapManager *sm, std::vector<Inkscape::SnapCandidateP
(*j).setSourceNum(0);
first_free_snap = false;
}
- Inkscape::SnappedPoint snapped_point = snap(sm, *j, (*i).getPoint(), bbox);
+ Inkscape::SnappedPoint snapped_point = snap(sm, *j, (*i).getPoint(), bbox); // Calls the snap() method of the derived classes
// std::cout << "dist = " << snapped_point.getSnapDistance() << std::endl;
snapped_point.setPointerDistance(Geom::L2(pointer - (*i).getPoint()));