From: cilix42 Date: Wed, 18 Jun 2008 02:13:25 +0000 (+0000) Subject: New LPE: Parallel X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=b320a8d186114a5122ddc3afbe95110eb6cb10ce;p=inkscape.git New LPE: Parallel --- diff --git a/src/live_effects/Makefile_insert b/src/live_effects/Makefile_insert index 3d5cc43c4..245a9bd60 100644 --- a/src/live_effects/Makefile_insert +++ b/src/live_effects/Makefile_insert @@ -56,5 +56,7 @@ live_effects_liblive_effects_a_SOURCES = \ live_effects/lpe-circle_3pts.cpp \ live_effects/lpe-circle_3pts.h \ live_effects/lpe-angle_bisector.cpp \ - live_effects/lpe-angle_bisector.h + live_effects/lpe-angle_bisector.h \ + live_effects/lpe-parallel.cpp \ + live_effects/lpe-parallel.h diff --git a/src/live_effects/effect.cpp b/src/live_effects/effect.cpp index 7e56023a6..73b5a5786 100644 --- a/src/live_effects/effect.cpp +++ b/src/live_effects/effect.cpp @@ -58,6 +58,7 @@ #include "live_effects/lpe-mirror_reflect.h" #include "live_effects/lpe-circle_3pts.h" #include "live_effects/lpe-angle_bisector.h" +#include "live_effects/lpe-parallel.h" // end of includes namespace Inkscape { @@ -87,6 +88,7 @@ const Util::EnumData LPETypeData[INVALID_LPE] = { {MIRROR_REFLECT, N_("Mirror reflection"), "mirror_reflect"}, {CIRCLE_3PTS, N_("Circle through 3 points"), "circle_3pts"}, {ANGLE_BISECTOR, N_("Angle bisector"), "angle_bisector"}, + {PARALLEL, N_("Parallel"), "parallel"}, }; const Util::EnumDataConverter LPETypeConverter(LPETypeData, INVALID_LPE); @@ -154,6 +156,9 @@ Effect::New(EffectType lpenr, LivePathEffectObject *lpeobj) case ANGLE_BISECTOR: neweffect = static_cast ( new LPEAngleBisector(lpeobj) ); break; + case PARALLEL: + neweffect = static_cast ( new LPEParallel(lpeobj) ); + break; default: g_warning("LivePathEffect::Effect::New called with invalid patheffect type (%d)", lpenr); neweffect = NULL; diff --git a/src/live_effects/effect.h b/src/live_effects/effect.h index 54dcf0c8c..09a07039a 100644 --- a/src/live_effects/effect.h +++ b/src/live_effects/effect.h @@ -75,6 +75,7 @@ enum EffectType { MIRROR_REFLECT, CIRCLE_3PTS, ANGLE_BISECTOR, + PARALLEL, INVALID_LPE // This must be last }; diff --git a/src/live_effects/lpe-parallel.cpp b/src/live_effects/lpe-parallel.cpp new file mode 100644 index 000000000..51f3d3ac1 --- /dev/null +++ b/src/live_effects/lpe-parallel.cpp @@ -0,0 +1,170 @@ +#define INKSCAPE_LPE_PARALLEL_CPP +/** \file + * LPE implementation + */ +/* + * Authors: + * Maximilian Albert + * + * Copyright (C) Johan Engelen 2007 + * Copyright (C) Maximilian Albert 2008 + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#include "live_effects/lpe-parallel.h" +#include "sp-shape.h" +#include "display/curve.h" + +#include <2geom/path.h> +#include <2geom/transforms.h> + +namespace Inkscape { +namespace LivePathEffect { + +namespace Pl { + +class KnotHolderEntityLeftEnd : public KnotHolderEntity +{ +public: + virtual bool isLPEParam() { return true; } + + virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state); + virtual NR::Point knot_get(); +}; + +class KnotHolderEntityRightEnd : public KnotHolderEntity +{ +public: + virtual bool isLPEParam() { return true; } + + virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state); + virtual NR::Point knot_get(); +}; + +} // namespace Pl + +LPEParallel::LPEParallel(LivePathEffectObject *lpeobject) : + Effect(lpeobject), + // initialise your parameters here: + offset_pt(_("Offset"), _("Tadah"), "offset_pt", &wr, this), + length_left(_("Length left"), _("Specifies the left end of the parallel"), "length-left", &wr, this, 150), + length_right(_("Length right"), _("Specifies the right end of the parallel"), "length-right", &wr, this, 150) +{ + show_orig_path = true; + + registerParameter(dynamic_cast(&offset_pt)); + registerParameter( dynamic_cast(&length_left) ); + registerParameter( dynamic_cast(&length_right) ); + + registerKnotHolderHandle(new Pl::KnotHolderEntityLeftEnd(), _("Adjust the \"left\" end of the parallel")); + registerKnotHolderHandle(new Pl::KnotHolderEntityRightEnd(), _("Adjust the \"right\" end of the parallel")); +} + +LPEParallel::~LPEParallel() +{ + +} + +void +LPEParallel::doOnApply (SPLPEItem *lpeitem) +{ + SPCurve *curve = SP_SHAPE(lpeitem)->curve; + + A = curve->first_point().to_2geom(); + B = curve->last_point().to_2geom(); + dir = unit_vector(B - A); + + offset_pt.param_set_and_write_new_value((A + B)/2 + dir.ccw() * 100); +} + +Geom::Piecewise > +LPEParallel::doEffect_pwd2 (Geom::Piecewise > const & pwd2_in) +{ + using namespace Geom; + + Piecewise > output; + + A = pwd2_in.firstValue(); + B = pwd2_in.lastValue(); + dir = unit_vector(B - A); + + C = offset_pt - dir * length_left; + D = offset_pt + dir * length_right; + + output = Piecewise >(D2(Linear(C[X], D[X]), Linear(C[Y], D[Y]))); + + return output + dir; +} + +namespace Pl { + +// TODO: make this more generic +static LPEParallel * +get_effect(SPItem *item) +{ + Effect *effect = sp_lpe_item_get_current_lpe(SP_LPE_ITEM(item)); + if (effect->effectType() != PARALLEL) { + g_print ("Warning: Effect is not of type LPEParallel!\n"); + return NULL; + } + return static_cast(effect); +} + +void +KnotHolderEntityLeftEnd::knot_set(NR::Point const &p, NR::Point const &/*origin*/, guint /*state*/) +{ + using namespace Geom; + + LPEParallel *lpe = get_effect(item); + + double lambda = L2(p - lpe->offset_pt) * sgn(dot(p.to_2geom() - lpe->offset_pt, lpe->dir)); + lpe->length_left.param_set_value(-lambda); + + sp_lpe_item_update_patheffect (SP_LPE_ITEM(item), false, true); +} + +void +KnotHolderEntityRightEnd::knot_set(NR::Point const &p, NR::Point const &/*origin*/, guint /*state*/) +{ + using namespace Geom; + + LPEParallel *lpe = get_effect(item); + + double lambda = L2(p - lpe->offset_pt) * sgn(dot(p.to_2geom() - lpe->offset_pt, lpe->dir)); + lpe->length_right.param_set_value(lambda); + + sp_lpe_item_update_patheffect (SP_LPE_ITEM(item), false, true); +} + +NR::Point +KnotHolderEntityLeftEnd::knot_get() +{ + LPEParallel *lpe = get_effect(item); + return lpe->C; +} + +NR::Point +KnotHolderEntityRightEnd::knot_get() +{ + LPEParallel *lpe = get_effect(item); + return lpe->D; +} + +} // namespace Pl + +/* ######################## */ + +} //namespace LivePathEffect +} /* namespace Inkscape */ + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 : diff --git a/src/live_effects/lpe-parallel.h b/src/live_effects/lpe-parallel.h new file mode 100644 index 000000000..6dc426aa8 --- /dev/null +++ b/src/live_effects/lpe-parallel.h @@ -0,0 +1,74 @@ +#ifndef INKSCAPE_LPE_PARALLEL_H +#define INKSCAPE_LPE_PARALLEL_H + +/** \file + * LPE implementation + */ + +/* + * Authors: + * Maximilian Albert + * + * Copyright (C) Johan Engelen 2007 + * Copyright (C) Maximilian Albert 2008 + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#include "live_effects/effect.h" +#include "live_effects/parameter/point.h" + +namespace Inkscape { +namespace LivePathEffect { + +namespace Pl { + // we need a separate namespace to avoid clashes with LPEPerpBisector + class KnotHolderEntityLeftEnd; + class KnotHolderEntityRightEnd; +} + +class LPEParallel : public Effect { +public: + LPEParallel(LivePathEffectObject *lpeobject); + virtual ~LPEParallel(); + + virtual void doOnApply (SPLPEItem *lpeitem); + + virtual Geom::Piecewise > doEffect_pwd2 (Geom::Piecewise > const & pwd2_in); + + /* the knotholder entity classes must be declared friends */ + friend class Pl::KnotHolderEntityLeftEnd; + friend class Pl::KnotHolderEntityRightEnd; + +private: + PointParam offset_pt; + ScalarParam length_left; + ScalarParam length_right; + + Geom::Point A; + Geom::Point B; + Geom::Point C; + Geom::Point D; + Geom::Point M; + Geom::Point N; + Geom::Point dir; + + LPEParallel(const LPEParallel&); + LPEParallel& operator=(const LPEParallel&); +}; + +} //namespace LivePathEffect +} //namespace Inkscape + +#endif + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :