diff options
| author | Jabier Arraiza Cenoz <jabier.arraiza@marker.es> | 2015-02-01 10:48:53 +0000 |
|---|---|---|
| committer | Jabiertxof <jtx@jtx.marker.es> | 2015-02-01 10:48:53 +0000 |
| commit | 3581010e2f7021167ba0f4e577e0b3f8da2944b6 (patch) | |
| tree | e6644dc31e58d21ff60a9ae7fe121287071e5566 /src/live_effects/lpe-transform_2pts.cpp | |
| parent | Create a empty LPE (diff) | |
| parent | Latvian translation update (diff) | |
| download | inkscape-3581010e2f7021167ba0f4e577e0b3f8da2944b6.tar.gz inkscape-3581010e2f7021167ba0f4e577e0b3f8da2944b6.zip | |
Effect done
(bzr r13879.1.2)
Diffstat (limited to 'src/live_effects/lpe-transform_2pts.cpp')
| -rw-r--r-- | src/live_effects/lpe-transform_2pts.cpp | 155 |
1 files changed, 150 insertions, 5 deletions
diff --git a/src/live_effects/lpe-transform_2pts.cpp b/src/live_effects/lpe-transform_2pts.cpp index 95555b80e..142070578 100644 --- a/src/live_effects/lpe-transform_2pts.cpp +++ b/src/live_effects/lpe-transform_2pts.cpp @@ -4,32 +4,177 @@ /* * Authors: - * + * Jabier Arraiza Cenoz<jabier.arraiza@marker.es> * * * Released under GNU GPL, read the file 'COPYING' for more information */ +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <gtkmm.h> + #include "live_effects/lpe-transform_2pts.h" +#include <glibmm/i18n.h> +#include "display/curve.h" +#include <2geom/transforms.h> +#include <2geom/path.h> +#include "sp-path.h" +#include "ui/tools-switch.h" + +#include "inkscape.h" namespace Inkscape { namespace LivePathEffect { LPETransform2Pts::LPETransform2Pts(LivePathEffectObject *lpeobject) : - Effect(lpeobject) + Effect(lpeobject), + fromOriginalWidth(_("Use bounding box"), _("Use bounding box"), "fromOriginalWidth", &wr, this, false), + start(_("Start"), _("Start point"), "start", &wr, this, "Start point"), + end(_("End"), _("End point"), "end", &wr, this, "End point") { + registerParameter(&fromOriginalWidth); + registerParameter(&start); + registerParameter(&end); } LPETransform2Pts::~LPETransform2Pts() { } -std::vector<Geom::Path> -LPETransform2Pts::doEffect_path (std::vector<Geom::Path> const & path_in) +void +LPETransform2Pts::doOnApply(SPLPEItem const* lpeitem) +{ + using namespace Geom; + original_bbox(lpeitem); + + A = Point(boundingbox_X.min(), boundingbox_Y.middle()); + B = Point(boundingbox_X.max(), boundingbox_Y.middle()); + SPLPEItem* item = const_cast<SPLPEItem*>(lpeitem); + SPPath *path = dynamic_cast<SPPath *>(item); + if (path) { + SPCurve * c = NULL; + c = path->get_original_curve(); + if(!c->is_closed() && c->first_path() == c->last_path()){ + A = *(c->first_point()); + B = *(c->last_point()); + } + } + start.param_setValue(A); + end.param_setValue(B); +} + +void +LPETransform2Pts::doBeforeEffect (SPLPEItem const* lpeitem) { - return path_in; + using namespace Geom; + original_bbox(lpeitem); + SPLPEItem* item = const_cast<SPLPEItem*>(lpeitem); + SPPath *path = dynamic_cast<SPPath *>(item); + if(fromOriginalWidth || !path ){ + A = Point(boundingbox_X.min(), boundingbox_Y.middle()); + B = Point(boundingbox_X.max(), boundingbox_Y.middle()); + } + if(path && !fromOriginalWidth){ + SPCurve * c = NULL; + c = path->get_original_curve(); + if(!c->is_closed()){ + A = *(c->first_point()); + B = *(c->last_point()); + } + } + item->apply_to_clippath(item); + item->apply_to_mask(item); } +void +LPETransform2Pts::reset () +{ + start.param_update_default(A); + end.param_update_default(B); + start.param_set_and_write_default(); + end.param_set_and_write_default(); + SPDesktop * desktop = SP_ACTIVE_DESKTOP; + tools_switch(desktop, TOOLS_SELECT); + tools_switch(desktop, TOOLS_NODES); +} + +Gtk::Widget *LPETransform2Pts::newWidget() +{ + // use manage here, because after deletion of Effect object, others might + // still be pointing to this widget. + Gtk::VBox *vbox = Gtk::manage(new Gtk::VBox(Effect::newWidget())); + + vbox->set_border_width(5); + vbox->set_homogeneous(false); + vbox->set_spacing(6); + + std::vector<Parameter *>::iterator it = param_vector.begin(); + + while (it != param_vector.end()) { + if ((*it)->widget_is_visible) { + Parameter *param = *it; + Gtk::Widget *widg = dynamic_cast<Gtk::Widget *>(param->param_newWidget()); + Glib::ustring *tip = param->param_getTooltip(); + if (widg) { + vbox->pack_start(*widg, true, true, 2); + if (tip) { + widg->set_tooltip_text(*tip); + } else { + widg->set_tooltip_text(""); + widg->set_has_tooltip(false); + } + } + } + + ++it; + } + Gtk::HBox * button = Gtk::manage(new Gtk::HBox(true,0)); + Gtk::Button *reset = Gtk::manage(new Gtk::Button(Glib::ustring(_("Reset")))); + reset->signal_clicked().connect(sigc::mem_fun(*this, &LPETransform2Pts::reset)); + reset->set_size_request(140,45); + button->pack_start(*reset, false, false, 2); + vbox->pack_start(*button, true, true, 2); + return dynamic_cast<Gtk::Widget *>(vbox); +} + +Geom::Piecewise<Geom::D2<Geom::SBasis> > +LPETransform2Pts::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwd2_in) +{ + Geom::Piecewise<Geom::D2<Geom::SBasis> > output; + double sca = Geom::distance((Geom::Point)start,(Geom::Point)end)/Geom::distance(A,B); + Geom::Ray original(A,B); + Geom::Ray transformed((Geom::Point)start,(Geom::Point)end); + double rot = transformed.angle() - original.angle(); + Geom::Path helper; + helper.start(A); + helper.appendNew<Geom::LineSegment>(B); + Geom::Affine m; + 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; +} + +void +LPETransform2Pts::addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector<Geom::PathVector> &hp_vec) +{ + using namespace Geom; + hp_vec.clear(); + Geom::Path hp; + hp.start((Geom::Point)start); + hp.appendNew<Geom::LineSegment>((Geom::Point)end); + Geom::PathVector pathv; + pathv.push_back(hp); + hp_vec.push_back(pathv); +} + + /* ######################## */ } //namespace LivePathEffect |
