summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJabier Arraiza Cenoz <jabier.arraiza@marker.es>2015-08-02 11:33:58 +0000
committerJabiertxof <jtx@jtx.marker.es>2015-08-02 11:33:58 +0000
commit19f8cf337ab1ceed9c654bb48b210fd9b391fcc8 (patch)
treedc7da4b2cfc86f704ec21a697f638a6e9ae24302 /src
parentFixed some typos in bsector and bspline (diff)
downloadinkscape-19f8cf337ab1ceed9c654bb48b210fd9b391fcc8.tar.gz
inkscape-19f8cf337ab1ceed9c654bb48b210fd9b391fcc8.zip
Added point parameter
(bzr r14272.1.1)
Diffstat (limited to 'src')
-rw-r--r--src/live_effects/lpe-bendpath.cpp43
-rw-r--r--src/live_effects/lpe-bendpath.h14
-rw-r--r--src/live_effects/lpe-patternalongpath.cpp56
-rw-r--r--src/live_effects/lpe-patternalongpath.h12
4 files changed, 118 insertions, 7 deletions
diff --git a/src/live_effects/lpe-bendpath.cpp b/src/live_effects/lpe-bendpath.cpp
index 33171b184..364c77ccb 100644
--- a/src/live_effects/lpe-bendpath.cpp
+++ b/src/live_effects/lpe-bendpath.cpp
@@ -48,17 +48,23 @@ first) but I think we can first forget about them.
namespace Inkscape {
namespace LivePathEffect {
+
LPEBendPath::LPEBendPath(LivePathEffectObject *lpeobject) :
Effect(lpeobject),
bend_path(_("Bend path:"), _("Path along which to bend the original path"), "bendpath", &wr, this, "M0,0 L1,0"),
prop_scale(_("_Width:"), _("Width of the path"), "prop_scale", &wr, this, 1),
scale_y_rel(_("W_idth in units of length"), _("Scale the width of the path in units of its length"), "scale_y_rel", &wr, this, false),
- vertical_pattern(_("_Original path is vertical"), _("Rotates the original 90 degrees, before bending it along the bend path"), "vertical", &wr, this, false)
+ vertical_pattern(_("_Original path is vertical"), _("Rotates the original 90 degrees, before bending it along the bend path"), "vertical", &wr, this, false),
+ width(_("Width distance"), _("Change the width of bend path - <b>Ctrl+Alt+Click</b>: reset"), "width", &wr, this),
+ height(0),
+ original_height(0),
+ prop_scale_previous(1)
{
registerParameter( dynamic_cast<Parameter *>(&bend_path) );
registerParameter( dynamic_cast<Parameter *>(&prop_scale) );
registerParameter( dynamic_cast<Parameter *>(&scale_y_rel) );
registerParameter( dynamic_cast<Parameter *>(&vertical_pattern) );
+ registerParameter( dynamic_cast<Parameter *>(&width) );
prop_scale.param_set_digits(3);
prop_scale.param_set_increments(0.01, 0.10);
@@ -74,8 +80,38 @@ LPEBendPath::~LPEBendPath()
void
LPEBendPath::doBeforeEffect (SPLPEItem const* lpeitem)
{
+ hp.clear();
// get the item bounding box
original_bbox(lpeitem);
+ original_height = boundingbox_Y.max() - boundingbox_Y.min();
+ bool prop_scale_modified = false;
+
+ Geom::Path path_in = bend_path.get_pathvector().pathAt(Geom::PathVectorTime(0, 0, 0.0));
+ Geom::Point ptA = path_in.pointAt(Geom::PathTime(0, 0.0));
+ Geom::Point B = path_in.pointAt(Geom::PathTime(1, 0.0));
+ Geom::Curve const *first_curve = &path_in.curveAt(Geom::PathTime(0, 0.0));
+ Geom::CubicBezier const *cubic = dynamic_cast<Geom::CubicBezier const *>(&*first_curve);
+ Geom::Ray ray(ptA, B);
+ if (cubic) {
+ ray.setPoints((*cubic)[1], ptA);
+ }
+ if(height == 0){
+ height = original_height;
+ width.param_setValue(Geom::Point::polar(ray.angle() + Geom::deg_to_rad(90), (original_height/2.0)) + ptA);
+ }
+ if( prop_scale_previous != prop_scale ){
+ prop_scale_modified = true;
+ }
+ if(!prop_scale_modified){
+ prop_scale.param_set_value(height/original_height);
+ }
+ height = Geom::distance(width,ptA) * 2;
+ width.param_setValue(Geom::Point::polar(ray.angle() + Geom::deg_to_rad(90), ((original_height*prop_scale)/2.0)) + ptA);
+ width.param_update_default(Geom::Point::polar(ray.angle() + Geom::deg_to_rad(90), (original_height/2.0)) + ptA);
+ prop_scale_previous = prop_scale;
+ Geom::Path hp_path(width);
+ hp_path.appendNew<Geom::LineSegment>(ptA);
+ hp.push_back(hp_path);
SPLPEItem * item = const_cast<SPLPEItem*>(lpeitem);
item->apply_to_clippath(item);
item->apply_to_mask(item);
@@ -148,6 +184,11 @@ LPEBendPath::resetDefaults(SPItem const* item)
bend_path.set_new_value( path.toPwSb(), true );
}
+void
+LPEBendPath::addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector<Geom::PathVector> &hp_vec)
+{
+ hp_vec.push_back(hp);
+}
} // namespace LivePathEffect
} /* namespace Inkscape */
diff --git a/src/live_effects/lpe-bendpath.h b/src/live_effects/lpe-bendpath.h
index 16b8c6137..6394ce07e 100644
--- a/src/live_effects/lpe-bendpath.h
+++ b/src/live_effects/lpe-bendpath.h
@@ -14,6 +14,7 @@
#include "live_effects/effect.h"
#include "live_effects/parameter/path.h"
#include "live_effects/parameter/bool.h"
+#include "live_effects/parameter/point.h"
#include <2geom/sbasis.h>
#include <2geom/sbasis-geometric.h>
@@ -27,6 +28,7 @@
namespace Inkscape {
namespace LivePathEffect {
+
//for Bend path on group : we need information concerning the group Bounding box
class LPEBendPath : public Effect, GroupBBoxEffect {
public:
@@ -39,15 +41,21 @@ public:
virtual void resetDefaults(SPItem const* item);
+ void addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector<Geom::PathVector> &hp_vec);
private:
- PathParam bend_path;
- ScalarParam prop_scale;
+ PathParam bend_path;
+ ScalarParam prop_scale;
BoolParam scale_y_rel;
- BoolParam vertical_pattern;
+ BoolParam vertical_pattern;
+ PointParam width;
+ double height;
+ double original_height;
+ double prop_scale_previous;
Geom::Piecewise<Geom::D2<Geom::SBasis> > uskeleton;
Geom::Piecewise<Geom::D2<Geom::SBasis> > n;
+ Geom::PathVector hp;
void on_pattern_pasted();
diff --git a/src/live_effects/lpe-patternalongpath.cpp b/src/live_effects/lpe-patternalongpath.cpp
index ed65a0d50..5215f94ec 100644
--- a/src/live_effects/lpe-patternalongpath.cpp
+++ b/src/live_effects/lpe-patternalongpath.cpp
@@ -75,7 +75,11 @@ LPEPatternAlongPath::LPEPatternAlongPath(LivePathEffectObject *lpeobject) :
vertical_pattern(_("Pattern is _vertical"), _("Rotate pattern 90 deg before applying"),
"vertical_pattern", &wr, this, false),
fuse_tolerance(_("_Fuse nearby ends:"), _("Fuse ends closer than this number. 0 means don't fuse."),
- "fuse_tolerance", &wr, this, 0)
+ "fuse_tolerance", &wr, this, 0),
+ width(_("Width distance"), _("Change the width of pattern path - <b>Ctrl+Alt+Click</b>: reset"), "width", &wr, this),
+ height(0),
+ original_height(0),
+ prop_scale_previous(1)
{
registerParameter( dynamic_cast<Parameter *>(&pattern) );
registerParameter( dynamic_cast<Parameter *>(&copytype) );
@@ -87,7 +91,7 @@ LPEPatternAlongPath::LPEPatternAlongPath(LivePathEffectObject *lpeobject) :
registerParameter( dynamic_cast<Parameter *>(&prop_units) );
registerParameter( dynamic_cast<Parameter *>(&vertical_pattern) );
registerParameter( dynamic_cast<Parameter *>(&fuse_tolerance) );
-
+ registerParameter( dynamic_cast<Parameter *>(&width) );
prop_scale.param_set_digits(3);
prop_scale.param_set_increments(0.01, 0.10);
}
@@ -97,6 +101,48 @@ LPEPatternAlongPath::~LPEPatternAlongPath()
}
+void
+LPEPatternAlongPath::doBeforeEffect (SPLPEItem const* lpeitem)
+{
+ hp.clear();
+ // get the pattern bounding box
+ Geom::OptRect bbox = pattern.get_pathvector().boundsFast();
+ if (bbox) {
+ original_height = (*bbox)[Geom::Y].max() - (*bbox)[Geom::Y].min();
+ bool prop_scale_modified = false;
+ SPShape const *sp_shape = dynamic_cast<SPShape const *>(lpeitem);
+ if (sp_shape) {
+ Geom::Path const *path_in = sp_shape->getCurveBeforeLPE()->first_path();
+ Geom::Point ptA = path_in->pointAt(Geom::PathTime(0, 0.0));
+ Geom::Point B = path_in->pointAt(Geom::PathTime(1, 0.0));
+ Geom::Curve const *first_curve = &path_in->curveAt(Geom::PathTime(0, 0.0));
+ Geom::CubicBezier const *cubic = dynamic_cast<Geom::CubicBezier const *>(&*first_curve);
+ Geom::Ray ray(ptA, B);
+ if (cubic) {
+ ray.setPoints((*cubic)[1], ptA);
+ }
+ if(height == 0){
+ height = original_height;
+ width.param_setValue(Geom::Point::polar(ray.angle() + Geom::deg_to_rad(90), (original_height/2.0)) + ptA);
+ prop_scale.param_set_value(1);
+ }
+ if( prop_scale_previous != prop_scale ){
+ prop_scale_modified = true;
+ }
+ height = Geom::distance(width,ptA) * 2;
+ if(!prop_scale_modified){
+ prop_scale.param_set_value(height/original_height);
+ }
+ width.param_setValue(Geom::Point::polar(ray.angle() + Geom::deg_to_rad(90), ((original_height*prop_scale)/2.0)) + ptA);
+ width.param_update_default(Geom::Point::polar(ray.angle() + Geom::deg_to_rad(90), (original_height/2.0)) + ptA);
+ prop_scale_previous = prop_scale;
+ Geom::Path hp_path(width);
+ hp_path.appendNew<Geom::LineSegment>(ptA);
+ hp.push_back(hp_path);
+ }
+ }
+}
+
Geom::Piecewise<Geom::D2<Geom::SBasis> >
LPEPatternAlongPath::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwd2_in)
{
@@ -238,6 +284,12 @@ LPEPatternAlongPath::transform_multiply(Geom::Affine const& postmul, bool set)
}
}
+void
+LPEPatternAlongPath::addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector<Geom::PathVector> &hp_vec)
+{
+ hp_vec.push_back(hp);
+}
+
} // namespace LivePathEffect
} /* namespace Inkscape */
diff --git a/src/live_effects/lpe-patternalongpath.h b/src/live_effects/lpe-patternalongpath.h
index be2197ddb..440c56548 100644
--- a/src/live_effects/lpe-patternalongpath.h
+++ b/src/live_effects/lpe-patternalongpath.h
@@ -13,6 +13,7 @@
#include "live_effects/effect.h"
#include "live_effects/parameter/path.h"
#include "live_effects/parameter/bool.h"
+#include "live_effects/parameter/point.h"
namespace Inkscape {
namespace LivePathEffect {
@@ -30,10 +31,15 @@ public:
LPEPatternAlongPath(LivePathEffectObject *lpeobject);
virtual ~LPEPatternAlongPath();
+ virtual void doBeforeEffect (SPLPEItem const* lpeitem);
+
virtual Geom::Piecewise<Geom::D2<Geom::SBasis> > doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwd2_in);
virtual void transform_multiply(Geom::Affine const& postmul, bool set);
+ void addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector<Geom::PathVector> &hp_vec);
+
+
PathParam pattern;
private:
EnumParam<PAPCopyType> copytype;
@@ -45,7 +51,11 @@ private:
BoolParam prop_units;
BoolParam vertical_pattern;
ScalarParam fuse_tolerance;
-
+ PointParam width;
+ double height;
+ double original_height;
+ double prop_scale_previous;
+ Geom::PathVector hp;
void on_pattern_pasted();
LPEPatternAlongPath(const LPEPatternAlongPath&);