index b61a078a4562cc4e24e60847b99fe7b34cb191b7..b43fd8b36788a43210b65e13692a0d0392657628 100644 (file)
// There must be a more convenient way to achieve this.
#include "sp-path.h"
#include "display/curve.h"
-#include "libnr/n-art-bpath-2geom.h"
#include <2geom/path.h>
#include <2geom/transforms.h>
namespace Inkscape {
namespace LivePathEffect {
+namespace TtC {
+
+class KnotHolderEntityAttachPt : public LPEKnotHolderEntity
+{
+public:
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual Geom::Point knot_get();
+};
+
+class KnotHolderEntityLeftEnd : public LPEKnotHolderEntity
+{
+public:
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual Geom::Point knot_get();
+};
+
+class KnotHolderEntityRightEnd : public LPEKnotHolderEntity
+{
+public:
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual Geom::Point knot_get();
+};
+
+} // namespace TtC
+
LPETangentToCurve::LPETangentToCurve(LivePathEffectObject *lpeobject) :
Effect(lpeobject),
angle(_("Angle"), _("Additional angle between tangent and curve"), "angle", &wr, this, 0.0),
length_left(_("Length left"), _("Specifies the left end of the tangent"), "length-left", &wr, this, 150),
length_right(_("Length right"), _("Specifies the right end of the tangent"), "length-right", &wr, this, 150)
{
+ show_orig_path = true;
+
registerParameter( dynamic_cast<Parameter *>(&angle) );
registerParameter( dynamic_cast<Parameter *>(&t_attach) );
registerParameter( dynamic_cast<Parameter *>(&length_left) );
registerParameter( dynamic_cast<Parameter *>(&length_right) );
+
+ registerKnotHolderHandle(new TtC::KnotHolderEntityAttachPt(), _("Adjust the point of attachment of the tangent"));
+ registerKnotHolderHandle(new TtC::KnotHolderEntityLeftEnd(), _("Adjust the \"left\" end of the tangent"));
+ registerKnotHolderHandle(new TtC::KnotHolderEntityRightEnd(), _("Adjust the \"right\" end of the tangent"));
}
LPETangentToCurve::~LPETangentToCurve()
return output;
}
-class KnotHolderEntityAttachPt : public KnotHolderEntity
-{
-public:
- virtual bool isLPEParam() { return true; }
-
- virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state);
- virtual NR::Point knot_get();
- virtual void onKnotUngrabbed();
-};
-
-class KnotHolderEntityLeftEnd : public KnotHolderEntity
-{
-public:
- virtual bool isLPEParam() { return true; }
-
- virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state);
- virtual NR::Point knot_get();
- virtual void onKnotUngrabbed();
-};
-
-class KnotHolderEntityRightEnd : public KnotHolderEntity
-{
-public:
- virtual bool isLPEParam() { return true; }
-
- virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state);
- virtual NR::Point knot_get();
- virtual void onKnotUngrabbed();
-};
-
-void
-LPETangentToCurve::addKnotHolderHandles(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item)
-{
- KnotHolderEntityLeftEnd *entity_left_end = new KnotHolderEntityLeftEnd();
- KnotHolderEntityRightEnd *entity_right_end = new KnotHolderEntityRightEnd();
- KnotHolderEntityAttachPt *entity_attach_pt = new KnotHolderEntityAttachPt();
-
- entity_left_end->create(desktop, item, knotholder,
- _("Adjust the \"left\" end of the tangent"));
- entity_right_end->create(desktop, item, knotholder,
- _("Adjust the \"right\" end of the tangent"));
- entity_attach_pt->create(desktop, item, knotholder,
- _("Adjust the point of attachment of the tangent"));
-
- knotholder->add(entity_left_end);
- knotholder->add(entity_right_end);
- knotholder->add(entity_attach_pt);
-}
+namespace TtC {
+// TODO: make this more generic
static LPETangentToCurve *
get_effect(SPItem *item)
{
}
void
-KnotHolderEntityAttachPt::knot_set(NR::Point const &p, NR::Point const &origin, guint state)
+KnotHolderEntityAttachPt::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint /*state*/)
{
- using namespace Geom;
-
- LPETangentToCurve* lpe = get_effect(item);
+ using namespace Geom;
+
+ LPETangentToCurve* lpe = get_effect(item);
+
+ Geom::Point const s = snap_knot_position(p);
// FIXME: There must be a better way of converting the path's SPCurve* to pwd2.
SPCurve *curve = sp_path_get_curve_for_edit (SP_PATH(item));
- const NArtBpath *bpath = curve->get_bpath();
+ Geom::PathVector pathv = curve->get_pathvector();
Piecewise<D2<SBasis> > pwd2;
- std::vector<Geom::Path> pathv = BPath_to_2GeomPath(bpath);
for (unsigned int i=0; i < pathv.size(); i++) {
pwd2.concat(pathv[i].toPwSb());
}
- double t0 = nearest_point(p.to_2geom(), pwd2);
+ double t0 = nearest_point(s, pwd2);
lpe->t_attach.param_set_value(t0);
// FIXME: this should not directly ask for updating the item. It should write to SVG, which triggers updating.
- sp_lpe_item_update_patheffect (SP_LPE_ITEM(item), true, true);
+ sp_lpe_item_update_patheffect (SP_LPE_ITEM(item), false, true);
}
void
-KnotHolderEntityLeftEnd::knot_set(NR::Point const &p, NR::Point const &origin, guint state)
+KnotHolderEntityLeftEnd::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint /*state*/)
{
LPETangentToCurve *lpe = get_effect(item);
-
- double lambda = Geom::nearest_point(p.to_2geom(), lpe->ptA, lpe->derivA);
+
+ Geom::Point const s = snap_knot_position(p);
+
+ double lambda = Geom::nearest_point(s, lpe->ptA, lpe->derivA);
lpe->length_left.param_set_value(-lambda);
- sp_lpe_item_update_patheffect (SP_LPE_ITEM(item), false, true);
+ sp_lpe_item_update_patheffect (SP_LPE_ITEM(item), false, true);
}
void
-KnotHolderEntityRightEnd::knot_set(NR::Point const &p, NR::Point const &origin, guint state)
+KnotHolderEntityRightEnd::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint /*state*/)
{
LPETangentToCurve *lpe = get_effect(item);
- double lambda = Geom::nearest_point(p.to_2geom(), lpe->ptA, lpe->derivA);
+ Geom::Point const s = snap_knot_position(p);
+
+ double lambda = Geom::nearest_point(s, lpe->ptA, lpe->derivA);
lpe->length_right.param_set_value(lambda);
- sp_lpe_item_update_patheffect (SP_LPE_ITEM(item), false, true);
+ sp_lpe_item_update_patheffect (SP_LPE_ITEM(item), false, true);
}
-NR::Point
+Geom::Point
KnotHolderEntityAttachPt::knot_get()
{
LPETangentToCurve* lpe = get_effect(item);
return lpe->ptA;
}
-NR::Point
+Geom::Point
KnotHolderEntityLeftEnd::knot_get()
{
LPETangentToCurve *lpe = get_effect(item);
return lpe->C;
}
-NR::Point
+Geom::Point
KnotHolderEntityRightEnd::knot_get()
{
LPETangentToCurve *lpe = get_effect(item);
return lpe->D;
}
-void
-KnotHolderEntityAttachPt::onKnotUngrabbed()
-{
- LPETangentToCurve *lpe = get_effect(item);
- lpe->t_attach.write_to_SVG();
-}
-
-void
-KnotHolderEntityLeftEnd::onKnotUngrabbed()
-{
- LPETangentToCurve *lpe = get_effect(item);
- lpe->length_left.write_to_SVG();
-}
-
-void
-KnotHolderEntityRightEnd::onKnotUngrabbed()
-{
- LPETangentToCurve *lpe = get_effect(item);
- lpe->length_right.write_to_SVG();
-}
-
-
-
-
+} // namespace TtC
} //namespace LivePathEffect
} /* namespace Inkscape */