From: johanengelen Date: Mon, 23 Oct 2006 19:02:59 +0000 (+0000) Subject: Axonometric grid: snapping to vertical gridlines X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=eee76dc9fd97872c225c448032e48d9c20611164;p=inkscape.git Axonometric grid: snapping to vertical gridlines --- diff --git a/src/Makefile_insert b/src/Makefile_insert index fec782544..a6a827ead 100644 --- a/src/Makefile_insert +++ b/src/Makefile_insert @@ -40,6 +40,7 @@ libinkpre_a_SOURCES = \ approx-equal.h remove-last.h \ arc-context.cpp arc-context.h \ attributes.cpp attributes.h \ + axonomgrid-snapper.cpp axonomgrid-snapper.h \ bad-uri-exception.h \ brokenimage.xpm \ color-rgba.h \ diff --git a/src/axonomgrid-snapper.cpp b/src/axonomgrid-snapper.cpp new file mode 100644 index 000000000..674357d44 --- /dev/null +++ b/src/axonomgrid-snapper.cpp @@ -0,0 +1,84 @@ +#ifdef AXONOM + +/** + * \file axonomgrid-snapper.cpp + * \brief Snapping things to axonometric grids. + * + * Author: + * Johan Engelen + * + * Copyright (C) 2006 Authors + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#include "sp-namedview.h" +#include "inkscape.h" +#include "desktop.h" +#include "display/canvas-grid.h" + +/** + * \return x rounded to the nearest multiple of c1 plus c0. + * + * \note + * If c1==0 (and c0 is finite), then returns +/-inf. This makes grid spacing of zero + * mean "ignore the grid in this dimention". We're currently discussing "good" semantics + * for guide/grid snapping. + */ + +/* FIXME: move this somewhere else, perhaps */ +static double round_to_nearest_multiple_plus(double x, double const c1, double const c0) +{ + return floor((x - c0) / c1 + .5) * c1 + c0; +} + +Inkscape::AxonomGridSnapper::AxonomGridSnapper(SPNamedView const *nv, NR::Coord const d) : LineSnapper(nv, d) +{ + +} + +Inkscape::LineSnapper::LineList +Inkscape::AxonomGridSnapper::_getSnapLines(NR::Point const &p) const +{ + LineList s; + + if ( NULL == _named_view ) { + return s; + } + + SPCGrid *griditem = NULL; + for (GSList *l = _named_view->gridviews; l != NULL; l = l->next) { + // FIXME : this is a hack since there is only one view for now + // but when we'll handle multiple views, snapping should + // must be rethought and maybe only the current view + // should give back it's SHOWN lines to snap to + // For now, the last SPCGrid in _named_view->gridviews will be used. + griditem = SP_CGRID(l->data); + } + + g_assert(griditem != NULL); + + for (unsigned int i = 0; i < 2; ++i) { + + /* This is to make sure we snap to only visible grid lines */ + double scaled_spacing = griditem->sw[i]; // this is spacing of visible lines if screen pixels + + // convert screen pixels to px + // FIXME: after we switch to snapping dist in screen pixels, this will be unnecessary + if (SP_ACTIVE_DESKTOP) { + scaled_spacing /= SP_ACTIVE_DESKTOP->current_zoom(); + } + + NR::Coord const rounded = round_to_nearest_multiple_plus(p[i], + scaled_spacing, + _named_view->gridorigin[i]); + + s.push_back(std::make_pair(NR::Dim2(i), rounded)); + } + + return s; +} + + + +#endif diff --git a/src/axonomgrid-snapper.h b/src/axonomgrid-snapper.h new file mode 100644 index 000000000..46090ee56 --- /dev/null +++ b/src/axonomgrid-snapper.h @@ -0,0 +1,33 @@ +#ifndef SEEN_AXONOMGRID_SNAPPER_H +#define SEEN_AXONOMGRID_SNAPPER_H + +/** + * \file axonomgrid-snapper.h + * \brief Snapping things to axonometricgrids. + * + * Author: + * Johan Engelen + * + * Copyright (C) 2006 Author + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#include "line-snapper.h" + +namespace Inkscape +{ + +class AxonomGridSnapper : public LineSnapper +{ +public: + AxonomGridSnapper(SPNamedView const *nv, NR::Coord const d); + +private: + LineList _getSnapLines(NR::Point const &p) const; +}; + +} + +#endif +