summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDiederik van Lierop <mail@diedenrezi.nl>2012-02-14 23:08:32 +0000
committerDiederik van Lierop <mail@diedenrezi.nl>2012-02-14 23:08:32 +0000
commit2f013ce44d64f518703648c6ee7c392f38a1beb7 (patch)
tree94d7b1f7ba01dee874d3f9de72a37c5ee6000596
parent1) Add checkboxes for perpendicular and tangential snapping to the document p... (diff)
downloadinkscape-2f013ce44d64f518703648c6ee7c392f38a1beb7.tar.gz
inkscape-2f013ce44d64f518703648c6ee7c392f38a1beb7.zip
Snap to grid/guide lines perpendicularly
(bzr r10976)
-rw-r--r--src/display/canvas-axonomgrid.cpp6
-rw-r--r--src/display/canvas-axonomgrid.h1
-rw-r--r--src/display/canvas-grid.cpp6
-rw-r--r--src/display/canvas-grid.h1
-rw-r--r--src/display/snap-indicator.cpp6
-rw-r--r--src/guide-snapper.cpp5
-rw-r--r--src/guide-snapper.h1
-rw-r--r--src/line-snapper.cpp29
-rw-r--r--src/line-snapper.h1
-rw-r--r--src/snap-enums.h2
-rw-r--r--src/snap-preferences.cpp2
11 files changed, 59 insertions, 1 deletions
diff --git a/src/display/canvas-axonomgrid.cpp b/src/display/canvas-axonomgrid.cpp
index 1c74e3d86..ab0592fc6 100644
--- a/src/display/canvas-axonomgrid.cpp
+++ b/src/display/canvas-axonomgrid.cpp
@@ -737,6 +737,12 @@ void CanvasAxonomGridSnapper::_addSnappedPoint(IntermSnapResults &isr, Geom::Poi
isr.points.push_back(dummy);
}
+void CanvasAxonomGridSnapper::_addSnappedLinePerpendicularly(IntermSnapResults &isr, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const
+{
+ SnappedPoint dummy = SnappedPoint(snapped_point, source, source_num, Inkscape::SNAPTARGET_GRID_PERPENDICULAR, snapped_distance, getSnapperTolerance(), getSnapperAlwaysSnap(), constrained_snap, true);
+ isr.points.push_back(dummy);
+}
+
bool CanvasAxonomGridSnapper::ThisSnapperMightSnap() const
{
return _snap_enabled && _snapmanager->snapprefs.isTargetSnappable(Inkscape::SNAPTARGET_GRID);
diff --git a/src/display/canvas-axonomgrid.h b/src/display/canvas-axonomgrid.h
index 0a12d3743..ec42b5f83 100644
--- a/src/display/canvas-axonomgrid.h
+++ b/src/display/canvas-axonomgrid.h
@@ -74,6 +74,7 @@ private:
LineList _getSnapLines(Geom::Point const &p) const;
void _addSnappedLine(IntermSnapResults &isr, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, Geom::Point const normal_to_line, const Geom::Point point_on_line) const;
void _addSnappedPoint(IntermSnapResults &isr, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const;
+ void _addSnappedLinePerpendicularly(IntermSnapResults &isr, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const;
CanvasAxonomGrid *grid;
};
diff --git a/src/display/canvas-grid.cpp b/src/display/canvas-grid.cpp
index 3517e5b47..ea406663c 100644
--- a/src/display/canvas-grid.cpp
+++ b/src/display/canvas-grid.cpp
@@ -1046,6 +1046,12 @@ void CanvasXYGridSnapper::_addSnappedPoint(IntermSnapResults &isr, Geom::Point c
isr.points.push_back(dummy);
}
+void CanvasXYGridSnapper::_addSnappedLinePerpendicularly(IntermSnapResults &isr, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const
+{
+ SnappedPoint dummy = SnappedPoint(snapped_point, source, source_num, Inkscape::SNAPTARGET_GRID_PERPENDICULAR, snapped_distance, getSnapperTolerance(), getSnapperAlwaysSnap(), constrained_snap, true);
+ isr.points.push_back(dummy);
+}
+
/**
* \return true if this Snapper will snap at least one kind of point.
*/
diff --git a/src/display/canvas-grid.h b/src/display/canvas-grid.h
index f3b285be7..173c0c02b 100644
--- a/src/display/canvas-grid.h
+++ b/src/display/canvas-grid.h
@@ -167,6 +167,7 @@ private:
LineList _getSnapLines(Geom::Point const &p) const;
void _addSnappedLine(IntermSnapResults &isr, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, Geom::Point const normal_to_line, const Geom::Point point_on_line) const;
void _addSnappedPoint(IntermSnapResults &isr, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const;
+ void _addSnappedLinePerpendicularly(IntermSnapResults &isr, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const;
CanvasXYGrid *grid;
};
diff --git a/src/display/snap-indicator.cpp b/src/display/snap-indicator.cpp
index ee719847f..d5b8ce07f 100644
--- a/src/display/snap-indicator.cpp
+++ b/src/display/snap-indicator.cpp
@@ -79,6 +79,9 @@ SnapIndicator::set_new_snaptarget(Inkscape::SnappedPoint const &p, bool pre_snap
case SNAPTARGET_GRID_INTERSECTION:
target_name = _("grid intersection");
break;
+ case SNAPTARGET_GRID_PERPENDICULAR:
+ target_name = _("grid line (perpendicular)");
+ break;
case SNAPTARGET_GUIDE:
target_name = _("guide");
break;
@@ -88,6 +91,9 @@ SnapIndicator::set_new_snaptarget(Inkscape::SnappedPoint const &p, bool pre_snap
case SNAPTARGET_GUIDE_ORIGIN:
target_name = _("guide origin");
break;
+ case SNAPTARGET_GUIDE_PERPENDICULAR:
+ target_name = _("guide (perpendicular)");
+ break;
case SNAPTARGET_GRID_GUIDE_INTERSECTION:
target_name = _("grid-guide intersection");
break;
diff --git a/src/guide-snapper.cpp b/src/guide-snapper.cpp
index d6741b642..11636b0fc 100644
--- a/src/guide-snapper.cpp
+++ b/src/guide-snapper.cpp
@@ -79,6 +79,11 @@ void Inkscape::GuideSnapper::_addSnappedLinesOrigin(IntermSnapResults &isr, Geom
isr.points.push_back(dummy);
}
+void Inkscape::GuideSnapper::_addSnappedLinePerpendicularly(IntermSnapResults &isr, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const
+{
+ SnappedPoint dummy = SnappedPoint(snapped_point, source, source_num, Inkscape::SNAPTARGET_GUIDE_PERPENDICULAR, snapped_distance, getSnapperTolerance(), getSnapperAlwaysSnap(), constrained_snap, true);
+ isr.points.push_back(dummy);
+}
void Inkscape::GuideSnapper::_addSnappedPoint(IntermSnapResults &isr, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const
{
diff --git a/src/guide-snapper.h b/src/guide-snapper.h
index f51939c08..aa0c45320 100644
--- a/src/guide-snapper.h
+++ b/src/guide-snapper.h
@@ -34,6 +34,7 @@ private:
LineList _getSnapLines(Geom::Point const &p) const;
void _addSnappedLine(IntermSnapResults &isr, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, Geom::Point const normal_to_line, Geom::Point const point_on_line) const;
void _addSnappedLinesOrigin(IntermSnapResults &isr, Geom::Point const origin, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const;
+ void _addSnappedLinePerpendicularly(IntermSnapResults &isr, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const;
void _addSnappedPoint(IntermSnapResults &isr, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const;
};
diff --git a/src/line-snapper.cpp b/src/line-snapper.cpp
index 3fb503354..c8f10fb29 100644
--- a/src/line-snapper.cpp
+++ b/src/line-snapper.cpp
@@ -5,7 +5,7 @@
* Diederik van Lierop <mail@diedenrezi.nl>
* And others...
*
- * Copyright (C) 1999-2008 Authors
+ * Copyright (C) 1999-2012 Authors
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
@@ -53,6 +53,33 @@ void Inkscape::LineSnapper::freeSnap(IntermSnapResults &isr,
// Only relevant for guides; grids don't have an origin per line
// Therefore _addSnappedLinesOrigin() will only be implemented for guides
}
+
+ // Here we will try to snap either tangentially or perpendicularly to a grid/guide line
+ // For this we need to know where the origin is located of the line that is currently being rotated,
+ std::vector<std::pair<Geom::Point, bool> > const origins_and_vectors = p.getOriginsAndVectors();
+ // Now we will iterate over all the origins and vectors and see which of these will get use a tangential or perpendicular snap
+ for (std::vector<std::pair<Geom::Point, bool> >::const_iterator it_origin_or_vector = origins_and_vectors.begin(); it_origin_or_vector != origins_and_vectors.end(); it_origin_or_vector++) {
+ if ((*it_origin_or_vector).second) { // if "second" is true then "first" is a vector, otherwise it's a point
+ // When snapping a line with a constant vector (constant direction) to a guide or grid line,
+ // then either all points will be perpendicular/tangential or none at all. This is not very useful
+ continue;
+ }
+
+ //Geom::Point origin_doc = _snapmanager->getDesktop()->dt2doc((*it_origin_or_vector).first); // "first" contains a Geom::Point, denoting either a point
+ Geom::Point origin = (*it_origin_or_vector).first; // "first" contains a Geom::Point, denoting either a point
+
+ // We won't try to snap tangentially; a line being tangential to another line can be achieved by snapping both its endpoints
+ // individually to the other line. There's no need to have an explicit tangential snap here, that would be redundant
+
+ if (_snapmanager->snapprefs.getSnapPerp()) { // Find the point that leads to a perpendicular snap
+ Geom::Point const origin_proj = Geom::projection(origin, Geom::Line(p1, p2));
+ Geom::Coord dist = Geom::L2(origin_proj - p.getPoint());
+ if (dist < getSnapperTolerance()) {
+ _addSnappedLinePerpendicularly(isr, origin_proj, dist, p.getSourceType(), p.getSourceNum(), false);
+ }
+ }
+ }
+
// std::cout << " -> distance = " << dist;
}
// std::cout << std::endl;
diff --git a/src/line-snapper.h b/src/line-snapper.h
index 578a426ce..e7995cdb6 100644
--- a/src/line-snapper.h
+++ b/src/line-snapper.h
@@ -55,6 +55,7 @@ private:
// Will only be implemented for guide lines, because grid lines don't have an origin
virtual void _addSnappedLinesOrigin(IntermSnapResults &isr, Geom::Point const origin, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const;
+ virtual void _addSnappedLinePerpendicularly(IntermSnapResults &isr, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const = 0;
virtual void _addSnappedPoint(IntermSnapResults &isr, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const = 0;
};
diff --git a/src/snap-enums.h b/src/snap-enums.h
index 22f1b9cdc..c6ca97402 100644
--- a/src/snap-enums.h
+++ b/src/snap-enums.h
@@ -79,9 +79,11 @@ enum SnapTargetType {
SNAPTARGET_DATUMS_CATEGORY = 64, // will be used as a flag and must therefore be a power of two
SNAPTARGET_GRID,
SNAPTARGET_GRID_INTERSECTION,
+ SNAPTARGET_GRID_PERPENDICULAR,
SNAPTARGET_GUIDE,
SNAPTARGET_GUIDE_INTERSECTION,
SNAPTARGET_GUIDE_ORIGIN,
+ SNAPTARGET_GUIDE_PERPENDICULAR,
SNAPTARGET_GRID_GUIDE_INTERSECTION,
SNAPTARGET_PAGE_BORDER,
SNAPTARGET_PAGE_CORNER,
diff --git a/src/snap-preferences.cpp b/src/snap-preferences.cpp
index 09924e3bc..79e47ca83 100644
--- a/src/snap-preferences.cpp
+++ b/src/snap-preferences.cpp
@@ -88,10 +88,12 @@ void Inkscape::SnapPreferences::_mapTargetToArrayIndex(Inkscape::SnapTargetType
// Some snap targets don't have their own toggle. These targets are called "secondary targets". We will re-map
// them to their cousin which does have a toggle, and which is called a "primary target"
case SNAPTARGET_GRID_INTERSECTION:
+ case SNAPTARGET_GRID_PERPENDICULAR:
target = SNAPTARGET_GRID;
break;
case SNAPTARGET_GUIDE_INTERSECTION:
case SNAPTARGET_GUIDE_ORIGIN:
+ case SNAPTARGET_GUIDE_PERPENDICULAR:
target = SNAPTARGET_GUIDE;
break;
case SNAPTARGET_PAGE_CORNER: