summaryrefslogtreecommitdiffstats
path: root/src/object-snapper.cpp
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/object-snapper.cpp
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/object-snapper.cpp')
-rw-r--r--src/object-snapper.cpp43
1 files changed, 6 insertions, 37 deletions
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);