summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/live_effects/lpe-transform_2pts.cpp94
-rw-r--r--src/live_effects/lpe-transform_2pts.h6
2 files changed, 92 insertions, 8 deletions
diff --git a/src/live_effects/lpe-transform_2pts.cpp b/src/live_effects/lpe-transform_2pts.cpp
index b70b68968..1f1cccd89 100644
--- a/src/live_effects/lpe-transform_2pts.cpp
+++ b/src/live_effects/lpe-transform_2pts.cpp
@@ -18,6 +18,7 @@
#include <2geom/pathvector.h>
#include "sp-path.h"
#include "ui/icon-names.h"
+#include "svg/svg.h"
#include <glibmm/i18n.h>
@@ -26,25 +27,42 @@ namespace LivePathEffect {
LPETransform2Pts::LPETransform2Pts(LivePathEffectObject *lpeobject) :
Effect(lpeobject),
+ elastic(_("Elastic"), _("Elastic transform mode"), "elastic", &wr, this, false,"", INKSCAPE_ICON("on"), INKSCAPE_ICON("off")),
+ fixed(_("Fixed"), _("No scale, only move and rotate"), "fixed", &wr, this, false,"", INKSCAPE_ICON("on"), INKSCAPE_ICON("off")),
from_original_width(_("From original width"), _("From original width"), "from_original_width", &wr, this, false,"", INKSCAPE_ICON("on"), INKSCAPE_ICON("off")),
start(_("Start"), _("Start point"), "start", &wr, this, "Start point"),
end(_("End"), _("End point"), "end", &wr, this, "End point"),
+ fixed_width(_("Fixed width"), _("Fixed width"), "fixed_width", &wr, this, 1),
first_knot(_("First Knot"), _("First Knot"), "first_knot", &wr, this, 1),
last_knot(_("Last Knot"), _("Last Knot"), "last_knot", &wr, this, 1),
+ helper_size(_("Helper size:"), _("Rotation helper size"), "helper_size", &wr, this, 10),
from_original_width_toggler(false),
point_a(Geom::Point()),
point_b(Geom::Point()),
pathvector(),
- append_path(false)
+ append_path(false),
+ previous_angle(Geom::deg_to_rad(0)),
+ previous_start(Geom::Point())
{
registerParameter(&start);
registerParameter(&end);
+ registerParameter(&fixed_width);
registerParameter(&first_knot);
registerParameter(&last_knot);
+ registerParameter(&helper_size);
+ registerParameter(&elastic);
+ registerParameter(&fixed);
registerParameter(&from_original_width);
first_knot.param_make_integer(true);
last_knot.param_make_integer(true);
+ helper_size.param_set_range(0, 999);
+ helper_size.param_set_increments(1, 1);
+ helper_size.param_set_digits(0);
+
+ fixed_width.param_set_range(0.0, 99999.0);
+ fixed_width.param_set_increments(1, 1);
+ fixed_width.param_set_digits(4);
}
LPETransform2Pts::~LPETransform2Pts()
@@ -73,6 +91,8 @@ LPETransform2Pts::doOnApply(SPLPEItem const* lpeitem)
size_t nnodes = nodeCount(pathvector);
last_knot.param_set_value(nnodes);
}
+
+ fixed_width.param_set_value(Geom::distance(point_a,point_b));
start.param_update_default(point_a);
start.param_set_default();
end.param_update_default(point_b);
@@ -101,7 +121,6 @@ LPETransform2Pts::doBeforeEffect (SPLPEItem const* lpeitem)
point_a = pointAtNodeIndex(pathvector,(size_t)first_knot-1);
point_b = pointAtNodeIndex(pathvector,(size_t)last_knot-1);
size_t nnodes = nodeCount(pathvector);
- std::cout << nnodes << "nnodes\n";
first_knot.param_set_range(1, last_knot-1);
last_knot.param_set_range(first_knot+1, nnodes);
from_original_width.param_setValue(false);
@@ -113,6 +132,15 @@ LPETransform2Pts::doBeforeEffect (SPLPEItem const* lpeitem)
from_original_width.param_setValue(true);
append_path = false;
}
+ if(fixed){
+ Geom::Ray transformed((Geom::Point)start,(Geom::Point)end);
+ if(previous_start == start || previous_angle == Geom::deg_to_rad(0)){
+ previous_angle = transformed.angle();
+ }
+ Geom::Point end_point = Geom::Point::polar(previous_angle, fixed_width) + (Geom::Point)start;
+ end.param_setValue(end_point);
+ }
+ previous_start = start;
splpeitem->apply_to_clippath(splpeitem);
splpeitem->apply_to_mask(splpeitem);
}
@@ -125,7 +153,10 @@ LPETransform2Pts::updateIndex()
if (sp_path) {
pathvector = sp_path->get_original_curve()->get_pathvector();
}
- if(!pathvector.empty() && !from_original_width) {
+ if(pathvector.empty()){
+ return;
+ }
+ if(!from_original_width) {
point_a = pointAtNodeIndex(pathvector,(size_t)first_knot-1);
point_b = pointAtNodeIndex(pathvector,(size_t)last_knot-1);
start.param_update_default(point_a);
@@ -136,7 +167,11 @@ LPETransform2Pts::updateIndex()
end.param_update_default(point_b);
start.param_set_default();
end.param_set_default();
+ } else {
+ point_a = Geom::Point(boundingbox_X.min(), boundingbox_Y.middle());
+ point_b = Geom::Point(boundingbox_X.max(), boundingbox_Y.middle());
}
+ fixed_width.param_set_value(Geom::distance(point_a,point_b));
}
//todo migrate to PathVector class?
size_t
@@ -197,6 +232,7 @@ LPETransform2Pts::reset()
first_knot.param_set_value(1);
last_knot.param_set_value(2);
}
+ fixed_width.param_set_value(Geom::distance(point_a,point_b));
start.param_update_default(point_a);
end.param_update_default(point_b);
start.param_set_default();
@@ -215,6 +251,7 @@ Gtk::Widget *LPETransform2Pts::newWidget()
std::vector<Parameter *>::iterator it = param_vector.begin();
Gtk::HBox * button = Gtk::manage(new Gtk::HBox(true,0));
+ Gtk::HBox * button2 = Gtk::manage(new Gtk::HBox(true,0));
while (it != param_vector.end()) {
if ((*it)->widget_is_visible) {
Parameter *param = *it;
@@ -240,6 +277,28 @@ Gtk::Widget *LPETransform2Pts::newWidget()
} else if (param->param_key == "from_original_width") {
Glib::ustring * tip = param->param_getTooltip();
if (widg) {
+ button2->pack_start(*widg, true, true, 2);
+ if (tip) {
+ widg->set_tooltip_text(*tip);
+ } else {
+ widg->set_tooltip_text("");
+ widg->set_has_tooltip(false);
+ }
+ }
+ } else if (param->param_key == "elastic") {
+ Glib::ustring * tip = param->param_getTooltip();
+ if (widg) {
+ button->pack_start(*widg, true, true, 2);
+ if (tip) {
+ widg->set_tooltip_text(*tip);
+ } else {
+ widg->set_tooltip_text("");
+ widg->set_has_tooltip(false);
+ }
+ }
+ } else if (param->param_key == "fixed") {
+ Glib::ustring * tip = param->param_getTooltip();
+ if (widg) {
button->pack_start(*widg, true, true, 2);
if (tip) {
widg->set_tooltip_text(*tip);
@@ -263,8 +322,9 @@ Gtk::Widget *LPETransform2Pts::newWidget()
}
Gtk::Button *reset = Gtk::manage(new Gtk::Button(Glib::ustring(_("Reset"))));
reset->signal_clicked().connect(sigc::mem_fun(*this, &LPETransform2Pts::reset));
- button->pack_start(*reset, true, true, 2);
+ button2->pack_start(*reset, true, true, 2);
vbox->pack_start(*button, true, true, 2);
+ vbox->pack_start(*button2, true, true, 2);
return dynamic_cast<Gtk::Widget *>(vbox);
}
@@ -280,10 +340,19 @@ LPETransform2Pts::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const
helper.start(point_a);
helper.appendNew<Geom::LineSegment>(point_b);
Geom::Affine m;
- m *= Geom::Scale(sca);
- m *= Geom::Rotate(rot);
- helper *= m;
- m *= Geom::Translate((Geom::Point)start - helper.initialPoint());
+ if(elastic){
+ Geom::Angle original_angle = original.angle();
+ m *= Geom::Rotate(-original_angle);
+ m *= Geom::Scale(sca, 1.0);
+ m *= Geom::Rotate(transformed.angle());
+ helper *= m;
+ m *= Geom::Translate((Geom::Point)start - helper.initialPoint());
+ } else {
+ m *= Geom::Scale(sca);
+ m *= Geom::Rotate(rot);
+ helper *= m;
+ m *= Geom::Translate((Geom::Point)start - helper.initialPoint());
+ }
output.concat(pwd2_in * m);
return output;
@@ -299,6 +368,15 @@ LPETransform2Pts::addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector<
hp.appendNew<Geom::LineSegment>((Geom::Point)end);
Geom::PathVector pathv;
pathv.push_back(hp);
+ if(fixed){
+ double r = helper_size*.1;
+ char const * svgd;
+ svgd = "m 7.07,7.07 c -3.9,3.91 -10.24,3.91 -14.14,0 -3.91,-3.9 -3.91,-10.24 0,-14.14 3.9,-3.91 10.24,-3.91 14.14,0 l -2.83,-4.24 -0.7,2.12";
+ PathVector pathv_turn = sp_svg_read_pathv(svgd);
+ pathv_turn *= Geom::Rotate(previous_angle);
+ pathv_turn *= Affine(r,0,0,r,0,0) * Translate(Geom::Point(start));
+ hp_vec.push_back(pathv_turn);
+ }
hp_vec.push_back(pathv);
}
diff --git a/src/live_effects/lpe-transform_2pts.h b/src/live_effects/lpe-transform_2pts.h
index 855780a7a..44163427e 100644
--- a/src/live_effects/lpe-transform_2pts.h
+++ b/src/live_effects/lpe-transform_2pts.h
@@ -49,16 +49,22 @@ protected:
virtual void addCanvasIndicators(SPLPEItem const *lpeitem, std::vector<Geom::PathVector> &hp_vec);
private:
+ ToggleButtonParam elastic;
+ ToggleButtonParam fixed;
ToggleButtonParam from_original_width;
PointParam start;
PointParam end;
+ ScalarParam fixed_width;
ScalarParam first_knot;
ScalarParam last_knot;
+ ScalarParam helper_size;
bool from_original_width_toggler;
Geom::Point point_a;
Geom::Point point_b;
Geom::PathVector pathvector;
bool append_path;
+ Geom::Angle previous_angle;
+ Geom::Point previous_start;
LPETransform2Pts(const LPETransform2Pts&);
LPETransform2Pts& operator=(const LPETransform2Pts&);
};