27
27
LPETransform2Pts::LPETransform2Pts(LivePathEffectObject *lpeobject) :
29
fromOriginalWidth(_("From original width"), _("From original width"), "fromOriginalWidth", &wr, this, false,"", INKSCAPE_ICON("on"), INKSCAPE_ICON("off")),
29
from_original_width(_("From original width"), _("From original width"), "from_original_width", &wr, this, false,"", INKSCAPE_ICON("on"), INKSCAPE_ICON("off")),
30
30
start(_("Start"), _("Start point"), "start", &wr, this, "Start point"),
31
31
end(_("End"), _("End point"), "end", &wr, this, "End point"),
32
firstKnot(_("First Knot"), _("First Knot"), "firstKnot", &wr, this, 1),
33
lastKnot(_("Last Knot"), _("Last Knot"), "lastKnot", &wr, this, 1),
34
fromOriginalWidthToogler(false),
32
first_knot(_("First Knot"), _("First Knot"), "first_knot", &wr, this, 1),
33
last_knot(_("Last Knot"), _("Last Knot"), "last_knot", &wr, this, 1),
34
from_original_width_toogler(false),
35
point_a(Geom::Point(0,0)),
36
point_b(Geom::Point(0,0)),
40
40
registerParameter(&start);
41
41
registerParameter(&end);
42
registerParameter(&firstKnot);
43
registerParameter(&lastKnot);
44
registerParameter(&fromOriginalWidth);
46
firstKnot.param_make_integer(true);
47
lastKnot.param_make_integer(true);
42
registerParameter(&first_knot);
43
registerParameter(&last_knot);
44
registerParameter(&from_original_width);
46
first_knot.param_make_integer(true);
47
last_knot.param_make_integer(true);
50
50
LPETransform2Pts::~LPETransform2Pts()
57
57
using namespace Geom;
58
58
original_bbox(lpeitem);
60
A = Point(boundingbox_X.min(), boundingbox_Y.middle());
61
B = Point(boundingbox_X.max(), boundingbox_Y.middle());
60
point_a = Point(boundingbox_X.min(), boundingbox_Y.middle());
61
point_b = Point(boundingbox_X.max(), boundingbox_Y.middle());
62
62
SPLPEItem * splpeitem = const_cast<SPLPEItem *>(lpeitem);
63
63
SPPath *path = dynamic_cast<SPPath *>(splpeitem);
65
c = path->get_original_curve();
67
if(c && !c->is_closed() && c->first_path() == c->last_path()){
68
A = *(c->first_point());
69
B = *(c->last_point());
70
int nnodes = (int)c->nodes_in_path();
71
lastKnot.param_set_value(nnodes);
73
start.param_update_default(A);
65
curve_c = path->get_original_curve();
67
if(curve_c && !curve_c->is_closed() && curve_c->first_path() == curve_c->last_path()) {
68
point_a = *(curve_c->first_point());
69
point_b = *(curve_c->last_point());
70
int nnodes = (int)curve_c->nodes_in_path();
71
last_knot.param_set_value(nnodes);
73
start.param_update_default(point_a);
74
74
start.param_set_default();
75
end.param_update_default(B);
75
end.param_update_default(point_b);
76
76
end.param_set_default();
82
82
using namespace Geom;
83
83
original_bbox(lpeitem);
84
A = Point(boundingbox_X.min(), boundingbox_Y.middle());
85
B = Point(boundingbox_X.max(), boundingbox_Y.middle());
84
point_a = Point(boundingbox_X.min(), boundingbox_Y.middle());
85
point_b = Point(boundingbox_X.max(), boundingbox_Y.middle());
87
87
SPLPEItem * splpeitem = const_cast<SPLPEItem *>(lpeitem);
88
88
SPPath *path = dynamic_cast<SPPath *>(splpeitem);
90
c = path->get_original_curve();
90
curve_c = path->get_original_curve();
92
if(fromOriginalWidthToogler != fromOriginalWidth){
93
fromOriginalWidthToogler = fromOriginalWidth;
92
if(from_original_width_toogler != from_original_width) {
93
from_original_width_toogler = from_original_width;
96
if(c && !fromOriginalWidth){
97
if(!c->is_closed() && c->first_path() == c->last_path()){
99
Geom::PathVector const originalPV = c->get_pathvector();
100
A = originalPV[0][0].initialPoint();
101
if((int)firstKnot > 1){
102
A = originalPV[0][(int)firstKnot-2].finalPoint();
104
B = originalPV[0][0].initialPoint();
105
if((int)lastKnot > 1){
106
B = originalPV[0][(int)lastKnot-2].finalPoint();
108
int nnodes = (int)c->nodes_in_path();
109
firstKnot.param_set_range(1, lastKnot-1);
110
lastKnot.param_set_range(firstKnot+1, nnodes);
111
fromOriginalWidth.param_setValue(false);
96
if(curve_c && !from_original_width) {
97
if(!curve_c->is_closed() && curve_c->first_path() == curve_c->last_path()) {
99
Geom::PathVector const originalPV = curve_c->get_pathvector();
100
point_a = originalPV[0][0].initialPoint();
101
if((int)first_knot > 1) {
102
point_a = originalPV[0][(int)first_knot-2].finalPoint();
104
point_b = originalPV[0][0].initialPoint();
105
if((int)last_knot > 1) {
106
point_b = originalPV[0][(int)last_knot-2].finalPoint();
108
int nnodes = (int)curve_c->nodes_in_path();
109
first_knot.param_set_range(1, last_knot-1);
110
last_knot.param_set_range(first_knot+1, nnodes);
111
from_original_width.param_setValue(false);
113
firstKnot.param_set_value(1);
114
lastKnot.param_set_value(2);
115
firstKnot.param_set_range(1,1);
116
lastKnot.param_set_range(2,2);
117
if(appandedPath == false){
113
first_knot.param_set_value(1);
114
last_knot.param_set_value(2);
115
first_knot.param_set_range(1,1);
116
last_knot.param_set_range(2,2);
117
if(append_path == false) {
120
fromOriginalWidth.param_setValue(true);
120
from_original_width.param_setValue(true);
124
firstKnot.param_set_value(1);
125
lastKnot.param_set_value(2);
126
firstKnot.param_set_range(1,1);
127
lastKnot.param_set_range(2,2);
128
fromOriginalWidth.param_setValue(true);
129
appandedPath = false;
124
first_knot.param_set_value(1);
125
last_knot.param_set_value(2);
126
first_knot.param_set_range(1,1);
127
last_knot.param_set_range(2,2);
128
from_original_width.param_setValue(true);
131
131
splpeitem->apply_to_clippath(splpeitem);
132
132
splpeitem->apply_to_mask(splpeitem);
136
136
LPETransform2Pts::updateIndex()
138
SPCurve * curve2 = NULL;
139
139
SPShape *shape = SP_SHAPE(sp_lpe_item);
141
c2 = shape->getCurve();
141
curve2 = shape->getCurve();
143
if(c2 && !fromOriginalWidth && !c->is_closed() && c->first_path() == c->last_path()){
144
Geom::PathVector const originalPV = c2->get_pathvector();
145
Geom::Point C = originalPV[0][0].initialPoint();
146
Geom::Point D = originalPV[0][0].initialPoint();
147
if((int)firstKnot > 1){
148
C = originalPV[0][(int)firstKnot-2].finalPoint();
150
if((int)lastKnot > 1){
151
D = originalPV[0][(int)lastKnot-2].finalPoint();
153
start.param_update_default(C);
143
if(curve2 && !from_original_width && !curve_c->is_closed() && curve_c->first_path() == curve_c->last_path()) {
144
Geom::PathVector const originalPV = curve2->get_pathvector();
145
Geom::Point point_c = originalPV[0][0].initialPoint();
146
Geom::Point point_d = originalPV[0][0].initialPoint();
147
if((int)first_knot > 1) {
148
point_c = originalPV[0][(int)first_knot-2].finalPoint();
150
if((int)last_knot > 1) {
151
point_d = originalPV[0][(int)last_knot-2].finalPoint();
153
start.param_update_default(point_c);
154
154
start.param_set_default();
155
end.param_update_default(D);
155
end.param_update_default(point_d);
156
156
end.param_set_default();
157
start.param_update_default(A);
158
end.param_update_default(B);
157
start.param_update_default(point_a);
158
end.param_update_default(point_b);
159
159
start.param_set_default();
160
160
end.param_set_default();
165
165
LPETransform2Pts::reset()
167
A = Geom::Point(boundingbox_X.min(), boundingbox_Y.middle());
168
B = Geom::Point(boundingbox_X.max(), boundingbox_Y.middle());
169
if(c && !c->is_closed() && c->first_path() == c->last_path() && !fromOriginalWidth){
170
int nnodes = (int)c->nodes_in_path();
171
firstKnot.param_set_range(1, lastKnot-1);
172
lastKnot.param_set_range(firstKnot+1, nnodes);
173
firstKnot.param_set_value(1);
174
lastKnot.param_set_value(nnodes);
175
A = *(c->first_point());
176
B = *(c->last_point());
167
point_a = Geom::Point(boundingbox_X.min(), boundingbox_Y.middle());
168
point_b = Geom::Point(boundingbox_X.max(), boundingbox_Y.middle());
169
if(curve_c && !curve_c->is_closed() && curve_c->first_path() == curve_c->last_path() && !from_original_width) {
170
int nnodes = (int)curve_c->nodes_in_path();
171
first_knot.param_set_range(1, last_knot-1);
172
last_knot.param_set_range(first_knot+1, nnodes);
173
first_knot.param_set_value(1);
174
last_knot.param_set_value(nnodes);
175
point_a = *(curve_c->first_point());
176
point_b = *(curve_c->last_point());
178
firstKnot.param_set_value(1);
179
lastKnot.param_set_value(2);
178
first_knot.param_set_value(1);
179
last_knot.param_set_value(2);
181
start.param_update_default(A);
182
end.param_update_default(B);
181
start.param_update_default(point_a);
182
end.param_update_default(point_b);
183
183
start.param_set_default();
184
184
end.param_set_default();
201
201
Parameter *param = *it;
202
202
Gtk::Widget *widg = dynamic_cast<Gtk::Widget *>(param->param_newWidget());
203
203
Glib::ustring *tip = param->param_getTooltip();
204
if (param->param_key == "firstKnot" || param->param_key == "lastKnot") {
205
Inkscape::UI::Widget::Scalar *widgRegistered = Gtk::manage(dynamic_cast<Inkscape::UI::Widget::Scalar *>(widg));
206
widgRegistered->signal_value_changed().connect(sigc::mem_fun(*this, &LPETransform2Pts::updateIndex));
207
widg = widgRegistered;
204
if (param->param_key == "first_knot" || param->param_key == "last_knot") {
205
Inkscape::UI::Widget::Scalar *registered_widget = Gtk::manage(dynamic_cast<Inkscape::UI::Widget::Scalar *>(widg));
206
registered_widget->signal_value_changed().connect(sigc::mem_fun(*this, &LPETransform2Pts::updateIndex));
207
widg = registered_widget;
209
Gtk::HBox *scalarParameter = dynamic_cast<Gtk::HBox *>(widg);
210
std::vector<Gtk::Widget *> childList = scalarParameter->get_children();
211
Gtk::Entry *entryWidg = dynamic_cast<Gtk::Entry *>(childList[1]);
212
entryWidg->set_width_chars(3);
209
Gtk::HBox *hbox_scalar = dynamic_cast<Gtk::HBox *>(widg);
210
std::vector<Gtk::Widget *> child_list = hbox_scalar->get_children();
211
Gtk::Entry *entry_widget = dynamic_cast<Gtk::Entry *>(child_list[1]);
212
entry_widget->set_width_chars(3);
213
213
vbox->pack_start(*widg, true, true, 2);
215
215
widg->set_tooltip_text(*tip);
253
253
LPETransform2Pts::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwd2_in)
255
255
Geom::Piecewise<Geom::D2<Geom::SBasis> > output;
256
double sca = Geom::distance((Geom::Point)start,(Geom::Point)end)/Geom::distance(A,B);
257
Geom::Ray original(A,B);
256
double sca = Geom::distance((Geom::Point)start,(Geom::Point)end)/Geom::distance(point_a,point_b);
257
Geom::Ray original(point_a,point_b);
258
258
Geom::Ray transformed((Geom::Point)start,(Geom::Point)end);
259
259
double rot = transformed.angle() - original.angle();
260
260
Geom::Path helper;
262
helper.appendNew<Geom::LineSegment>(B);
261
helper.start(point_a);
262
helper.appendNew<Geom::LineSegment>(point_b);
264
264
m *= Geom::Scale(sca);
265
265
m *= Geom::Rotate(rot);