/** \file * LPE knot effect implementation, see lpe-knot.cpp. */ /* Authors: * Jean-Francois Barraud * Johan Engelen * * Copyright (C) Johan Engelen 2007 * * Released under GNU GPL, read the file 'COPYING' for more information */ #ifndef INKSCAPE_LPE_KNOT_H #define INKSCAPE_LPE_KNOT_H #include "sp-item-group.h" #include "live_effects/effect.h" #include "live_effects/lpegroupbbox.h" #include "live_effects/parameter/parameter.h" #include "live_effects/parameter/array.h" //#include "live_effects/parameter/path.h" #include "live_effects/parameter/bool.h" #include "2geom/crossing.h" namespace Inkscape { namespace LivePathEffect { class KnotHolderEntityCrossingSwitcher; // CrossingPoint, CrossingPoints: // "point oriented" storage of crossing data (needed to find crossing nearest to a click, etc...) //TODO: evaluate how lpeknot-specific that is? Should something like this exist in 2geom? namespace LPEKnotNS {//just in case... struct CrossingPoint { Geom::Point pt; int sign; //+/-1 = positive or neg crossing, 0 = flat. unsigned i, j; //paths components meeting in this point. unsigned ni, nj; //this crossing is the ni-th along i, nj-th along j. double ti, tj; //time along paths. }; class CrossingPoints : public std::vector{ public: CrossingPoints() : std::vector() {} CrossingPoints(Geom::CrossingSet const &cs, std::vector const &path);//for self crossings only! CrossingPoints(std::vector const &paths); CrossingPoints(std::vector const &input); std::vector to_vector(); CrossingPoint get(unsigned const i, unsigned const ni); void inherit_signs(CrossingPoints const &from_other, int default_value = 1); }; } class LPEKnot : public Effect, GroupBBoxEffect { public: LPEKnot(LivePathEffectObject *lpeobject); virtual ~LPEKnot(); virtual void doBeforeEffect (SPLPEItem *lpeitem); virtual std::vector doEffect_path (std::vector const & input_path); /* the knotholder entity classes must be declared friends */ friend class KnotHolderEntityCrossingSwitcher; protected: virtual void addCanvasIndicators(SPLPEItem *lpeitem, std::vector &hp_vec); private: void updateSwitcher(); ScalarParam interruption_width; BoolParam prop_to_stroke_width; BoolParam add_stroke_width; BoolParam add_other_stroke_width; ScalarParam switcher_size; double stroke_width; ArrayParam crossing_points_vector;//svg storage of crossing_points LPEKnotNS::CrossingPoints crossing_points;//topology representation of the knot. std::vector gpaths;//the collection of all the paths in the object or group. std::vector gstroke_widths;//the collection of all the stroke widths in the object or group. //UI: please, someone, help me to improve this!! unsigned selectedCrossing;//the selected crossing Geom::Point switcher;//where to put the "switcher" helper LPEKnot(const LPEKnot&); LPEKnot& operator=(const LPEKnot&); }; } //namespace LivePathEffect } //namespace Inkscape #endif