index 472fe5d9dd51713e961624a276b7abadb497d4d0..3ea57de23f3f3110134db2e8654e8dd82d19c7ca 100644 (file)
-#define INKSCAPE_LIVEPATHEFFECT_CPP
-
/*
* Copyright (C) Johan Engelen 2007 <j.b.c.engelen@utwente.nl>
+ * Abhishek Sharma
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+//#define LPE_ENABLE_TEST_EFFECTS
+
#include "live_effects/effect.h"
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
#include "xml/node-event-vector.h"
#include "sp-object.h"
#include "attributes.h"
#include "tools-switch.h"
#include "message-stack.h"
#include "desktop.h"
-#include "nodepath.h"
-
+#include "knotholder.h"
+#include "sp-lpe-item.h"
#include "live_effects/lpeobject.h"
#include "live_effects/parameter/parameter.h"
#include <glibmm/ustring.h>
#include "live_effects/lpe-sketch.h"
#include "live_effects/lpe-vonkoch.h"
#include "live_effects/lpe-knot.h"
+#include "live_effects/lpe-rough-hatches.h"
+#include "live_effects/lpe-dynastroke.h"
#include "live_effects/lpe-test-doEffect-stack.h"
#include "live_effects/lpe-gears.h"
#include "live_effects/lpe-curvestitch.h"
#include "live_effects/lpe-text_label.h"
#include "live_effects/lpe-path_length.h"
#include "live_effects/lpe-line_segment.h"
-// end of includes
+#include "live_effects/lpe-recursiveskeleton.h"
+#include "live_effects/lpe-extrude.h"
+#include "live_effects/lpe-powerstroke.h"
+
namespace Inkscape {
namespace LivePathEffect {
const Util::EnumData<EffectType> LPETypeData[] = {
- // {constant defined in effect.h, N_("name of your effect"), "name of your effect in SVG"}
- {ANGLE_BISECTOR, N_("Angle bisector"), "angle_bisector"},
- {BEND_PATH, N_("Bend"), "bend_path"},
- {BOOLOPS, N_("Boolops"), "boolops"},
- {CIRCLE_WITH_RADIUS, N_("Circle (center+radius)"), "circle_with_radius"},
- {CIRCLE_3PTS, N_("Circle through 3 points"), "circle_3pts"},
- {CONSTRUCT_GRID, N_("Construct grid"), "construct_grid"},
+ // {constant defined in effect-enum.h, N_("name of your effect"), "name of your effect in SVG"}
#ifdef LPE_ENABLE_TEST_EFFECTS
{DOEFFECTSTACK_TEST, N_("doEffect stack test"), "doeffectstacktest"},
-#endif
- {ENVELOPE, N_("Envelope Deformation"), "envelope"},
- {FREEHAND_SHAPE, N_("Freehand Shape"), "freehand_shape"}, // this is actually a special type of PatternAlongPath, used to paste shapes in pen/pencil tool
- {GEARS, N_("Gears"), "gears"},
- {INTERPOLATE, N_("Interpolate Sub-Paths"), "interpolate"},
- {KNOT, N_("Knot"), "knot"},
+ {ANGLE_BISECTOR, N_("Angle bisector"), "angle_bisector"},
+ // TRANSLATORS: boolean operations
+ {BOOLOPS, N_("Boolops"), "boolops"},
+ {CIRCLE_WITH_RADIUS, N_("Circle (by center and radius)"), "circle_with_radius"},
+ {CIRCLE_3PTS, N_("Circle by 3 points"), "circle_3pts"},
+ {DYNASTROKE, N_("Dynamic stroke"), "dynastroke"},
+ {EXTRUDE, N_("Extrude"), "extrude"},
{LATTICE, N_("Lattice Deformation"), "lattice"},
{LINE_SEGMENT, N_("Line Segment"), "line_segment"},
{MIRROR_SYMMETRY, N_("Mirror symmetry"), "mirror_symmetry"},
{OFFSET, N_("Offset"), "offset"},
{PARALLEL, N_("Parallel"), "parallel"},
{PATH_LENGTH, N_("Path length"), "path_length"},
- {PATTERN_ALONG_PATH, N_("Pattern Along Path"), "skeletal"}, // for historic reasons, this effect is called skeletal(strokes) in Inkscape:SVG
{PERP_BISECTOR, N_("Perpendicular bisector"), "perp_bisector"},
{PERSPECTIVE_PATH, N_("Perspective path"), "perspective_path"},
+ {POWERSTROKE, N_("Power stroke"), "powerstroke"},
{COPY_ROTATE, N_("Rotate copies"), "copy_rotate"},
- {RULER, N_("Ruler"), "ruler"},
- {SKETCH, N_("Sketch"), "sketch"},
- {SPIRO, N_("Spiro spline"), "spiro"},
- {CURVE_STITCH, N_("Stitch Sub-Paths"), "curvestitching"},
+ {RECURSIVE_SKELETON, N_("Recursive skeleton"), "recursive_skeleton"},
{TANGENT_TO_CURVE, N_("Tangent to curve"), "tangent_to_curve"},
{TEXT_LABEL, N_("Text label"), "text_label"},
+#endif
+/* 0.46 */
+ {BEND_PATH, N_("Bend"), "bend_path"},
+ {GEARS, N_("Gears"), "gears"},
+ {PATTERN_ALONG_PATH, N_("Pattern Along Path"), "skeletal"}, // for historic reasons, this effect is called skeletal(strokes) in Inkscape:SVG
+ {CURVE_STITCH, N_("Stitch Sub-Paths"), "curvestitching"},
+/* 0.47 */
{VONKOCH, N_("VonKoch"), "vonkoch"},
+ {KNOT, N_("Knot"), "knot"},
+ {CONSTRUCT_GRID, N_("Construct grid"), "construct_grid"},
+ {SPIRO, N_("Spiro spline"), "spiro"},
+ {ENVELOPE, N_("Envelope Deformation"), "envelope"},
+ {INTERPOLATE, N_("Interpolate Sub-Paths"), "interpolate"},
+ {ROUGH_HATCHES, N_("Hatches (rough)"), "rough_hatches"},
+ {SKETCH, N_("Sketch"), "sketch"},
+ {RULER, N_("Ruler"), "ruler"},
+/* 0.49 */
};
const Util::EnumDataConverter<EffectType> LPETypeConverter(LPETypeData, sizeof(LPETypeData)/sizeof(*LPETypeData));
int
Effect::acceptsNumClicks(EffectType type) {
switch (type) {
+ case INVALID_LPE: return -1; // in case we want to distinguish between invalid LPE and valid ones that expect zero clicks
case ANGLE_BISECTOR: return 3;
- case PERP_BISECTOR: return 2;
case CIRCLE_3PTS: return 3;
case CIRCLE_WITH_RADIUS: return 2;
+ case LINE_SEGMENT: return 2;
+ case PERP_BISECTOR: return 2;
default: return 0;
}
}
case PATTERN_ALONG_PATH:
neweffect = static_cast<Effect*> ( new LPEPatternAlongPath(lpeobj) );
break;
- case FREEHAND_SHAPE:
- neweffect = static_cast<Effect*> ( new LPEFreehandShape(lpeobj) );
- break;
case BEND_PATH:
neweffect = static_cast<Effect*> ( new LPEBendPath(lpeobj) );
break;
case SKETCH:
neweffect = static_cast<Effect*> ( new LPESketch(lpeobj) );
break;
+ case ROUGH_HATCHES:
+ neweffect = static_cast<Effect*> ( new LPERoughHatches(lpeobj) );
+ break;
case VONKOCH:
neweffect = static_cast<Effect*> ( new LPEVonKoch(lpeobj) );
break;
case KNOT:
neweffect = static_cast<Effect*> ( new LPEKnot(lpeobj) );
break;
-#ifdef LPE_ENABLE_TEST_EFFECTS
- case DOEFFECTSTACK_TEST:
- neweffect = static_cast<Effect*> ( new LPEdoEffectStackTest(lpeobj) );
- break;
-#endif
case GEARS:
neweffect = static_cast<Effect*> ( new LPEGears(lpeobj) );
break;
case LINE_SEGMENT:
neweffect = static_cast<Effect*> ( new LPELineSegment(lpeobj) );
break;
+ case DOEFFECTSTACK_TEST:
+ neweffect = static_cast<Effect*> ( new LPEdoEffectStackTest(lpeobj) );
+ break;
+ case DYNASTROKE:
+ neweffect = static_cast<Effect*> ( new LPEDynastroke(lpeobj) );
+ break;
+ case RECURSIVE_SKELETON:
+ neweffect = static_cast<Effect*> ( new LPERecursiveSkeleton(lpeobj) );
+ break;
+ case EXTRUDE:
+ neweffect = static_cast<Effect*> ( new LPEExtrude(lpeobj) );
+ break;
+ case POWERSTROKE:
+ neweffect = static_cast<Effect*> ( new LPEPowerStroke(lpeobj) );
+ break;
default:
g_warning("LivePathEffect::Effect::New called with invalid patheffect type (%d)", lpenr);
neweffect = NULL;
return neweffect;
}
-void
-Effect::createAndApply(const char* name, SPDocument *doc, SPItem *item)
+void Effect::createAndApply(const char* name, SPDocument *doc, SPItem *item)
{
// Path effect definition
- Inkscape::XML::Document *xml_doc = sp_document_repr_doc(doc);
+ Inkscape::XML::Document *xml_doc = doc->getReprDoc();
Inkscape::XML::Node *repr = xml_doc->createElement("inkscape:path-effect");
repr->setAttribute("effect", name);
is_ready(false) // is automatically set to false if providesOwnFlashPaths() is not overridden
{
registerParameter( dynamic_cast<Parameter *>(&is_visible) );
+ is_visible.widget_is_visible = false;
}
Effect::~Effect()
std::vector<Geom::PathVector> hp_vec;
if (!SP_IS_SHAPE(lpeitem)) {
- g_print ("How to handle helperpaths for non-shapes?\n");
+// g_print ("How to handle helperpaths for non-shapes?\n"); // non-shapes are for example SPGroups.
return hp_vec;
}
// rather than copying PathVectors all over the place
if (show_orig_path) {
// add original path to helperpaths
- SPCurve* curve = sp_shape_get_curve (SP_SHAPE(lpeitem));
+ SPCurve* curve = SP_SHAPE(lpeitem)->getCurve ();
hp_vec.push_back(curve->get_pathvector());
}
std::vector<Parameter *>::iterator it = param_vector.begin();
while (it != param_vector.end()) {
- Parameter * param = *it;
- Gtk::Widget * widg = param->param_newWidget(tooltips);
- Glib::ustring * tip = param->param_getTooltip();
- if (widg) {
- vbox->pack_start(*widg, true, true, 2);
- if (tip != NULL) {
- tooltips->set_tip(*widg, *tip);
+ if ((*it)->widget_is_visible) {
+ Parameter * param = *it;
+ Gtk::Widget * widg = param->param_newWidget(tooltips);
+ Glib::ustring * tip = param->param_getTooltip();
+ if (widg) {
+ vbox->pack_start(*widg, true, true, 2);
+ if (tip != NULL) {
+ tooltips->set_tip(*widg, *tip);
+ }
}
}
void
Effect::resetDefaults(SPItem * /*item*/)
{
- // do nothing for simple effects
-}
-
-void
-Effect::setup_nodepath(Inkscape::NodePath::Path *np)
-{
- np->helperpath_rgba = 0xff0000ff;
- np->helperpath_width = 1.0;
+ std::vector<Inkscape::LivePathEffect::Parameter *>::iterator p;
+ for (p = param_vector.begin(); p != param_vector.end(); ++p) {
+ (*p)->param_set_default();
+ (*p)->write_to_SVG();
+ }
}
void
}
}
-// TODO: take _all_ parameters into account, not only PointParams
bool
Effect::providesKnotholder()
{
if (kh_entity_vector.size() > 0)
return true;
- // otherwise: are there any PointParams?
+ // otherwise: are there any parameters that have knotholderentities?
for (std::vector<Parameter *>::iterator p = param_vector.begin(); p != param_vector.end(); ++p) {
-// if ( Inkscape::LivePathEffect::PointParam *pointparam = dynamic_cast<Inkscape::LivePathEffect::PointParam*>(*p) ) {
- if (dynamic_cast<Inkscape::LivePathEffect::PointParam*>(*p)) {
+ if ((*p)->providesKnotHolderEntities()) {
return true;
}
}