19715d9462f14c8543082f8df232e3c99a8453caJabiertxof/*
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 * hours
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof * Released under GNU GPL, read the file 'COPYING' for more information
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof */
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
2a34eab862e0e9608690fcdea3ffca47ff593fcaLiam P. White#include <2geom/piecewise.h>
2a34eab862e0e9608690fcdea3ffca47ff593fcaLiam P. White#include <2geom/sbasis-to-bezier.h>
2a34eab862e0e9608690fcdea3ffca47ff593fcaLiam P. White#include <2geom/sbasis-geometric.h>
af4ffc13725d197d363363e3396de870410a8556Jabiertxof#include <2geom/line.h>
af4ffc13725d197d363363e3396de870410a8556Jabiertxof#include <2geom/path-intersection.h>
2a34eab862e0e9608690fcdea3ffca47ff593fcaLiam P. White
af4ffc13725d197d363363e3396de870410a8556Jabiertxof#include "ui/dialog/lpe-fillet-chamfer-properties.h"
af4ffc13725d197d363363e3396de870410a8556Jabiertxof#include "live_effects/parameter/filletchamferpointarray.h"
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof#include "live_effects/effect.h"
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof#include "svg/svg.h"
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof#include "svg/stringstream.h"
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof#include "knotholder.h"
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof#include "sp-lpe-item.h"
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof#include "selection.h"
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof// needed for on-canvas editting:
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof#include "desktop.h"
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof#include "live_effects/lpeobject.h"
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof#include "helper/geom-nodetype.h"
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof#include "helper/geom-curves.h"
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof#include "ui/tools/node-tool.h"
2a34eab862e0e9608690fcdea3ffca47ff593fcaLiam P. White
2a34eab862e0e9608690fcdea3ffca47ff593fcaLiam P. White// TODO due to internal breakage in glibmm headers,
2a34eab862e0e9608690fcdea3ffca47ff593fcaLiam P. White// this has to be included last.
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof#include <glibmm/i18n.h>
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
af4ffc13725d197d363363e3396de870410a8556Jabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofusing namespace Geom;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofnamespace Inkscape {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofnamespace LivePathEffect {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofFilletChamferPointArrayParam::FilletChamferPointArrayParam(
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof const Glib::ustring &label, const Glib::ustring &tip,
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof const Glib::ustring &key, Inkscape::UI::Widget::Registry *wr,
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Effect *effect)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof : ArrayParam<Point>(label, tip, key, wr, effect, 0)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof{
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof knot_shape = SP_KNOT_SHAPE_DIAMOND;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof knot_mode = SP_KNOT_MODE_XOR;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof knot_color = 0x00ff0000;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof}
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofFilletChamferPointArrayParam::~FilletChamferPointArrayParam() {}
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofGtk::Widget *FilletChamferPointArrayParam::param_newWidget()
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof{
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof return NULL;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof /*
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Inkscape::UI::Widget::RegisteredTransformedPoint * pointwdg =
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Gtk::manage(
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof new Inkscape::UI::Widget::RegisteredTransformedPoint(
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof param_label,
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof param_tooltip,
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof param_key,
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof *param_wr,
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof param_effect->getRepr(),
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof param_effect->getSPDoc()
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof ) );
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
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
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof return dynamic_cast<Gtk::Widget *> (hbox);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof */
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof}
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofvoid
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofFilletChamferPointArrayParam::param_transform_multiply(Affine const &postmul,
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof bool /*set*/)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof{
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Inkscape::Preferences *prefs = Inkscape::Preferences::get();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (prefs->getBool("/options/transform/rectcorners", true) &&
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof _vector[1][X] <= 0) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof std::vector<Geom::Point> result;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof for (std::vector<Point>::const_iterator point_it = _vector.begin();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof point_it != _vector.end(); ++point_it) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Coord A =
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof (*point_it)[X] * ((postmul.expansionX() + postmul.expansionY()) / 2);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof result.push_back(Point(A, (*point_it)[Y]));
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof param_set_and_write_new_value(result);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof // param_set_and_write_new_value( (*this) * postmul );
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof}
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
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 Piecewise<D2<SBasis> > const &pwd2_in)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof{
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (!last_pwd2.empty()) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof PathVector const pathv =
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof path_from_piecewise(remove_short_cuts(pwd2_in, 0.1), 0.001);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof PathVector last_pathv =
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof path_from_piecewise(remove_short_cuts(last_pwd2, 0.1), 0.001);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof std::vector<Point> result;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof unsigned long counter = 0;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof unsigned long counterPaths = 0;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof unsigned long counterCurves = 0;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof long offset = 0;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof long offsetPaths = 0;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Geom::NodeType nodetype;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof for (PathVector::const_iterator path_it = pathv.begin();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof path_it != pathv.end(); ++path_it) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (path_it->empty()) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof counterPaths++;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof counter++;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof continue;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
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 curve_endit = path_it->end_open();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof counterCurves = 0;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof while (curve_it1 != curve_endit) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof //if start a path get node type
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (counterCurves == 0) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (path_it->closed()) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (path_it->back_closed().isDegenerate()) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof nodetype = get_nodetype(path_it->back_open(), *curve_it1);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof } else {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof nodetype = get_nodetype(path_it->back_closed(), *curve_it1);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof } else {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof nodetype = NODE_NONE;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof } else {
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);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (this_is_line || next_is_line) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof nodetype = NODE_CUSP;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (last_pathv.size() > pathv.size() ||
af4ffc13725d197d363363e3396de870410a8556Jabiertxof (last_pathv.size() > counterPaths &&
af4ffc13725d197d363363e3396de870410a8556Jabiertxof last_pathv[counterPaths].size() > counter - offset &&
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof !are_near(curve_it1->initialPoint(),
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof last_pathv[counterPaths][counter - offset].initialPoint(),
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof 0.1))) {
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if ( curve_it2 == curve_endit) {
7731e667cc71dcc7568173cdaec89b1d0c75029aJabiertxof if (last_pathv[counterPaths].size() != pathv[counterPaths].size()) {
7731e667cc71dcc7568173cdaec89b1d0c75029aJabiertxof offset = (last_pathv[counterPaths].size() - pathv[counterPaths].size()) * -1;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof } else {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof offset = 0;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof offsetPaths += offset;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof offset = offsetPaths;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof } else if (counterCurves == 0 && last_pathv.size() <= pathv.size() &&
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof counter - offset <= last_pathv[counterPaths].size() &&
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof are_near(curve_it1->initialPoint(),
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof last_pathv[counterPaths].finalPoint(), 0.1) &&
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof !last_pathv[counterPaths].closed()) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof long e = counter - offset + 1;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof std::vector<Point> tmp = _vector;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof for (unsigned long i =
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof last_pathv[counterPaths].size() + counter - offset;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof i > counterCurves - offset + 1; i--) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (tmp[i - 1][X] > 0) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof double fractpart, intpart;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof fractpart = modf(tmp[i - 1][X], &intpart);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof _vector[e] = Point(e + fractpart, tmp[i - 1][Y]);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof } else {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof _vector[e] = Point(tmp[i - 1][X], tmp[i - 1][Y]);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof e++;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof //delete temp vector
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof std::vector<Point>().swap(tmp);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (last_pathv.size() > counterPaths) {
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński last_pathv[counterPaths] = last_pathv[counterPaths].reversed();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof } else {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (last_pathv.size() > counterPaths) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (last_pathv[counterPaths].size() <
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof pathv[counterPaths].size()) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof offset++;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof } else if (last_pathv[counterPaths].size() >
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof pathv[counterPaths].size()) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof offset--;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof continue;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof } else {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof offset++;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof double xPos = 0;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (_vector[1][X] > 0) {
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński xPos = nearest_time(curve_it1->initialPoint(), pwd2_in);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (nodetype == NODE_CUSP) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof result.push_back(Point(xPos, 1));
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof } else {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof result.push_back(Point(xPos, 0));
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof } else {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof double xPos = _vector[counter - offset][X];
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (_vector.size() <= (unsigned)(counter - offset)) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (_vector[1][X] > 0) {
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński xPos = nearest_time(curve_it1->initialPoint(), pwd2_in);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof } else {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof xPos = 0;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (nodetype == NODE_CUSP) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof double vectorY = _vector[counter - offset][Y];
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (_vector.size() <= (unsigned)(counter - offset) || vectorY == 0) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof vectorY = 1;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof result.push_back(Point(xPos, vectorY));
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof } else {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (_vector[1][X] < 0) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof xPos = 0;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof result.push_back(Point(floor(xPos), 0));
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof ++curve_it1;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (curve_it2 != curve_endit) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof ++curve_it2;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof counter++;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof counterCurves++;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof counterPaths++;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof _vector = result;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof write_to_SVG();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof}
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofvoid FilletChamferPointArrayParam::recalculate_knots(
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Piecewise<D2<SBasis> > const &pwd2_in)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof{
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof bool change = false;
46a7e69c00cc4adb866f69f8d32cecb8944a4803Jabiertxof if(_vector.size() == 0){
46a7e69c00cc4adb866f69f8d32cecb8944a4803Jabiertxof return;
46a7e69c00cc4adb866f69f8d32cecb8944a4803Jabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof PathVector pathv = path_from_piecewise(pwd2_in, 0.001);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (!pathv.empty()) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof std::vector<Point> result;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof int counter = 0;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof int counterCurves = 0;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Geom::NodeType nodetype;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof for (PathVector::const_iterator path_it = pathv.begin();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof path_it != pathv.end(); ++path_it) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (path_it->empty()) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof counter++;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof continue;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
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 curve_endit = path_it->end_open();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof counterCurves = 0;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof while (curve_it1 != curve_endit) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof //if start a path get node type
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (counterCurves == 0) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (path_it->closed()) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (path_it->back_closed().isDegenerate()) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof nodetype = get_nodetype(path_it->back_open(), *curve_it1);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof } else {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof nodetype = get_nodetype(path_it->back_closed(), *curve_it1);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof } else {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof nodetype = NODE_NONE;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof } else {
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 if (this_is_line || next_is_line) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof nodetype = NODE_CUSP;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (nodetype == NODE_CUSP) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof double vectorY = _vector[counter][Y];
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (vectorY == 0) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof vectorY = 1;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof change = true;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof result.push_back(Point(_vector[counter][X], vectorY));
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof } else {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof double xPos = floor(_vector[counter][X]);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (_vector[1][X] < 0) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof xPos = 0;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof double vectorY = _vector[counter][Y];
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (vectorY != 0) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof change = true;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof result.push_back(Point(xPos, 0));
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof ++curve_it1;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof counter++;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (curve_it2 != curve_endit) {
60686db0a5208fa858942a7e9cf8318956dcd36eJabiertxof ++curve_it2;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof counterCurves++;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (change) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof _vector = result;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof write_to_SVG();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof}
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofvoid FilletChamferPointArrayParam::set_pwd2(
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Piecewise<D2<SBasis> > const &pwd2_in,
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Piecewise<D2<SBasis> > const &pwd2_normal_in)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof{
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof last_pwd2 = pwd2_in;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof last_pwd2_normal = pwd2_normal_in;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof}
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofvoid FilletChamferPointArrayParam::set_helper_size(int hs)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof{
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof helper_size = hs;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof}
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxofvoid FilletChamferPointArrayParam::set_chamfer_steps(int value_chamfer_steps)
3c024caadbaea502bc219bc7aed8fe925017096dJabiertxof{
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof chamfer_steps = value_chamfer_steps;
3c024caadbaea502bc219bc7aed8fe925017096dJabiertxof}
3c024caadbaea502bc219bc7aed8fe925017096dJabiertxof
af4ffc13725d197d363363e3396de870410a8556Jabiertxofvoid FilletChamferPointArrayParam::set_use_distance(bool use_knot_distance )
af4ffc13725d197d363363e3396de870410a8556Jabiertxof{
af4ffc13725d197d363363e3396de870410a8556Jabiertxof use_distance = use_knot_distance;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof}
af4ffc13725d197d363363e3396de870410a8556Jabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofvoid FilletChamferPointArrayParam::updateCanvasIndicators()
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof{
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof std::vector<Point> ts = data();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof hp.clear();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof unsigned int i = 0;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof for (std::vector<Point>::const_iterator point_it = ts.begin();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof point_it != ts.end(); ++point_it) {
225d46778e89db9e42c1f92d79638fd0163f67aaJabiertxof double Xvalue = to_time(i, (*point_it)[X]) -i;
225d46778e89db9e42c1f92d79638fd0163f67aaJabiertxof if (Xvalue == 0) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof i++;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof continue;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
225d46778e89db9e42c1f92d79638fd0163f67aaJabiertxof Geom::Point ptA = last_pwd2[i].valueAt(Xvalue);
225d46778e89db9e42c1f92d79638fd0163f67aaJabiertxof Geom::Point derivA = unit_vector(derivative(last_pwd2[i]).valueAt(Xvalue));
225d46778e89db9e42c1f92d79638fd0163f67aaJabiertxof Geom::Rotate rot(Geom::Rotate::from_degrees(-90));
225d46778e89db9e42c1f92d79638fd0163f67aaJabiertxof derivA = derivA * rot;
225d46778e89db9e42c1f92d79638fd0163f67aaJabiertxof Geom::Point C = ptA - derivA * helper_size;
225d46778e89db9e42c1f92d79638fd0163f67aaJabiertxof Geom::Point D = ptA + derivA * helper_size;
225d46778e89db9e42c1f92d79638fd0163f67aaJabiertxof Geom::Ray ray1(C, D);
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);
225d46778e89db9e42c1f92d79638fd0163f67aaJabiertxof Geom::Affine aff = Geom::Affine();
225d46778e89db9e42c1f92d79638fd0163f67aaJabiertxof aff *= Geom::Scale(helper_size);
a16a494f042310ee849a6f717ffea70846f1f22cKrzysztof Kosiński aff *= Geom::Rotate(ray1.angle() - rad_from_deg(270));
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński aff *= Geom::Translate(last_pwd2[i].valueAt(Xvalue));
225d46778e89db9e42c1f92d79638fd0163f67aaJabiertxof pathv *= aff;
225d46778e89db9e42c1f92d79638fd0163f67aaJabiertxof hp.push_back(pathv[0]);
225d46778e89db9e42c1f92d79638fd0163f67aaJabiertxof hp.push_back(pathv[1]);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof i++;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof}
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofvoid FilletChamferPointArrayParam::addCanvasIndicators(
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof SPLPEItem const */*lpeitem*/, std::vector<Geom::PathVector> &hp_vec)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof{
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof hp_vec.push_back(hp);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof}
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
af4ffc13725d197d363363e3396de870410a8556Jabiertxofdouble FilletChamferPointArrayParam::rad_to_len(int index, double rad)
af4ffc13725d197d363363e3396de870410a8556Jabiertxof{
af4ffc13725d197d363363e3396de870410a8556Jabiertxof double len = 0;
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 if(positions.second != 0){
af4ffc13725d197d363363e3396de870410a8556Jabiertxof A = last_pwd2[index-1];
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }else{
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if(!subpaths[positions.first].closed()){
af4ffc13725d197d363363e3396de870410a8556Jabiertxof return len;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof D2<SBasis> B = last_pwd2[index];
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];
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Geom::Crossings cs = Geom::crossings(p0, p1);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if(cs.size() > 0){
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Point cp =p0(cs[0].ta);
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński double p0pt = nearest_time(cp, B);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof len = time_to_len(index,p0pt);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof } else {
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if(rad < 0){
af4ffc13725d197d363363e3396de870410a8556Jabiertxof len = rad_to_len(index, rad * -1);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof return len;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof}
af4ffc13725d197d363363e3396de870410a8556Jabiertxof
af4ffc13725d197d363363e3396de870410a8556Jabiertxofdouble FilletChamferPointArrayParam::len_to_rad(int index, double len)
af4ffc13725d197d363363e3396de870410a8556Jabiertxof{
af4ffc13725d197d363363e3396de870410a8556Jabiertxof double rad = 0;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof double tmp_len = _vector[index][X];
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 Piecewise<D2<SBasis> > u;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof u.push_cut(0);
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 std::vector<double> times;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if(positions.second != 0){
af4ffc13725d197d363363e3396de870410a8556Jabiertxof A = subpaths[positions.first][positions.second-1].duplicate();
af4ffc13725d197d363363e3396de870410a8556Jabiertxof times = get_times(index-1, subpaths, false);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }else{
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if(!subpaths[positions.first].closed()){
af4ffc13725d197d363363e3396de870410a8556Jabiertxof return rad;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof times = get_times(last_index(index, subpaths), subpaths, true);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
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]);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Curve *knotCurve2 = B->portion(times[2], 1);
b1b352ba8dc52b86acfbf68071a62dfb9a9792c3Kris De Gussem Geom::CubicBezier const *cubic1 = dynamic_cast<Geom::CubicBezier const *>(knotCurve1);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Ray ray1(startArcPoint, A->finalPoint());
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if (cubic1) {
af4ffc13725d197d363363e3396de870410a8556Jabiertxof ray1.setPoints((*cubic1)[2], startArcPoint);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
b1b352ba8dc52b86acfbf68071a62dfb9a9792c3Kris De Gussem Geom::CubicBezier const *cubic2 = dynamic_cast<Geom::CubicBezier const *>(knotCurve2);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Ray ray2(B->initialPoint(), endArcPoint);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if (cubic2) {
af4ffc13725d197d363363e3396de870410a8556Jabiertxof ray2.setPoints(endArcPoint, (*cubic2)[1]);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
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);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof rad = distanceArc/sin(angleBetween/2.0);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof return rad * -1;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof}
af4ffc13725d197d363363e3396de870410a8556Jabiertxof
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosińskistd::vector<double> FilletChamferPointArrayParam::get_times(int index, Geom::PathVector subpaths, bool last)
af4ffc13725d197d363363e3396de870410a8556Jabiertxof{
af4ffc13725d197d363363e3396de870410a8556Jabiertxof const double tolerance = 0.001;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof const double gapHelper = 0.00001;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof std::pair<std::size_t, std::size_t> positions = get_positions(index, subpaths);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Curve *curve_it1;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof curve_it1 = subpaths[positions.first][positions.second].duplicate();
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Coord it1_length = (*curve_it1).length(tolerance);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof double time_it1, time_it2, time_it1_B, intpart;
f004ac29761c676717432894a59410554019b797Jon A. Cruz if (static_cast<int>(_vector.size()) <= index){
d189272b9cf42f45747fca926ffe49b541492b11Jabiertxof std::vector<double> out;
d189272b9cf42f45747fca926ffe49b541492b11Jabiertxof out.push_back(0);
d189272b9cf42f45747fca926ffe49b541492b11Jabiertxof out.push_back(1);
d189272b9cf42f45747fca926ffe49b541492b11Jabiertxof out.push_back(0);
d189272b9cf42f45747fca926ffe49b541492b11Jabiertxof return out;
d189272b9cf42f45747fca926ffe49b541492b11Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof time_it1 = modf(to_time(index, _vector[index][X]), &intpart);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if (_vector[index][Y] == 0) {
af4ffc13725d197d363363e3396de870410a8556Jabiertxof time_it1 = 0;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof double resultLenght = 0;
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 = 0;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof resultLenght = 0;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof } else {
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 }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if (resultLenght > 0 && time_it2 != 0) {
af4ffc13725d197d363363e3396de870410a8556Jabiertxof time_it1_B = modf(to_time(index, -resultLenght), &intpart);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof } else {
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if (time_it2 == 0) {
af4ffc13725d197d363363e3396de870410a8556Jabiertxof time_it1_B = 1;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof } else {
af4ffc13725d197d363363e3396de870410a8556Jabiertxof time_it1_B = gapHelper;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof
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)) {
af4ffc13725d197d363363e3396de870410a8556Jabiertxof time_it1_B = 1;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof time_it2 = 0;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if (time_it1_B < time_it1) {
af4ffc13725d197d363363e3396de870410a8556Jabiertxof time_it1_B = time_it1 + gapHelper;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof std::vector<double> out;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof out.push_back(time_it1);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof out.push_back(time_it1_B);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof out.push_back(time_it2);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof return out;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof}
af4ffc13725d197d363363e3396de870410a8556Jabiertxof
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosińskistd::pair<std::size_t, std::size_t> FilletChamferPointArrayParam::get_positions(int index, Geom::PathVector subpaths)
af4ffc13725d197d363363e3396de870410a8556Jabiertxof{
af4ffc13725d197d363363e3396de870410a8556Jabiertxof int counter = -1;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof std::size_t first = 0;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof std::size_t second = 0;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof for (PathVector::const_iterator path_it = subpaths.begin(); path_it != subpaths.end(); ++path_it) {
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if (path_it->empty())
af4ffc13725d197d363363e3396de870410a8556Jabiertxof continue;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Geom::Path::const_iterator curve_it1 = path_it->begin();
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Geom::Path::const_iterator curve_endit = path_it->end_default();
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if (path_it->closed()) {
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 curve_endit = path_it->end_open();
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof first++;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof second = 0;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof while (curve_it1 != curve_endit) {
af4ffc13725d197d363363e3396de870410a8556Jabiertxof counter++;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof second++;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if(counter == index){
af4ffc13725d197d363363e3396de870410a8556Jabiertxof break;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof ++curve_it1;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if(counter == index){
af4ffc13725d197d363363e3396de870410a8556Jabiertxof break;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof first--;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof second--;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof std::pair<std::size_t, std::size_t> out(first, second);
af4ffc13725d197d363363e3396de870410a8556Jabiertxof return out;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof}
af4ffc13725d197d363363e3396de870410a8556Jabiertxof
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosińskiint FilletChamferPointArrayParam::last_index(int index, Geom::PathVector subpaths)
af4ffc13725d197d363363e3396de870410a8556Jabiertxof{
af4ffc13725d197d363363e3396de870410a8556Jabiertxof int counter = -1;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof bool inSubpath = false;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof for (PathVector::const_iterator path_it = subpaths.begin(); path_it != subpaths.end(); ++path_it) {
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if (path_it->empty())
af4ffc13725d197d363363e3396de870410a8556Jabiertxof continue;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Geom::Path::const_iterator curve_it1 = path_it->begin();
af4ffc13725d197d363363e3396de870410a8556Jabiertxof Geom::Path::const_iterator curve_endit = path_it->end_default();
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if (path_it->closed()) {
af4ffc13725d197d363363e3396de870410a8556Jabiertxof const Geom::Curve &closingline = path_it->back_closed();
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if (are_near(closingline.initialPoint(), closingline.finalPoint())) {
af4ffc13725d197d363363e3396de870410a8556Jabiertxof curve_endit = path_it->end_open();
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof while (curve_it1 != curve_endit) {
af4ffc13725d197d363363e3396de870410a8556Jabiertxof counter++;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if(counter == index){
af4ffc13725d197d363363e3396de870410a8556Jabiertxof inSubpath = true;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof ++curve_it1;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if(inSubpath){
af4ffc13725d197d363363e3396de870410a8556Jabiertxof break;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if(!inSubpath){
af4ffc13725d197d363363e3396de870410a8556Jabiertxof counter = -1;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof return counter;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof}
af4ffc13725d197d363363e3396de870410a8556Jabiertxof
af4ffc13725d197d363363e3396de870410a8556Jabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofdouble FilletChamferPointArrayParam::len_to_time(int index, double len)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof{
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof double t = 0;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (last_pwd2.size() > (unsigned) index) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (len != 0) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (last_pwd2[index][0].degreesOfFreedom() != 2) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Piecewise<D2<SBasis> > u;
af4ffc13725d197d363363e3396de870410a8556Jabiertxof u.push_cut(0);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof u.push(last_pwd2[index], 1);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof std::vector<double> t_roots = roots(arcLengthSb(u) - std::abs(len));
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (t_roots.size() > 0) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof t = t_roots[0];
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof } else {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof double lenghtPart = 0;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (last_pwd2.size() > (unsigned) index) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof lenghtPart = length(last_pwd2[index], EPSILON);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (std::abs(len) < lenghtPart && lenghtPart != 0) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof t = std::abs(len) / lenghtPart;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof t = double(index) + t;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof } else {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof t = double(last_pwd2.size() - 1);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof return t;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof}
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofdouble FilletChamferPointArrayParam::time_to_len(int index, double time)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof{
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof double intpart;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof double len = 0;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof time = modf(time, &intpart);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof double lenghtPart = 0;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (last_pwd2.size() <= (unsigned) index || time == 0) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof return len;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (last_pwd2[index][0].degreesOfFreedom() != 2) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Piecewise<D2<SBasis> > u;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof u.push_cut(0);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof u.push(last_pwd2[index], 1);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof u = portion(u, 0, time);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof return length(u, 0.001) * -1;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof lenghtPart = length(last_pwd2[index], EPSILON);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof return (time * lenghtPart) * -1;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof}
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofdouble FilletChamferPointArrayParam::to_time(int index, double A)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof{
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (A > 0) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof return A;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof } else {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof return len_to_time(index, A);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof}
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofdouble FilletChamferPointArrayParam::to_len(int index, double A)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof{
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (A > 0) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof return time_to_len(index, A);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof } else {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof return A;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof}
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofvoid FilletChamferPointArrayParam::set_oncanvas_looks(SPKnotShapeType shape,
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof SPKnotModeType mode,
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof guint32 color)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof{
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof knot_shape = shape;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof knot_mode = mode;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof knot_color = color;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof}
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofFilletChamferPointArrayParamKnotHolderEntity::
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofFilletChamferPointArrayParamKnotHolderEntity(
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof FilletChamferPointArrayParam *p, unsigned int index)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof : _pparam(p), _index(index) {}
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofvoid FilletChamferPointArrayParamKnotHolderEntity::knot_set(Point const &p,
93cce75c515069567a34a17f5f75a9742881695dJon A. Cruz Point const &/*origin*/,
afe3b94c9da473ea1e7632e7853dd7dee528d194Jabiertxof guint state)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof{
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof using namespace Geom;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (!valid_index(_index)) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof return;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
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);
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński t = nearest_time(s, pwd2[_index]);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (t == 1) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof t = 0.9999;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof t += _index;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (_pparam->_vector.at(_index)[X] <= 0) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof _pparam->_vector.at(_index) =
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Point(_pparam->time_to_len(_index, t), _pparam->_vector.at(_index)[Y]);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof } else {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof _pparam->_vector.at(_index) = Point(t, _pparam->_vector.at(_index)[Y]);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof sp_lpe_item_update_patheffect(SP_LPE_ITEM(item), false, false);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof}
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofPoint FilletChamferPointArrayParamKnotHolderEntity::knot_get() const
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof{
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof using namespace Geom;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (!valid_index(_index)) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof return Point(infinity(), infinity());
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Piecewise<D2<SBasis> > const &pwd2 = _pparam->get_pwd2();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof double time_it = _pparam->to_time(_index, _pparam->_vector.at(_index)[X]);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Point canvas_point = pwd2.valueAt(time_it);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof _pparam->updateCanvasIndicators();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof return canvas_point;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof}
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofvoid FilletChamferPointArrayParamKnotHolderEntity::knot_click(guint state)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof{
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (state & GDK_CONTROL_MASK) {
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof if (state & GDK_MOD1_MASK) {
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 }else{
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof using namespace Geom;
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof int type = (int)_pparam->_vector.at(_index)[Y];
afe3b94c9da473ea1e7632e7853dd7dee528d194Jabiertxof if (type >=3000 && type < 4000){
afe3b94c9da473ea1e7632e7853dd7dee528d194Jabiertxof type = 3;
afe3b94c9da473ea1e7632e7853dd7dee528d194Jabiertxof }
afe3b94c9da473ea1e7632e7853dd7dee528d194Jabiertxof if (type >=4000 && type < 5000){
afe3b94c9da473ea1e7632e7853dd7dee528d194Jabiertxof type = 4;
afe3b94c9da473ea1e7632e7853dd7dee528d194Jabiertxof }
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof switch(type){
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof case 1:
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof type = 2;
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof break;
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof case 2:
afe3b94c9da473ea1e7632e7853dd7dee528d194Jabiertxof type = _pparam->chamfer_steps + 3000;
afe3b94c9da473ea1e7632e7853dd7dee528d194Jabiertxof break;
afe3b94c9da473ea1e7632e7853dd7dee528d194Jabiertxof case 3:
afe3b94c9da473ea1e7632e7853dd7dee528d194Jabiertxof type = _pparam->chamfer_steps + 4000;
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof break;
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof default:
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof type = 1;
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof break;
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof }
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);
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof const gchar *tip;
afe3b94c9da473ea1e7632e7853dd7dee528d194Jabiertxof if (type >=3000 && type < 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 (type >=4000 && type < 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");
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof } else if (type == 2) {
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");
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof } else {
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");
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof }
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof this->knot->tip = g_strdup(tip);
9a7cf8a6ac9fa1ea8f7d3bbee0f5ae6fd91b570bJabiertxof this->knot->show();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof } else if (state & GDK_SHIFT_MASK) {
af4ffc13725d197d363363e3396de870410a8556Jabiertxof double xModified = _pparam->_vector.at(_index).x();
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if(xModified < 0 && !_pparam->use_distance){
af4ffc13725d197d363363e3396de870410a8556Jabiertxof xModified = _pparam->len_to_rad(_index, _pparam->_vector.at(_index).x());
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
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 if(positions.second != 0){
af4ffc13725d197d363363e3396de870410a8556Jabiertxof A = _pparam->last_pwd2[_index-1];
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof D2<SBasis> B = _pparam->last_pwd2[_index];
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);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof}
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofvoid FilletChamferPointArrayParamKnotHolderEntity::knot_set_offset(
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Geom::Point offset)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof{
af4ffc13725d197d363363e3396de870410a8556Jabiertxof double xModified = offset.x();
af4ffc13725d197d363363e3396de870410a8556Jabiertxof if(xModified < 0 && !_pparam->use_distance){
af4ffc13725d197d363363e3396de870410a8556Jabiertxof xModified = _pparam->rad_to_len(_index, offset.x());
af4ffc13725d197d363363e3396de870410a8556Jabiertxof }
af4ffc13725d197d363363e3396de870410a8556Jabiertxof _pparam->_vector.at(_index) = Geom::Point(xModified, offset.y());
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof this->parent_holder->knot_ungrabbed_handler(this->knot, 0);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof}
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxofvoid FilletChamferPointArrayParam::addKnotHolderEntities(KnotHolder *knotholder,
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof SPDesktop *desktop,
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof SPItem *item)
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof{
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof recalculate_knots(get_pwd2());
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof for (unsigned int i = 0; i < _vector.size(); ++i) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (_vector[i][Y] <= 0) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof continue;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof const gchar *tip;
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");
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof } else if (_vector[i][Y] == 2) {
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");
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof } else {
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 }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof FilletChamferPointArrayParamKnotHolderEntity *e =
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof new FilletChamferPointArrayParamKnotHolderEntity(this, i);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof e->create(desktop, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN, _(tip),
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof knot_shape, knot_mode, knot_color);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof knotholder->add(e);
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof }
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof updateCanvasIndicators();
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof}
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof} /* namespace LivePathEffect */
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof} /* namespace Inkscape */
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof/*
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof Local Variables:
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof mode:c++
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 End:
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof*/
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :