f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm/*
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * Copyright (C) Johan Engelen 2007 <j.b.c.engelen@utwente.nl>
9dc68827cbd515262ecb8d5ae8547d9e82c72e00Jon A. Cruz * Abhishek Sharma
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm *
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * Released under GNU GPL, read the file 'COPYING' for more information
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm */
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
799f674d1756b6937a578c2f64b7c57fed08a827Liam P. White//#define LPE_ENABLE_TEST_EFFECTS //uncomment for toy effects
032f369baeef7d4a3b8769997df5dcd6dd874830jfbarraud
f4a94b19c3c5d7d1e7bd926de1eb7e6c077babb2johanengelen#ifdef HAVE_CONFIG_H
f4a94b19c3c5d7d1e7bd926de1eb7e6c077babb2johanengelen# include "config.h"
f4a94b19c3c5d7d1e7bd926de1eb7e6c077babb2johanengelen#endif
f4a94b19c3c5d7d1e7bd926de1eb7e6c077babb2johanengelen
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm// include effects:
8c39cbeab9949a0a7d6ae66b768a7352019e42f8johanengelen#include "live_effects/lpe-patternalongpath.h"
5c45bb188ab729e501e48732842cb9de6a9813beAlex Valavanis#include "live_effects/effect.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-angle_bisector.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-attach-path.h"
072916d0ef7dccd696b59381f50bcf776abccefbjohanengelen#include "live_effects/lpe-bendpath.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-bounding-box.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-bspline.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-circle_3pts.h"
8d9f5d586a04809427ce1df284a5720112177991cilix#include "live_effects/lpe-circle_with_radius.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-clone-original.h"
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelen#include "live_effects/lpe-constructgrid.h"
044d712d4d03f8354962d54e47cfac2346a69ccccilix#include "live_effects/lpe-copy_rotate.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-curvestitch.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-dynastroke.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-ellipse_5pts.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-envelope.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-extrude.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-fill-between-many.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-fill-between-strokes.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-fillet-chamfer.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-gears.h"
0a75b58e47d3de42550c4f7960e253ea3befc09ajohanengelen#include "live_effects/lpe-interpolate.h"
742a1b08138aef8fc3c19730ae48e5477ee43fc5Johan B. C. Engelen#include "live_effects/lpe-interpolate_points.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-jointype.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-knot.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-lattice2.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-lattice.h"
3515994554d167522343ce57417648b39370ccabcilix#include "live_effects/lpe-line_segment.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-mirror_symmetry.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-offset.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-parallel.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-path_length.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-perp_bisector.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-perspective-envelope.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-perspective_path.h"
4fe8248cd521387d0829c423bf4492e2cbdfd7cdJohan Engelen#include "live_effects/lpe-powerstroke.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-recursiveskeleton.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-roughen.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-rough-hatches.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-ruler.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-show_handles.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-simplify.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-sketch.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-spiro.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-tangent_to_curve.h"
29b712141fb1db0064278da807d8028d9af0ca22Jabiertxof#include "live_effects/lpe-transform_2pts.h"
d10a0baa40c22107b37b2ae2f687b108f5c05d99Liam P. White#include "live_effects/lpe-taperstroke.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-test-doEffect-stack.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-text_label.h"
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński#include "live_effects/lpe-vonkoch.h"
081a89987d4cb46e707c9dd5648a7a24a01a750djfbarraud
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis#include "xml/node-event-vector.h"
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis#include "sp-object.h"
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis#include "attributes.h"
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis#include "message-stack.h"
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis#include "desktop.h"
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis#include "inkscape.h"
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis#include "document.h"
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis#include "document-private.h"
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis#include "xml/document.h"
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis#include <glibmm/i18n.h>
d1561c248f49dc3508ae9e6557fc0d371928e394Markus Engel#include "ui/tools/pen-tool.h"
5e657c265e2687328f5f9c7bf71a4c6b39bb3be9Liam P. White#include "ui/tools-switch.h"
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis#include "knotholder.h"
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis#include "sp-lpe-item.h"
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis#include "live_effects/lpeobject.h"
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis#include "live_effects/parameter/parameter.h"
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis#include <glibmm/ustring.h>
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis#include "display/curve.h"
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis#include <exception>
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis#include <2geom/sbasis-to-bezier.h>
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis#include <2geom/affine.h>
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis#include <2geom/pathvector.h>
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis
1c88ed492df4a0bcb37006a6cc36127897cd847ejfbarraud
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmnamespace Inkscape {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmnamespace LivePathEffect {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
72b7b31db250f20b90730d2888e6a554b434a407johanengelenconst Util::EnumData<EffectType> LPETypeData[] = {
06cd6b0ab2dbe286184e35d1078bab18c966b0d2jfbarraud // {constant defined in effect-enum.h, N_("name of your effect"), "name of your effect in SVG"}
790674255fb54e588b4b6d73ee9e15050b45d1a4johanengelen#ifdef LPE_ENABLE_TEST_EFFECTS
790674255fb54e588b4b6d73ee9e15050b45d1a4johanengelen {DOEFFECTSTACK_TEST, N_("doEffect stack test"), "doeffectstacktest"},
9de5f3bfa8e35ad5e6adcd6eaad4d0d49e7043a3johanengelen {ANGLE_BISECTOR, N_("Angle bisector"), "angle_bisector"},
f555c315692d0a6b221636e8a7004fe9eda0b2cbcilix {CIRCLE_WITH_RADIUS, N_("Circle (by center and radius)"), "circle_with_radius"},
4d2f452da50c83a3bced2bab8cb9e2b287c6efd1johanengelen {CIRCLE_3PTS, N_("Circle by 3 points"), "circle_3pts"},
4d2f452da50c83a3bced2bab8cb9e2b287c6efd1johanengelen {DYNASTROKE, N_("Dynamic stroke"), "dynastroke"},
b62895f15526ccefdf1e274c49c02aa043895ee9johanengelen {EXTRUDE, N_("Extrude"), "extrude"},
9de5f3bfa8e35ad5e6adcd6eaad4d0d49e7043a3johanengelen {LATTICE, N_("Lattice Deformation"), "lattice"},
3515994554d167522343ce57417648b39370ccabcilix {LINE_SEGMENT, N_("Line Segment"), "line_segment"},
9de5f3bfa8e35ad5e6adcd6eaad4d0d49e7043a3johanengelen {OFFSET, N_("Offset"), "offset"},
9de5f3bfa8e35ad5e6adcd6eaad4d0d49e7043a3johanengelen {PARALLEL, N_("Parallel"), "parallel"},
ecf048161ae0284d01d34ca5844204775c0d3fdecilix {PATH_LENGTH, N_("Path length"), "path_length"},
9de5f3bfa8e35ad5e6adcd6eaad4d0d49e7043a3johanengelen {PERP_BISECTOR, N_("Perpendicular bisector"), "perp_bisector"},
9de5f3bfa8e35ad5e6adcd6eaad4d0d49e7043a3johanengelen {PERSPECTIVE_PATH, N_("Perspective path"), "perspective_path"},
afa1e71af5a64b54df797ac1f0bcf32c6613b371johanengelen {RECURSIVE_SKELETON, N_("Recursive skeleton"), "recursive_skeleton"},
9de5f3bfa8e35ad5e6adcd6eaad4d0d49e7043a3johanengelen {TANGENT_TO_CURVE, N_("Tangent to curve"), "tangent_to_curve"},
4afe3fc6b9c122bc5c02b27aea3845ba41384d2acilix {TEXT_LABEL, N_("Text label"), "text_label"},
ed333665ff1493f985131beaa7e7624afe8fe331Jabiertxof {FILLET_CHAMFER, N_("Fillet/Chamfer"), "fillet-chamfer"},
4d2f452da50c83a3bced2bab8cb9e2b287c6efd1johanengelen#endif
4d2f452da50c83a3bced2bab8cb9e2b287c6efd1johanengelen/* 0.46 */
8ba84881e79b6175868d04179ca86f4823a69ec0Liam P. White {BEND_PATH, N_("Bend"), "bend_path"},
4d2f452da50c83a3bced2bab8cb9e2b287c6efd1johanengelen {GEARS, N_("Gears"), "gears"},
4d2f452da50c83a3bced2bab8cb9e2b287c6efd1johanengelen {PATTERN_ALONG_PATH, N_("Pattern Along Path"), "skeletal"}, // for historic reasons, this effect is called skeletal(strokes) in Inkscape:SVG
4d2f452da50c83a3bced2bab8cb9e2b287c6efd1johanengelen {CURVE_STITCH, N_("Stitch Sub-Paths"), "curvestitching"},
4d2f452da50c83a3bced2bab8cb9e2b287c6efd1johanengelen/* 0.47 */
032f369baeef7d4a3b8769997df5dcd6dd874830jfbarraud {VONKOCH, N_("VonKoch"), "vonkoch"},
3533ac02ef26a49e50514b619886467fd53c28fbjohanengelen {KNOT, N_("Knot"), "knot"},
4d2f452da50c83a3bced2bab8cb9e2b287c6efd1johanengelen {CONSTRUCT_GRID, N_("Construct grid"), "construct_grid"},
3533ac02ef26a49e50514b619886467fd53c28fbjohanengelen {SPIRO, N_("Spiro spline"), "spiro"},
4daaa4a6cb870ab0b4f6fbd66943a7535535f1adjohanengelen {ENVELOPE, N_("Envelope Deformation"), "envelope"},
1ba2d157b7006f2f1a6043bc29e9c66be6386373johanengelen {INTERPOLATE, N_("Interpolate Sub-Paths"), "interpolate"},
0c4410dc5d53461e85445298c1f5d08d2d823c98jfbarraud {ROUGH_HATCHES, N_("Hatches (rough)"), "rough_hatches"},
3cb0f0262354a11d123e45ad10b027bebf957e46jfbarraud {SKETCH, N_("Sketch"), "sketch"},
822f89451bdca5665d48668154c774a45ec30c85jfbarraud {RULER, N_("Ruler"), "ruler"},
a00b60e7e872c026641948bcca8854b346631cc6Liam P. White/* 0.91 */
8ba84881e79b6175868d04179ca86f4823a69ec0Liam P. White {POWERSTROKE, N_("Power stroke"), "powerstroke"},
8ba84881e79b6175868d04179ca86f4823a69ec0Liam P. White {CLONE_ORIGINAL, N_("Clone original path"), "clone_original"},
e570dd120886b0342f6e50df8cfa344164ca25b1Jabiertxof/* 0.92 */
e570dd120886b0342f6e50df8cfa344164ca25b1Jabiertxof {SIMPLIFY, N_("Simplify"), "simplify"},
e570dd120886b0342f6e50df8cfa344164ca25b1Jabiertxof {LATTICE2, N_("Lattice Deformation 2"), "lattice2"},
e570dd120886b0342f6e50df8cfa344164ca25b1Jabiertxof {PERSPECTIVE_ENVELOPE, N_("Perspective/Envelope"), "perspective-envelope"},
e570dd120886b0342f6e50df8cfa344164ca25b1Jabiertxof {INTERPOLATE_POINTS, N_("Interpolate points"), "interpolate_points"},
e570dd120886b0342f6e50df8cfa344164ca25b1Jabiertxof {TRANSFORM_2PTS, N_("Transform by 2 points"), "transform_2pts"},
f6cbfbe5a4c7dc89273a6f3b9d2a9d3c09df9cceJabiertxof {SHOW_HANDLES, N_("Show handles"), "show_handles"},
f6cbfbe5a4c7dc89273a6f3b9d2a9d3c09df9cceJabiertxof {ROUGHEN, N_("Roughen"), "roughen"},
136203b42d18389e16f7e30427dd6424e555149dJabiertxo Arraiza Cenoz {BSPLINE, N_("BSpline"), "bspline"},
a617d38416993f79b57879c6bfa174e9be78bb40Liam P. White {JOIN_TYPE, N_("Join type"), "join_type"},
a617d38416993f79b57879c6bfa174e9be78bb40Liam P. White {TAPER_STROKE, N_("Taper stroke"), "taper_stroke"},
e0586151dd2a87c070f0df89eb4f3cf187c3c80cJabiertxof {MIRROR_SYMMETRY, N_("Mirror symmetry"), "mirror_symmetry"},
132a32ec7174a7a4aa842e9866fe6b51fc203c4eJabiertxof {COPY_ROTATE, N_("Rotate copies"), "copy_rotate"},
e570dd120886b0342f6e50df8cfa344164ca25b1Jabiertxof/* Ponyscape -> Inkscape 0.92*/
6a5c006765230bd994cc6ac027dab6ed15837bbfLiam P. White {ATTACH_PATH, N_("Attach path"), "attach_path"},
8ba84881e79b6175868d04179ca86f4823a69ec0Liam P. White {FILL_BETWEEN_STROKES, N_("Fill between strokes"), "fill_between_strokes"},
8ba84881e79b6175868d04179ca86f4823a69ec0Liam P. White {FILL_BETWEEN_MANY, N_("Fill between many"), "fill_between_many"},
8ba84881e79b6175868d04179ca86f4823a69ec0Liam P. White {ELLIPSE_5PTS, N_("Ellipse by 5 points"), "ellipse_5pts"},
8ba84881e79b6175868d04179ca86f4823a69ec0Liam P. White {BOUNDING_BOX, N_("Bounding Box"), "bounding_box"},
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm};
72b7b31db250f20b90730d2888e6a554b434a407johanengelenconst Util::EnumDataConverter<EffectType> LPETypeConverter(LPETypeData, sizeof(LPETypeData)/sizeof(*LPETypeData));
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
a45e91fd09273632e9acf849bb72621832156f07cilixint
494c671e141564431d7d05f141c885d9a2789db5cilixEffect::acceptsNumClicks(EffectType type) {
a45e91fd09273632e9acf849bb72621832156f07cilix switch (type) {
eac94793745a61429b52a4b489e148737d091749cilix case INVALID_LPE: return -1; // in case we want to distinguish between invalid LPE and valid ones that expect zero clicks
a45e91fd09273632e9acf849bb72621832156f07cilix case ANGLE_BISECTOR: return 3;
a45e91fd09273632e9acf849bb72621832156f07cilix case CIRCLE_3PTS: return 3;
a45e91fd09273632e9acf849bb72621832156f07cilix case CIRCLE_WITH_RADIUS: return 2;
8791d7447034c34fdedc50f261bf5c89c34e59f5cilix case LINE_SEGMENT: return 2;
8791d7447034c34fdedc50f261bf5c89c34e59f5cilix case PERP_BISECTOR: return 2;
a45e91fd09273632e9acf849bb72621832156f07cilix default: return 0;
a45e91fd09273632e9acf849bb72621832156f07cilix }
a45e91fd09273632e9acf849bb72621832156f07cilix}
a45e91fd09273632e9acf849bb72621832156f07cilix
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmEffect*
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmEffect::New(EffectType lpenr, LivePathEffectObject *lpeobj)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm Effect* neweffect = NULL;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm switch (lpenr) {
8c39cbeab9949a0a7d6ae66b768a7352019e42f8johanengelen case PATTERN_ALONG_PATH:
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen neweffect = static_cast<Effect*> ( new LPEPatternAlongPath(lpeobj) );
29f9623ba77fc735b89765ae3a13e0c06aabafcecilix break;
072916d0ef7dccd696b59381f50bcf776abccefbjohanengelen case BEND_PATH:
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen neweffect = static_cast<Effect*> ( new LPEBendPath(lpeobj) );
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen break;
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud case SKETCH:
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen neweffect = static_cast<Effect*> ( new LPESketch(lpeobj) );
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud break;
06cd6b0ab2dbe286184e35d1078bab18c966b0d2jfbarraud case ROUGH_HATCHES:
06cd6b0ab2dbe286184e35d1078bab18c966b0d2jfbarraud neweffect = static_cast<Effect*> ( new LPERoughHatches(lpeobj) );
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould break;
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud case VONKOCH:
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen neweffect = static_cast<Effect*> ( new LPEVonKoch(lpeobj) );
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud break;
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud case KNOT:
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen neweffect = static_cast<Effect*> ( new LPEKnot(lpeobj) );
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud break;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm case GEARS:
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen neweffect = static_cast<Effect*> ( new LPEGears(lpeobj) );
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm break;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm case CURVE_STITCH:
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen neweffect = static_cast<Effect*> ( new LPECurveStitch(lpeobj) );
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm break;
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelen case LATTICE:
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelen neweffect = static_cast<Effect*> ( new LPELattice(lpeobj) );
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelen break;
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelen case ENVELOPE:
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelen neweffect = static_cast<Effect*> ( new LPEEnvelope(lpeobj) );
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelen break;
8d9f5d586a04809427ce1df284a5720112177991cilix case CIRCLE_WITH_RADIUS:
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen neweffect = static_cast<Effect*> ( new LPECircleWithRadius(lpeobj) );
8d9f5d586a04809427ce1df284a5720112177991cilix break;
70eb1fc448cb08acf3468f80fa2296c03b32afd2cilix case PERSPECTIVE_PATH:
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen neweffect = static_cast<Effect*> ( new LPEPerspectivePath(lpeobj) );
70eb1fc448cb08acf3468f80fa2296c03b32afd2cilix break;
c169f6cddd2da06cfb761339f445bbd8866f72a8buliabyak case SPIRO:
c169f6cddd2da06cfb761339f445bbd8866f72a8buliabyak neweffect = static_cast<Effect*> ( new LPESpiro(lpeobj) );
c169f6cddd2da06cfb761339f445bbd8866f72a8buliabyak break;
6f4a90e526af850ffc36064f58f09c190f3b633fjohanengelen case CONSTRUCT_GRID:
6f4a90e526af850ffc36064f58f09c190f3b633fjohanengelen neweffect = static_cast<Effect*> ( new LPEConstructGrid(lpeobj) );
6f4a90e526af850ffc36064f58f09c190f3b633fjohanengelen break;
f4db63be4e929f4706410914295deccaceea19cdcilix case PERP_BISECTOR:
f4db63be4e929f4706410914295deccaceea19cdcilix neweffect = static_cast<Effect*> ( new LPEPerpBisector(lpeobj) );
f4db63be4e929f4706410914295deccaceea19cdcilix break;
ab99111a42436818e6902e044c8f3af2b724263bcilix case TANGENT_TO_CURVE:
ab99111a42436818e6902e044c8f3af2b724263bcilix neweffect = static_cast<Effect*> ( new LPETangentToCurve(lpeobj) );
ab99111a42436818e6902e044c8f3af2b724263bcilix break;
76db360f5f052775326e6d406b9e1e9e2966e11acilix case MIRROR_SYMMETRY:
76db360f5f052775326e6d406b9e1e9e2966e11acilix neweffect = static_cast<Effect*> ( new LPEMirrorSymmetry(lpeobj) );
b0c42c0dfcd02cc05126371948489a5a88b2e4b3cilix break;
3d0482af18ffb591c1d8ddecf516629e1bcd2ae4cilix case CIRCLE_3PTS:
3d0482af18ffb591c1d8ddecf516629e1bcd2ae4cilix neweffect = static_cast<Effect*> ( new LPECircle3Pts(lpeobj) );
3d0482af18ffb591c1d8ddecf516629e1bcd2ae4cilix break;
64aee804a6a47424f7994e60558351b8cf2ea4dbcilix case ANGLE_BISECTOR:
64aee804a6a47424f7994e60558351b8cf2ea4dbcilix neweffect = static_cast<Effect*> ( new LPEAngleBisector(lpeobj) );
64aee804a6a47424f7994e60558351b8cf2ea4dbcilix break;
b320a8d186114a5122ddc3afbe95110eb6cb10cecilix case PARALLEL:
b320a8d186114a5122ddc3afbe95110eb6cb10cecilix neweffect = static_cast<Effect*> ( new LPEParallel(lpeobj) );
b320a8d186114a5122ddc3afbe95110eb6cb10cecilix break;
044d712d4d03f8354962d54e47cfac2346a69ccccilix case COPY_ROTATE:
044d712d4d03f8354962d54e47cfac2346a69ccccilix neweffect = static_cast<Effect*> ( new LPECopyRotate(lpeobj) );
044d712d4d03f8354962d54e47cfac2346a69ccccilix break;
61cfd957cd023c4f432ea0c7307784a56bf978e9cilix case OFFSET:
61cfd957cd023c4f432ea0c7307784a56bf978e9cilix neweffect = static_cast<Effect*> ( new LPEOffset(lpeobj) );
61cfd957cd023c4f432ea0c7307784a56bf978e9cilix break;
2f5c0701b333a695eedb1680beb1adf95c0723dacilix case RULER:
2f5c0701b333a695eedb1680beb1adf95c0723dacilix neweffect = static_cast<Effect*> ( new LPERuler(lpeobj) );
2f5c0701b333a695eedb1680beb1adf95c0723dacilix break;
0a75b58e47d3de42550c4f7960e253ea3befc09ajohanengelen case INTERPOLATE:
0a75b58e47d3de42550c4f7960e253ea3befc09ajohanengelen neweffect = static_cast<Effect*> ( new LPEInterpolate(lpeobj) );
0a75b58e47d3de42550c4f7960e253ea3befc09ajohanengelen break;
742a1b08138aef8fc3c19730ae48e5477ee43fc5Johan B. C. Engelen case INTERPOLATE_POINTS:
742a1b08138aef8fc3c19730ae48e5477ee43fc5Johan B. C. Engelen neweffect = static_cast<Effect*> ( new LPEInterpolatePoints(lpeobj) );
742a1b08138aef8fc3c19730ae48e5477ee43fc5Johan B. C. Engelen break;
4afe3fc6b9c122bc5c02b27aea3845ba41384d2acilix case TEXT_LABEL:
4afe3fc6b9c122bc5c02b27aea3845ba41384d2acilix neweffect = static_cast<Effect*> ( new LPETextLabel(lpeobj) );
4afe3fc6b9c122bc5c02b27aea3845ba41384d2acilix break;
ecf048161ae0284d01d34ca5844204775c0d3fdecilix case PATH_LENGTH:
ecf048161ae0284d01d34ca5844204775c0d3fdecilix neweffect = static_cast<Effect*> ( new LPEPathLength(lpeobj) );
ecf048161ae0284d01d34ca5844204775c0d3fdecilix break;
3515994554d167522343ce57417648b39370ccabcilix case LINE_SEGMENT:
3515994554d167522343ce57417648b39370ccabcilix neweffect = static_cast<Effect*> ( new LPELineSegment(lpeobj) );
3515994554d167522343ce57417648b39370ccabcilix break;
790674255fb54e588b4b6d73ee9e15050b45d1a4johanengelen case DOEFFECTSTACK_TEST:
790674255fb54e588b4b6d73ee9e15050b45d1a4johanengelen neweffect = static_cast<Effect*> ( new LPEdoEffectStackTest(lpeobj) );
790674255fb54e588b4b6d73ee9e15050b45d1a4johanengelen break;
136203b42d18389e16f7e30427dd6424e555149dJabiertxo Arraiza Cenoz case BSPLINE:
136203b42d18389e16f7e30427dd6424e555149dJabiertxo Arraiza Cenoz neweffect = static_cast<Effect*> ( new LPEBSpline(lpeobj) );
136203b42d18389e16f7e30427dd6424e555149dJabiertxo Arraiza Cenoz break;
081a89987d4cb46e707c9dd5648a7a24a01a750djfbarraud case DYNASTROKE:
081a89987d4cb46e707c9dd5648a7a24a01a750djfbarraud neweffect = static_cast<Effect*> ( new LPEDynastroke(lpeobj) );
081a89987d4cb46e707c9dd5648a7a24a01a750djfbarraud break;
afa1e71af5a64b54df797ac1f0bcf32c6613b371johanengelen case RECURSIVE_SKELETON:
afa1e71af5a64b54df797ac1f0bcf32c6613b371johanengelen neweffect = static_cast<Effect*> ( new LPERecursiveSkeleton(lpeobj) );
afa1e71af5a64b54df797ac1f0bcf32c6613b371johanengelen break;
b62895f15526ccefdf1e274c49c02aa043895ee9johanengelen case EXTRUDE:
b62895f15526ccefdf1e274c49c02aa043895ee9johanengelen neweffect = static_cast<Effect*> ( new LPEExtrude(lpeobj) );
b62895f15526ccefdf1e274c49c02aa043895ee9johanengelen break;
4fe8248cd521387d0829c423bf4492e2cbdfd7cdJohan Engelen case POWERSTROKE:
4fe8248cd521387d0829c423bf4492e2cbdfd7cdJohan Engelen neweffect = static_cast<Effect*> ( new LPEPowerStroke(lpeobj) );
4fe8248cd521387d0829c423bf4492e2cbdfd7cdJohan Engelen break;
05e1ec4d6f1ccc3a0db3cc13e8a3b18489714f14Johan Engelen case CLONE_ORIGINAL:
05e1ec4d6f1ccc3a0db3cc13e8a3b18489714f14Johan Engelen neweffect = static_cast<Effect*> ( new LPECloneOriginal(lpeobj) );
05e1ec4d6f1ccc3a0db3cc13e8a3b18489714f14Johan Engelen break;
6a5c006765230bd994cc6ac027dab6ed15837bbfLiam P. White case ATTACH_PATH:
8ba84881e79b6175868d04179ca86f4823a69ec0Liam P. White neweffect = static_cast<Effect*> ( new LPEAttachPath(lpeobj) );
6a5c006765230bd994cc6ac027dab6ed15837bbfLiam P. White break;
8ba84881e79b6175868d04179ca86f4823a69ec0Liam P. White case FILL_BETWEEN_STROKES:
8ba84881e79b6175868d04179ca86f4823a69ec0Liam P. White neweffect = static_cast<Effect*> ( new LPEFillBetweenStrokes(lpeobj) );
8ba84881e79b6175868d04179ca86f4823a69ec0Liam P. White break;
8ba84881e79b6175868d04179ca86f4823a69ec0Liam P. White case FILL_BETWEEN_MANY:
8ba84881e79b6175868d04179ca86f4823a69ec0Liam P. White neweffect = static_cast<Effect*> ( new LPEFillBetweenMany(lpeobj) );
8ba84881e79b6175868d04179ca86f4823a69ec0Liam P. White break;
8ba84881e79b6175868d04179ca86f4823a69ec0Liam P. White case ELLIPSE_5PTS:
8ba84881e79b6175868d04179ca86f4823a69ec0Liam P. White neweffect = static_cast<Effect*> ( new LPEEllipse5Pts(lpeobj) );
8ba84881e79b6175868d04179ca86f4823a69ec0Liam P. White break;
8ba84881e79b6175868d04179ca86f4823a69ec0Liam P. White case BOUNDING_BOX:
8ba84881e79b6175868d04179ca86f4823a69ec0Liam P. White neweffect = static_cast<Effect*> ( new LPEBoundingBox(lpeobj) );
8ba84881e79b6175868d04179ca86f4823a69ec0Liam P. White break;
d10a0baa40c22107b37b2ae2f687b108f5c05d99Liam P. White case JOIN_TYPE:
8ba84881e79b6175868d04179ca86f4823a69ec0Liam P. White neweffect = static_cast<Effect*> ( new LPEJoinType(lpeobj) );
d10a0baa40c22107b37b2ae2f687b108f5c05d99Liam P. White break;
d10a0baa40c22107b37b2ae2f687b108f5c05d99Liam P. White case TAPER_STROKE:
d10a0baa40c22107b37b2ae2f687b108f5c05d99Liam P. White neweffect = static_cast<Effect*> ( new LPETaperStroke(lpeobj) );
b824aead9789d81cb56fb1700a46872ff7eb5c7fLiam P. White break;
80db4eb7f4fe34ba6f42344c71338dc8a98302bbJabiertxof case SIMPLIFY:
80db4eb7f4fe34ba6f42344c71338dc8a98302bbJabiertxof neweffect = static_cast<Effect*> ( new LPESimplify(lpeobj) );
80db4eb7f4fe34ba6f42344c71338dc8a98302bbJabiertxof break;
09d98e945b8105f64767a305e727300b9aaddd4aJabiertxof case LATTICE2:
09d98e945b8105f64767a305e727300b9aaddd4aJabiertxof neweffect = static_cast<Effect*> ( new LPELattice2(lpeobj) );
d10a0baa40c22107b37b2ae2f687b108f5c05d99Liam P. White break;
55f802973ac27b5258201538fd476250b5134f44Liam P. White case PERSPECTIVE_ENVELOPE:
55f802973ac27b5258201538fd476250b5134f44Liam P. White neweffect = static_cast<Effect*> ( new LPEPerspectiveEnvelope(lpeobj) );
5ca48c4a31a249352a2685fbc2a576f1e0d041a0Jabiertxof break;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof case FILLET_CHAMFER:
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof neweffect = static_cast<Effect*> ( new LPEFilletChamfer(lpeobj) );
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof break;
60db347ea19e568bd09c35a0248a9f78d7931ca0Jabiertxof case ROUGHEN:
60db347ea19e568bd09c35a0248a9f78d7931ca0Jabiertxof neweffect = static_cast<Effect*> ( new LPERoughen(lpeobj) );
60db347ea19e568bd09c35a0248a9f78d7931ca0Jabiertxof break;
f6cbfbe5a4c7dc89273a6f3b9d2a9d3c09df9cceJabiertxof case SHOW_HANDLES:
f6cbfbe5a4c7dc89273a6f3b9d2a9d3c09df9cceJabiertxof neweffect = static_cast<Effect*> ( new LPEShowHandles(lpeobj) );
f6cbfbe5a4c7dc89273a6f3b9d2a9d3c09df9cceJabiertxof break;
29b712141fb1db0064278da807d8028d9af0ca22Jabiertxof case TRANSFORM_2PTS:
29b712141fb1db0064278da807d8028d9af0ca22Jabiertxof neweffect = static_cast<Effect*> ( new LPETransform2Pts(lpeobj) );
29b712141fb1db0064278da807d8028d9af0ca22Jabiertxof break;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm default:
6863a963d4dd3d2e855f74ae8a7ff640bd4e1181Liam P. White g_warning("LivePathEffect::Effect::New called with invalid patheffect type (%d)", lpenr);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm neweffect = NULL;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm break;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm if (neweffect) {
f68aabe351946119c80978525cd86564dd33e02fJon A. Cruz neweffect->readallParameters(lpeobj->getRepr());
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm return neweffect;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
9dc68827cbd515262ecb8d5ae8547d9e82c72e00Jon A. Cruzvoid Effect::createAndApply(const char* name, SPDocument *doc, SPItem *item)
6656f193fdace606d1b162d6dea0223bc295f0a6cilix{
6656f193fdace606d1b162d6dea0223bc295f0a6cilix // Path effect definition
9dc68827cbd515262ecb8d5ae8547d9e82c72e00Jon A. Cruz Inkscape::XML::Document *xml_doc = doc->getReprDoc();
6656f193fdace606d1b162d6dea0223bc295f0a6cilix Inkscape::XML::Node *repr = xml_doc->createElement("inkscape:path-effect");
6656f193fdace606d1b162d6dea0223bc295f0a6cilix repr->setAttribute("effect", name);
6656f193fdace606d1b162d6dea0223bc295f0a6cilix
07b7f1aaaf1087716e784a50cf574a059f7018d3Jon A. Cruz doc->getDefs()->getRepr()->addChild(repr, NULL); // adds to <defs> and assigns the 'id' attribute
6656f193fdace606d1b162d6dea0223bc295f0a6cilix const gchar * repr_id = repr->attribute("id");
6656f193fdace606d1b162d6dea0223bc295f0a6cilix Inkscape::GC::release(repr);
6656f193fdace606d1b162d6dea0223bc295f0a6cilix
6656f193fdace606d1b162d6dea0223bc295f0a6cilix gchar *href = g_strdup_printf("#%s", repr_id);
f4ce66b44581cea80a736cf20244c0539a7525daJohan B. C. Engelen SP_LPE_ITEM(item)->addPathEffect(href, true);
6656f193fdace606d1b162d6dea0223bc295f0a6cilix g_free(href);
6656f193fdace606d1b162d6dea0223bc295f0a6cilix}
6656f193fdace606d1b162d6dea0223bc295f0a6cilix
6656f193fdace606d1b162d6dea0223bc295f0a6cilixvoid
09ba3247163582bf2e30e17c4c154aa259ce038acilixEffect::createAndApply(EffectType type, SPDocument *doc, SPItem *item)
6656f193fdace606d1b162d6dea0223bc295f0a6cilix{
6656f193fdace606d1b162d6dea0223bc295f0a6cilix createAndApply(LPETypeConverter.get_key(type).c_str(), doc, item);
6656f193fdace606d1b162d6dea0223bc295f0a6cilix}
6656f193fdace606d1b162d6dea0223bc295f0a6cilix
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmEffect::Effect(LivePathEffectObject *lpeobject)
b8d3bf3a76982b925ccacab389e190adbfa1f3b1jabiertxof : apply_to_clippath_and_mask(false),
b8d3bf3a76982b925ccacab389e190adbfa1f3b1jabiertxof _provides_knotholder_entities(false),
3cfad782faf34c654ec837780ed7b3fe95e82c2eJohan B. C. Engelen oncanvasedit_it(0),
71146abe8aba032d73788a625fee5769a581bd3ccilix is_visible(_("Is visible?"), _("If unchecked, the effect remains applied to the object but is temporarily disabled on canvas"), "is_visible", &wr, this, true),
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix show_orig_path(false),
fbb4eb8b63e74d9441220a73a8ca858425be4bd4johanengelen lpeobj(lpeobject),
9ce14357bb94b9dd92ad40bf43ef435a257b355acilix concatenate_before_pwd2(false),
cbff03643467232537259e0f72dd6c196f9cffa5Jabiertxof sp_lpe_item(NULL),
cbff03643467232537259e0f72dd6c196f9cffa5Jabiertxof current_zoom(1),
cbff03643467232537259e0f72dd6c196f9cffa5Jabiertxof sp_curve(NULL),
c27006137a3ad49e074b97b3297db753e1ac8eefcilix provides_own_flash_paths(true), // is automatically set to false if providesOwnFlashPaths() is not overridden
c27006137a3ad49e074b97b3297db753e1ac8eefcilix is_ready(false) // is automatically set to false if providesOwnFlashPaths() is not overridden
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
71146abe8aba032d73788a625fee5769a581bd3ccilix registerParameter( dynamic_cast<Parameter *>(&is_visible) );
96ef6190a69e8101a3c3a8ef8b01cb35042d1f9dcilix is_visible.widget_is_visible = false;
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof current_zoom = 0.0;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmEffect::~Effect()
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
eaa9bdc7bf7b73397e536edd47490d84e4420bd8bryceGlib::ustring
0b2d8abc1011ad865fce3b883ccb2587cb15cc90Johan B. C. EngelenEffect::getName() const
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
72b7b31db250f20b90730d2888e6a554b434a407johanengelen if (lpeobj->effecttype_set && LPETypeConverter.is_valid_id(lpeobj->effecttype) )
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm return Glib::ustring( _(LPETypeConverter.get_label(lpeobj->effecttype).c_str()) );
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm else
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm return Glib::ustring( _("No effect") );
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
c90010388b0d4045c26e81c2be28beedcb36c7d3cilixEffectType
507f5de177a9e789927e7ac3e80ac05b27720084Johan B. C. EngelenEffect::effectType() const {
c90010388b0d4045c26e81c2be28beedcb36c7d3cilix return lpeobj->effecttype;
c90010388b0d4045c26e81c2be28beedcb36c7d3cilix}
c90010388b0d4045c26e81c2be28beedcb36c7d3cilix
77a4a003111bd5cfb771d4849801c898aeb889b0cilix/**
77a4a003111bd5cfb771d4849801c898aeb889b0cilix * Is performed a single time when the effect is freshly applied to a path
77a4a003111bd5cfb771d4849801c898aeb889b0cilix */
262d0c3f05130d86368d95f110aa8ccab5f83e5ccilixvoid
a39c187369a59e887255e3f704a3ababf2b10678Johan B. C. EngelenEffect::doOnApply (SPLPEItem const*/*lpeitem*/)
262d0c3f05130d86368d95f110aa8ccab5f83e5ccilix{
262d0c3f05130d86368d95f110aa8ccab5f83e5ccilix}
262d0c3f05130d86368d95f110aa8ccab5f83e5ccilix
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxofvoid
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0JabiertxofEffect::setSelectedNodePoints(std::vector<Geom::Point> sNP)
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof{
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof selectedNodesPoints = sNP;
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof}
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxofvoid
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0JabiertxofEffect::setCurrentZoom(double cZ)
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof{
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof current_zoom = cZ;
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof}
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxofbool
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0JabiertxofEffect::isNodePointSelected(Geom::Point const &nodePoint) const
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof{
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof if (selectedNodesPoints.size() > 0) {
d997bb8ac46dd7f4143fe9adb8e4111293a1cf41Jabiertxof using Geom::X;
d997bb8ac46dd7f4143fe9adb8e4111293a1cf41Jabiertxof using Geom::Y;
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof for (std::vector<Geom::Point>::const_iterator i = selectedNodesPoints.begin();
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof i != selectedNodesPoints.end(); ++i) {
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof Geom::Point p = *i;
d997bb8ac46dd7f4143fe9adb8e4111293a1cf41Jabiertxof Geom::Affine transformCoordinate = sp_lpe_item->i2dt_affine();
d997bb8ac46dd7f4143fe9adb8e4111293a1cf41Jabiertxof Geom::Point p2(nodePoint[X],nodePoint[Y]);
d997bb8ac46dd7f4143fe9adb8e4111293a1cf41Jabiertxof p2 *= transformCoordinate;
d997bb8ac46dd7f4143fe9adb8e4111293a1cf41Jabiertxof if (Geom::are_near(p, p2, 0.01)) {
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof return true;
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof }
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof }
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof }
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof return false;
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof}
dbe4fd798adb1e0177bee67fd4c86b8a00d1b8f0Jabiertxof
77a4a003111bd5cfb771d4849801c898aeb889b0cilix/**
77a4a003111bd5cfb771d4849801c898aeb889b0cilix * Is performed each time before the effect is updated.
77a4a003111bd5cfb771d4849801c898aeb889b0cilix */
23d859f2ce09c04ed802cb4912cc9c50f512f0a2bgkvoid
0b2d8abc1011ad865fce3b883ccb2587cb15cc90Johan B. C. EngelenEffect::doBeforeEffect (SPLPEItem const*/*lpeitem*/)
23d859f2ce09c04ed802cb4912cc9c50f512f0a2bgk{
23d859f2ce09c04ed802cb4912cc9c50f512f0a2bgk //Do nothing for simple effects
23d859f2ce09c04ed802cb4912cc9c50f512f0a2bgk}
23d859f2ce09c04ed802cb4912cc9c50f512f0a2bgk
af0b27bfa6837dd41d79416ed225d99cee6e2318Liam P. Whitevoid Effect::doAfterEffect (SPLPEItem const* /*lpeitem*/)
799f674d1756b6937a578c2f64b7c57fed08a827Liam P. White{
799f674d1756b6937a578c2f64b7c57fed08a827Liam P. White}
799f674d1756b6937a578c2f64b7c57fed08a827Liam P. White
af0b27bfa6837dd41d79416ed225d99cee6e2318Liam P. Whitevoid Effect::doOnRemove (SPLPEItem const* /*lpeitem*/)
799f674d1756b6937a578c2f64b7c57fed08a827Liam P. White{
799f674d1756b6937a578c2f64b7c57fed08a827Liam P. White}
799f674d1756b6937a578c2f64b7c57fed08a827Liam P. White
62c8c7faca825a94361a0cecb568735f83475933Liam P. White//secret impl methods (shhhh!)
62c8c7faca825a94361a0cecb568735f83475933Liam P. Whitevoid Effect::doOnApply_impl(SPLPEItem const* lpeitem)
62c8c7faca825a94361a0cecb568735f83475933Liam P. White{
62c8c7faca825a94361a0cecb568735f83475933Liam P. White sp_lpe_item = const_cast<SPLPEItem *>(lpeitem);
e65cfa2ea933c3cbc05f00c6e8ab1cef1f68672fLiam P. White /*sp_curve = SP_SHAPE(sp_lpe_item)->getCurve();
e65cfa2ea933c3cbc05f00c6e8ab1cef1f68672fLiam P. White pathvector_before_effect = sp_curve->get_pathvector();*/
62c8c7faca825a94361a0cecb568735f83475933Liam P. White doOnApply(lpeitem);
62c8c7faca825a94361a0cecb568735f83475933Liam P. White}
62c8c7faca825a94361a0cecb568735f83475933Liam P. White
62c8c7faca825a94361a0cecb568735f83475933Liam P. Whitevoid Effect::doBeforeEffect_impl(SPLPEItem const* lpeitem)
62c8c7faca825a94361a0cecb568735f83475933Liam P. White{
62c8c7faca825a94361a0cecb568735f83475933Liam P. White sp_lpe_item = const_cast<SPLPEItem *>(lpeitem);
64a311db53efc60ec257d3f6d128b53204eb4683Liam P. White //printf("(SPLPEITEM*) %p\n", sp_lpe_item);
7809c81148155b4c4777463f9dbbbf714233e897Jabiertxof SPShape * shape = dynamic_cast<SPShape *>(sp_lpe_item);
7809c81148155b4c4777463f9dbbbf714233e897Jabiertxof if(shape){
7809c81148155b4c4777463f9dbbbf714233e897Jabiertxof sp_curve = shape->getCurve();
7809c81148155b4c4777463f9dbbbf714233e897Jabiertxof pathvector_before_effect = sp_curve->get_pathvector();
7809c81148155b4c4777463f9dbbbf714233e897Jabiertxof }
62c8c7faca825a94361a0cecb568735f83475933Liam P. White doBeforeEffect(lpeitem);
3cc2708734738d50bc2d4c271e26e1fadd743f1bJabiertxof if (apply_to_clippath_and_mask && SP_IS_GROUP(sp_lpe_item)) {
3cc2708734738d50bc2d4c271e26e1fadd743f1bJabiertxof sp_lpe_item->apply_to_clippath(sp_lpe_item);
3cc2708734738d50bc2d4c271e26e1fadd743f1bJabiertxof sp_lpe_item->apply_to_mask(sp_lpe_item);
3cc2708734738d50bc2d4c271e26e1fadd743f1bJabiertxof }
62c8c7faca825a94361a0cecb568735f83475933Liam P. White}
62c8c7faca825a94361a0cecb568735f83475933Liam P. White
77a4a003111bd5cfb771d4849801c898aeb889b0cilix/**
147c8e03bb214f85cd5906ddc6413c4293c4baa9cilix * Effects can have a parameter path set before they are applied by accepting a nonzero number of
147c8e03bb214f85cd5906ddc6413c4293c4baa9cilix * mouse clicks. This method activates the pen context, which waits for the specified number of
494c671e141564431d7d05f141c885d9a2789db5cilix * clicks. Override Effect::acceptsNumClicks() to return the number of expected mouse clicks.
77a4a003111bd5cfb771d4849801c898aeb889b0cilix */
77a4a003111bd5cfb771d4849801c898aeb889b0cilixvoid
77a4a003111bd5cfb771d4849801c898aeb889b0cilixEffect::doAcceptPathPreparations(SPLPEItem *lpeitem)
77a4a003111bd5cfb771d4849801c898aeb889b0cilix{
77a4a003111bd5cfb771d4849801c898aeb889b0cilix // switch to pen context
fc336487182165df2bbcbe52800aa3d2e292b7c7Liam P. White SPDesktop *desktop = SP_ACTIVE_DESKTOP; // TODO: Is there a better method to find the item's desktop?
77a4a003111bd5cfb771d4849801c898aeb889b0cilix if (!tools_isactive(desktop, TOOLS_FREEHAND_PEN)) {
77a4a003111bd5cfb771d4849801c898aeb889b0cilix tools_switch(desktop, TOOLS_FREEHAND_PEN);
77a4a003111bd5cfb771d4849801c898aeb889b0cilix }
77a4a003111bd5cfb771d4849801c898aeb889b0cilix
5f19756f48574526dda8abedebf811c9d1456e80Markus Engel Inkscape::UI::Tools::ToolBase *ec = desktop->event_context;
5f19756f48574526dda8abedebf811c9d1456e80Markus Engel Inkscape::UI::Tools::PenTool *pc = SP_PEN_CONTEXT(ec);
494c671e141564431d7d05f141c885d9a2789db5cilix pc->expecting_clicks_for_LPE = this->acceptsNumClicks();
77a4a003111bd5cfb771d4849801c898aeb889b0cilix pc->waiting_LPE = this;
77a4a003111bd5cfb771d4849801c898aeb889b0cilix pc->waiting_item = lpeitem;
77a4a003111bd5cfb771d4849801c898aeb889b0cilix pc->polylines_only = true;
77a4a003111bd5cfb771d4849801c898aeb889b0cilix
77a4a003111bd5cfb771d4849801c898aeb889b0cilix ec->desktop->messageStack()->flash(Inkscape::INFORMATION_MESSAGE,
77a4a003111bd5cfb771d4849801c898aeb889b0cilix g_strdup_printf(_("Please specify a parameter path for the LPE '%s' with %d mouse clicks"),
494c671e141564431d7d05f141c885d9a2789db5cilix getName().c_str(), acceptsNumClicks()));
77a4a003111bd5cfb771d4849801c898aeb889b0cilix}
23d859f2ce09c04ed802cb4912cc9c50f512f0a2bgk
97a20864afec63a0b7bb757b628ee2ae596cf648cilixvoid
97a20864afec63a0b7bb757b628ee2ae596cf648cilixEffect::writeParamsToSVG() {
97a20864afec63a0b7bb757b628ee2ae596cf648cilix std::vector<Inkscape::LivePathEffect::Parameter *>::iterator p;
97a20864afec63a0b7bb757b628ee2ae596cf648cilix for (p = param_vector.begin(); p != param_vector.end(); ++p) {
97a20864afec63a0b7bb757b628ee2ae596cf648cilix (*p)->write_to_SVG();
97a20864afec63a0b7bb757b628ee2ae596cf648cilix }
97a20864afec63a0b7bb757b628ee2ae596cf648cilix}
97a20864afec63a0b7bb757b628ee2ae596cf648cilix
77a4a003111bd5cfb771d4849801c898aeb889b0cilix/**
77a4a003111bd5cfb771d4849801c898aeb889b0cilix * If the effect expects a path parameter (specified by a number of mouse clicks) before it is
77a4a003111bd5cfb771d4849801c898aeb889b0cilix * applied, this is the method that processes the resulting path. Override it to customize it for
c27006137a3ad49e074b97b3297db753e1ac8eefcilix * your LPE. But don't forget to call the parent method so that is_ready is set to true!
77a4a003111bd5cfb771d4849801c898aeb889b0cilix */
77a4a003111bd5cfb771d4849801c898aeb889b0cilixvoid
0b2d8abc1011ad865fce3b883ccb2587cb15cc90Johan B. C. EngelenEffect::acceptParamPath (SPPath const*/*param_path*/) {
c27006137a3ad49e074b97b3297db753e1ac8eefcilix setReady();
77a4a003111bd5cfb771d4849801c898aeb889b0cilix}
77a4a003111bd5cfb771d4849801c898aeb889b0cilix
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm/*
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * Here be the doEffect function chain:
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm */
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmvoid
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmEffect::doEffect (SPCurve * curve)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński Geom::PathVector orig_pathv = curve->get_pathvector();
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński Geom::PathVector result_pathv = doEffect_path(orig_pathv);
dda97aeba7480d08320ebceecae13b8531db1b81johanengelen
a2fbdfc8e80d3d1845bf0d5df989726ae2ffd5bfjohanengelen curve->set_pathvector(result_pathv);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof KosińskiGeom::PathVector
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof KosińskiEffect::doEffect_path (Geom::PathVector const & path_in)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński Geom::PathVector path_out;
46c4893a7458eda6edcd064121bc000634af7a09johanengelen
46c4893a7458eda6edcd064121bc000634af7a09johanengelen if ( !concatenate_before_pwd2 ) {
46c4893a7458eda6edcd064121bc000634af7a09johanengelen // default behavior
46c4893a7458eda6edcd064121bc000634af7a09johanengelen for (unsigned int i=0; i < path_in.size(); i++) {
46c4893a7458eda6edcd064121bc000634af7a09johanengelen Geom::Piecewise<Geom::D2<Geom::SBasis> > pwd2_in = path_in[i].toPwSb();
46c4893a7458eda6edcd064121bc000634af7a09johanengelen Geom::Piecewise<Geom::D2<Geom::SBasis> > pwd2_out = doEffect_pwd2(pwd2_in);
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński Geom::PathVector path = Geom::path_from_piecewise( pwd2_out, LPE_CONVERSION_TOLERANCE);
46c4893a7458eda6edcd064121bc000634af7a09johanengelen // add the output path vector to the already accumulated vector:
46c4893a7458eda6edcd064121bc000634af7a09johanengelen for (unsigned int j=0; j < path.size(); j++) {
46c4893a7458eda6edcd064121bc000634af7a09johanengelen path_out.push_back(path[j]);
46c4893a7458eda6edcd064121bc000634af7a09johanengelen }
46c4893a7458eda6edcd064121bc000634af7a09johanengelen }
46c4893a7458eda6edcd064121bc000634af7a09johanengelen } else {
46c4893a7458eda6edcd064121bc000634af7a09johanengelen // concatenate the path into possibly discontinuous pwd2
46c4893a7458eda6edcd064121bc000634af7a09johanengelen Geom::Piecewise<Geom::D2<Geom::SBasis> > pwd2_in;
46c4893a7458eda6edcd064121bc000634af7a09johanengelen for (unsigned int i=0; i < path_in.size(); i++) {
46c4893a7458eda6edcd064121bc000634af7a09johanengelen pwd2_in.concat( path_in[i].toPwSb() );
46c4893a7458eda6edcd064121bc000634af7a09johanengelen }
46c4893a7458eda6edcd064121bc000634af7a09johanengelen Geom::Piecewise<Geom::D2<Geom::SBasis> > pwd2_out = doEffect_pwd2(pwd2_in);
46c4893a7458eda6edcd064121bc000634af7a09johanengelen path_out = Geom::path_from_piecewise( pwd2_out, LPE_CONVERSION_TOLERANCE);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm return path_out;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmGeom::Piecewise<Geom::D2<Geom::SBasis> >
ecda720053ff791e35dae3c5c1177bc225b6cdf1johanengelenEffect::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwd2_in)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm g_warning("Effect has no doEffect implementation");
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm return pwd2_in;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmvoid
0b2d8abc1011ad865fce3b883ccb2587cb15cc90Johan B. C. EngelenEffect::readallParameters(Inkscape::XML::Node const* repr)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen std::vector<Parameter *>::iterator it = param_vector.begin();
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen while (it != param_vector.end()) {
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen Parameter * param = *it;
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen const gchar * key = param->param_key.c_str();
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm const gchar * value = repr->attribute(key);
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen if (value) {
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen bool accepted = param->param_readSVGValue(value);
2d107ef9730aff3f4d776ae0c2f7d983e289ce02joncruz if (!accepted) {
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen g_warning("Effect::readallParameters - '%s' not accepted for %s", value, key);
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen }
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen } else {
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen // set default value
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen param->param_set_default();
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen
84d6d1f7365e49f2936df9df890ce49d2c000ce2Kris ++it;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
0fc5ce7045233dae7e15fdc86774370f1b1d73cbjohanengelen/* This function does not and SHOULD NOT write to XML */
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmvoid
0fc5ce7045233dae7e15fdc86774370f1b1d73cbjohanengelenEffect::setParameter(const gchar * key, const gchar * new_value)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen Parameter * param = getParameter(key);
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen if (param) {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm if (new_value) {
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen bool accepted = param->param_readSVGValue(new_value);
2d107ef9730aff3f4d776ae0c2f7d983e289ce02joncruz if (!accepted) {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm g_warning("Effect::setParameter - '%s' not accepted for %s", new_value, key);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm } else {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm // set default value
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen param->param_set_default();
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmvoid
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmEffect::registerParameter(Parameter * param)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen param_vector.push_back(param);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
5be124ad592f5c71eca838ad2eaac9ffa953605fcilix
5be124ad592f5c71eca838ad2eaac9ffa953605fcilix/**
5be124ad592f5c71eca838ad2eaac9ffa953605fcilix * Add all registered LPE knotholder handles to the knotholder
5be124ad592f5c71eca838ad2eaac9ffa953605fcilix */
5be124ad592f5c71eca838ad2eaac9ffa953605fcilixvoid
5be124ad592f5c71eca838ad2eaac9ffa953605fcilixEffect::addHandles(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) {
797bee69297bbdd86c5cff2e0771a71d1e2ac69dcilix using namespace Inkscape::LivePathEffect;
70609e4f169703506468bb8957e5d9e3d4bb4602Jabiertxof
797bee69297bbdd86c5cff2e0771a71d1e2ac69dcilix // add handles provided by the effect itself
25ad3718fb4b96b39930af8e043c8ee1e624fd10cilix addKnotHolderEntities(knotholder, desktop, item);
25ad3718fb4b96b39930af8e043c8ee1e624fd10cilix
25ad3718fb4b96b39930af8e043c8ee1e624fd10cilix // add handles provided by the effect's parameters (if any)
25ad3718fb4b96b39930af8e043c8ee1e624fd10cilix for (std::vector<Parameter *>::iterator p = param_vector.begin(); p != param_vector.end(); ++p) {
25ad3718fb4b96b39930af8e043c8ee1e624fd10cilix (*p)->addKnotHolderEntities(knotholder, desktop, item);
25ad3718fb4b96b39930af8e043c8ee1e624fd10cilix }
25ad3718fb4b96b39930af8e043c8ee1e624fd10cilix}
25ad3718fb4b96b39930af8e043c8ee1e624fd10cilix
2e2b8bd323e3693f9d86f545ce049d3f1b45d1c2cilix/**
4f6f96b37466fa06ffc85e7a0921db83bdeac757Johan B. C. Engelen * Return a vector of PathVectors which contain all canvas indicators for this effect.
4f6f96b37466fa06ffc85e7a0921db83bdeac757Johan B. C. Engelen * This is the function called by external code to get all canvas indicators (effect and its parameters)
4f6f96b37466fa06ffc85e7a0921db83bdeac757Johan B. C. Engelen * lpeitem = the item onto which this effect is applied
4f6f96b37466fa06ffc85e7a0921db83bdeac757Johan B. C. Engelen * @todo change return type to one pathvector, add all paths to one pathvector instead of maintaining a vector of pathvectors
2e2b8bd323e3693f9d86f545ce049d3f1b45d1c2cilix */
2e2b8bd323e3693f9d86f545ce049d3f1b45d1c2cilixstd::vector<Geom::PathVector>
4f6f96b37466fa06ffc85e7a0921db83bdeac757Johan B. C. EngelenEffect::getCanvasIndicators(SPLPEItem const* lpeitem)
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix{
2e2b8bd323e3693f9d86f545ce049d3f1b45d1c2cilix std::vector<Geom::PathVector> hp_vec;
2e2b8bd323e3693f9d86f545ce049d3f1b45d1c2cilix
4f6f96b37466fa06ffc85e7a0921db83bdeac757Johan B. C. Engelen // add indicators provided by the effect itself
2e2b8bd323e3693f9d86f545ce049d3f1b45d1c2cilix addCanvasIndicators(lpeitem, hp_vec);
2e2b8bd323e3693f9d86f545ce049d3f1b45d1c2cilix
4f6f96b37466fa06ffc85e7a0921db83bdeac757Johan B. C. Engelen // add indicators provided by the effect's parameters
2e2b8bd323e3693f9d86f545ce049d3f1b45d1c2cilix for (std::vector<Parameter *>::iterator p = param_vector.begin(); p != param_vector.end(); ++p) {
2e2b8bd323e3693f9d86f545ce049d3f1b45d1c2cilix (*p)->addCanvasIndicators(lpeitem, hp_vec);
732fb09f9c502000068a77667c3356cbbd5d39d5cilix }
732fb09f9c502000068a77667c3356cbbd5d39d5cilix
2e2b8bd323e3693f9d86f545ce049d3f1b45d1c2cilix return hp_vec;
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix}
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix
2e2b8bd323e3693f9d86f545ce049d3f1b45d1c2cilix/**
2e2b8bd323e3693f9d86f545ce049d3f1b45d1c2cilix * Add possible canvas indicators (i.e., helperpaths other than the original path) to \a hp_vec
2e2b8bd323e3693f9d86f545ce049d3f1b45d1c2cilix * This function should be overwritten by derived effects if they want to provide their own helperpaths.
2e2b8bd323e3693f9d86f545ce049d3f1b45d1c2cilix */
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilixvoid
0b2d8abc1011ad865fce3b883ccb2587cb15cc90Johan B. C. EngelenEffect::addCanvasIndicators(SPLPEItem const*/*lpeitem*/, std::vector<Geom::PathVector> &/*hp_vec*/)
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix{
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix}
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix
2e2b8bd323e3693f9d86f545ce049d3f1b45d1c2cilix
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen/**
73d455c08e8062e257dd052d2d690b9300434351cilix * This *creates* a new widget, management of deletion should be done by the caller
73d455c08e8062e257dd052d2d690b9300434351cilix */
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmGtk::Widget *
5cf332777b4c27336d64c273ac63bce3ee27a53dAlex ValavanisEffect::newWidget()
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen // use manage here, because after deletion of Effect object, others might still be pointing to this widget.
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen Gtk::VBox * vbox = Gtk::manage( new Gtk::VBox() );
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen vbox->set_border_width(5);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen std::vector<Parameter *>::iterator it = param_vector.begin();
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen while (it != param_vector.end()) {
96ef6190a69e8101a3c3a8ef8b01cb35042d1f9dcilix if ((*it)->widget_is_visible) {
96ef6190a69e8101a3c3a8ef8b01cb35042d1f9dcilix Parameter * param = *it;
5cf332777b4c27336d64c273ac63bce3ee27a53dAlex Valavanis Gtk::Widget * widg = param->param_newWidget();
96ef6190a69e8101a3c3a8ef8b01cb35042d1f9dcilix Glib::ustring * tip = param->param_getTooltip();
96ef6190a69e8101a3c3a8ef8b01cb35042d1f9dcilix if (widg) {
96ef6190a69e8101a3c3a8ef8b01cb35042d1f9dcilix vbox->pack_start(*widg, true, true, 2);
6192db41ab6e422a6193affbd3e68d61e184627bJon A. Cruz if (tip) {
5cf332777b4c27336d64c273ac63bce3ee27a53dAlex Valavanis widg->set_tooltip_text(*tip);
6192db41ab6e422a6193affbd3e68d61e184627bJon A. Cruz } else {
6192db41ab6e422a6193affbd3e68d61e184627bJon A. Cruz widg->set_tooltip_text("");
6192db41ab6e422a6193affbd3e68d61e184627bJon A. Cruz widg->set_has_tooltip(false);
96ef6190a69e8101a3c3a8ef8b01cb35042d1f9dcilix }
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen
84d6d1f7365e49f2936df9df890ce49d2c000ce2Kris ++it;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm return dynamic_cast<Gtk::Widget *>(vbox);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f68aabe351946119c80978525cd86564dd33e02fJon A. CruzInkscape::XML::Node *Effect::getRepr()
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
f68aabe351946119c80978525cd86564dd33e02fJon A. Cruz return lpeobj->getRepr();
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f68aabe351946119c80978525cd86564dd33e02fJon A. CruzSPDocument *Effect::getSPDoc()
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
f68aabe351946119c80978525cd86564dd33e02fJon A. Cruz if (lpeobj->document == NULL) {
f68aabe351946119c80978525cd86564dd33e02fJon A. Cruz g_message("Effect::getSPDoc() returns NULL");
f68aabe351946119c80978525cd86564dd33e02fJon A. Cruz }
f68aabe351946119c80978525cd86564dd33e02fJon A. Cruz return lpeobj->document;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelenParameter *
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelenEffect::getParameter(const char * key)
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen{
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen Glib::ustring stringkey(key);
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen std::vector<Parameter *>::iterator it = param_vector.begin();
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen while (it != param_vector.end()) {
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen Parameter * param = *it;
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen if ( param->param_key == key) {
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen return param;
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen }
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen
84d6d1f7365e49f2936df9df890ce49d2c000ce2Kris ++it;
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen }
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen return NULL;
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen}
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelenParameter *
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelenEffect::getNextOncanvasEditableParam()
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen{
af8d25189f88abf89cdbe0e180e271c94079624fbuliabyak if (param_vector.size() == 0) // no parameters
af8d25189f88abf89cdbe0e180e271c94079624fbuliabyak return NULL;
af8d25189f88abf89cdbe0e180e271c94079624fbuliabyak
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen oncanvasedit_it++;
af8d25189f88abf89cdbe0e180e271c94079624fbuliabyak if (oncanvasedit_it >= static_cast<int>(param_vector.size())) {
a0334366488989ef25fb812d7030d298c0917c96johanengelen oncanvasedit_it = 0;
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen }
a0334366488989ef25fb812d7030d298c0917c96johanengelen int old_it = oncanvasedit_it;
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen do {
a0334366488989ef25fb812d7030d298c0917c96johanengelen Parameter * param = param_vector[oncanvasedit_it];
a0334366488989ef25fb812d7030d298c0917c96johanengelen if(param && param->oncanvas_editable) {
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen return param;
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen } else {
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen oncanvasedit_it++;
f9504c822b72a774b910958446fd1e730235b7cbjoncruz if (oncanvasedit_it == static_cast<int>(param_vector.size())) { // loop round the map
a0334366488989ef25fb812d7030d298c0917c96johanengelen oncanvasedit_it = 0;
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen }
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen }
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen } while (oncanvasedit_it != old_it); // iterate until complete loop through map has been made
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen return NULL;
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen}
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelenvoid
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelenEffect::editNextParamOncanvas(SPItem * item, SPDesktop * desktop)
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen{
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen if (!desktop) return;
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen Parameter * param = getNextOncanvasEditableParam();
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen if (param) {
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen param->param_editOncanvas(item, desktop);
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen gchar *message = g_strdup_printf(_("Editing parameter <b>%s</b>."), param->param_label.c_str());
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, message);
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen g_free(message);
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen } else {
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen desktop->messageStack()->flash( Inkscape::WARNING_MESSAGE,
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen _("None of the applied path effect's parameters can be edited on-canvas.") );
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen }
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen/* This function should reset the defaults and is used for example to initialize an effect right after it has been applied to a path
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen* The nice thing about this is that this function can use knowledge of the original path and set things accordingly for example to the size or origin of the original path!
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen*/
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelenvoid
a39c187369a59e887255e3f704a3ababf2b10678Johan B. C. EngelenEffect::resetDefaults(SPItem const* /*item*/)
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen{
a69e3ca5fcc8acacf862c577620d75f472d58cecjohanengelen std::vector<Inkscape::LivePathEffect::Parameter *>::iterator p;
a69e3ca5fcc8acacf862c577620d75f472d58cecjohanengelen for (p = param_vector.begin(); p != param_vector.end(); ++p) {
a69e3ca5fcc8acacf862c577620d75f472d58cecjohanengelen (*p)->param_set_default();
a69e3ca5fcc8acacf862c577620d75f472d58cecjohanengelen (*p)->write_to_SVG();
a69e3ca5fcc8acacf862c577620d75f472d58cecjohanengelen }
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen}
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelenvoid
d37634d73670180f99a3e0ea583621373d90ec4fJohan EngelenEffect::transform_multiply(Geom::Affine const& postmul, bool set)
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen{
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen // cycle through all parameters. Most parameters will not need transformation, but path and point params do.
84d6d1f7365e49f2936df9df890ce49d2c000ce2Kris for (std::vector<Parameter *>::iterator it = param_vector.begin(); it != param_vector.end(); ++it) {
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen Parameter * param = *it;
bdd7add6c064afee52d2eabeaa18f745430e5a4djohanengelen param->param_transform_multiply(postmul, set);
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen }
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen}
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen
42ba1b712b7b430669fc49aa9facb439181081becilixbool
507f5de177a9e789927e7ac3e80ac05b27720084Johan B. C. EngelenEffect::providesKnotholder() const
42ba1b712b7b430669fc49aa9facb439181081becilix{
42ba1b712b7b430669fc49aa9facb439181081becilix // does the effect actively provide any knotholder entities of its own?
3cfad782faf34c654ec837780ed7b3fe95e82c2eJohan B. C. Engelen if (_provides_knotholder_entities) {
42ba1b712b7b430669fc49aa9facb439181081becilix return true;
3cfad782faf34c654ec837780ed7b3fe95e82c2eJohan B. C. Engelen }
42ba1b712b7b430669fc49aa9facb439181081becilix
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould // otherwise: are there any parameters that have knotholderentities?
507f5de177a9e789927e7ac3e80ac05b27720084Johan B. C. Engelen for (std::vector<Parameter *>::const_iterator p = param_vector.begin(); p != param_vector.end(); ++p) {
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould if ((*p)->providesKnotHolderEntities()) {
42ba1b712b7b430669fc49aa9facb439181081becilix return true;
42ba1b712b7b430669fc49aa9facb439181081becilix }
42ba1b712b7b430669fc49aa9facb439181081becilix }
42ba1b712b7b430669fc49aa9facb439181081becilix
42ba1b712b7b430669fc49aa9facb439181081becilix return false;
42ba1b712b7b430669fc49aa9facb439181081becilix}
42ba1b712b7b430669fc49aa9facb439181081becilix
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm} /* namespace LivePathEffect */
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm} /* namespace Inkscape */
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm/*
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm Local Variables:
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm mode:c++
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm c-file-style:"stroustrup"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm indent-tabs-mode:nil
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm fill-column:99
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm End:
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm*/
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :