From b91b26dfd424a46b90e69643dacd94feccff4731 Mon Sep 17 00:00:00 2001 From: cilix42 Date: Mon, 19 May 2008 16:10:35 +0000 Subject: [PATCH] Add handles to adapt tangent length --- src/live_effects/lpe-tangent_to_curve.cpp | 48 +++++++++++++++++++++-- src/live_effects/lpe-tangent_to_curve.h | 12 +++++- 2 files changed, 55 insertions(+), 5 deletions(-) diff --git a/src/live_effects/lpe-tangent_to_curve.cpp b/src/live_effects/lpe-tangent_to_curve.cpp index e7344c9dc..92aca33c6 100644 --- a/src/live_effects/lpe-tangent_to_curve.cpp +++ b/src/live_effects/lpe-tangent_to_curve.cpp @@ -57,12 +57,52 @@ void attach_pt_set(SPItem *item, NR::Point const &p, NR::Point const &origin, gu sp_lpe_item_update_patheffect (SP_LPE_ITEM(item), true); } +NR::Point left_end_get(SPItem *item) { + Inkscape::LivePathEffect::LPETangentToCurve *lpe = + (Inkscape::LivePathEffect::LPETangentToCurve *) sp_lpe_item_get_livepatheffect(SP_LPE_ITEM(item)); + + return lpe->C; +} + +NR::Point right_end_get(SPItem *item) { + Inkscape::LivePathEffect::LPETangentToCurve *lpe = + (Inkscape::LivePathEffect::LPETangentToCurve *) sp_lpe_item_get_livepatheffect(SP_LPE_ITEM(item)); + + return lpe->D; +} + +void left_end_set(SPItem *item, NR::Point const &p, NR::Point const &origin, guint state) { + Inkscape::LivePathEffect::LPETangentToCurve *lpe = + (Inkscape::LivePathEffect::LPETangentToCurve *) sp_lpe_item_get_livepatheffect(SP_LPE_ITEM(item)); + + double lambda = Geom::nearest_point(p.to_2geom(), lpe->ptA, lpe->derivA); + lpe->length_left.param_set_value(-lambda); + + sp_lpe_item_update_patheffect (SP_LPE_ITEM(item), true); +} + +void right_end_set(SPItem *item, NR::Point const &p, NR::Point const &origin, guint state) { + Inkscape::LivePathEffect::LPETangentToCurve *lpe = + (Inkscape::LivePathEffect::LPETangentToCurve *) sp_lpe_item_get_livepatheffect(SP_LPE_ITEM(item)); + + double lambda = Geom::nearest_point(p.to_2geom(), lpe->ptA, lpe->derivA); + lpe->length_right.param_set_value(lambda); + + sp_lpe_item_update_patheffect (SP_LPE_ITEM(item), true); +} + LPETangentToCurve::LPETangentToCurve(LivePathEffectObject *lpeobject) : Effect(lpeobject), - t_attach(_("Location along curve"), _("Location of the point of attachment along the curve (between 0.0 and number-of-segments)"), "t_attach", &wr, this, 0.5) + t_attach(_("Location along curve"), _("Location of the point of attachment along the curve (between 0.0 and number-of-segments)"), "t_attach", &wr, this, 0.5), + length_left(_("Length left"), _("Specifies the left end of the tangent"), "length-left", &wr, this, 150), + length_right(_("Length right"), _("Specifies the right end of the tangent"), "length-right", &wr, this, 150) { registerParameter( dynamic_cast(&t_attach) ); + registerParameter( dynamic_cast(&length_left) ); + registerParameter( dynamic_cast(&length_right) ); registerKnotHolderHandle(attach_pt_set, attach_pt_get); + registerKnotHolderHandle(left_end_set, left_end_get); + registerKnotHolderHandle(right_end_set, right_end_get); } LPETangentToCurve::~LPETangentToCurve() @@ -78,10 +118,10 @@ LPETangentToCurve::doEffect_pwd2 (Geom::Piecewise > const ptA = pwd2_in.valueAt(t_attach); derivA = unit_vector(derivative(pwd2_in).valueAt(t_attach)); - Point A = ptA - derivA * 100; - Point B = ptA + derivA * 100; + C = ptA - derivA * length_left; + D = ptA + derivA * length_right; - output = Piecewise >(D2(Linear(A[X], B[X]), Linear(A[Y], B[Y]))); + output = Piecewise >(D2(Linear(C[X], D[X]), Linear(C[Y], D[Y]))); return output; } diff --git a/src/live_effects/lpe-tangent_to_curve.h b/src/live_effects/lpe-tangent_to_curve.h index d8049c176..7d80b23bb 100644 --- a/src/live_effects/lpe-tangent_to_curve.h +++ b/src/live_effects/lpe-tangent_to_curve.h @@ -33,14 +33,24 @@ public: /* the knotholder functions must be declared friends */ friend NR::Point attach_pt_get(SPItem *item); + friend NR::Point left_end_get(SPItem *item); + friend NR::Point right_end_get(SPItem *item); friend void attach_pt_set(SPItem *item, NR::Point const &p, NR::Point const &origin, guint state); + friend void left_end_set(SPItem *item, NR::Point const &p, NR::Point const &origin, guint state); + friend void right_end_set(SPItem *item, NR::Point const &p, NR::Point const &origin, guint state); private: ScalarParam t_attach; - Geom::Point ptA; + ScalarParam length_left; + ScalarParam length_right; + + Geom::Point ptA; // point of attachment to the curve Geom::Point derivA; + Geom::Point C; // left end of tangent + Geom::Point D; // right end of tangent + LPETangentToCurve(const LPETangentToCurve&); LPETangentToCurve& operator=(const LPETangentToCurve&); }; -- 2.30.2