Code

Rename LPE: mirror reflect --> mirror symmetry
[inkscape.git] / src / live_effects / lpe-spiro.cpp
index e4a0af741ed002b251679d0c1d1a6525458248c6..30c7b162cc083420ce6931f401dfc25374bd650b 100644 (file)
 #include "live_effects/bezctx_intf.h"
 #include "live_effects/spiro.h"
 
+// For handling un-continuous paths:
+#include <2geom/pathvector.h>
+#include <2geom/matrix.h>
+#include "message-stack.h"
+#include "inkscape.h"
+#include "desktop.h"
+
 typedef struct {
     bezctx base;
     SPCurve *curve;
@@ -88,12 +95,14 @@ void
 LPESpiro::setup_nodepath(Inkscape::NodePath::Path *np)
 {
     sp_nodepath_show_handles(np, false);
-    sp_nodepath_show_helperpath(np, false);
+//    sp_nodepath_show_helperpath(np, false);
 }
 
 void
 LPESpiro::doEffect(SPCurve * curve)
 {
+    Geom::PathVector original_pathv = curve->get_pathvector();
+
     SPCurve *csrc = curve->copy();
     curve->reset();
     bezctx *bc = new_bezctx_ink(curve);
@@ -168,8 +177,8 @@ LPESpiro::doEffect(SPCurve * curve)
                     double this_angle_L2 = NR::L2(this_angle);
                     double next_angle_L2 = NR::L2(next_angle);
                     double both_angles_L2 = NR::L2(this_angle + next_angle);
-                    if (this_angle_L2 > 1e-6 && 
-                        next_angle_L2 > 1e-6 && 
+                    if (this_angle_L2 > 1e-6 &&
+                        next_angle_L2 > 1e-6 &&
                         this_angle_L2 + next_angle_L2 - both_angles_L2 < 1e-3) {
                         if (this_is_line && !next_is_line) {
                             path[ip].ty = ']';
@@ -192,6 +201,18 @@ LPESpiro::doEffect(SPCurve * curve)
         ib++;
     }
     g_free (path);
+
+    // FIXME: refactor the spiro code such that it cannot generate non-continous paths!
+    // sometimes, the code above generates a path that is not continuous. if so, undo the effect by resetting the original path.
+    try {
+        curve->get_pathvector() * Geom::identity(); // tests for continuity, this makes LPE Spiro slower of course :-(
+    }
+    catch (Geom::ContinuityError & e) {
+        g_warning("Exception during LPE Spiro execution. \n %s", e.what());
+        SP_ACTIVE_DESKTOP->messageStack()->flash( Inkscape::WARNING_MESSAGE,
+            _("An exception occurred during execution of the Spiro Path Effect.") );
+        curve->set_pathvector(original_pathv);
+    }
 }
 
 }; //namespace LivePathEffect