21#include <glibmm/i18n.h>
23#include <gtkmm/button.h>
24#include <gtkmm/expander.h>
25#include <gtkmm/widget.h>
37namespace LivePathEffect {
41 horizontal_mirror(_(
"Mirror movements in horizontal"), _(
"Mirror movements in horizontal"),
"horizontal_mirror", &wr, this, false),
42 vertical_mirror(_(
"Mirror movements in vertical"), _(
"Mirror movements in vertical"),
"vertical_mirror", &wr, this, false),
43 perimetral(_(
"Use only perimeter"), _(
"Use only perimeter"),
"perimetral", &wr, this, false),
44 live_update(_(
"Update while moving knots (maybe slow)"), _(
"Update while moving knots (maybe slow)"),
"live_update", &wr, this, true),
45 grid_point_0(_(
"Control 0:"), _(
"Control 0 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"),
"gridpoint0", &wr, this),
46 grid_point_1(_(
"Control 1:"), _(
"Control 1 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"),
"gridpoint1", &wr, this),
47 grid_point_2(_(
"Control 2:"), _(
"Control 2 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"),
"gridpoint2", &wr, this),
48 grid_point_3(_(
"Control 3:"), _(
"Control 3 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"),
"gridpoint3", &wr, this),
49 grid_point_4(_(
"Control 4:"), _(
"Control 4 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"),
"gridpoint4", &wr, this),
50 grid_point_5(_(
"Control 5:"), _(
"Control 5 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"),
"gridpoint5", &wr, this),
51 grid_point_6(_(
"Control 6:"), _(
"Control 6 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"),
"gridpoint6", &wr, this),
52 grid_point_7(_(
"Control 7:"), _(
"Control 7 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"),
"gridpoint7", &wr, this),
53 grid_point_8x9(_(
"Control 8x9:"), _(
"Control 8x9 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"),
"gridpoint8x9", &wr, this),
54 grid_point_10x11(_(
"Control 10x11:"), _(
"Control 10x11 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"),
"gridpoint10x11", &wr, this),
55 grid_point_12(_(
"Control 12:"), _(
"Control 12 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"),
"gridpoint12", &wr, this),
56 grid_point_13(_(
"Control 13:"), _(
"Control 13 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"),
"gridpoint13", &wr, this),
57 grid_point_14(_(
"Control 14:"), _(
"Control 14 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"),
"gridpoint14", &wr, this),
58 grid_point_15(_(
"Control 15:"), _(
"Control 15 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"),
"gridpoint15", &wr, this),
59 grid_point_16(_(
"Control 16:"), _(
"Control 16 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"),
"gridpoint16", &wr, this),
60 grid_point_17(_(
"Control 17:"), _(
"Control 17 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"),
"gridpoint17", &wr, this),
61 grid_point_18(_(
"Control 18:"), _(
"Control 18 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"),
"gridpoint18", &wr, this),
62 grid_point_19(_(
"Control 19:"), _(
"Control 19 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"),
"gridpoint19", &wr, this),
63 grid_point_20x21(_(
"Control 20x21:"), _(
"Control 20x21 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"),
"gridpoint20x21", &wr, this),
64 grid_point_22x23(_(
"Control 22x23:"), _(
"Control 22x23 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"),
"gridpoint22x23", &wr, this),
65 grid_point_24x26(_(
"Control 24x26:"), _(
"Control 24x26 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"),
"gridpoint24x26", &wr, this),
66 grid_point_25x27(_(
"Control 25x27:"), _(
"Control 25x27 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"),
"gridpoint25x27", &wr, this),
67 grid_point_28x30(_(
"Control 28x30:"), _(
"Control 28x30 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"),
"gridpoint28x30", &wr, this),
68 grid_point_29x31(_(
"Control 29x31:"), _(
"Control 29x31 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"),
"gridpoint29x31", &wr, this),
69 grid_point_32x33x34x35(_(
"Control 32x33x34x35:"), _(
"Control 32x33x34x35 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"),
"gridpoint32x33x34x35", &wr, this),
120 for(
unsigned dim = 0; dim < 2; dim++) {
123 const int depth = sb2[dim].us*sb2[dim].vs;
124 sb2[dim].resize(depth,
Linear2d(0));
129 std::vector<Geom::Point > handles(36);
174 for(
unsigned dim = 0; dim < 2; dim++) {
177 for(
unsigned vi = 0; vi < sb2[dim].vs; vi++) {
178 for(
unsigned ui = 0; ui < sb2[dim].us; ui++) {
179 for(
unsigned iv = 0; iv < 2; iv++) {
180 for(
unsigned iu = 0; iu < 2; iu++) {
181 unsigned corner = iu + 2*iv;
182 unsigned i = ui + vi*sb2[dim].us;
186 (vi + iv*(4-2*vi))*
height/4.);
189 if(vi == 0 && ui == 0) {
196 double dl =
dot((handles[corner+4*i] - (base +
origin)), dir)/
dot(dir,dir);
206 for(
unsigned i = 0; i < pwd2_in_linear_and_cubic.
size(); i++) {
227 auto const vbox = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL, 6);
230 auto const hbox = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL,0);
232 auto const vbox_expander = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL);
233 vbox_expander->set_spacing(2);
235 auto const reset_button = Gtk::make_managed<Gtk::Button>(Glib::ustring(_(
"Reset grid")));
237 reset_button->set_size_request(140,30);
242 std::vector<Parameter *>::iterator it =
param_vector.begin();
244 if ((*it)->widget_is_visible) {
251 if (param->
param_key ==
"horizontal_mirror" ||
262 widg->set_tooltip_markup(*tip);
264 widg->set_tooltip_text(
"");
265 widg->set_has_tooltip(
false);
273 expander = Gtk::make_managed<Gtk::Expander>(Glib::ustring(_(
"Show Points")));
274 expander->set_child(*vbox_expander);
286 expander->set_label (Glib::ustring(_(
"Hide Points")));
288 expander->set_label (Glib::ustring(_(
"Show Points")));
302 double distance_middle = (distance_one + distance_two)/2;
304 distance_middle *= -1;
323 double distance_middle = (distance_one + distance_two)/2;
325 distance_middle *= -1;
574 if(move)
c.moveTo(a);
662 hp_vec.push_back(
c.peek());
Conversion between Bezier control points and SBasis curves.
Adaptor that creates 2D functions from 1D ones.
constexpr C extent() const
Infinite line on a plane.
Coord nearestTime(Point const &p) const
Find a point on the line closest to the query point.
Point pointAt(Coord t) const
Store paths to a PathVector.
bool empty() const
Check whether the vector contains any paths.
Function defined as discrete pieces.
void push(const T &s, double to)
Convenience/implementation hiding function to add segment/cut pairs.
Two-dimensional point that doubles as a vector.
std::vector< Parameter * > param_vector
void registerParameter(Parameter *param)
virtual void resetDefaults(SPItem const *item)
Sets all parameters to their default values and writes them to SVG.
bool apply_to_clippath_and_mask
void original_bbox(SPLPEItem const *lpeitem, bool absolute=false, bool clip_mask=false, Geom::Affine base_transform=Geom::identity())
Geom::Interval boundingbox_Y
Geom::Interval boundingbox_X
void horizontal(PointParam ¶mA, PointParam ¶mB, Geom::Line horiz)
PointParam grid_point_29x31
BoolParam vertical_mirror
void addCanvasIndicators(SPLPEItem const *, std::vector< Geom::PathVector > &hp_vec) override
Add possible canvas indicators (i.e., helperpaths other than the original path) to hp_vec This functi...
PointParam grid_point_28x30
Gtk::Widget * newWidget() override
This creates a managed widget.
PointParam grid_point_22x23
void calculateCurve(Geom::Point a, Geom::Point b, Geom::PathBuilder &c, bool horizontal, bool move)
PointParam grid_point_20x21
void resetDefaults(SPItem const *item) override
Sets all parameters to their default values and writes them to SVG.
PointParam grid_point_10x11
Geom::Piecewise< Geom::D2< Geom::SBasis > > doEffect_pwd2(Geom::Piecewise< Geom::D2< Geom::SBasis > > const &pwd2_in) override
PointParam grid_point_24x26
PointParam grid_point_25x27
void vertical(PointParam ¶mA, PointParam ¶mB, Geom::Line vert)
BoolParam horizontal_mirror
PointParam grid_point_32x33x34x35
void doBeforeEffect(SPLPEItem const *lpeitem) override
Is performed each time before the effect is updated.
LPELattice2(LivePathEffectObject *lpeobject)
PointParam grid_point_8x9
Glib::ustring const * param_getTooltip() const
virtual Gtk::Widget * param_newWidget()=0
void param_update_default(Geom::Point default_point)
Geom::Point param_get_default() const
void param_setValue(Geom::Point newpoint, bool write=false)
void param_set_liveupdate(bool live_update)
void param_set_default() final
void param_hide_knot(bool hide)
Base class for visual SVG elements.
Geom::PathVector pathv_to_cubicbezier(Geom::PathVector const &pathv, bool nolines)
Specific geometry functions for Inkscape, not provided my lib2geom.
LPE <lattice2> implementation, see lpe-lattice2.cpp.
Various utility functions.
Piecewise< D2< SBasis > > paths_to_pw(PathVector const &paths)
Angle distance(Angle const &a, Angle const &b)
PathVector path_from_piecewise(Piecewise< D2< SBasis > > const &B, double tol, bool only_cubicbeziers=false)
Make a path from a d2 sbasis.
D2< T > compose_each(D2< T > const &a, D2< T > const &b)
T dot(D2< T > const &a, D2< T > const &b)
void pack_start(Gtk::Box &box, Gtk::Widget &child, bool const expand, bool const fill, unsigned const padding)
Adds child to box, packed with reference to the start of box.
Helper class to stream background task notifications as a series of messages.
Helpers for using Gtk::Boxes, encapsulating large changes between GTK3 & GTK4.
Obsolete 2D SBasis function class.
Base class for live path effect items.