From 2ce6e88764838e2dd9a4b22e18263cb436e13148 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Sun, 1 Apr 2018 19:44:02 +0200 Subject: [PATCH 1/2] Add option to unify dash with diferent segment paths --- src/live_effects/lpe-dash-stroke.cpp | 54 +++++++++++++++++++++++----- src/live_effects/lpe-dash-stroke.h | 1 + 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/src/live_effects/lpe-dash-stroke.cpp b/src/live_effects/lpe-dash-stroke.cpp index 1ad1da2602..6e274cfa5f 100644 --- a/src/live_effects/lpe-dash-stroke.cpp +++ b/src/live_effects/lpe-dash-stroke.cpp @@ -18,14 +18,16 @@ LPEDashStroke::LPEDashStroke(LivePathEffectObject *lpeobject) holefactor(_("Hole factor"), _("Hole factor"), "holefactor", &wr, this, 0.0), splitsegments(_("Use segments"), _("Use segments"), "splitsegments", &wr, this, true), halfextreme(_("Half start/end"), _("Start and end of each segment has half size"), "halfextreme", &wr, this, true), + unifysegment(_("Unify dashes"), _("Aprox unify the dashes lenght using the min with segment"), "unifysegment", &wr, this, true), message(_("Info Box"), _("Important messages"), "message", &wr, this, _("Add \"Fill Between Many LPE\" to add fill.")) { registerParameter(&numberdashes); registerParameter(&holefactor); registerParameter(&splitsegments); registerParameter(&halfextreme); + registerParameter(&unifysegment); registerParameter(&message); - numberdashes.param_set_range(0, 5000); + numberdashes.param_set_range(2, 999999999); numberdashes.param_set_increments(1, 1); numberdashes.param_set_digits(0); holefactor.param_set_range(-0.99999, 0.99999); @@ -93,10 +95,7 @@ LPEDashStroke::doEffect_path(Geom::PathVector const & path_in){ curve_endit = path_it->end_open(); } } - if(splitsegments) { - //double item_length = Geom::length(paths_to_pw(path_it)); - //item_length = Inkscape::Util::Quantity::convert(item_length * scale, unit->abbr, unit_name); - } + size_t numberholes = numberdashes - 1; size_t ammount = numberdashes + numberholes; if (halfextreme) { @@ -113,12 +112,53 @@ LPEDashStroke::doEffect_path(Geom::PathVector const & path_in){ dashpercent = globaldash/(numberdashes -1); } double holepercent = globalhole/numberholes; - + double dashsize_fixed = 0; + double holesize_fixed = 0; + Geom::Piecewise > pwd2 = (*path_it).toPwSb(); + double lenght_pwd2 = length (pwd2); + double minlenght = lenght_pwd2; + if(unifysegment) { + while (curve_it1 != curve_endit) { + double lenght_segment = (*curve_it1).length(); + if (lenght_segment < minlenght) { + minlenght = lenght_segment; + dashsize_fixed = (*curve_it1).length() * dashpercent; + holesize_fixed = (*curve_it1).length() * holepercent; + } + ++curve_it1; + ++curve_it2; + } + curve_it1 = path_it->begin(); + curve_it2 = ++(path_it->begin()); + curve_endit = path_it->end_default(); + } size_t p_index = 0; size_t start_index = 0; if(splitsegments) { while (curve_it1 != curve_endit) { Geom::Path segment = (*path_it).portion(p_index, p_index + 1); + if(unifysegment) { + size_t numberdashes_fixed = (size_t)ceil((*curve_it1).length()/(dashsize_fixed + holesize_fixed)); + if (halfextreme) { + numberdashes_fixed++; + } + numberholes = numberdashes_fixed - 1; + ammount = numberdashes_fixed + numberholes; + if (halfextreme) { + ammount--; + } + base = 1/(double)ammount; + globaldash = base * numberdashes_fixed * (1 + holefactor); + if (halfextreme) { + globaldash = base * (numberdashes_fixed - 1) * (1 + holefactor); + } + globalhole = 1-globaldash; + dashpercent = globaldash/numberdashes_fixed; + if (halfextreme) { + dashpercent = globaldash/(numberdashes_fixed -1); + } + holepercent = globalhole/numberholes; + } double dashsize = (*curve_it1).length() * dashpercent; double holesize = (*curve_it1).length() * holepercent; if ((*curve_it1).isLineSegment()) { @@ -187,8 +227,6 @@ LPEDashStroke::doEffect_path(Geom::PathVector const & path_in){ } else { double start = 0.0; double end = 0.0; - Geom::Piecewise > pwd2 = (*path_it).toPwSb(); - double lenght_pwd2 = length (pwd2); double dashsize = lenght_pwd2 * dashpercent; double holesize = lenght_pwd2 * holepercent; if (halfextreme) { diff --git a/src/live_effects/lpe-dash-stroke.h b/src/live_effects/lpe-dash-stroke.h index 0db9b0a48f..84921fe279 100644 --- a/src/live_effects/lpe-dash-stroke.h +++ b/src/live_effects/lpe-dash-stroke.h @@ -26,6 +26,7 @@ private: ScalarParam holefactor; BoolParam splitsegments; BoolParam halfextreme; + BoolParam unifysegment; MessageParam message; }; -- GitLab From db6f849e52dc4d56a6562897b5bbcd2d86c71d17 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Sun, 1 Apr 2018 20:14:30 +0200 Subject: [PATCH 2/2] Bug fix closing paths --- src/live_effects/lpe-dash-stroke.cpp | 34 ++++++++++++++++------------ 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/live_effects/lpe-dash-stroke.cpp b/src/live_effects/lpe-dash-stroke.cpp index 6e274cfa5f..148e28a13d 100644 --- a/src/live_effects/lpe-dash-stroke.cpp +++ b/src/live_effects/lpe-dash-stroke.cpp @@ -95,21 +95,24 @@ LPEDashStroke::doEffect_path(Geom::PathVector const & path_in){ curve_endit = path_it->end_open(); } } - - size_t numberholes = numberdashes - 1; - size_t ammount = numberdashes + numberholes; + size_t numberdashes_fixed = numberdashes; + if(!splitsegments) { + numberdashes_fixed++; + } + size_t numberholes = numberdashes_fixed - 1; + size_t ammount = numberdashes_fixed + numberholes; if (halfextreme) { ammount--; } double base = 1/(double)ammount; - double globaldash = base * numberdashes * (1 + holefactor); + double globaldash = base * numberdashes_fixed * (1 + holefactor); if (halfextreme) { - globaldash = base * (numberdashes - 1) * (1 + holefactor); + globaldash = base * (numberdashes_fixed - 1) * (1 + holefactor); } double globalhole = 1-globaldash; - double dashpercent = globaldash/numberdashes; + double dashpercent = globaldash/numberdashes_fixed; if (halfextreme) { - dashpercent = globaldash/(numberdashes -1); + dashpercent = globaldash/(numberdashes_fixed -1); } double holepercent = globalhole/numberholes; double dashsize_fixed = 0; @@ -133,12 +136,12 @@ LPEDashStroke::doEffect_path(Geom::PathVector const & path_in){ curve_endit = path_it->end_default(); } size_t p_index = 0; - size_t start_index = 0; + size_t start_index = result.size(); if(splitsegments) { while (curve_it1 != curve_endit) { Geom::Path segment = (*path_it).portion(p_index, p_index + 1); if(unifysegment) { - size_t numberdashes_fixed = (size_t)ceil((*curve_it1).length()/(dashsize_fixed + holesize_fixed)); + numberdashes_fixed = (size_t)ceil((*curve_it1).length()/(dashsize_fixed + holesize_fixed)); if (halfextreme) { numberdashes_fixed++; } @@ -175,7 +178,6 @@ LPEDashStroke::doEffect_path(Geom::PathVector const & path_in){ } else { result.push_back(segment.portion(0.0, dashpercent)); } - start_index = result.size()-1; } double start = dashpercent + holepercent; @@ -203,7 +205,6 @@ LPEDashStroke::doEffect_path(Geom::PathVector const & path_in){ result[result.size()-1].append(segment.portion(start, end)); } else { result.push_back(segment.portion(start, end)); - start_index = result.size()-1; } double startsize = dashsize + holesize; if (halfextreme) { @@ -220,6 +221,14 @@ LPEDashStroke::doEffect_path(Geom::PathVector const & path_in){ end = timeAtLength(endsize,segment); } } + if (curve_it2 == curve_endit) { + if (path_it->closed()) { + Geom::Path end = result[result.size()-1]; + end.setFinal(result[start_index].initialPoint()); + end.append(result[start_index]); + result[start_index] = end; + } + } p_index ++; ++curve_it1; ++curve_it2; @@ -235,7 +244,6 @@ LPEDashStroke::doEffect_path(Geom::PathVector const & path_in){ end = timeAtLength(dashsize,pwd2); } result.push_back((*path_it).portion(start, end)); - start_index = result.size()-1; double startsize = dashsize + holesize; if (halfextreme) { startsize = (dashsize/2.0) + holesize; @@ -250,8 +258,6 @@ LPEDashStroke::doEffect_path(Geom::PathVector const & path_in){ start = timeAtLength(startsize,pwd2); end = timeAtLength(endsize,pwd2); } - } - if (curve_it2 == curve_endit) { if (path_it->closed()) { Geom::Path end = result[result.size()-1]; end.setFinal(result[start_index].initialPoint()); -- GitLab