diff options
| author | Maximilian Albert <maximilian.albert@gmail.com> | 2008-06-18 02:14:06 +0000 |
|---|---|---|
| committer | cilix42 <cilix42@users.sourceforge.net> | 2008-06-18 02:14:06 +0000 |
| commit | dac8076aecf2fe010551c3687ad37d28df20065f (patch) | |
| tree | 373983574dfb262a38458471d6c300d8f62af823 /src | |
| parent | New LPE: Copy rotate (diff) | |
| download | inkscape-dac8076aecf2fe010551c3687ad37d28df20065f.tar.gz inkscape-dac8076aecf2fe010551c3687ad37d28df20065f.zip | |
Add handle to adjust angle
(bzr r5979)
Diffstat (limited to 'src')
| -rw-r--r-- | src/live_effects/lpe-copy_rotate.cpp | 76 | ||||
| -rw-r--r-- | src/live_effects/lpe-copy_rotate.h | 14 |
2 files changed, 89 insertions, 1 deletions
diff --git a/src/live_effects/lpe-copy_rotate.cpp b/src/live_effects/lpe-copy_rotate.cpp index e3f996a1b..52ac7d6be 100644 --- a/src/live_effects/lpe-copy_rotate.cpp +++ b/src/live_effects/lpe-copy_rotate.cpp @@ -23,20 +23,40 @@ namespace Inkscape { namespace LivePathEffect { +namespace CR { + +class KnotHolderEntityAngle : 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 CR + LPECopyRotate::LPECopyRotate(LivePathEffectObject *lpeobject) : Effect(lpeobject), + include_original(_("Include original?"), _(""), "include_original", &wr, this, false), angle(_("Angle"), _("Angle"), "angle", &wr, this, 30.0), num_copies(_("Number of copies"), _("Number of copies of the original path"), "num_copies", &wr, this, 1), - origin(_("Origin"), _("Origin of the rotation"), "origin", &wr, this) + origin(_("Origin"), _("Origin of the rotation"), "origin", &wr, this), + dist_angle_handle(100) { show_orig_path = true; // register all your parameters here, so Inkscape knows which parameters this effect has: + registerParameter( dynamic_cast<Parameter *>(&include_original) ); registerParameter( dynamic_cast<Parameter *>(&angle) ); registerParameter( dynamic_cast<Parameter *>(&num_copies) ); registerParameter( dynamic_cast<Parameter *>(&origin) ); + registerKnotHolderHandle(new CR::KnotHolderEntityAngle(), _("Adjust the angle")); + num_copies.param_make_integer(true); + num_copies.param_set_range(0, 1000); + } LPECopyRotate::~LPECopyRotate() @@ -48,6 +68,10 @@ void LPECopyRotate::doOnApply(SPLPEItem *lpeitem) { origin.param_setValue(SP_SHAPE(lpeitem)->curve->first_point().to_2geom()); + A = pwd2_in.firstValue(); + B = pwd2_in.lastValue(); + dir = unit_vector(B - A); + dist_angle_handle = L2(B - A); } Geom::Piecewise<Geom::D2<Geom::SBasis> > @@ -55,8 +79,16 @@ LPECopyRotate::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & p { using namespace Geom; + A = pwd2_in.firstValue(); + B = pwd2_in.lastValue(); + dir = unit_vector(B - A); + Piecewise<D2<SBasis> > output; + if (include_original) { + output = pwd2_in; + } + for (int i = 1; i <= num_copies; ++i) { Rotate rot(deg_to_rad(angle * i)); Matrix t = Translate(-origin) * rot * Translate(origin); @@ -66,6 +98,48 @@ LPECopyRotate::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & p return output; } +namespace CR { + +using namespace Geom; + +// TODO: make this more generic +static LPECopyRotate * +get_effect(SPItem *item) +{ + Effect *effect = sp_lpe_item_get_current_lpe(SP_LPE_ITEM(item)); + if (effect->effectType() != COPY_ROTATE) { + g_print ("Warning: Effect is not of type LPECopyRotate!\n"); + return NULL; + } + return static_cast<LPECopyRotate *>(effect); +} + +void +KnotHolderEntityAngle::knot_set(NR::Point const &p, NR::Point const &/*origin*/, guint state) +{ + LPECopyRotate* lpe = get_effect(item); + + // FIXME: is the minus sign due to a bug in 2geom? + lpe->angle.param_set_value(rad_to_deg(-angle_between(lpe->dir, p.to_2geom() - lpe->origin))); + lpe->dist_angle_handle = L2(p - lpe->origin); + + // FIXME: this should not directly ask for updating the item. It should write to SVG, which triggers updating. + sp_lpe_item_update_patheffect (SP_LPE_ITEM(item), false, true); +} + +NR::Point +KnotHolderEntityAngle::knot_get() +{ + LPECopyRotate* lpe = get_effect(item); + + // FIXME: is the minus sign due to a bug in 2geom? + Point d = lpe->dir * Rotate(-deg_to_rad(lpe->angle)) * lpe->dist_angle_handle; + + return lpe->origin + d; +} + +} // namespace CR + /* ######################## */ } //namespace LivePathEffect diff --git a/src/live_effects/lpe-copy_rotate.h b/src/live_effects/lpe-copy_rotate.h index 72b46b5d6..9678014fc 100644 --- a/src/live_effects/lpe-copy_rotate.h +++ b/src/live_effects/lpe-copy_rotate.h @@ -20,6 +20,11 @@ namespace Inkscape { namespace LivePathEffect { +namespace CR { + // we need a separate namespace to avoid clashes with LPEPerpBisector + class KnotHolderEntityAngle; +} + class LPECopyRotate : public Effect { public: LPECopyRotate(LivePathEffectObject *lpeobject); @@ -29,11 +34,20 @@ public: virtual Geom::Piecewise<Geom::D2<Geom::SBasis> > doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwd2_in); + /* the knotholder entity classes must be declared friends */ + friend class CR::KnotHolderEntityAngle; + private: ScalarParam angle; ScalarParam num_copies; PointParam origin; + BoolParam include_original; + + Geom::Point A; + Geom::Point B; + Geom::Point dir; + double dist_angle_handle; LPECopyRotate(const LPECopyRotate&); LPECopyRotate& operator=(const LPECopyRotate&); |
