diff --git a/src/live_effects/lpe-dash-stroke.cpp b/src/live_effects/lpe-dash-stroke.cpp index 1ad1da26022bd6b2c68ef516cb747c77359a301b..148e28a13d3d49ac9084b37d98c9032c13ab9a71 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,32 +95,73 @@ 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 numberdashes_fixed = numberdashes; + if(!splitsegments) { + numberdashes_fixed++; } - size_t numberholes = numberdashes - 1; - size_t ammount = numberdashes + numberholes; + 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; + 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; + 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) { + 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()) { @@ -135,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; @@ -163,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) { @@ -180,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; @@ -187,8 +236,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) { @@ -197,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; @@ -212,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()); diff --git a/src/live_effects/lpe-dash-stroke.h b/src/live_effects/lpe-dash-stroke.h index 0db9b0a48f55f01cd5746219693ef8b36a38cd17..84921fe279d2d38249b40fc78fde7eddaa444b1c 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; };