19715d9462f14c8543082f8df232e3c99a8453caJabiertxof * Copyright (C) Jabiertxo Arraiza Cenoz <jabier.arraiza@marker.es>
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof * Special thanks to Johan Engelen for the base of the effect -powerstroke-
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof * Also to ScislaC for point me to the idea
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof * Also su_v for his construvtive feedback and time
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof * and finaly to Liam P. White for his big help on coding, that save me a lot of
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof * Released under GNU GPL, read the file 'COPYING' for more information
af4ffc13725d197d363363e3396de870410a8556Jabiertxof#include "ui/dialog/lpe-fillet-chamfer-properties.h"
af4ffc13725d197d363363e3396de870410a8556Jabiertxof#include "live_effects/parameter/filletchamferpointarray.h"
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof// needed for on-canvas editting:
2a34eab862e0e9608690fcdea3ffca47ff593fcaLiam P. White// TODO due to internal breakage in glibmm headers,
2a34eab862e0e9608690fcdea3ffca47ff593fcaLiam P. White// this has to be included last.
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofusing namespace Geom;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofFilletChamferPointArrayParam::FilletChamferPointArrayParam(
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof const Glib::ustring &label, const Glib::ustring &tip,
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof const Glib::ustring &key, Inkscape::UI::Widget::Registry *wr,
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof : ArrayParam<Point>(label, tip, key, wr, effect, 0)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofFilletChamferPointArrayParam::~FilletChamferPointArrayParam() {}
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofGtk::Widget *FilletChamferPointArrayParam::param_newWidget()
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Inkscape::UI::Widget::RegisteredTransformedPoint * pointwdg =
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Gtk::manage(
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof new Inkscape::UI::Widget::RegisteredTransformedPoint(
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof param_label,
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof param_tooltip,
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof param_effect->getRepr(),
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof param_effect->getSPDoc()
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof // TODO: fix to get correct desktop (don't use SP_ACTIVE_DESKTOP)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof SPDesktop *desktop = SP_ACTIVE_DESKTOP;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Affine transf = desktop->doc2dt();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof pointwdg->setTransform(transf);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof pointwdg->setValue( *this );
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof pointwdg->clearProgrammatically();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof pointwdg->set_undo_parameters(SP_VERB_DIALOG_LIVE_PATH_EFFECT,
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof _("Change point parameter"));
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Gtk::HBox * hbox = Gtk::manage( new Gtk::HBox() );
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof static_cast<Gtk::HBox*>(hbox)->pack_start(*pointwdg, true, true);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof static_cast<Gtk::HBox*>(hbox)->show_all_children();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof return dynamic_cast<Gtk::Widget *> (hbox);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofFilletChamferPointArrayParam::param_transform_multiply(Affine const &postmul,
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof bool /*set*/)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Inkscape::Preferences *prefs = Inkscape::Preferences::get();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (prefs->getBool("/options/transform/rectcorners", true) &&
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof for (std::vector<Point>::const_iterator point_it = _vector.begin();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof (*point_it)[X] * ((postmul.expansionX() + postmul.expansionY()) / 2);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof // param_set_and_write_new_value( (*this) * postmul );
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof/** call this method to recalculate the controlpoints such that they stay at the
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof * same location relative to the new path. Useful after adding/deleting nodes to
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof * the path.*/
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofvoid FilletChamferPointArrayParam::recalculate_controlpoints_for_new_pwd2(
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof path_from_piecewise(remove_short_cuts(pwd2_in, 0.1), 0.001);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof path_from_piecewise(remove_short_cuts(last_pwd2, 0.1), 0.001);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof for (PathVector::const_iterator path_it = pathv.begin();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Geom::Path::const_iterator curve_it1 = path_it->begin();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Geom::Path::const_iterator curve_it2 = ++(path_it->begin());
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Geom::Path::const_iterator curve_endit = path_it->end_default();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (path_it->closed() && path_it->back_closed().isDegenerate()) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof const Curve &closingline = path_it->back_closed();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (are_near(closingline.initialPoint(), closingline.finalPoint())) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof //if start a path get node type
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof nodetype = get_nodetype(path_it->back_open(), *curve_it1);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof nodetype = get_nodetype(path_it->back_closed(), *curve_it1);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof //check node type also whith straight lines because get_nodetype
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof //return non cusp node in a node inserted inside a straight line
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof //todo: if the path remove some nodes whith the result of a straight
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof //line but with handles, the node inserted into dont fire the knot
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof // because is not handle as cusp node by get_nodetype function
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof bool next_is_line = is_straight_curve(*curve_it1);
b1b352ba8dc52b86acfbf68071a62dfb9a9792c3Kris De Gussem bool this_is_line = is_straight_curve((*path_it)[counterCurves - 1]);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof nodetype = get_nodetype((*path_it)[counterCurves - 1], *curve_it1);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof last_pathv[counterPaths].size() > counter - offset &&
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof last_pathv[counterPaths][counter - offset].initialPoint(),
7731e667cc71dcc7568173cdaec89b1d0c75029aJabiertxof if (last_pathv[counterPaths].size() != pathv[counterPaths].size()) {
7731e667cc71dcc7568173cdaec89b1d0c75029aJabiertxof offset = (last_pathv[counterPaths].size() - pathv[counterPaths].size()) * -1;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof } else if (counterCurves == 0 && last_pathv.size() <= pathv.size() &&
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof counter - offset <= last_pathv[counterPaths].size() &&
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof for (unsigned long i =
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof last_pathv[counterPaths].size() + counter - offset;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof _vector[e] = Point(e + fractpart, tmp[i - 1][Y]);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof _vector[e] = Point(tmp[i - 1][X], tmp[i - 1][Y]);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof //delete temp vector
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński last_pathv[counterPaths] = last_pathv[counterPaths].reversed();
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński xPos = nearest_time(curve_it1->initialPoint(), pwd2_in);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (_vector.size() <= (unsigned)(counter - offset)) {
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński xPos = nearest_time(curve_it1->initialPoint(), pwd2_in);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (_vector.size() <= (unsigned)(counter - offset) || vectorY == 0) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofvoid FilletChamferPointArrayParam::recalculate_knots(
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof PathVector pathv = path_from_piecewise(pwd2_in, 0.001);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof for (PathVector::const_iterator path_it = pathv.begin();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Geom::Path::const_iterator curve_it1 = path_it->begin();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Geom::Path::const_iterator curve_it2 = ++(path_it->begin());
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Geom::Path::const_iterator curve_endit = path_it->end_default();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (path_it->closed() && path_it->back_closed().isDegenerate()) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof const Curve &closingline = path_it->back_closed();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (are_near(closingline.initialPoint(), closingline.finalPoint())) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof //if start a path get node type
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof nodetype = get_nodetype(path_it->back_open(), *curve_it1);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof nodetype = get_nodetype(path_it->back_closed(), *curve_it1);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof bool next_is_line = is_straight_curve(*curve_it1);
b1b352ba8dc52b86acfbf68071a62dfb9a9792c3Kris De Gussem bool this_is_line = is_straight_curve((*path_it)[counterCurves - 1]);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof nodetype = get_nodetype((*path_it)[counterCurves - 1], *curve_it1);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof result.push_back(Point(_vector[counter][X], vectorY));
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofvoid FilletChamferPointArrayParam::set_helper_size(int hs)
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxofvoid FilletChamferPointArrayParam::set_chamfer_steps(int value_chamfer_steps)
af4ffc13725d197d363363e3396de870410a8556Jabiertxofvoid FilletChamferPointArrayParam::set_use_distance(bool use_knot_distance )
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofvoid FilletChamferPointArrayParam::updateCanvasIndicators()
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof unsigned int i = 0;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof for (std::vector<Point>::const_iterator point_it = ts.begin();
225d46778e89db9e42c1f92d79638fd0163f67aaJabiertxof Geom::Point derivA = unit_vector(derivative(last_pwd2[i]).valueAt(Xvalue));
225d46778e89db9e42c1f92d79638fd0163f67aaJabiertxof Geom::Rotate rot(Geom::Rotate::from_degrees(-90));
225d46778e89db9e42c1f92d79638fd0163f67aaJabiertxof char const * svgd = "M 1,0.25 0.5,0 1,-0.25 M 1,0.5 0,0 1,-0.5";
225d46778e89db9e42c1f92d79638fd0163f67aaJabiertxof Geom::PathVector pathv = sp_svg_read_pathv(svgd);
a16a494f042310ee849a6f717ffea70846f1f22cKrzysztof Kosiński aff *= Geom::Rotate(ray1.angle() - rad_from_deg(270));
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński aff *= Geom::Translate(last_pwd2[i].valueAt(Xvalue));
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofvoid FilletChamferPointArrayParam::addCanvasIndicators(
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof SPLPEItem const */*lpeitem*/, std::vector<Geom::PathVector> &hp_vec)
af4ffc13725d197d363363e3396de870410a8556Jabiertxofdouble FilletChamferPointArrayParam::rad_to_len(int index, double rad)
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński Geom::PathVector subpaths = path_from_piecewise(last_pwd2, 0.1);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof std::pair<std::size_t, std::size_t> positions = get_positions(index, subpaths);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof D2<SBasis> A = last_pwd2[last_index(index, subpaths)];
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Piecewise<D2<SBasis> > offset_curve0 = Piecewise<D2<SBasis> >(A)+rot90(unitVector(derivative(A)))*(rad);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Piecewise<D2<SBasis> > offset_curve1 = Piecewise<D2<SBasis> >(B)+rot90(unitVector(derivative(B)))*(rad);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Geom::Path p0 = path_from_piecewise(offset_curve0, 0.1)[0];
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Geom::Path p1 = path_from_piecewise(offset_curve1, 0.1)[0];
af4ffc13725d197d363363e3396de870410a8556Jabiertxofdouble FilletChamferPointArrayParam::len_to_rad(int index, double len)
af4ffc13725d197d363363e3396de870410a8556Jabiertxof _vector[index] = Geom::Point(len,_vector[index][Y]);
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński Geom::PathVector subpaths = path_from_piecewise(last_pwd2, 0.1);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof std::pair<std::size_t, std::size_t> positions = get_positions(index, subpaths);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof u.push(last_pwd2[last_index(index, subpaths)], 1);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Geom::Curve * A = path_from_piecewise(u, 0.1)[0][0].duplicate();
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Geom::Curve * B = subpaths[positions.first][positions.second].duplicate();
af4ffc13725d197d363363e3396de870410a8556Jabiertxof A = subpaths[positions.first][positions.second-1].duplicate();
af4ffc13725d197d363363e3396de870410a8556Jabiertxof times = get_times(last_index(index, subpaths), subpaths, true);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof _vector[index] = Geom::Point(tmp_len,_vector[index][Y]);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Geom::Point startArcPoint = A->toSBasis().valueAt(times[1]);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Geom::Point endArcPoint = B->toSBasis().valueAt(times[2]);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Curve *knotCurve1 = A->portion(times[0], times[1]);
b1b352ba8dc52b86acfbf68071a62dfb9a9792c3Kris De Gussem Geom::CubicBezier const *cubic1 = dynamic_cast<Geom::CubicBezier const *>(knotCurve1);
b1b352ba8dc52b86acfbf68071a62dfb9a9792c3Kris De Gussem Geom::CubicBezier const *cubic2 = dynamic_cast<Geom::CubicBezier const *>(knotCurve2);
cccfdbab6a36d7ea9f8d34125a609db06d870dd6Krzysztof Kosiński bool ccwToggle = cross(A->finalPoint() - startArcPoint, endArcPoint - startArcPoint) > 0;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof double distanceArc = Geom::distance(startArcPoint,middle_point(startArcPoint,endArcPoint));
af4ffc13725d197d363363e3396de870410a8556Jabiertxof double angleBetween = angle_between(ray1, ray2, ccwToggle);
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosińskistd::vector<double> FilletChamferPointArrayParam::get_times(int index, Geom::PathVector subpaths, bool last)
af4ffc13725d197d363363e3396de870410a8556Jabiertxof std::pair<std::size_t, std::size_t> positions = get_positions(index, subpaths);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof curve_it1 = subpaths[positions.first][positions.second].duplicate();
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Coord it1_length = (*curve_it1).length(tolerance);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof time_it1 = modf(to_time(index, _vector[index][X]), &intpart);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if (subpaths[positions.first].closed() && last) {
af4ffc13725d197d363363e3396de870410a8556Jabiertxof time_it2 = modf(to_time(index - positions.second , _vector[index - positions.second ][X]), &intpart);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof resultLenght = it1_length + to_len(index - positions.second, _vector[index - positions.second ][X]);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof } else if (!subpaths[positions.first].closed() && last){
af4ffc13725d197d363363e3396de870410a8556Jabiertxof time_it2 = modf(to_time(index + 1, _vector[index + 1][X]), &intpart);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof resultLenght = it1_length + to_len( index + 1, _vector[index + 1][X]);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof time_it1_B = modf(to_time(index, -resultLenght), &intpart);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if ((subpaths[positions.first].closed() && last && _vector[index - positions.second][Y] == 0) || (subpaths[positions.first].size() > positions.second + 1 && _vector[index + 1][Y] == 0)) {
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosińskistd::pair<std::size_t, std::size_t> FilletChamferPointArrayParam::get_positions(int index, Geom::PathVector subpaths)
af4ffc13725d197d363363e3396de870410a8556Jabiertxof for (PathVector::const_iterator path_it = subpaths.begin(); path_it != subpaths.end(); ++path_it) {
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Geom::Path::const_iterator curve_it1 = path_it->begin();
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Geom::Path::const_iterator curve_endit = path_it->end_default();
af4ffc13725d197d363363e3396de870410a8556Jabiertxof const Geom::Curve &closingline = path_it->back_closed();
af4ffc13725d197d363363e3396de870410a8556Jabiertxof // the closing line segment is always of type
af4ffc13725d197d363363e3396de870410a8556Jabiertxof // Geom::LineSegment.
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if (are_near(closingline.initialPoint(), closingline.finalPoint())) {
af4ffc13725d197d363363e3396de870410a8556Jabiertxof // closingline.isDegenerate() did not work, because it only checks for
af4ffc13725d197d363363e3396de870410a8556Jabiertxof // *exact* zero length, which goes wrong for relative coordinates and
af4ffc13725d197d363363e3396de870410a8556Jabiertxof // rounding errors...
af4ffc13725d197d363363e3396de870410a8556Jabiertxof // the closing line segment has zero-length. So stop before that one!
af4ffc13725d197d363363e3396de870410a8556Jabiertxof std::pair<std::size_t, std::size_t> out(first, second);
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosińskiint FilletChamferPointArrayParam::last_index(int index, Geom::PathVector subpaths)
af4ffc13725d197d363363e3396de870410a8556Jabiertxof for (PathVector::const_iterator path_it = subpaths.begin(); path_it != subpaths.end(); ++path_it) {
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Geom::Path::const_iterator curve_it1 = path_it->begin();
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Geom::Path::const_iterator curve_endit = path_it->end_default();
af4ffc13725d197d363363e3396de870410a8556Jabiertxof const Geom::Curve &closingline = path_it->back_closed();
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if (are_near(closingline.initialPoint(), closingline.finalPoint())) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofdouble FilletChamferPointArrayParam::len_to_time(int index, double len)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof double t = 0;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (last_pwd2[index][0].degreesOfFreedom() != 2) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof std::vector<double> t_roots = roots(arcLengthSb(u) - std::abs(len));
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (std::abs(len) < lenghtPart && lenghtPart != 0) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof t = double(index) + t;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofdouble FilletChamferPointArrayParam::time_to_len(int index, double time)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (last_pwd2.size() <= (unsigned) index || time == 0) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (last_pwd2[index][0].degreesOfFreedom() != 2) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofdouble FilletChamferPointArrayParam::to_time(int index, double A)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (A > 0) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofdouble FilletChamferPointArrayParam::to_len(int index, double A)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (A > 0) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofvoid FilletChamferPointArrayParam::set_oncanvas_looks(SPKnotShapeType shape,
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof FilletChamferPointArrayParam *p, unsigned int index)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofvoid FilletChamferPointArrayParamKnotHolderEntity::knot_set(Point const &p,
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof using namespace Geom;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Piecewise<D2<SBasis> > const &pwd2 = _pparam->get_pwd2();
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński double t = nearest_time(p, pwd2[_index]);
c93e188303d4a495f7e2808c18509e80cebf8714Jabiertxof Geom::Point const s = snap_knot_position(pwd2[_index].valueAt(t), state);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (t == 1) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Point(_pparam->time_to_len(_index, t), _pparam->_vector.at(_index)[Y]);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof _pparam->_vector.at(_index) = Point(t, _pparam->_vector.at(_index)[Y]);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof sp_lpe_item_update_patheffect(SP_LPE_ITEM(item), false, false);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofPoint FilletChamferPointArrayParamKnotHolderEntity::knot_get() const
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof using namespace Geom;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Piecewise<D2<SBasis> > const &pwd2 = _pparam->get_pwd2();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof double time_it = _pparam->to_time(_index, _pparam->_vector.at(_index)[X]);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofvoid FilletChamferPointArrayParamKnotHolderEntity::knot_click(guint state)
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof _pparam->_vector.at(_index) = Point(_index, _pparam->_vector.at(_index)[Y]);
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof _pparam->param_set_and_write_new_value(_pparam->_vector);
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof sp_lpe_item_update_patheffect(SP_LPE_ITEM(item), false, false);
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof using namespace Geom;
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof _pparam->_vector.at(_index) = Point(_pparam->_vector.at(_index)[X], (double)type);
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof _pparam->param_set_and_write_new_value(_pparam->_vector);
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof sp_lpe_item_update_patheffect(SP_LPE_ITEM(item), false, false);
941258c32420e8e09b4e0bc2f745df8731300efaYuri Chornoivan tip = _("<b>Chamfer</b>: <b>Ctrl+Click</b> toggle type, "
afe3b94c9da473ea1e7632e7853dd7dee528d194Jabiertxof "<b>Shift+Click</b> open dialog, "
afe3b94c9da473ea1e7632e7853dd7dee528d194Jabiertxof "<b>Ctrl+Alt+Click</b> reset");
941258c32420e8e09b4e0bc2f745df8731300efaYuri Chornoivan tip = _("<b>Inverse Chamfer</b>: <b>Ctrl+Click</b> toggle type, "
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof "<b>Shift+Click</b> open dialog, "
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof "<b>Ctrl+Alt+Click</b> reset");
941258c32420e8e09b4e0bc2f745df8731300efaYuri Chornoivan tip = _("<b>Inverse Fillet</b>: <b>Ctrl+Click</b> toggle type, "
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof "<b>Shift+Click</b> open dialog, "
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof "<b>Ctrl+Alt+Click</b> reset");
941258c32420e8e09b4e0bc2f745df8731300efaYuri Chornoivan tip = _("<b>Fillet</b>: <b>Ctrl+Click</b> toggle type, "
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof "<b>Shift+Click</b> open dialog, "
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof "<b>Ctrl+Alt+Click</b> reset");
af4ffc13725d197d363363e3396de870410a8556Jabiertxof double xModified = _pparam->_vector.at(_index).x();
af4ffc13725d197d363363e3396de870410a8556Jabiertxof xModified = _pparam->len_to_rad(_index, _pparam->_vector.at(_index).x());
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński Geom::PathVector subpaths = path_from_piecewise(_pparam->last_pwd2, 0.1);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof std::pair<std::size_t, std::size_t> positions = _pparam->get_positions(_index, subpaths);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof D2<SBasis> A = _pparam->last_pwd2[_pparam->last_index(_index, subpaths)];
af4ffc13725d197d363363e3396de870410a8556Jabiertxof bool aprox = (A[0].degreesOfFreedom() != 2 || B[0].degreesOfFreedom() != 2) && !_pparam->use_distance?true:false;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Geom::Point offset = Geom::Point(xModified, _pparam->_vector.at(_index).y());
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Inkscape::UI::Dialogs::FilletChamferPropertiesDialog::showDialog(
0b159142b0b5738b20883b411fe8233657cf8b4fJabiertxof this->desktop, offset, this, _pparam->use_distance, aprox);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofvoid FilletChamferPointArrayParamKnotHolderEntity::knot_set_offset(
af4ffc13725d197d363363e3396de870410a8556Jabiertxof xModified = _pparam->rad_to_len(_index, offset.x());
af4ffc13725d197d363363e3396de870410a8556Jabiertxof _pparam->_vector.at(_index) = Geom::Point(xModified, offset.y());
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof this->parent_holder->knot_ungrabbed_handler(this->knot, 0);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofvoid FilletChamferPointArrayParam::addKnotHolderEntities(KnotHolder *knotholder,
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof for (unsigned int i = 0; i < _vector.size(); ++i) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (_vector[i][Y] <= 0) {
afe3b94c9da473ea1e7632e7853dd7dee528d194Jabiertxof if (_vector[i][Y] >=3000 && _vector[i][Y] < 4000){
941258c32420e8e09b4e0bc2f745df8731300efaYuri Chornoivan tip = _("<b>Chamfer</b>: <b>Ctrl+Click</b> toggle type, "
afe3b94c9da473ea1e7632e7853dd7dee528d194Jabiertxof "<b>Shift+Click</b> open dialog, "
afe3b94c9da473ea1e7632e7853dd7dee528d194Jabiertxof "<b>Ctrl+Alt+Click</b> reset");
afe3b94c9da473ea1e7632e7853dd7dee528d194Jabiertxof } else if (_vector[i][Y] >=4000 && _vector[i][Y] < 5000) {
941258c32420e8e09b4e0bc2f745df8731300efaYuri Chornoivan tip = _("<b>Inverse Chamfer</b>: <b>Ctrl+Click</b> toggle type, "
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof "<b>Shift+Click</b> open dialog, "
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof "<b>Ctrl+Alt+Click</b> reset");
941258c32420e8e09b4e0bc2f745df8731300efaYuri Chornoivan tip = _("<b>Inverse Fillet</b>: <b>Ctrl+Click</b> toggle type, "
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof "<b>Shift+Click</b> open dialog, "
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof "<b>Ctrl+Alt+Click</b> reset");
941258c32420e8e09b4e0bc2f745df8731300efaYuri Chornoivan tip = _("<b>Fillet</b>: <b>Ctrl+Click</b> toggle type, "
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof "<b>Shift+Click</b> open dialog, "
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof "<b>Ctrl+Alt+Click</b> reset");
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof FilletChamferPointArrayParamKnotHolderEntity *e =
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof new FilletChamferPointArrayParamKnotHolderEntity(this, i);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof e->create(desktop, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN, _(tip),
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof} /* namespace LivePathEffect */
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof} /* namespace Inkscape */
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Local Variables:
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof c-file-style:"stroustrup"
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof indent-tabs-mode:nil
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof fill-column:99
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :