diff options
| author | Diederik van Lierop <mail@diedenrezi.nl> | 2012-02-14 23:08:32 +0000 |
|---|---|---|
| committer | Diederik van Lierop <mail@diedenrezi.nl> | 2012-02-14 23:08:32 +0000 |
| commit | 2f013ce44d64f518703648c6ee7c392f38a1beb7 (patch) | |
| tree | 94d7b1f7ba01dee874d3f9de72a37c5ee6000596 | |
| parent | 1) Add checkboxes for perpendicular and tangential snapping to the document p... (diff) | |
| download | inkscape-2f013ce44d64f518703648c6ee7c392f38a1beb7.tar.gz inkscape-2f013ce44d64f518703648c6ee7c392f38a1beb7.zip | |
Snap to grid/guide lines perpendicularly
(bzr r10976)
| -rw-r--r-- | src/display/canvas-axonomgrid.cpp | 6 | ||||
| -rw-r--r-- | src/display/canvas-axonomgrid.h | 1 | ||||
| -rw-r--r-- | src/display/canvas-grid.cpp | 6 | ||||
| -rw-r--r-- | src/display/canvas-grid.h | 1 | ||||
| -rw-r--r-- | src/display/snap-indicator.cpp | 6 | ||||
| -rw-r--r-- | src/guide-snapper.cpp | 5 | ||||
| -rw-r--r-- | src/guide-snapper.h | 1 | ||||
| -rw-r--r-- | src/line-snapper.cpp | 29 | ||||
| -rw-r--r-- | src/line-snapper.h | 1 | ||||
| -rw-r--r-- | src/snap-enums.h | 2 | ||||
| -rw-r--r-- | src/snap-preferences.cpp | 2 |
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: |
