summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJabier Arraiza Cenoz <jabier.arraiza@marker.es>2014-09-29 01:35:12 +0000
committerJabiertxof <jtx@jtx.marker.es>2014-09-29 01:35:12 +0000
commit241347e25e559460b985f944bbcb2b5c9c910c86 (patch)
tree24d5fdfdeb89f5bb3004da01a5c4d50b70c35c0f /src
parentFix bug in object dialog, in highlight color couldent select opacity, now fixed (diff)
downloadinkscape-241347e25e559460b985f944bbcb2b5c9c910c86.tar.gz
inkscape-241347e25e559460b985f944bbcb2b5c9c910c86.zip
Fillet-Chamfer update. Two things.
Helper paths on knots: now work well in rect and curves Method: Now the method ase selectable. Three methods: Auto: Straight lines whith arcs and curves whith bezier Arc: Always use arc. Bezier: Always use bezier. (bzr r13341.1.225)
Diffstat (limited to 'src')
-rw-r--r--src/live_effects/lpe-fillet-chamfer.cpp16
-rw-r--r--src/live_effects/lpe-fillet-chamfer.h8
-rw-r--r--src/live_effects/parameter/filletchamferpointarray.cpp37
3 files changed, 37 insertions, 24 deletions
diff --git a/src/live_effects/lpe-fillet-chamfer.cpp b/src/live_effects/lpe-fillet-chamfer.cpp
index 0ad21a284..4e7d62ff5 100644
--- a/src/live_effects/lpe-fillet-chamfer.cpp
+++ b/src/live_effects/lpe-fillet-chamfer.cpp
@@ -42,6 +42,14 @@ using namespace Geom;
namespace Inkscape {
namespace LivePathEffect {
+static const Util::EnumData<FilletMethod> FilletMethodData[FM_END] = {
+ { FM_AUTO, N_("Auto"), "auto" },
+ { FM_ARC, N_("Force arc"), "arc" },
+ { FM_BEZIER, N_("Force bezier"), "bezier" }
+};
+static const Util::EnumDataConverter<FilletMethod>
+FMConverter(FilletMethodData, FM_END);
+
const double tolerance = 0.001;
const double gapHelper = 0.00001;
@@ -52,14 +60,15 @@ LPEFilletChamfer::LPEFilletChamfer(LivePathEffectObject *lpeobject) :
ignore_radius_0(_("Ignore 0 radius knots"), _("Ignore 0 radius knots"), "ignore_radius_0", &wr, this, false),
only_selected(_("Change only selected nodes"), _("Change only selected nodes"), "only_selected", &wr, this, false),
flexible(_("Flexible radius size (%)"), _("Flexible radius size (%)"), "flexible", &wr, this, false),
- force_arcs(_("Use arcs in cubic curves"), _("Use arcs in cubic curves"), "force_arcs", &wr, this, false),
use_knot_distance(_("Use knots distance instead radius"), _("Use knots distance instead radius"), "use_knot_distance", &wr, this, false),
unit(_("Unit"), _("Unit"), "unit", &wr, this),
+ method(_("Method"), _("Fillets methods"), "method", FMConverter, &wr, this, FM_AUTO),
radius(_("Radius (unit or %)"), _("Radius, in unit or %"), "radius", &wr, this, 0.),
helper_size(_("Helper size with direction"), _("Helper size with direction"), "helper_size", &wr, this, 0)
{
registerParameter(&fillet_chamfer_values);
registerParameter(&unit);
+ registerParameter(&method);
registerParameter(&radius);
registerParameter(&helper_size);
registerParameter(&flexible);
@@ -67,7 +76,6 @@ LPEFilletChamfer::LPEFilletChamfer(LivePathEffectObject *lpeobject) :
registerParameter(&ignore_radius_0);
registerParameter(&only_selected);
registerParameter(&hide_knots);
- registerParameter(&force_arcs);
radius.param_set_range(0., infinity());
radius.param_set_increments(1, 1);
@@ -591,14 +599,14 @@ LPEFilletChamfer::doEffect_path(std::vector<Geom::Path> const &path_in)
}
path_out.appendNew<Geom::LineSegment>(endArcPoint);
} else if (type == 2) {
- if((is_straight_curve(*curve_it1) && is_straight_curve(*curve_it2Fixed)) || force_arcs){
+ if((is_straight_curve(*curve_it1) && is_straight_curve(*curve_it2Fixed) && method != FM_BEZIER )|| method == FM_ARC){
ccwToggle = ccwToggle?0:1;
path_out.appendNew<SVGEllipticalArc>(rx, ry, angleArc, 0, ccwToggle, endArcPoint);
}else{
path_out.appendNew<Geom::CubicBezier>(inverseHandle1, inverseHandle2, endArcPoint);
}
} else {
- if((is_straight_curve(*curve_it1) && is_straight_curve(*curve_it2Fixed)) || force_arcs){
+ if((is_straight_curve(*curve_it1) && is_straight_curve(*curve_it2Fixed) && method != FM_BEZIER )|| method == FM_ARC){
path_out.appendNew<SVGEllipticalArc>(rx, ry, angleArc, 0, ccwToggle, endArcPoint);
} else {
path_out.appendNew<Geom::CubicBezier>(handle1, handle2, endArcPoint);
diff --git a/src/live_effects/lpe-fillet-chamfer.h b/src/live_effects/lpe-fillet-chamfer.h
index 49b407b71..873684101 100644
--- a/src/live_effects/lpe-fillet-chamfer.h
+++ b/src/live_effects/lpe-fillet-chamfer.h
@@ -33,6 +33,12 @@
namespace Inkscape {
namespace LivePathEffect {
+enum FilletMethod {
+ FM_AUTO,
+ FM_ARC,
+ FM_BEZIER,
+ FM_END
+};
class LPEFilletChamfer : public Effect {
public:
@@ -67,9 +73,9 @@ private:
BoolParam ignore_radius_0;
BoolParam only_selected;
BoolParam flexible;
- BoolParam force_arcs;
BoolParam use_knot_distance;
UnitParam unit;
+ EnumParam<FilletMethod> method;
ScalarParam radius;
ScalarParam helper_size;
diff --git a/src/live_effects/parameter/filletchamferpointarray.cpp b/src/live_effects/parameter/filletchamferpointarray.cpp
index bb00ef045..e2b1aba61 100644
--- a/src/live_effects/parameter/filletchamferpointarray.cpp
+++ b/src/live_effects/parameter/filletchamferpointarray.cpp
@@ -8,11 +8,6 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <glibmm.h>
-
-#include "ui/dialog/lpe-fillet-chamfer-properties.h"
-#include "live_effects/parameter/filletchamferpointarray.h"
-
#include <2geom/piecewise.h>
#include <2geom/sbasis-to-bezier.h>
#include <2geom/sbasis-geometric.h>
@@ -384,25 +379,29 @@ void FilletChamferPointArrayParam::updateCanvasIndicators()
std::vector<Point> ts = data();
hp.clear();
unsigned int i = 0;
- Piecewise<D2<SBasis> > const &n = get_pwd2_normal();
for (std::vector<Point>::const_iterator point_it = ts.begin();
point_it != ts.end(); ++point_it) {
- double Xvalue = to_time(i, (*point_it)[X]);
- double XPlusValue = to_time(i, -helper_size) - i;
- if (Xvalue == i) {
+ double Xvalue = to_time(i, (*point_it)[X]) -i;
+ if (Xvalue == 0) {
i++;
continue;
}
- Point canvas_point = last_pwd2.valueAt(Xvalue) + 0 * n.valueAt(Xvalue);
- Point start_point = last_pwd2.valueAt(Xvalue + XPlusValue) +
- helper_size * n.valueAt(Xvalue + XPlusValue);
- Point end_point = last_pwd2.valueAt(Xvalue + XPlusValue) -
- helper_size * n.valueAt(Xvalue + XPlusValue);
- Geom::Path arrow;
- arrow.start(start_point);
- arrow.appendNew<Geom::LineSegment>(canvas_point);
- arrow.appendNew<Geom::LineSegment>(end_point);
- hp.push_back(arrow);
+ Geom::Point ptA = last_pwd2[i].valueAt(Xvalue);
+ Geom::Point derivA = unit_vector(derivative(last_pwd2[i]).valueAt(Xvalue));
+ Geom::Rotate rot(Geom::Rotate::from_degrees(-90));
+ derivA = derivA * rot;
+ Geom::Point C = ptA - derivA * helper_size;
+ Geom::Point D = ptA + derivA * helper_size;
+ Geom::Ray ray1(C, D);
+ char const * svgd = "M 1,0.25 0.5,0 1,-0.25 M 1,0.5 0,0 1,-0.5";
+ Geom::PathVector pathv = sp_svg_read_pathv(svgd);
+ Geom::Affine aff = Geom::Affine();
+ aff *= Geom::Scale(helper_size);
+ aff *= Geom::Rotate(ray1.angle() - deg_to_rad(270));
+ pathv *= aff;
+ pathv += last_pwd2[i].valueAt(Xvalue);
+ hp.push_back(pathv[0]);
+ hp.push_back(pathv[1]);
i++;
}
}