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;
};