X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Flive_effects%2Flpe-perp_bisector.cpp;h=7c08bdb08ff07488675e944b58cc277c22f65fbb;hb=e9c4a66f3db12ac811f42b73493c1c88460f0de3;hp=2fec63f3c37141f18acde4442275fca463113d03;hpb=73d455c08e8062e257dd052d2d690b9300434351;p=inkscape.git diff --git a/src/live_effects/lpe-perp_bisector.cpp b/src/live_effects/lpe-perp_bisector.cpp index 2fec63f3c..7c08bdb08 100644 --- a/src/live_effects/lpe-perp_bisector.cpp +++ b/src/live_effects/lpe-perp_bisector.cpp @@ -18,38 +18,64 @@ #include #include "sp-path.h" #include "line-geometry.h" - +#include "sp-lpe-item.h" #include <2geom/path.h> namespace Inkscape { namespace LivePathEffect { +namespace PB { -/* FIXME: We should arguably make these member functions of LPEPerpBisector. - Is there an easy way to register member functions with knotholder? - */ -NR::Point bisector_left_end_get(SPItem *item) { - Inkscape::LivePathEffect::LPEPerpBisector *lpe = - (Inkscape::LivePathEffect::LPEPerpBisector *) sp_lpe_item_get_livepatheffect(SP_LPE_ITEM(item)); +class KnotHolderEntityLeftEnd : public KnotHolderEntity +{ +public: + virtual bool isLPEParam() { return true; } - return NR::Point(lpe->C); + 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(); +}; + +// TODO: Make this more generic +static LPEPerpBisector * +get_effect(SPItem *item) +{ + Effect *effect = sp_lpe_item_get_current_lpe(SP_LPE_ITEM(item)); + if (effect->effectType() != PERP_BISECTOR) { + g_print ("Warning: Effect is not of type LPEPerpBisector!\n"); + return NULL; + } + return static_cast(effect); } -NR::Point bisector_right_end_get(SPItem *item) { - Inkscape::LivePathEffect::LPEPerpBisector *lpe = - (Inkscape::LivePathEffect::LPEPerpBisector *) sp_lpe_item_get_livepatheffect(SP_LPE_ITEM(item)); +NR::Point +KnotHolderEntityLeftEnd::knot_get() { + Inkscape::LivePathEffect::LPEPerpBisector *lpe = get_effect(item); + return NR::Point(lpe->C); +} +NR::Point +KnotHolderEntityRightEnd::knot_get() { + Inkscape::LivePathEffect::LPEPerpBisector *lpe = get_effect(item); return NR::Point(lpe->D); } void bisector_end_set(SPItem *item, NR::Point const &p, bool left) { Inkscape::LivePathEffect::LPEPerpBisector *lpe = - (Inkscape::LivePathEffect::LPEPerpBisector *) sp_lpe_item_get_livepatheffect(SP_LPE_ITEM(item)); + dynamic_cast (sp_lpe_item_get_current_lpe(SP_LPE_ITEM(item))); - Geom::Point v(Geom::unit_vector(lpe->B - lpe->A)); - Geom::Point diff(lpe->M - p.to_2geom()); + if (!lpe) + return; - double lambda = - v[Geom::Y] * diff[Geom::X] + v[Geom::X] * diff[Geom::Y]; + double lambda = Geom::nearest_point(p.to_2geom(), lpe->M, lpe->perp_dir); if (left) { lpe->C = lpe->M + lpe->perp_dir * lambda; lpe->length_left.param_set_value(lambda); @@ -58,37 +84,45 @@ bisector_end_set(SPItem *item, NR::Point const &p, bool left) { lpe->length_right.param_set_value(-lambda); } - sp_lpe_item_update_patheffect (SP_LPE_ITEM(item), true); + // 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), true, true); } void -bisector_left_end_set(SPItem *item, NR::Point const &p, NR::Point const &/*origin*/, guint /*state*/) { +KnotHolderEntityLeftEnd::knot_set(NR::Point const &p, NR::Point const &/*origin*/, guint /*state*/) { bisector_end_set(item, p); } void -bisector_right_end_set(SPItem *item, NR::Point const &p, NR::Point const &/*origin*/, guint /*state*/) { +KnotHolderEntityRightEnd::knot_set(NR::Point const &p, NR::Point const &/*origin*/, guint /*state*/) { bisector_end_set(item, p, false); } +/** NR::Point path_start_get(SPItem *item) { Inkscape::LivePathEffect::LPEPerpBisector *lpe = - (Inkscape::LivePathEffect::LPEPerpBisector *) sp_lpe_item_get_livepatheffect(SP_LPE_ITEM(item)); + dynamic_cast (sp_lpe_item_get_current_lpe(SP_LPE_ITEM(item))); - return NR::Point(lpe->A); + if (lpe) + return NR::Point(lpe->A); + else + return NR::Point(0,0); } NR::Point path_end_get(SPItem *item) { Inkscape::LivePathEffect::LPEPerpBisector *lpe = - (Inkscape::LivePathEffect::LPEPerpBisector *) sp_lpe_item_get_livepatheffect(SP_LPE_ITEM(item)); + dynamic_cast (sp_lpe_item_get_current_lpe(SP_LPE_ITEM(item))); - return NR::Point(lpe->B); + if (lpe) + return NR::Point(lpe->B); + else + return NR::Point(0,0); } void path_set_start_end(SPItem *item, NR::Point const &p, bool start) { SPCurve* curve = sp_path_get_curve_for_edit (SP_PATH(item)); // TODO: Should we use sp_shape_get_curve()? - NR::Matrix const i2d (sp_item_i2d_affine (SP_ITEM(item))); + Geom::Matrix const i2d (sp_item_i2d_affine (SP_ITEM(item))); Geom::Point A, B; if (start) { @@ -105,14 +139,17 @@ path_set_start_end(SPItem *item, NR::Point const &p, bool start) { sp_path_set_original_curve(SP_PATH(item), c, TRUE, true); c->unref(); } +**/ -void path_start_set(SPItem *item, NR::Point const &p, NR::Point const &/*origin*/, guint /*state*/) { - path_set_start_end(item, p); -} +//void path_start_set(SPItem *item, NR::Point const &p, NR::Point const &/*origin*/, guint /*state*/) { +// path_set_start_end(item, p); +//} -void path_end_set(SPItem *item, NR::Point const &p, NR::Point const &/*origin*/, guint /*state*/) { - path_set_start_end(item, p, false); -} +//void path_end_set(SPItem *item, NR::Point const &p, NR::Point const &/*origin*/, guint /*state*/) { +// path_set_start_end(item, p, false); +//} + +} //namescape PB LPEPerpBisector::LPEPerpBisector(LivePathEffectObject *lpeobject) : Effect(lpeobject), @@ -124,10 +161,14 @@ LPEPerpBisector::LPEPerpBisector(LivePathEffectObject *lpeobject) : registerParameter( dynamic_cast(&length_left) ); registerParameter( dynamic_cast(&length_right) ); + registerKnotHolderHandle(new PB::KnotHolderEntityLeftEnd(), _("Lala")); + registerKnotHolderHandle(new PB::KnotHolderEntityRightEnd(), _("Lolo")); +/** registerKnotHolderHandle(path_start_set, path_start_get); registerKnotHolderHandle(path_end_set, path_end_get); registerKnotHolderHandle(bisector_left_end_set, bisector_left_end_get); registerKnotHolderHandle(bisector_right_end_set, bisector_right_end_get); +**/ } LPEPerpBisector::~LPEPerpBisector() @@ -135,9 +176,10 @@ LPEPerpBisector::~LPEPerpBisector() } void -LPEPerpBisector::doOnApply (SPLPEItem *lpeitem) +LPEPerpBisector::doOnApply (SPLPEItem */*lpeitem*/) { /* make the path a straight line */ + /** SPCurve* curve = sp_path_get_curve_for_edit (SP_PATH(lpeitem)); // TODO: Should we use sp_shape_get_curve()? Geom::Point A((curve->first_point()).to_2geom()); @@ -149,6 +191,7 @@ LPEPerpBisector::doOnApply (SPLPEItem *lpeitem) // TODO: Why doesn't sp_path_set_original_curve(SP_PATH(lpeitem), c, TRUE, true) work? SP_PATH(lpeitem)->original_curve = c->ref(); c->unref(); + **/ }