From 0e90df42ad8299b0a42435fb4445f83bc4ddbbfd Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Mon, 29 Aug 2016 19:35:32 +0200 Subject: Fix a bug in pattern along path at first edit node after applied. Backport it to 0.92 (bzr r15089) --- src/live_effects/lpe-bendpath.cpp | 14 +++++++++----- src/live_effects/lpe-bendpath.h | 2 +- src/live_effects/lpe-patternalongpath.cpp | 17 ++++++++++------- src/live_effects/lpe-patternalongpath.h | 1 + src/ui/tools/freehand-base.cpp | 13 +++++++++++++ 5 files changed, 34 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/live_effects/lpe-bendpath.cpp b/src/live_effects/lpe-bendpath.cpp index c24d38d7b..2ba1e32b4 100644 --- a/src/live_effects/lpe-bendpath.cpp +++ b/src/live_effects/lpe-bendpath.cpp @@ -67,6 +67,7 @@ LPEBendPath::LPEBendPath(LivePathEffectObject *lpeobject) : _provides_knotholder_entities = true; apply_to_clippath_and_mask = true; concatenate_before_pwd2 = true; + _prop_scale_store = prop_scale; } LPEBendPath::~LPEBendPath() @@ -80,6 +81,9 @@ LPEBendPath::doBeforeEffect (SPLPEItem const* lpeitem) // get the item bounding box original_bbox(lpeitem); original_height = boundingbox_Y.max() - boundingbox_Y.min(); + if(_prop_scale_store != prop_scale) { + prop_scale.param_set_value(_prop_scale_store); + } } Geom::Piecewise > @@ -120,9 +124,9 @@ LPEBendPath::doEffect_pwd2 (Geom::Piecewise > const & pwd } if ( scale_y_rel.get_value() ) { - y*=(scaling*prop_scale); + y*=(scaling*_prop_scale_store); } else { - if (prop_scale != 1.0) y *= prop_scale; + if (_prop_scale_store != 1.0) y *= _prop_scale_store; } Piecewise > output = compose(uskeleton,x) + y*compose(n,x); @@ -184,9 +188,9 @@ KnotHolderEntityWidthBendPath::knot_set(Geom::Point const &p, Geom::Point const& Geom::Point knot_pos = this->knot->pos * item->i2dt_affine().inverse(); Geom::Coord nearest_to_ray = ray.nearestTime(knot_pos); if(nearest_to_ray == 0){ - lpe->prop_scale.param_set_value(-Geom::distance(s , ptA)/(lpe->original_height/2.0)); + lpe->_prop_scale_store = -Geom::distance(s , ptA)/(lpe->original_height/2.0); } else { - lpe->prop_scale.param_set_value(Geom::distance(s , ptA)/(lpe->original_height/2.0)); + lpe->_prop_scale_store = Geom::distance(s , ptA)/(lpe->original_height/2.0); } sp_lpe_item_update_patheffect (SP_LPE_ITEM(item), false, true); @@ -207,7 +211,7 @@ KnotHolderEntityWidthBendPath::knot_get() const ray.setPoints(ptA,(*cubic)[1]); } ray.setAngle(ray.angle() + Geom::rad_from_deg(90)); - Geom::Point result_point = Geom::Point::polar(ray.angle(), (lpe->original_height/2.0) * lpe->prop_scale) + ptA; + Geom::Point result_point = Geom::Point::polar(ray.angle(), (lpe->original_height/2.0) * lpe->_prop_scale_store) + ptA; bp_helper_path.clear(); Geom::Path hp(result_point); diff --git a/src/live_effects/lpe-bendpath.h b/src/live_effects/lpe-bendpath.h index eeda86a5e..36789bb15 100644 --- a/src/live_effects/lpe-bendpath.h +++ b/src/live_effects/lpe-bendpath.h @@ -58,7 +58,7 @@ private: BoolParam vertical_pattern; Geom::Piecewise > uskeleton; Geom::Piecewise > n; - + double _prop_scale_store; void on_pattern_pasted(); LPEBendPath(const LPEBendPath&); diff --git a/src/live_effects/lpe-patternalongpath.cpp b/src/live_effects/lpe-patternalongpath.cpp index 7d6ac10ac..0814ce0da 100644 --- a/src/live_effects/lpe-patternalongpath.cpp +++ b/src/live_effects/lpe-patternalongpath.cpp @@ -95,7 +95,7 @@ LPEPatternAlongPath::LPEPatternAlongPath(LivePathEffectObject *lpeobject) : prop_scale.param_set_increments(0.01, 0.10); _provides_knotholder_entities = true; - + _prop_scale_store = prop_scale; } LPEPatternAlongPath::~LPEPatternAlongPath() @@ -111,6 +111,9 @@ LPEPatternAlongPath::doBeforeEffect (SPLPEItem const* lpeitem) if (bbox) { original_height = (*bbox)[Geom::Y].max() - (*bbox)[Geom::Y].min(); } + if(_prop_scale_store != prop_scale) { + prop_scale.param_set_value(_prop_scale_store); + } } Geom::Piecewise > @@ -213,9 +216,9 @@ LPEPatternAlongPath::doEffect_pwd2 (Geom::Piecewise > con x*=scaling; } if ( scale_y_rel.get_value() ) { - y*=(scaling*prop_scale); + y*=(scaling*_prop_scale_store); } else { - if (prop_scale != 1.0) y *= prop_scale; + if (_prop_scale_store != 1.0) y *= _prop_scale_store; } x += toffset; @@ -253,7 +256,7 @@ LPEPatternAlongPath::transform_multiply(Geom::Affine const& postmul, bool set) Inkscape::Preferences *prefs = Inkscape::Preferences::get(); bool transform_stroke = prefs ? prefs->getBool("/options/transform/stroke", true) : true; if (transform_stroke && !scale_y_rel) { - prop_scale.param_set_value(prop_scale * ((postmul.expansionX() + postmul.expansionY()) / 2)); + prop_scale.param_set_value(_prop_scale_store * ((postmul.expansionX() + postmul.expansionY()) / 2)); } if (postmul.isTranslation()) { pattern.param_transform_multiply(postmul, set); @@ -299,9 +302,9 @@ KnotHolderEntityWidthPatternAlongPath::knot_set(Geom::Point const &p, Geom::Poin Geom::Point knot_pos = this->knot->pos * item->i2dt_affine().inverse(); Geom::Coord nearest_to_ray = ray.nearestTime(knot_pos); if(nearest_to_ray == 0){ - lpe->prop_scale.param_set_value(-Geom::distance(s , ptA)/(lpe->original_height/2.0)); + lpe->_prop_scale_store = -Geom::distance(s , ptA)/(lpe->original_height/2.0); } else { - lpe->prop_scale.param_set_value(Geom::distance(s , ptA)/(lpe->original_height/2.0)); + lpe->_prop_scale_store = Geom::distance(s , ptA)/(lpe->original_height/2.0); } } @@ -325,7 +328,7 @@ KnotHolderEntityWidthPatternAlongPath::knot_get() const ray.setPoints(ptA, (*cubic)[1]); } ray.setAngle(ray.angle() + Geom::rad_from_deg(90)); - Geom::Point result_point = Geom::Point::polar(ray.angle(), (lpe->original_height/2.0) * lpe->prop_scale) + ptA; + Geom::Point result_point = Geom::Point::polar(ray.angle(), (lpe->original_height/2.0) * lpe->_prop_scale_store) + ptA; pap_helper_path.clear(); Geom::Path hp(result_point); diff --git a/src/live_effects/lpe-patternalongpath.h b/src/live_effects/lpe-patternalongpath.h index 3d7fc02bc..eedf4c172 100644 --- a/src/live_effects/lpe-patternalongpath.h +++ b/src/live_effects/lpe-patternalongpath.h @@ -61,6 +61,7 @@ private: BoolParam prop_units; BoolParam vertical_pattern; ScalarParam fuse_tolerance; + double _prop_scale_store; void on_pattern_pasted(); LPEPatternAlongPath(const LPEPatternAlongPath&); diff --git a/src/ui/tools/freehand-base.cpp b/src/ui/tools/freehand-base.cpp index eb29ed88d..7382c37ea 100644 --- a/src/ui/tools/freehand-base.cpp +++ b/src/ui/tools/freehand-base.cpp @@ -212,6 +212,19 @@ static void spdc_paste_curve_as_freehand_shape(Geom::PathVector const &newpath, Effect::createAndApply(PATTERN_ALONG_PATH, dc->desktop->doc(), item); Effect* lpe = SP_LPE_ITEM(item)->getCurrentLPE(); static_cast(lpe)->pattern.set_new_value(newpath,true); + + // write pattern along path parameters: + lpe->getRepr()->setAttribute("copytype", "single_stretched"); + lpe->getRepr()->setAttribute("fuse_tolerance", "0"); + lpe->getRepr()->setAttribute("is_visible", "true"); + lpe->getRepr()->setAttribute("normal_offset", "0"); + lpe->getRepr()->setAttribute("prop_scale", "1"); + lpe->getRepr()->setAttribute("prop_units", "false"); + lpe->getRepr()->setAttribute("scale_y_rel", "false"); + lpe->getRepr()->setAttribute("spacing", "0"); + lpe->getRepr()->setAttribute("tang_offset", "0"); + lpe->getRepr()->setAttribute("vertical_pattern", "false"); + } static void spdc_apply_powerstroke_shape(const std::vector & points, FreehandBase *dc, SPItem *item) -- cgit v1.2.3