From a2377f88de39790b2324a846f9e619d78d399afc Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Mon, 10 Nov 2014 22:35:13 +0100 Subject: adding blending support (bzr r13682.1.1) --- src/live_effects/effect.cpp | 2 +- src/live_effects/lpe-mirror_symmetry.cpp | 102 ++++++++++++++++++++++++++----- src/live_effects/lpe-mirror_symmetry.h | 5 +- 3 files changed, 93 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/live_effects/effect.cpp b/src/live_effects/effect.cpp index fbdc78f8a..9433dec7f 100644 --- a/src/live_effects/effect.cpp +++ b/src/live_effects/effect.cpp @@ -106,7 +106,6 @@ const Util::EnumData LPETypeData[] = { {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"}, @@ -153,6 +152,7 @@ const Util::EnumData LPETypeData[] = { {PERSPECTIVE_ENVELOPE, N_("Perspective/Envelope"), "perspective-envelope"}, {FILLET_CHAMFER, N_("Fillet/Chamfer"), "fillet-chamfer"}, {INTERPOLATE_POINTS, N_("Interpolate points"), "interpolate_points"}, + {MIRROR_SYMMETRY, N_("Mirror symmetry"), "mirror_symmetry"}, }; const Util::EnumDataConverter LPETypeConverter(LPETypeData, sizeof(LPETypeData)/sizeof(*LPETypeData)); diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp index 0bb67a4a2..8877ffd9c 100644 --- a/src/live_effects/lpe-mirror_symmetry.cpp +++ b/src/live_effects/lpe-mirror_symmetry.cpp @@ -21,6 +21,7 @@ #include #include <2geom/path.h> +#include <2geom/path-intersection.h> #include <2geom/transforms.h> #include <2geom/affine.h> @@ -30,11 +31,13 @@ namespace LivePathEffect { LPEMirrorSymmetry::LPEMirrorSymmetry(LivePathEffectObject *lpeobject) : Effect(lpeobject), discard_orig_path(_("Discard original path?"), _("Check this to only keep the mirrored part of the path"), "discard_orig_path", &wr, this, false), - reflection_line(_("Reflection line:"), _("Line which serves as 'mirror' for the reflection"), "reflection_line", &wr, this, "M0,0 L100,100") + joinPaths(_("Join the paths"), _("Join the resulting paths"), "joinPaths", &wr, this, true), + reflection_line(_("Reflection line:"), _("Line which serves as 'mirror' for the reflection"), "reflection_line", &wr, this, "M0,0 L1,0") { show_orig_path = true; registerParameter( dynamic_cast(&discard_orig_path) ); + registerParameter( dynamic_cast(&joinPaths) ); registerParameter( dynamic_cast(&reflection_line) ); } @@ -55,15 +58,10 @@ LPEMirrorSymmetry::doOnApply (SPLPEItem const* lpeitem) { using namespace Geom; - // fixme: what happens if the bbox is empty? - // fixme: this is probably wrong - Geom::Affine t = lpeitem->i2dt_affine(); - Geom::Rect bbox = *lpeitem->desktopVisualBounds(); + original_bbox(lpeitem); - Point A(bbox.left(), bbox.bottom()); - Point B(bbox.left(), bbox.top()); - A *= t; - B *= t; + Point A(boundingbox_X.max(), boundingbox_Y.max()); + Point B(boundingbox_X.max(), boundingbox_Y.min()); Piecewise > rline = Piecewise >(D2(Linear(A[X], B[X]), Linear(A[Y], B[Y]))); reflection_line.set_new_value(rline, true); } @@ -77,11 +75,12 @@ LPEMirrorSymmetry::doEffect_path (std::vector const & path_in) } std::vector path_out; - if (!discard_orig_path) { + std::vector mline(reflection_line.get_pathvector()); + + if (!discard_orig_path && !joinPaths) { path_out = path_in; } - std::vector mline(reflection_line.get_pathvector()); Geom::Point A(mline.front().initialPoint()); Geom::Point B(mline.back().finalPoint()); @@ -97,9 +96,84 @@ LPEMirrorSymmetry::doEffect_path (std::vector const & path_in) m = m * sca; m = m * m2.inverse(); m = m * m1; - - for (int i = 0; i < static_cast(path_in.size()); ++i) { - path_out.push_back(path_in[i] * m); + + if(joinPaths){ + for (Geom::PathVector::const_iterator path_it = path_in.begin(); + path_it != path_in.end(); ++path_it) { + if (path_it->empty()){ + continue; + } + Geom::Path original; + Geom::Path mlineExpanded; + Geom::Line lineSeparation; + lineSeparation.setPoints(mline[0].initialPoint(),mline[0].finalPoint()); + mlineExpanded.start( lineSeparation.pointAt(-100000)); + mlineExpanded.appendNew( lineSeparation.pointAt(100000)); + Geom::Crossings cs = crossings(*path_it, mlineExpanded); + double timeStart = 0.0; + //http://stackoverflow.com/questions/1560492/how-to-tell-whether-a-point-is-to-the-right-or-left-side-of-a-line + double pos = (lineSeparation.pointAt(100000)[Geom::X]-lineSeparation.pointAt(-100000)[Geom::X])*(path_it->initialPoint()[Geom::Y]-lineSeparation.pointAt(-100000)[Geom::Y]) - (lineSeparation.pointAt(100000)[Geom::Y]-lineSeparation.pointAt(-100000)[Geom::Y])*(path_it->initialPoint()[Geom::X]-lineSeparation.pointAt(-100000)[Geom::X]); + int position = (pos < 0) ? -1 : (pos > 0); + unsigned int counter = 0; + + for(unsigned int i = 0; i < cs.size(); i++) { + double timeEnd = cs[i].ta; + Geom::Path portion = path_it->portion(timeStart, timeEnd); + if(position == -1 && i==0){ + counter++; + } + if(counter%2!=0){ + if (!discard_orig_path){ + if(i==0){ + original = portion; + } else { + original.append(portion, (Geom::Path::Stitching)1); + } + original.append(portion.reverse() * m, (Geom::Path::Stitching)1); + if (!path_it->closed()){ + path_out.push_back(original); + original.clear(); + } + } else { + path_out.push_back(portion * m); + } + } + timeStart = timeEnd; + counter++; + } + if(cs.size()!=0 && ((cs.size()%2 == 0 && position == -1)||(cs.size()%2 != 0 && position == 1))){ + Geom::Path portion = path_it->portion(timeStart, nearest_point(path_it->finalPoint(), *path_it)); + if (!discard_orig_path){ + if(!path_it->closed()){ + original = portion; + } else { + original.append(portion, (Geom::Path::Stitching)1); + } + original.append(portion.reverse() * m, (Geom::Path::Stitching)1); + if (!path_it->closed()){ + path_out.push_back(original); + original.clear(); + } + } else { + path_out.push_back(portion * m); + } + + } + if (path_it->closed() && !original.empty() && !discard_orig_path) { + original.close(); + path_out.push_back(original); + } + if(cs.size() == 0){ + path_out.push_back(*path_it); + path_out.push_back(*path_it * m); + } + } + } + + if (!joinPaths) { + for (int i = 0; i < static_cast(path_in.size()); ++i) { + path_out.push_back(path_in[i] * m); + } } return path_out; diff --git a/src/live_effects/lpe-mirror_symmetry.h b/src/live_effects/lpe-mirror_symmetry.h index a4a2b86c0..2ea8161d4 100644 --- a/src/live_effects/lpe-mirror_symmetry.h +++ b/src/live_effects/lpe-mirror_symmetry.h @@ -20,10 +20,12 @@ #include "live_effects/parameter/point.h" #include "live_effects/parameter/path.h" +#include "live_effects/lpegroupbbox.h" + namespace Inkscape { namespace LivePathEffect { -class LPEMirrorSymmetry : public Effect { +class LPEMirrorSymmetry : public Effect, GroupBBoxEffect{ public: LPEMirrorSymmetry(LivePathEffectObject *lpeobject); virtual ~LPEMirrorSymmetry(); @@ -36,6 +38,7 @@ public: private: BoolParam discard_orig_path; + BoolParam joinPaths; PathParam reflection_line; LPEMirrorSymmetry(const LPEMirrorSymmetry&); -- cgit v1.2.3 From fc813d4f7b4adb8e681abdd429bc0d9c19312ea5 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Tue, 11 Nov 2014 00:45:06 +0100 Subject: added join mode (bzr r13682.1.3) --- src/live_effects/lpe-mirror_symmetry.cpp | 47 ++++++++++---------------------- 1 file changed, 15 insertions(+), 32 deletions(-) (limited to 'src') diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp index 8877ffd9c..67f4e3f16 100644 --- a/src/live_effects/lpe-mirror_symmetry.cpp +++ b/src/live_effects/lpe-mirror_symmetry.cpp @@ -97,7 +97,7 @@ LPEMirrorSymmetry::doEffect_path (std::vector const & path_in) m = m * m2.inverse(); m = m * m1; - if(joinPaths){ + if(joinPaths && !discard_orig_path){ for (Geom::PathVector::const_iterator path_it = path_in.begin(); path_it != path_in.end(); ++path_it) { if (path_it->empty()){ @@ -123,47 +123,30 @@ LPEMirrorSymmetry::doEffect_path (std::vector const & path_in) counter++; } if(counter%2!=0){ - if (!discard_orig_path){ - if(i==0){ - original = portion; - } else { - original.append(portion, (Geom::Path::Stitching)1); - } - original.append(portion.reverse() * m, (Geom::Path::Stitching)1); - if (!path_it->closed()){ - path_out.push_back(original); - original.clear(); - } - } else { - path_out.push_back(portion * m); + original = portion; + original.append(portion.reverse() * m, (Geom::Path::Stitching)1); + if(i!=0){ + original.close(); } + path_out.push_back(original); + original.clear(); } timeStart = timeEnd; counter++; } if(cs.size()!=0 && ((cs.size()%2 == 0 && position == -1)||(cs.size()%2 != 0 && position == 1))){ Geom::Path portion = path_it->portion(timeStart, nearest_point(path_it->finalPoint(), *path_it)); - if (!discard_orig_path){ - if(!path_it->closed()){ - original = portion; - } else { - original.append(portion, (Geom::Path::Stitching)1); - } - original.append(portion.reverse() * m, (Geom::Path::Stitching)1); - if (!path_it->closed()){ - path_out.push_back(original); - original.clear(); - } + original = portion.reverse(); + original.append(portion * m, (Geom::Path::Stitching)1); + if (!path_it->closed()){ + path_out.push_back(original); } else { - path_out.push_back(portion * m); + path_out[0].append(original.reverse(), (Geom::Path::Stitching)1); + path_out[0].close(); } - - } - if (path_it->closed() && !original.empty() && !discard_orig_path) { - original.close(); - path_out.push_back(original); + original.clear(); } - if(cs.size() == 0){ + if(cs.size() == 0 && position == -1){ path_out.push_back(*path_it); path_out.push_back(*path_it * m); } -- cgit v1.2.3 From ffad504bec2b31828f6fe10edfab5ec8ef6437fb Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Tue, 11 Nov 2014 19:59:49 +0100 Subject: Code cleanup (bzr r13682.1.4) --- src/live_effects/lpe-mirror_symmetry.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp index 67f4e3f16..fa588fe96 100644 --- a/src/live_effects/lpe-mirror_symmetry.cpp +++ b/src/live_effects/lpe-mirror_symmetry.cpp @@ -107,12 +107,14 @@ LPEMirrorSymmetry::doEffect_path (std::vector const & path_in) Geom::Path mlineExpanded; Geom::Line lineSeparation; lineSeparation.setPoints(mline[0].initialPoint(),mline[0].finalPoint()); - mlineExpanded.start( lineSeparation.pointAt(-100000)); - mlineExpanded.appendNew( lineSeparation.pointAt(100000)); + Geom::Point lineStart = lineSeparation.pointAt(-100000.0); + Geom::Point lineEnd = lineSeparation.pointAt(100000.0); + mlineExpanded.start( lineStart); + mlineExpanded.appendNew( lineEnd); Geom::Crossings cs = crossings(*path_it, mlineExpanded); double timeStart = 0.0; //http://stackoverflow.com/questions/1560492/how-to-tell-whether-a-point-is-to-the-right-or-left-side-of-a-line - double pos = (lineSeparation.pointAt(100000)[Geom::X]-lineSeparation.pointAt(-100000)[Geom::X])*(path_it->initialPoint()[Geom::Y]-lineSeparation.pointAt(-100000)[Geom::Y]) - (lineSeparation.pointAt(100000)[Geom::Y]-lineSeparation.pointAt(-100000)[Geom::Y])*(path_it->initialPoint()[Geom::X]-lineSeparation.pointAt(-100000)[Geom::X]); + double pos = (lineEnd[Geom::X]-lineStart[Geom::X])*(path_it->initialPoint()[Geom::Y]-lineStart[Geom::Y]) - (lineEnd[Geom::Y]-lineStart[Geom::Y])*(path_it->initialPoint()[Geom::X]-lineStart[Geom::X]); int position = (pos < 0) ? -1 : (pos > 0); unsigned int counter = 0; -- cgit v1.2.3 From 165025d5aa43570d3905d312632199efddd45c9a Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Thu, 13 Nov 2014 18:04:22 +0100 Subject: Fixed bugs pointed by su_v. Added inverse option to merges (bzr r13682.1.6) --- src/live_effects/lpe-mirror_symmetry.cpp | 125 +++++++++++++++++++------------ src/live_effects/lpe-mirror_symmetry.h | 6 +- src/selection-chemistry.cpp | 2 +- 3 files changed, 85 insertions(+), 48 deletions(-) (limited to 'src') diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp index fa588fe96..c21c65a3e 100644 --- a/src/live_effects/lpe-mirror_symmetry.cpp +++ b/src/live_effects/lpe-mirror_symmetry.cpp @@ -19,7 +19,7 @@ #include #include #include - +#include "helper/geom.h" #include <2geom/path.h> #include <2geom/path-intersection.h> #include <2geom/transforms.h> @@ -31,13 +31,15 @@ namespace LivePathEffect { LPEMirrorSymmetry::LPEMirrorSymmetry(LivePathEffectObject *lpeobject) : Effect(lpeobject), discard_orig_path(_("Discard original path?"), _("Check this to only keep the mirrored part of the path"), "discard_orig_path", &wr, this, false), - joinPaths(_("Join the paths"), _("Join the resulting paths"), "joinPaths", &wr, this, true), + fusionPaths(_("Fusioned symetry"), _("Fusion right side whith symm"), "fusionPaths", &wr, this, true), + reverseFusion(_("Reverse fusion"), _("Reverse fusion"), "reverseFusion", &wr, this, false), reflection_line(_("Reflection line:"), _("Line which serves as 'mirror' for the reflection"), "reflection_line", &wr, this, "M0,0 L1,0") { show_orig_path = true; registerParameter( dynamic_cast(&discard_orig_path) ); - registerParameter( dynamic_cast(&joinPaths) ); + registerParameter( dynamic_cast(&fusionPaths) ); + registerParameter( dynamic_cast(&reverseFusion) ); registerParameter( dynamic_cast(&reflection_line) ); } @@ -49,6 +51,8 @@ void LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem) { SPLPEItem * item = const_cast(lpeitem); + std::vector mline(reflection_line.get_pathvector()); + lineSeparation.setPoints(mline[0].initialPoint(),mline[0].finalPoint()); item->apply_to_clippath(item); item->apply_to_mask(item); } @@ -66,6 +70,14 @@ LPEMirrorSymmetry::doOnApply (SPLPEItem const* lpeitem) reflection_line.set_new_value(rline, true); } +int +LPEMirrorSymmetry::pointSideOfLine(Geom::Point A, Geom::Point B, Geom::Point X) +{ + //http://stackoverflow.com/questions/1560492/how-to-tell-whether-a-point-is-to-the-right-or-left-side-of-a-line + double pos = (B[Geom::X]-A[Geom::X])*(X[Geom::Y]-A[Geom::Y]) - (B[Geom::Y]-A[Geom::Y])*(X[Geom::X]-A[Geom::X]); + return (pos < 0) ? -1 : (pos > 0); +} + std::vector LPEMirrorSymmetry::doEffect_path (std::vector const & path_in) { @@ -73,16 +85,20 @@ LPEMirrorSymmetry::doEffect_path (std::vector const & path_in) if ( reflection_line.get_pathvector().empty() ) { return path_in; } - + Geom::PathVector const original_pathv = pathv_to_linear_and_cubic_beziers(path_in); std::vector path_out; - std::vector mline(reflection_line.get_pathvector()); + Geom::Path mlineExpanded; + Geom::Point lineStart = lineSeparation.pointAt(-100000.0); + Geom::Point lineEnd = lineSeparation.pointAt(100000.0); + mlineExpanded.start( lineStart); + mlineExpanded.appendNew( lineEnd); - if (!discard_orig_path && !joinPaths) { + if (!discard_orig_path && !fusionPaths) { path_out = path_in; } - Geom::Point A(mline.front().initialPoint()); - Geom::Point B(mline.back().finalPoint()); + Geom::Point A(lineStart); + Geom::Point B(lineEnd); Geom::Affine m1(1.0, 0.0, 0.0, 1.0, A[0], A[1]); double hyp = Geom::distance(A, B); @@ -97,65 +113,82 @@ LPEMirrorSymmetry::doEffect_path (std::vector const & path_in) m = m * m2.inverse(); m = m * m1; - if(joinPaths && !discard_orig_path){ - for (Geom::PathVector::const_iterator path_it = path_in.begin(); - path_it != path_in.end(); ++path_it) { + if(fusionPaths && !discard_orig_path){ + for (Geom::PathVector::const_iterator path_it = original_pathv.begin(); + path_it != original_pathv.end(); ++path_it) { if (path_it->empty()){ continue; } - Geom::Path original; - Geom::Path mlineExpanded; - Geom::Line lineSeparation; - lineSeparation.setPoints(mline[0].initialPoint(),mline[0].finalPoint()); - Geom::Point lineStart = lineSeparation.pointAt(-100000.0); - Geom::Point lineEnd = lineSeparation.pointAt(100000.0); - mlineExpanded.start( lineStart); - mlineExpanded.appendNew( lineEnd); - Geom::Crossings cs = crossings(*path_it, mlineExpanded); double timeStart = 0.0; - //http://stackoverflow.com/questions/1560492/how-to-tell-whether-a-point-is-to-the-right-or-left-side-of-a-line - double pos = (lineEnd[Geom::X]-lineStart[Geom::X])*(path_it->initialPoint()[Geom::Y]-lineStart[Geom::Y]) - (lineEnd[Geom::Y]-lineStart[Geom::Y])*(path_it->initialPoint()[Geom::X]-lineStart[Geom::X]); - int position = (pos < 0) ? -1 : (pos > 0); - unsigned int counter = 0; - + int position = 0; + bool end_open = false; + if (path_it->closed()) { + const Geom::Curve &closingline = path_it->back_closed(); + if (!are_near(closingline.initialPoint(), closingline.finalPoint())) { + end_open = true; + } + } + Geom::Path original = (Geom::Path)(*path_it); + if(end_open && path_it->closed()){ + original.close(false); + original.appendNew( original.initialPoint() ); + original.close(true); + } + Geom::Crossings cs = crossings(original, mlineExpanded); for(unsigned int i = 0; i < cs.size(); i++) { double timeEnd = cs[i].ta; - Geom::Path portion = path_it->portion(timeStart, timeEnd); - if(position == -1 && i==0){ - counter++; + Geom::Path portion = original.portion(timeStart, timeEnd); + Geom::Point middle = portion.pointAt((double)portion.size()/2.0); + position = pointSideOfLine(lineStart, lineEnd, middle); + if(reverseFusion){ + position *= -1; } - if(counter%2!=0){ - original = portion; - original.append(portion.reverse() * m, (Geom::Path::Stitching)1); + if(position == -1){ + Geom::Path mirror = portion.reverse() * m; + mirror.setInitial(portion.finalPoint()); + portion.append(mirror); if(i!=0){ - original.close(); + portion.setFinal(portion.initialPoint()); + portion.close(); } - path_out.push_back(original); - original.clear(); + path_out.push_back(portion); } + portion.clear(); timeStart = timeEnd; - counter++; } - if(cs.size()!=0 && ((cs.size()%2 == 0 && position == -1)||(cs.size()%2 != 0 && position == 1))){ - Geom::Path portion = path_it->portion(timeStart, nearest_point(path_it->finalPoint(), *path_it)); - original = portion.reverse(); - original.append(portion * m, (Geom::Path::Stitching)1); - if (!path_it->closed()){ - path_out.push_back(original); + position = pointSideOfLine(lineStart, lineEnd, original.finalPoint()); + if(reverseFusion){ + position *= -1; + } + if(cs.size()!=0 && position == -1){ + Geom::Path portion = original.portion(timeStart, original.size()); + portion = portion.reverse(); + Geom::Path mirror = portion.reverse() * m; + mirror.setInitial(portion.finalPoint()); + portion.append(mirror); + portion = portion.reverse(); + if (!original.closed()){ + path_out.push_back(portion); } else { - path_out[0].append(original.reverse(), (Geom::Path::Stitching)1); + if(cs.size() >1 ){ + portion.setFinal(path_out[0].initialPoint()); + portion.setInitial(path_out[0].finalPoint()); + path_out[0].append(portion); + } else { + path_out.push_back(portion); + } path_out[0].close(); } - original.clear(); + portion.clear(); } if(cs.size() == 0 && position == -1){ - path_out.push_back(*path_it); - path_out.push_back(*path_it * m); + path_out.push_back(original); + path_out.push_back(original * m); } } } - if (!joinPaths) { + if (!fusionPaths || discard_orig_path) { for (int i = 0; i < static_cast(path_in.size()); ++i) { path_out.push_back(path_in[i] * m); } diff --git a/src/live_effects/lpe-mirror_symmetry.h b/src/live_effects/lpe-mirror_symmetry.h index 2ea8161d4..c925f220f 100644 --- a/src/live_effects/lpe-mirror_symmetry.h +++ b/src/live_effects/lpe-mirror_symmetry.h @@ -34,12 +34,16 @@ public: virtual void doBeforeEffect (SPLPEItem const* lpeitem); + virtual int pointSideOfLine(Geom::Point A, Geom::Point B, Geom::Point X); + virtual std::vector doEffect_path (std::vector const & path_in); private: BoolParam discard_orig_path; - BoolParam joinPaths; + BoolParam fusionPaths; + BoolParam reverseFusion; PathParam reflection_line; + Geom::Line lineSeparation; LPEMirrorSymmetry(const LPEMirrorSymmetry&); LPEMirrorSymmetry& operator=(const LPEMirrorSymmetry&); diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp index d0ef0afea..d00e8d702 100644 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -4186,7 +4186,7 @@ void sp_selection_unset_mask(SPDesktop *desktop, bool apply_clip_path) { for ( SPObject *child = obj->firstChild() ; child; child = child->getNext() ) { // Collect all clipped paths and masks within a single group Inkscape::XML::Node *copy = SP_OBJECT(child)->getRepr()->duplicate(xml_doc); - if(copy->attribute("inkscape:original-d")) + if(copy->attribute("inkscape:original-d") && copy->attribute("inkscape:path-effect")) { copy->setAttribute("d", copy->attribute("inkscape:original-d")); } -- cgit v1.2.3 From 2a940cb92f484630523c7d859d7048f3df6e4f6e Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Thu, 13 Nov 2014 20:32:40 +0100 Subject: Six a bug on subpaths pointed by suv (bzr r13682.1.8) --- src/live_effects/lpe-mirror_symmetry.cpp | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp index c21c65a3e..6fb2bfc73 100644 --- a/src/live_effects/lpe-mirror_symmetry.cpp +++ b/src/live_effects/lpe-mirror_symmetry.cpp @@ -119,6 +119,7 @@ LPEMirrorSymmetry::doEffect_path (std::vector const & path_in) if (path_it->empty()){ continue; } + std::vector temp_path; double timeStart = 0.0; int position = 0; bool end_open = false; @@ -151,7 +152,7 @@ LPEMirrorSymmetry::doEffect_path (std::vector const & path_in) portion.setFinal(portion.initialPoint()); portion.close(); } - path_out.push_back(portion); + temp_path.push_back(portion); } portion.clear(); timeStart = timeEnd; @@ -168,23 +169,25 @@ LPEMirrorSymmetry::doEffect_path (std::vector const & path_in) portion.append(mirror); portion = portion.reverse(); if (!original.closed()){ - path_out.push_back(portion); + temp_path.push_back(portion); } else { if(cs.size() >1 ){ - portion.setFinal(path_out[0].initialPoint()); - portion.setInitial(path_out[0].finalPoint()); - path_out[0].append(portion); + portion.setFinal(temp_path[0].initialPoint()); + portion.setInitial(temp_path[0].finalPoint()); + temp_path[0].append(portion); } else { - path_out.push_back(portion); + temp_path.push_back(portion); } - path_out[0].close(); + temp_path[0].close(); } portion.clear(); } if(cs.size() == 0 && position == -1){ - path_out.push_back(original); - path_out.push_back(original * m); + temp_path.push_back(original); + temp_path.push_back(original * m); } + path_out.insert(path_out.end(), temp_path.begin(), temp_path.end()); + temp_path.clear(); } } -- cgit v1.2.3 From a5333b6abc807176319c96d66cb7111e70f4896f Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Sat, 15 Nov 2014 18:29:41 +0100 Subject: ignore this commit (bzr r13682.1.9) --- src/knotholder.cpp | 6 ++ src/live_effects/effect.cpp | 8 ++- src/live_effects/effect.h | 2 + src/live_effects/lpe-bendpath.cpp | 4 +- src/live_effects/lpe-mirror_symmetry.cpp | 103 ++++++++++++++++++++++++++++++- src/live_effects/lpe-mirror_symmetry.h | 15 +++++ src/live_effects/lpegroupbbox.cpp | 12 ++++ src/ui/dialog/livepatheffect-editor.cpp | 35 ++++++++--- 8 files changed, 171 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/knotholder.cpp b/src/knotholder.cpp index f46daa09e..28f6f5748 100644 --- a/src/knotholder.cpp +++ b/src/knotholder.cpp @@ -69,6 +69,12 @@ KnotHolder::KnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolderReleasedFun } KnotHolder::~KnotHolder() { + if(SP_IS_LPE_ITEM(item)){ + Inkscape::LivePathEffect::Effect *effect = SP_LPE_ITEM(item)->getCurrentLPE(); + if(effect){ + effect->removeHandles(); + } + } sp_object_unref(item); for (std::list::iterator i = entity.begin(); i != entity.end(); ++i) diff --git a/src/live_effects/effect.cpp b/src/live_effects/effect.cpp index eb649db62..9997b1662 100644 --- a/src/live_effects/effect.cpp +++ b/src/live_effects/effect.cpp @@ -613,7 +613,7 @@ Effect::registerParameter(Parameter * param) void Effect::addHandles(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) { using namespace Inkscape::LivePathEffect; - + knot_holder = knotholder; // add handles provided by the effect itself addKnotHolderEntities(knotholder, desktop, item); @@ -623,6 +623,12 @@ Effect::addHandles(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) { } } +void +Effect::removeHandles(){ + if(knot_holder){ + knot_holder = NULL; + } +} /** * Return a vector of PathVectors which contain all canvas indicators for this effect. * This is the function called by external code to get all canvas indicators (effect and its parameters) diff --git a/src/live_effects/effect.h b/src/live_effects/effect.h index 7da76b267..5d715c7f2 100644 --- a/src/live_effects/effect.h +++ b/src/live_effects/effect.h @@ -101,6 +101,7 @@ public: // (but spiro lpe still needs it!) virtual LPEPathFlashType pathFlashType() const { return DEFAULT; } void addHandles(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item); + void removeHandles(); std::vector getCanvasIndicators(SPLPEItem const* lpeitem); inline bool providesOwnFlashPaths() const { @@ -160,6 +161,7 @@ protected: SPLPEItem * sp_lpe_item; // these get stored in doBeforeEffect_impl, and derived classes may do as they please with them. Glib::ustring const * defaultUnit; // these get stored in doBeforeEffect_impl, and derived classes may do as they please with them. + KnotHolder *knot_holder; double current_zoom; std::vector selectedNodesPoints; SPCurve * sp_curve; diff --git a/src/live_effects/lpe-bendpath.cpp b/src/live_effects/lpe-bendpath.cpp index 33171b184..968e12518 100644 --- a/src/live_effects/lpe-bendpath.cpp +++ b/src/live_effects/lpe-bendpath.cpp @@ -137,7 +137,9 @@ LPEBendPath::resetDefaults(SPItem const* item) Geom::Point start(boundingbox_X.min(), (boundingbox_Y.max()+boundingbox_Y.min())/2); Geom::Point end(boundingbox_X.max(), (boundingbox_Y.max()+boundingbox_Y.min())/2); - + std::cout << start << "start\n"; + std::cout << start << "end\n"; + std::cout << boundingbox_X.min() << "boundingbox_X.min\n"; if ( Geom::are_near(start,end) ) { end += Geom::Point(1.,0.); } diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp index 6fb2bfc73..dc9a94b1b 100644 --- a/src/live_effects/lpe-mirror_symmetry.cpp +++ b/src/live_effects/lpe-mirror_symmetry.cpp @@ -24,23 +24,43 @@ #include <2geom/path-intersection.h> #include <2geom/transforms.h> #include <2geom/affine.h> +#include "knot-holder-entity.h" +#include "knotholder.h" namespace Inkscape { namespace LivePathEffect { +namespace MS { + +class KnotHolderEntityCenterMirrorSymmetry : public LPEKnotHolderEntity { +public: + KnotHolderEntityCenterMirrorSymmetry(LPEMirrorSymmetry *effect) : LPEKnotHolderEntity(effect) {}; + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); + virtual Geom::Point knot_get() const; +}; + +} // namespace MS + LPEMirrorSymmetry::LPEMirrorSymmetry(LivePathEffectObject *lpeobject) : Effect(lpeobject), discard_orig_path(_("Discard original path?"), _("Check this to only keep the mirrored part of the path"), "discard_orig_path", &wr, this, false), fusionPaths(_("Fusioned symetry"), _("Fusion right side whith symm"), "fusionPaths", &wr, this, true), reverseFusion(_("Reverse fusion"), _("Reverse fusion"), "reverseFusion", &wr, this, false), - reflection_line(_("Reflection line:"), _("Line which serves as 'mirror' for the reflection"), "reflection_line", &wr, this, "M0,0 L1,0") + forceX(_("Force horizontal"), _("Force horizontal"), "forceX", &wr, this, false), + forceY(_("Force vertical"), _("Force vertical"), "forceY", &wr, this, false), + reflection_line(_("Reflection line:"), _("Line which serves as 'mirror' for the reflection"), "reflection_line", &wr, this, "M0,0 L1,0"), + center(_("Center of mirroring (X or Y)"), _("Center of the mirror"), "center", &wr, this, "Adjust the center of mirroring") { show_orig_path = true; registerParameter( dynamic_cast(&discard_orig_path) ); registerParameter( dynamic_cast(&fusionPaths) ); registerParameter( dynamic_cast(&reverseFusion) ); + registerParameter( dynamic_cast(&forceX) ); + registerParameter( dynamic_cast(&forceY) ); registerParameter( dynamic_cast(&reflection_line) ); + registerParameter( dynamic_cast(¢er) ); + } LPEMirrorSymmetry::~LPEMirrorSymmetry() @@ -50,9 +70,36 @@ LPEMirrorSymmetry::~LPEMirrorSymmetry() void LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem) { + using namespace Geom; + SPLPEItem * item = const_cast(lpeitem); std::vector mline(reflection_line.get_pathvector()); - lineSeparation.setPoints(mline[0].initialPoint(),mline[0].finalPoint()); + double dist = distance(mline[0].initialPoint(),mline[0].finalPoint()); + if( !forceX && !forceY ){ + center.param_setValue(mline[0].pointAt(0.5)); + } + Point A(0,0); + Point B(0,0); + if(forceX){ + A = Geom::Point(center[X]+(dist/2.0),center[Y]); + B = Geom::Point(center[X]-(dist/2.0),center[Y]); + } + if(forceY){ + A = Geom::Point(center[X],center[Y]+(dist/2.0)); + B = Geom::Point(center[X],center[Y]-(dist/2.0)); + } + if( forceX || forceY ){ + lineSeparation.setPoints(A,B); + Piecewise > rline = Piecewise >(D2(Linear(A[X], B[X]), Linear(A[Y], B[Y]))); + reflection_line.set_new_value(rline, true); + } else { + lineSeparation.setPoints(mline[0].initialPoint(),mline[0].finalPoint()); + } + //Geom::Point const q = lineSeparation.pointAt(0.5)* lpeitem->i2dt_affine().inverse(); + if(knot_holder){ + knot_holder->update_knots(); + } + //e->knot_set(q, e->knot->drag_origin * lpeitem->i2dt_affine().inverse(), (guint)1); item->apply_to_clippath(item); item->apply_to_mask(item); } @@ -200,6 +247,58 @@ LPEMirrorSymmetry::doEffect_path (std::vector const & path_in) return path_out; } +void +LPEMirrorSymmetry::addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector &hp_vec) +{ + using namespace Geom; + + PathVector pathv; + Geom::Path mlineExpanded; + Geom::Point lineStart = lineSeparation.pointAt(-100000.0); + Geom::Point lineEnd = lineSeparation.pointAt(100000.0); + mlineExpanded.start( lineStart); + mlineExpanded.appendNew( lineEnd); + pathv.push_back(mlineExpanded); + hp_vec.push_back(pathv); +} + +void +LPEMirrorSymmetry::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) { + { + KnotHolderEntity *e = new MS::KnotHolderEntityCenterMirrorSymmetry(this); + e->create( desktop, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN, + _("Adjust the center") ); + knotholder->add(e); + } + +}; + +namespace MS { + +using namespace Geom; + +void +KnotHolderEntityCenterMirrorSymmetry::knot_set(Geom::Point const &p, Geom::Point const &origin, guint state) +{ + LPEMirrorSymmetry* lpe = dynamic_cast(_effect); + + Geom::Point const s = snap_knot_position(p, state); + + lpe->center.param_setValue(s); + + // 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), false, true); +} + +Geom::Point +KnotHolderEntityCenterMirrorSymmetry::knot_get() const +{ + LPEMirrorSymmetry const *lpe = dynamic_cast(_effect); + return lpe->center; +} + +} // namespace CR + } //namespace LivePathEffect } /* namespace Inkscape */ diff --git a/src/live_effects/lpe-mirror_symmetry.h b/src/live_effects/lpe-mirror_symmetry.h index c925f220f..4b2c9aea0 100644 --- a/src/live_effects/lpe-mirror_symmetry.h +++ b/src/live_effects/lpe-mirror_symmetry.h @@ -25,6 +25,11 @@ namespace Inkscape { namespace LivePathEffect { +namespace MS { + // we need a separate namespace to avoid clashes with LPEPerpBisector + class KnotHolderEntityCenterMirrorSymmetry; +} + class LPEMirrorSymmetry : public Effect, GroupBBoxEffect{ public: LPEMirrorSymmetry(LivePathEffectObject *lpeobject); @@ -38,12 +43,22 @@ public: virtual std::vector doEffect_path (std::vector const & path_in); + /* the knotholder entity classes must be declared friends */ + friend class MS::KnotHolderEntityCenterMirrorSymmetry; + void addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item); + +protected: + virtual void addCanvasIndicators(SPLPEItem const *lpeitem, std::vector &hp_vec); + private: BoolParam discard_orig_path; BoolParam fusionPaths; BoolParam reverseFusion; + BoolParam forceX; + BoolParam forceY; PathParam reflection_line; Geom::Line lineSeparation; + PointParam center; LPEMirrorSymmetry(const LPEMirrorSymmetry&); LPEMirrorSymmetry& operator=(const LPEMirrorSymmetry&); diff --git a/src/live_effects/lpegroupbbox.cpp b/src/live_effects/lpegroupbbox.cpp index 2a1b70a6a..78545e9c5 100644 --- a/src/live_effects/lpegroupbbox.cpp +++ b/src/live_effects/lpegroupbbox.cpp @@ -8,6 +8,7 @@ #include "live_effects/lpegroupbbox.h" #include "sp-item.h" +#include "sp-item-group.h" namespace Inkscape { namespace LivePathEffect { @@ -34,9 +35,20 @@ void GroupBBoxEffect::original_bbox(SPLPEItem const* lpeitem, bool absolute) } Geom::OptRect bbox = lpeitem->geometricBounds(transform); + std::cout << bbox->hasZeroArea() << "=AREA\n"; + if(bbox->hasZeroArea() && SP_IS_GROUP(lpeitem)){ + bbox = (Geom::OptRect)SP_GROUP(lpeitem)->bbox(transform, SPLPEItem::GEOMETRIC_BBOX); + //GSList const *items = sp_item_group_item_list(SPGroup * group); + //for ( GSList const *i = items ; i != NULL ; i = i->next ) { + // bbox.unionWith(SP_ITEM(i->data)->desktopGeometricBounds()); + //} + } + std::cout << bbox->hasZeroArea() << "=AREA222\n"; if (bbox) { boundingbox_X = (*bbox)[Geom::X]; boundingbox_Y = (*bbox)[Geom::Y]; + std::cout << boundingbox_X << "=BBOXX\n"; + std::cout << boundingbox_Y << "=BBOXY\n"; } else { boundingbox_X = Geom::Interval(); boundingbox_Y = Geom::Interval(); diff --git a/src/ui/dialog/livepatheffect-editor.cpp b/src/ui/dialog/livepatheffect-editor.cpp index eb3857ee7..e9c012ff5 100644 --- a/src/ui/dialog/livepatheffect-editor.cpp +++ b/src/ui/dialog/livepatheffect-editor.cpp @@ -292,8 +292,11 @@ LivePathEffectEditor::onSelectionChanged(Inkscape::Selection *sel) effectlist_store->clear(); current_lpeitem = NULL; - if ( sel && !sel->isEmpty() ) { - SPItem *item = sel->singleItem(); + if ( sel && (sel->isEmpty() || sel->singleItem())) { + SPItem * item= SP_ITEM(current_desktop->currentRoot()); + if(!sel->isEmpty()){ + item = sel->singleItem(); + } if ( item ) { SPLPEItem *lpeitem = dynamic_cast(item); if ( lpeitem ) { @@ -422,8 +425,11 @@ void LivePathEffectEditor::onAdd() { Inkscape::Selection *sel = _getSelection(); - if ( sel && !sel->isEmpty() ) { - SPItem *item = sel->singleItem(); + if ( sel && (sel->isEmpty() || sel->singleItem())) { + SPItem * item= SP_ITEM(current_desktop->currentRoot()); + if(!sel->isEmpty()){ + item = sel->singleItem(); + } if (item) { if ( dynamic_cast(item) ) { // show effectlist dialog @@ -500,8 +506,11 @@ void LivePathEffectEditor::onRemove() { Inkscape::Selection *sel = _getSelection(); - if ( sel && !sel->isEmpty() ) { - SPItem *item = sel->singleItem(); + if ( sel && (sel->isEmpty() || sel->singleItem())) { + SPItem * item= SP_ITEM(current_desktop->currentRoot()); + if(!sel->isEmpty()){ + item = sel->singleItem(); + } SPLPEItem *lpeitem = dynamic_cast(item); if ( lpeitem ) { lpeitem->removeCurrentPathEffect(false); @@ -518,8 +527,11 @@ LivePathEffectEditor::onRemove() void LivePathEffectEditor::onUp() { Inkscape::Selection *sel = _getSelection(); - if ( sel && !sel->isEmpty() ) { - SPItem *item = sel->singleItem(); + if ( sel && (sel->isEmpty() || sel->singleItem())) { + SPItem * item= SP_ITEM(current_desktop->currentRoot()); + if(!sel->isEmpty()){ + item = sel->singleItem(); + } SPLPEItem *lpeitem = dynamic_cast(item); if ( lpeitem ) { lpeitem->upCurrentPathEffect(); @@ -535,8 +547,11 @@ void LivePathEffectEditor::onUp() void LivePathEffectEditor::onDown() { Inkscape::Selection *sel = _getSelection(); - if ( sel && !sel->isEmpty() ) { - SPItem *item = sel->singleItem(); + if ( sel && (sel->isEmpty() || sel->singleItem())) { + SPItem * item= SP_ITEM(current_desktop->currentRoot()); + if(!sel->isEmpty()){ + item = sel->singleItem(); + } SPLPEItem *lpeitem = dynamic_cast(item); if ( lpeitem ) { lpeitem->downCurrentPathEffect(); -- cgit v1.2.3 From 69ef82447f23d5ebd3abc6a5903b10bbdb1b12f4 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Sat, 15 Nov 2014 18:34:32 +0100 Subject: ignore this commit (bzr r13682.1.10) --- src/knotholder.cpp | 6 - src/live_effects/effect.cpp | 10 +- src/live_effects/effect.h | 2 - src/live_effects/lpe-bendpath.cpp | 4 +- src/live_effects/lpe-fillet-chamfer.cpp | 76 +++++-- src/live_effects/lpe-fillet-chamfer.h | 4 +- src/live_effects/lpe-mirror_symmetry.cpp | 230 ++------------------- src/live_effects/lpe-mirror_symmetry.h | 24 +-- src/live_effects/lpegroupbbox.cpp | 12 -- .../parameter/filletchamferpointarray.cpp | 32 ++- src/selection-chemistry.cpp | 2 +- src/sp-item-group.cpp | 9 +- src/ui/clipboard.cpp | 7 + src/ui/dialog/livepatheffect-editor.cpp | 35 +--- src/ui/dialog/lpe-fillet-chamfer-properties.cpp | 15 +- src/ui/dialog/lpe-fillet-chamfer-properties.h | 1 + 16 files changed, 146 insertions(+), 323 deletions(-) (limited to 'src') diff --git a/src/knotholder.cpp b/src/knotholder.cpp index 28f6f5748..f46daa09e 100644 --- a/src/knotholder.cpp +++ b/src/knotholder.cpp @@ -69,12 +69,6 @@ KnotHolder::KnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolderReleasedFun } KnotHolder::~KnotHolder() { - if(SP_IS_LPE_ITEM(item)){ - Inkscape::LivePathEffect::Effect *effect = SP_LPE_ITEM(item)->getCurrentLPE(); - if(effect){ - effect->removeHandles(); - } - } sp_object_unref(item); for (std::list::iterator i = entity.begin(); i != entity.end(); ++i) diff --git a/src/live_effects/effect.cpp b/src/live_effects/effect.cpp index 9997b1662..e49a15dd0 100644 --- a/src/live_effects/effect.cpp +++ b/src/live_effects/effect.cpp @@ -106,6 +106,7 @@ const Util::EnumData LPETypeData[] = { {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"}, @@ -152,7 +153,6 @@ const Util::EnumData LPETypeData[] = { {PERSPECTIVE_ENVELOPE, N_("Perspective/Envelope"), "perspective-envelope"}, {FILLET_CHAMFER, N_("Fillet/Chamfer"), "fillet-chamfer"}, {INTERPOLATE_POINTS, N_("Interpolate points"), "interpolate_points"}, - {MIRROR_SYMMETRY, N_("Mirror symmetry"), "mirror_symmetry"}, }; const Util::EnumDataConverter LPETypeConverter(LPETypeData, sizeof(LPETypeData)/sizeof(*LPETypeData)); @@ -613,7 +613,7 @@ Effect::registerParameter(Parameter * param) void Effect::addHandles(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) { using namespace Inkscape::LivePathEffect; - knot_holder = knotholder; + // add handles provided by the effect itself addKnotHolderEntities(knotholder, desktop, item); @@ -623,12 +623,6 @@ Effect::addHandles(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) { } } -void -Effect::removeHandles(){ - if(knot_holder){ - knot_holder = NULL; - } -} /** * Return a vector of PathVectors which contain all canvas indicators for this effect. * This is the function called by external code to get all canvas indicators (effect and its parameters) diff --git a/src/live_effects/effect.h b/src/live_effects/effect.h index 5d715c7f2..7da76b267 100644 --- a/src/live_effects/effect.h +++ b/src/live_effects/effect.h @@ -101,7 +101,6 @@ public: // (but spiro lpe still needs it!) virtual LPEPathFlashType pathFlashType() const { return DEFAULT; } void addHandles(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item); - void removeHandles(); std::vector getCanvasIndicators(SPLPEItem const* lpeitem); inline bool providesOwnFlashPaths() const { @@ -161,7 +160,6 @@ protected: SPLPEItem * sp_lpe_item; // these get stored in doBeforeEffect_impl, and derived classes may do as they please with them. Glib::ustring const * defaultUnit; // these get stored in doBeforeEffect_impl, and derived classes may do as they please with them. - KnotHolder *knot_holder; double current_zoom; std::vector selectedNodesPoints; SPCurve * sp_curve; diff --git a/src/live_effects/lpe-bendpath.cpp b/src/live_effects/lpe-bendpath.cpp index 968e12518..33171b184 100644 --- a/src/live_effects/lpe-bendpath.cpp +++ b/src/live_effects/lpe-bendpath.cpp @@ -137,9 +137,7 @@ LPEBendPath::resetDefaults(SPItem const* item) Geom::Point start(boundingbox_X.min(), (boundingbox_Y.max()+boundingbox_Y.min())/2); Geom::Point end(boundingbox_X.max(), (boundingbox_Y.max()+boundingbox_Y.min())/2); - std::cout << start << "start\n"; - std::cout << start << "end\n"; - std::cout << boundingbox_X.min() << "boundingbox_X.min\n"; + if ( Geom::are_near(start,end) ) { end += Geom::Point(1.,0.); } diff --git a/src/live_effects/lpe-fillet-chamfer.cpp b/src/live_effects/lpe-fillet-chamfer.cpp index c89bfbd37..78e24f0b8 100644 --- a/src/live_effects/lpe-fillet-chamfer.cpp +++ b/src/live_effects/lpe-fillet-chamfer.cpp @@ -79,7 +79,7 @@ LPEFilletChamfer::LPEFilletChamfer(LivePathEffectObject *lpeobject) : radius.param_set_range(0., infinity()); radius.param_set_increments(1, 1); radius.param_set_digits(4); - chamfer_steps.param_set_range(0, infinity()); + chamfer_steps.param_set_range(0, 999); chamfer_steps.param_set_increments(1, 1); chamfer_steps.param_set_digits(0); helper_size.param_set_range(0, infinity()); @@ -116,7 +116,7 @@ Gtk::Widget *LPEFilletChamfer::newWidget() } } else if (param->param_key == "chamfer_steps") { Inkscape::UI::Widget::Scalar *widgRegistered = Gtk::manage(dynamic_cast(widg)); - widgRegistered->signal_value_changed().connect(sigc::mem_fun(*this, &LPEFilletChamfer::chamfer)); + widgRegistered->signal_value_changed().connect(sigc::mem_fun(*this, &LPEFilletChamfer::chamferSubdivisions)); widg = widgRegistered; if (widg) { Gtk::HBox *scalarParameter = dynamic_cast(widg); @@ -153,21 +153,26 @@ Gtk::Widget *LPEFilletChamfer::newWidget() ++it; } - - Gtk::VBox *buttonsContainer = Gtk::manage(new Gtk::VBox(true, 0)); + Gtk::HBox *filletContainer = Gtk::manage(new Gtk::HBox(true, 0)); Gtk::Button *fillet = Gtk::manage(new Gtk::Button(Glib::ustring(_("Fillet")))); fillet->signal_clicked().connect(sigc::mem_fun(*this, &LPEFilletChamfer::fillet)); - buttonsContainer->pack_start(*fillet, true, true, 2); - Gtk::Button *inverse = Gtk::manage(new Gtk::Button(Glib::ustring(_("Inverse fillet")))); - inverse->signal_clicked().connect(sigc::mem_fun(*this, &LPEFilletChamfer::inverse)); - buttonsContainer->pack_start(*inverse, true, true, 2); - + filletContainer->pack_start(*fillet, true, true, 2); + Gtk::Button *inverseFillet = Gtk::manage(new Gtk::Button(Glib::ustring(_("Inverse fillet")))); + inverseFillet->signal_clicked().connect(sigc::mem_fun(*this, &LPEFilletChamfer::inverseFillet)); + filletContainer->pack_start(*inverseFillet, true, true, 2); + + Gtk::HBox *chamferContainer = Gtk::manage(new Gtk::HBox(true, 0)); Gtk::Button *chamfer = Gtk::manage(new Gtk::Button(Glib::ustring(_("Chamfer")))); chamfer->signal_clicked().connect(sigc::mem_fun(*this, &LPEFilletChamfer::chamfer)); - buttonsContainer->pack_start(*chamfer, true, true, 2); - vbox->pack_start(*buttonsContainer, true, true, 2); + chamferContainer->pack_start(*chamfer, true, true, 2); + Gtk::Button *inverseChamfer = Gtk::manage(new Gtk::Button(Glib::ustring(_("Inverse chamfer")))); + inverseChamfer->signal_clicked().connect(sigc::mem_fun(*this, &LPEFilletChamfer::inverseChamfer)); + chamferContainer->pack_start(*inverseChamfer, true, true, 2); + + vbox->pack_start(*filletContainer, true, true, 2); + vbox->pack_start(*chamferContainer, true, true, 2); return vbox; } @@ -232,17 +237,31 @@ void LPEFilletChamfer::fillet() doChangeType(path_from_piecewise(pwd2, tolerance), 1); } -void LPEFilletChamfer::inverse() +void LPEFilletChamfer::inverseFillet() { Piecewise > const &pwd2 = fillet_chamfer_values.get_pwd2(); doChangeType(path_from_piecewise(pwd2, tolerance), 2); } +void LPEFilletChamfer::chamferSubdivisions() +{ + fillet_chamfer_values.set_chamfer_steps(chamfer_steps); + Piecewise > const &pwd2 = fillet_chamfer_values.get_pwd2(); + doChangeType(path_from_piecewise(pwd2, tolerance), chamfer_steps + 5000); +} + void LPEFilletChamfer::chamfer() { - fillet_chamfer_values.set_chamfer_steps(chamfer_steps + 3); + fillet_chamfer_values.set_chamfer_steps(chamfer_steps); Piecewise > const &pwd2 = fillet_chamfer_values.get_pwd2(); - doChangeType(path_from_piecewise(pwd2, tolerance), chamfer_steps + 3); + doChangeType(path_from_piecewise(pwd2, tolerance), chamfer_steps + 3000); +} + +void LPEFilletChamfer::inverseChamfer() +{ + fillet_chamfer_values.set_chamfer_steps(chamfer_steps); + Piecewise > const &pwd2 = fillet_chamfer_values.get_pwd2(); + doChangeType(path_from_piecewise(pwd2, tolerance), chamfer_steps + 4000); } void LPEFilletChamfer::refreshKnots() @@ -333,6 +352,13 @@ void LPEFilletChamfer::doChangeType(std::vector const& original_path toggle = false; } if (toggle) { + if(type >= 5000){ + if(filletChamferData[counter][Y] >= 3000 && filletChamferData[counter][Y] < 4000){ + type = type - 2000; + } else if (filletChamferData[counter][Y] >= 4000 && filletChamferData[counter][Y] < 5000){ + type = type - 1000; + } + } result.push_back(Point(filletChamferData[counter][X], type)); } else { result.push_back(filletChamferData[counter]); @@ -552,8 +578,8 @@ LPEFilletChamfer::doEffect_path(std::vector const &path_in) } else { type = std::abs(filletChamferData[counter + 1][Y]); } - if (type >= 3) { - unsigned int chamferSubs = type-2; + if (type >= 3000 && type < 4000) { + unsigned int chamferSubs = type-2999; Geom::Path path_chamfer; path_chamfer.start(path_out.finalPoint()); if((is_straight_curve(*curve_it1) && is_straight_curve(*curve_it2Fixed) && method != FM_BEZIER )|| method == FM_ARC){ @@ -567,6 +593,22 @@ LPEFilletChamfer::doEffect_path(std::vector const &path_in) path_out.appendNew(chamferStep); } path_out.appendNew(endArcPoint); + } else if (type >= 4000 && type < 5000) { + unsigned int chamferSubs = type-3999; + Geom::Path path_chamfer; + path_chamfer.start(path_out.finalPoint()); + if((is_straight_curve(*curve_it1) && is_straight_curve(*curve_it2Fixed) && method != FM_BEZIER )|| method == FM_ARC){ + ccwToggle = ccwToggle?0:1; + path_chamfer.appendNew(rx, ry, angleArc, 0, ccwToggle, endArcPoint); + }else{ + path_chamfer.appendNew(inverseHandle1, inverseHandle2, endArcPoint); + } + double chamfer_stepsTime = 1.0/chamferSubs; + for(unsigned int i = 1; i < chamferSubs; i++){ + Geom::Point chamferStep = path_chamfer.pointAt(chamfer_stepsTime * i); + path_out.appendNew(chamferStep); + } + path_out.appendNew(endArcPoint); } else if (type == 2) { if((is_straight_curve(*curve_it1) && is_straight_curve(*curve_it2Fixed) && method != FM_BEZIER )|| method == FM_ARC){ ccwToggle = ccwToggle?0:1; @@ -574,7 +616,7 @@ LPEFilletChamfer::doEffect_path(std::vector const &path_in) }else{ path_out.appendNew(inverseHandle1, inverseHandle2, endArcPoint); } - } else { + } else if (type == 1){ if((is_straight_curve(*curve_it1) && is_straight_curve(*curve_it2Fixed) && method != FM_BEZIER )|| method == FM_ARC){ path_out.appendNew(rx, ry, angleArc, 0, ccwToggle, endArcPoint); } else { diff --git a/src/live_effects/lpe-fillet-chamfer.h b/src/live_effects/lpe-fillet-chamfer.h index e3589197c..0d6a1ff17 100644 --- a/src/live_effects/lpe-fillet-chamfer.h +++ b/src/live_effects/lpe-fillet-chamfer.h @@ -56,8 +56,10 @@ public: void toggleHide(); void toggleFlexFixed(); void chamfer(); + void chamferSubdivisions(); + void inverseChamfer(); void fillet(); - void inverse(); + void inverseFillet(); void updateFillet(); void doUpdateFillet(std::vector const& original_pathv, double power); void doChangeType(std::vector const& original_pathv, int type); diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp index dc9a94b1b..0bb67a4a2 100644 --- a/src/live_effects/lpe-mirror_symmetry.cpp +++ b/src/live_effects/lpe-mirror_symmetry.cpp @@ -19,48 +19,23 @@ #include #include #include -#include "helper/geom.h" + #include <2geom/path.h> -#include <2geom/path-intersection.h> #include <2geom/transforms.h> #include <2geom/affine.h> -#include "knot-holder-entity.h" -#include "knotholder.h" namespace Inkscape { namespace LivePathEffect { -namespace MS { - -class KnotHolderEntityCenterMirrorSymmetry : public LPEKnotHolderEntity { -public: - KnotHolderEntityCenterMirrorSymmetry(LPEMirrorSymmetry *effect) : LPEKnotHolderEntity(effect) {}; - virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); - virtual Geom::Point knot_get() const; -}; - -} // namespace MS - LPEMirrorSymmetry::LPEMirrorSymmetry(LivePathEffectObject *lpeobject) : Effect(lpeobject), discard_orig_path(_("Discard original path?"), _("Check this to only keep the mirrored part of the path"), "discard_orig_path", &wr, this, false), - fusionPaths(_("Fusioned symetry"), _("Fusion right side whith symm"), "fusionPaths", &wr, this, true), - reverseFusion(_("Reverse fusion"), _("Reverse fusion"), "reverseFusion", &wr, this, false), - forceX(_("Force horizontal"), _("Force horizontal"), "forceX", &wr, this, false), - forceY(_("Force vertical"), _("Force vertical"), "forceY", &wr, this, false), - reflection_line(_("Reflection line:"), _("Line which serves as 'mirror' for the reflection"), "reflection_line", &wr, this, "M0,0 L1,0"), - center(_("Center of mirroring (X or Y)"), _("Center of the mirror"), "center", &wr, this, "Adjust the center of mirroring") + reflection_line(_("Reflection line:"), _("Line which serves as 'mirror' for the reflection"), "reflection_line", &wr, this, "M0,0 L100,100") { show_orig_path = true; registerParameter( dynamic_cast(&discard_orig_path) ); - registerParameter( dynamic_cast(&fusionPaths) ); - registerParameter( dynamic_cast(&reverseFusion) ); - registerParameter( dynamic_cast(&forceX) ); - registerParameter( dynamic_cast(&forceY) ); registerParameter( dynamic_cast(&reflection_line) ); - registerParameter( dynamic_cast(¢er) ); - } LPEMirrorSymmetry::~LPEMirrorSymmetry() @@ -70,36 +45,7 @@ LPEMirrorSymmetry::~LPEMirrorSymmetry() void LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem) { - using namespace Geom; - SPLPEItem * item = const_cast(lpeitem); - std::vector mline(reflection_line.get_pathvector()); - double dist = distance(mline[0].initialPoint(),mline[0].finalPoint()); - if( !forceX && !forceY ){ - center.param_setValue(mline[0].pointAt(0.5)); - } - Point A(0,0); - Point B(0,0); - if(forceX){ - A = Geom::Point(center[X]+(dist/2.0),center[Y]); - B = Geom::Point(center[X]-(dist/2.0),center[Y]); - } - if(forceY){ - A = Geom::Point(center[X],center[Y]+(dist/2.0)); - B = Geom::Point(center[X],center[Y]-(dist/2.0)); - } - if( forceX || forceY ){ - lineSeparation.setPoints(A,B); - Piecewise > rline = Piecewise >(D2(Linear(A[X], B[X]), Linear(A[Y], B[Y]))); - reflection_line.set_new_value(rline, true); - } else { - lineSeparation.setPoints(mline[0].initialPoint(),mline[0].finalPoint()); - } - //Geom::Point const q = lineSeparation.pointAt(0.5)* lpeitem->i2dt_affine().inverse(); - if(knot_holder){ - knot_holder->update_knots(); - } - //e->knot_set(q, e->knot->drag_origin * lpeitem->i2dt_affine().inverse(), (guint)1); item->apply_to_clippath(item); item->apply_to_mask(item); } @@ -109,22 +55,19 @@ LPEMirrorSymmetry::doOnApply (SPLPEItem const* lpeitem) { using namespace Geom; - original_bbox(lpeitem); + // fixme: what happens if the bbox is empty? + // fixme: this is probably wrong + Geom::Affine t = lpeitem->i2dt_affine(); + Geom::Rect bbox = *lpeitem->desktopVisualBounds(); - Point A(boundingbox_X.max(), boundingbox_Y.max()); - Point B(boundingbox_X.max(), boundingbox_Y.min()); + Point A(bbox.left(), bbox.bottom()); + Point B(bbox.left(), bbox.top()); + A *= t; + B *= t; Piecewise > rline = Piecewise >(D2(Linear(A[X], B[X]), Linear(A[Y], B[Y]))); reflection_line.set_new_value(rline, true); } -int -LPEMirrorSymmetry::pointSideOfLine(Geom::Point A, Geom::Point B, Geom::Point X) -{ - //http://stackoverflow.com/questions/1560492/how-to-tell-whether-a-point-is-to-the-right-or-left-side-of-a-line - double pos = (B[Geom::X]-A[Geom::X])*(X[Geom::Y]-A[Geom::Y]) - (B[Geom::Y]-A[Geom::Y])*(X[Geom::X]-A[Geom::X]); - return (pos < 0) ? -1 : (pos > 0); -} - std::vector LPEMirrorSymmetry::doEffect_path (std::vector const & path_in) { @@ -132,20 +75,15 @@ LPEMirrorSymmetry::doEffect_path (std::vector const & path_in) if ( reflection_line.get_pathvector().empty() ) { return path_in; } - Geom::PathVector const original_pathv = pathv_to_linear_and_cubic_beziers(path_in); - std::vector path_out; - Geom::Path mlineExpanded; - Geom::Point lineStart = lineSeparation.pointAt(-100000.0); - Geom::Point lineEnd = lineSeparation.pointAt(100000.0); - mlineExpanded.start( lineStart); - mlineExpanded.appendNew( lineEnd); - if (!discard_orig_path && !fusionPaths) { + std::vector path_out; + if (!discard_orig_path) { path_out = path_in; } - Geom::Point A(lineStart); - Geom::Point B(lineEnd); + std::vector mline(reflection_line.get_pathvector()); + Geom::Point A(mline.front().initialPoint()); + Geom::Point B(mline.back().finalPoint()); Geom::Affine m1(1.0, 0.0, 0.0, 1.0, A[0], A[1]); double hyp = Geom::distance(A, B); @@ -159,146 +97,14 @@ LPEMirrorSymmetry::doEffect_path (std::vector const & path_in) m = m * sca; m = m * m2.inverse(); m = m * m1; - - if(fusionPaths && !discard_orig_path){ - for (Geom::PathVector::const_iterator path_it = original_pathv.begin(); - path_it != original_pathv.end(); ++path_it) { - if (path_it->empty()){ - continue; - } - std::vector temp_path; - double timeStart = 0.0; - int position = 0; - bool end_open = false; - if (path_it->closed()) { - const Geom::Curve &closingline = path_it->back_closed(); - if (!are_near(closingline.initialPoint(), closingline.finalPoint())) { - end_open = true; - } - } - Geom::Path original = (Geom::Path)(*path_it); - if(end_open && path_it->closed()){ - original.close(false); - original.appendNew( original.initialPoint() ); - original.close(true); - } - Geom::Crossings cs = crossings(original, mlineExpanded); - for(unsigned int i = 0; i < cs.size(); i++) { - double timeEnd = cs[i].ta; - Geom::Path portion = original.portion(timeStart, timeEnd); - Geom::Point middle = portion.pointAt((double)portion.size()/2.0); - position = pointSideOfLine(lineStart, lineEnd, middle); - if(reverseFusion){ - position *= -1; - } - if(position == -1){ - Geom::Path mirror = portion.reverse() * m; - mirror.setInitial(portion.finalPoint()); - portion.append(mirror); - if(i!=0){ - portion.setFinal(portion.initialPoint()); - portion.close(); - } - temp_path.push_back(portion); - } - portion.clear(); - timeStart = timeEnd; - } - position = pointSideOfLine(lineStart, lineEnd, original.finalPoint()); - if(reverseFusion){ - position *= -1; - } - if(cs.size()!=0 && position == -1){ - Geom::Path portion = original.portion(timeStart, original.size()); - portion = portion.reverse(); - Geom::Path mirror = portion.reverse() * m; - mirror.setInitial(portion.finalPoint()); - portion.append(mirror); - portion = portion.reverse(); - if (!original.closed()){ - temp_path.push_back(portion); - } else { - if(cs.size() >1 ){ - portion.setFinal(temp_path[0].initialPoint()); - portion.setInitial(temp_path[0].finalPoint()); - temp_path[0].append(portion); - } else { - temp_path.push_back(portion); - } - temp_path[0].close(); - } - portion.clear(); - } - if(cs.size() == 0 && position == -1){ - temp_path.push_back(original); - temp_path.push_back(original * m); - } - path_out.insert(path_out.end(), temp_path.begin(), temp_path.end()); - temp_path.clear(); - } - } - - if (!fusionPaths || discard_orig_path) { - for (int i = 0; i < static_cast(path_in.size()); ++i) { - path_out.push_back(path_in[i] * m); - } - } - return path_out; -} - -void -LPEMirrorSymmetry::addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector &hp_vec) -{ - using namespace Geom; - - PathVector pathv; - Geom::Path mlineExpanded; - Geom::Point lineStart = lineSeparation.pointAt(-100000.0); - Geom::Point lineEnd = lineSeparation.pointAt(100000.0); - mlineExpanded.start( lineStart); - mlineExpanded.appendNew( lineEnd); - pathv.push_back(mlineExpanded); - hp_vec.push_back(pathv); -} - -void -LPEMirrorSymmetry::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) { - { - KnotHolderEntity *e = new MS::KnotHolderEntityCenterMirrorSymmetry(this); - e->create( desktop, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN, - _("Adjust the center") ); - knotholder->add(e); + for (int i = 0; i < static_cast(path_in.size()); ++i) { + path_out.push_back(path_in[i] * m); } -}; - -namespace MS { - -using namespace Geom; - -void -KnotHolderEntityCenterMirrorSymmetry::knot_set(Geom::Point const &p, Geom::Point const &origin, guint state) -{ - LPEMirrorSymmetry* lpe = dynamic_cast(_effect); - - Geom::Point const s = snap_knot_position(p, state); - - lpe->center.param_setValue(s); - - // 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), false, true); -} - -Geom::Point -KnotHolderEntityCenterMirrorSymmetry::knot_get() const -{ - LPEMirrorSymmetry const *lpe = dynamic_cast(_effect); - return lpe->center; + return path_out; } -} // namespace CR - } //namespace LivePathEffect } /* namespace Inkscape */ diff --git a/src/live_effects/lpe-mirror_symmetry.h b/src/live_effects/lpe-mirror_symmetry.h index 4b2c9aea0..a4a2b86c0 100644 --- a/src/live_effects/lpe-mirror_symmetry.h +++ b/src/live_effects/lpe-mirror_symmetry.h @@ -20,17 +20,10 @@ #include "live_effects/parameter/point.h" #include "live_effects/parameter/path.h" -#include "live_effects/lpegroupbbox.h" - namespace Inkscape { namespace LivePathEffect { -namespace MS { - // we need a separate namespace to avoid clashes with LPEPerpBisector - class KnotHolderEntityCenterMirrorSymmetry; -} - -class LPEMirrorSymmetry : public Effect, GroupBBoxEffect{ +class LPEMirrorSymmetry : public Effect { public: LPEMirrorSymmetry(LivePathEffectObject *lpeobject); virtual ~LPEMirrorSymmetry(); @@ -39,26 +32,11 @@ public: virtual void doBeforeEffect (SPLPEItem const* lpeitem); - virtual int pointSideOfLine(Geom::Point A, Geom::Point B, Geom::Point X); - virtual std::vector doEffect_path (std::vector const & path_in); - /* the knotholder entity classes must be declared friends */ - friend class MS::KnotHolderEntityCenterMirrorSymmetry; - void addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item); - -protected: - virtual void addCanvasIndicators(SPLPEItem const *lpeitem, std::vector &hp_vec); - private: BoolParam discard_orig_path; - BoolParam fusionPaths; - BoolParam reverseFusion; - BoolParam forceX; - BoolParam forceY; PathParam reflection_line; - Geom::Line lineSeparation; - PointParam center; LPEMirrorSymmetry(const LPEMirrorSymmetry&); LPEMirrorSymmetry& operator=(const LPEMirrorSymmetry&); diff --git a/src/live_effects/lpegroupbbox.cpp b/src/live_effects/lpegroupbbox.cpp index 78545e9c5..2a1b70a6a 100644 --- a/src/live_effects/lpegroupbbox.cpp +++ b/src/live_effects/lpegroupbbox.cpp @@ -8,7 +8,6 @@ #include "live_effects/lpegroupbbox.h" #include "sp-item.h" -#include "sp-item-group.h" namespace Inkscape { namespace LivePathEffect { @@ -35,20 +34,9 @@ void GroupBBoxEffect::original_bbox(SPLPEItem const* lpeitem, bool absolute) } Geom::OptRect bbox = lpeitem->geometricBounds(transform); - std::cout << bbox->hasZeroArea() << "=AREA\n"; - if(bbox->hasZeroArea() && SP_IS_GROUP(lpeitem)){ - bbox = (Geom::OptRect)SP_GROUP(lpeitem)->bbox(transform, SPLPEItem::GEOMETRIC_BBOX); - //GSList const *items = sp_item_group_item_list(SPGroup * group); - //for ( GSList const *i = items ; i != NULL ; i = i->next ) { - // bbox.unionWith(SP_ITEM(i->data)->desktopGeometricBounds()); - //} - } - std::cout << bbox->hasZeroArea() << "=AREA222\n"; if (bbox) { boundingbox_X = (*bbox)[Geom::X]; boundingbox_Y = (*bbox)[Geom::Y]; - std::cout << boundingbox_X << "=BBOXX\n"; - std::cout << boundingbox_Y << "=BBOXY\n"; } else { boundingbox_X = Geom::Interval(); boundingbox_Y = Geom::Interval(); diff --git a/src/live_effects/parameter/filletchamferpointarray.cpp b/src/live_effects/parameter/filletchamferpointarray.cpp index cf9ef3132..4e2be6e88 100644 --- a/src/live_effects/parameter/filletchamferpointarray.cpp +++ b/src/live_effects/parameter/filletchamferpointarray.cpp @@ -723,7 +723,7 @@ FilletChamferPointArrayParamKnotHolderEntity( void FilletChamferPointArrayParamKnotHolderEntity::knot_set(Point const &p, Point const &/*origin*/, - guint /*state*/) + guint state) { using namespace Geom; @@ -733,7 +733,7 @@ void FilletChamferPointArrayParamKnotHolderEntity::knot_set(Point const &p, /// @todo how about item transforms??? Piecewise > const &pwd2 = _pparam->get_pwd2(); //todo: add snapping - //Geom::Point const s = snap_knot_position(p, state); + Geom::Point const s = snap_knot_position(p, state); double t = nearest_point(p, pwd2[_index]); if (t == 1) { t = 0.9999; @@ -777,13 +777,21 @@ void FilletChamferPointArrayParamKnotHolderEntity::knot_click(guint state) }else{ using namespace Geom; int type = (int)_pparam->_vector.at(_index)[Y]; - + if (type >=3000 && type < 4000){ + type = 3; + } + if (type >=4000 && type < 5000){ + type = 4; + } switch(type){ case 1: type = 2; break; case 2: - type = _pparam->chamfer_steps; + type = _pparam->chamfer_steps + 3000; + break; + case 3: + type = _pparam->chamfer_steps + 4000; break; default: type = 1; @@ -793,8 +801,12 @@ void FilletChamferPointArrayParamKnotHolderEntity::knot_click(guint state) _pparam->param_set_and_write_new_value(_pparam->_vector); sp_lpe_item_update_patheffect(SP_LPE_ITEM(item), false, false); const gchar *tip; - if (type >= 3) { - tip = _("Chamfer: Ctrl+Click toogle type, " + if (type >=3000 && type < 4000){ + tip = _("Chamfer: Ctrl+Click toogle type, " + "Shift+Click open dialog, " + "Ctrl+Alt+Click reset"); + } else if (type >=4000 && type < 5000) { + tip = _("Inverse Chamfer: Ctrl+Click toogle type, " "Shift+Click open dialog, " "Ctrl+Alt+Click reset"); } else if (type == 2) { @@ -850,8 +862,12 @@ void FilletChamferPointArrayParam::addKnotHolderEntities(KnotHolder *knotholder, continue; } const gchar *tip; - if (_vector[i][Y] >= 3) { - tip = _("Chamfer: Ctrl+Click toogle type, " + if (_vector[i][Y] >=3000 && _vector[i][Y] < 4000){ + tip = _("Chamfer: Ctrl+Click toogle type, " + "Shift+Click open dialog, " + "Ctrl+Alt+Click reset"); + } else if (_vector[i][Y] >=4000 && _vector[i][Y] < 5000) { + tip = _("Inverse Chamfer: Ctrl+Click toogle type, " "Shift+Click open dialog, " "Ctrl+Alt+Click reset"); } else if (_vector[i][Y] == 2) { diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp index d00e8d702..ffa149cee 100644 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -1643,7 +1643,7 @@ void sp_selection_apply_affine(Inkscape::Selection *selection, Geom::Affine cons item->doWriteTransform(item->getRepr(), move, &move, compensate); } else if (prefs_unmoved) { - //if (SP_IS_USE(sp_use_get_original(SP_USE(item)))) + //if (dynamic_cast(sp_use_get_original(dynamic_cast(item)))) // clone_move = Geom::identity(); Geom::Affine move = result * clone_move; item->doWriteTransform(item->getRepr(), move, &t, compensate); diff --git a/src/sp-item-group.cpp b/src/sp-item-group.cpp index 613ace5c1..992bca631 100644 --- a/src/sp-item-group.cpp +++ b/src/sp-item-group.cpp @@ -662,8 +662,13 @@ void SPGroup::scaleChildItemsRec(Geom::Scale const &sc, Geom::Point const &p, bo { if ( hasChildren() ) { for (SPObject *o = firstChild() ; o ; o = o->getNext() ) { - SPItem *item = dynamic_cast(o); - if ( item ) { + if ( SPDefs *defs = dynamic_cast(o) ) { // select symbols from defs, ignore clips, masks, patterns + for (SPObject *defschild = defs->firstChild() ; defschild ; defschild = defschild->getNext() ) { + SPGroup *defsgroup = dynamic_cast(defschild); + if (defsgroup) + defsgroup->scaleChildItemsRec(sc, p, false); + } + } else if ( SPItem *item = dynamic_cast(o) ) { SPGroup *group = dynamic_cast(item); if (group && !dynamic_cast(item)) { /* Using recursion breaks clipping because transforms are applied diff --git a/src/ui/clipboard.cpp b/src/ui/clipboard.cpp index 931a295d8..153ed9830 100644 --- a/src/ui/clipboard.cpp +++ b/src/ui/clipboard.cpp @@ -330,6 +330,13 @@ void ClipboardManagerImpl::copySymbol(Inkscape::XML::Node* symbol, gchar const* use->setAttribute("xlink:href", id.c_str() ); // Set a default style in rather than so it can be changed. use->setAttribute("style", style ); + + Inkscape::XML::Node *nv_repr = sp_desktop_namedview(inkscape_active_desktop())->getRepr(); + gdouble scale_units = Inkscape::Util::Quantity::convert(1, nv_repr->attribute("inkscape:document-units"), "px"); + gchar *transform_str = sp_svg_transform_write(Geom::Scale(scale_units, scale_units)); + use->setAttribute("transform", transform_str); + g_free(transform_str); + _root->appendChild(use); // This min and max sets offsets, we don't have any so set to zero. diff --git a/src/ui/dialog/livepatheffect-editor.cpp b/src/ui/dialog/livepatheffect-editor.cpp index e9c012ff5..eb3857ee7 100644 --- a/src/ui/dialog/livepatheffect-editor.cpp +++ b/src/ui/dialog/livepatheffect-editor.cpp @@ -292,11 +292,8 @@ LivePathEffectEditor::onSelectionChanged(Inkscape::Selection *sel) effectlist_store->clear(); current_lpeitem = NULL; - if ( sel && (sel->isEmpty() || sel->singleItem())) { - SPItem * item= SP_ITEM(current_desktop->currentRoot()); - if(!sel->isEmpty()){ - item = sel->singleItem(); - } + if ( sel && !sel->isEmpty() ) { + SPItem *item = sel->singleItem(); if ( item ) { SPLPEItem *lpeitem = dynamic_cast(item); if ( lpeitem ) { @@ -425,11 +422,8 @@ void LivePathEffectEditor::onAdd() { Inkscape::Selection *sel = _getSelection(); - if ( sel && (sel->isEmpty() || sel->singleItem())) { - SPItem * item= SP_ITEM(current_desktop->currentRoot()); - if(!sel->isEmpty()){ - item = sel->singleItem(); - } + if ( sel && !sel->isEmpty() ) { + SPItem *item = sel->singleItem(); if (item) { if ( dynamic_cast(item) ) { // show effectlist dialog @@ -506,11 +500,8 @@ void LivePathEffectEditor::onRemove() { Inkscape::Selection *sel = _getSelection(); - if ( sel && (sel->isEmpty() || sel->singleItem())) { - SPItem * item= SP_ITEM(current_desktop->currentRoot()); - if(!sel->isEmpty()){ - item = sel->singleItem(); - } + if ( sel && !sel->isEmpty() ) { + SPItem *item = sel->singleItem(); SPLPEItem *lpeitem = dynamic_cast(item); if ( lpeitem ) { lpeitem->removeCurrentPathEffect(false); @@ -527,11 +518,8 @@ LivePathEffectEditor::onRemove() void LivePathEffectEditor::onUp() { Inkscape::Selection *sel = _getSelection(); - if ( sel && (sel->isEmpty() || sel->singleItem())) { - SPItem * item= SP_ITEM(current_desktop->currentRoot()); - if(!sel->isEmpty()){ - item = sel->singleItem(); - } + if ( sel && !sel->isEmpty() ) { + SPItem *item = sel->singleItem(); SPLPEItem *lpeitem = dynamic_cast(item); if ( lpeitem ) { lpeitem->upCurrentPathEffect(); @@ -547,11 +535,8 @@ void LivePathEffectEditor::onUp() void LivePathEffectEditor::onDown() { Inkscape::Selection *sel = _getSelection(); - if ( sel && (sel->isEmpty() || sel->singleItem())) { - SPItem * item= SP_ITEM(current_desktop->currentRoot()); - if(!sel->isEmpty()){ - item = sel->singleItem(); - } + if ( sel && !sel->isEmpty() ) { + SPItem *item = sel->singleItem(); SPLPEItem *lpeitem = dynamic_cast(item); if ( lpeitem ) { lpeitem->downCurrentPathEffect(); diff --git a/src/ui/dialog/lpe-fillet-chamfer-properties.cpp b/src/ui/dialog/lpe-fillet-chamfer-properties.cpp index e55c9f8df..55a19fc51 100644 --- a/src/ui/dialog/lpe-fillet-chamfer-properties.cpp +++ b/src/ui/dialog/lpe-fillet-chamfer-properties.cpp @@ -79,12 +79,15 @@ FilletChamferPropertiesDialog::FilletChamferPropertiesDialog() _fillet_chamfer_type_inverse_fillet.set_group(_fillet_chamfer_type_group); _fillet_chamfer_type_chamfer.set_label(_("Chamfer")); _fillet_chamfer_type_chamfer.set_group(_fillet_chamfer_type_group); + _fillet_chamfer_type_inverse_chamfer.set_label(_("Inverse chamfer")); + _fillet_chamfer_type_inverse_chamfer.set_group(_fillet_chamfer_type_group); mainVBox->pack_start(_layout_table, true, true, 4); mainVBox->pack_start(_fillet_chamfer_type_fillet, true, true, 4); mainVBox->pack_start(_fillet_chamfer_type_inverse_fillet, true, true, 4); mainVBox->pack_start(_fillet_chamfer_type_chamfer, true, true, 4); + mainVBox->pack_start(_fillet_chamfer_type_inverse_chamfer, true, true, 4); // Buttons _close_button.set_use_stock(true); @@ -158,8 +161,10 @@ void FilletChamferPropertiesDialog::_apply() d_width = 1; } else if (_fillet_chamfer_type_inverse_fillet.get_active() == true) { d_width = 2; + } else if (_fillet_chamfer_type_inverse_chamfer.get_active() == true) { + d_width = _fillet_chamfer_chamfer_subdivisions.get_value() + 4000; } else { - d_width = _fillet_chamfer_chamfer_subdivisions.get_value() + 3; + d_width = _fillet_chamfer_chamfer_subdivisions.get_value() + 3000; } if (_flexible) { if (d_pos > 99.99999 || d_pos < 0) { @@ -229,8 +234,12 @@ void FilletChamferPropertiesDialog::_set_knot_point(Geom::Point knotpoint) _fillet_chamfer_type_fillet.set_active(true); } else if (knotpoint.y() == 2) { _fillet_chamfer_type_inverse_fillet.set_active(true); - } else if (knotpoint.y() >= 3) { - _fillet_chamfer_chamfer_subdivisions.set_value(knotpoint.y() - 3); + } else if (knotpoint.y() >= 3000 && knotpoint.y() < 4000) { + _fillet_chamfer_chamfer_subdivisions.set_value(knotpoint.y() - 3000); + _fillet_chamfer_type_chamfer.set_active(true); + } else if (knotpoint.y() >= 4000 && knotpoint.y() < 5000) { + _fillet_chamfer_chamfer_subdivisions.set_value(knotpoint.y() - 4000); + _fillet_chamfer_type_inverse_chamfer.set_active(true); } } diff --git a/src/ui/dialog/lpe-fillet-chamfer-properties.h b/src/ui/dialog/lpe-fillet-chamfer-properties.h index ec87addc5..3807e98c8 100644 --- a/src/ui/dialog/lpe-fillet-chamfer-properties.h +++ b/src/ui/dialog/lpe-fillet-chamfer-properties.h @@ -47,6 +47,7 @@ protected: Gtk::RadioButton _fillet_chamfer_type_fillet; Gtk::RadioButton _fillet_chamfer_type_inverse_fillet; Gtk::RadioButton _fillet_chamfer_type_chamfer; + Gtk::RadioButton _fillet_chamfer_type_inverse_chamfer; Gtk::Label _fillet_chamfer_chamfer_subdivisions_label; Gtk::SpinButton _fillet_chamfer_chamfer_subdivisions; -- cgit v1.2.3 From e7bb1921ce0a29a94fe03c321ad409e7d407611d Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Mon, 17 Nov 2014 23:27:28 +0100 Subject: adding knot improvements pointed by su_v (bzr r13682.1.13) --- src/live_effects/lpe-mirror_symmetry.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp index 4024ff83e..1205476a4 100644 --- a/src/live_effects/lpe-mirror_symmetry.cpp +++ b/src/live_effects/lpe-mirror_symmetry.cpp @@ -80,10 +80,10 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem) SPLPEItem * item = const_cast(lpeitem); std::vector mline(reflection_line.get_pathvector()); - Point A = mline[0].initialPoint(); - Point B = mline[0].finalPoint(); - Point C = mline[0].pointAt(0.5); + Point A(boundingbox_X.max(), boundingbox_Y.max()); + Point B(boundingbox_X.max(), boundingbox_Y.min()); double dist = distance(A,B); + Point C = mline[0].pointAt(0.5); if(mode == MT_X){ A = Geom::Point(center[X]+(dist/2.0),center[Y]); B = Geom::Point(center[X]-(dist/2.0),center[Y]); @@ -96,7 +96,19 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem) Piecewise > rline = Piecewise >(D2(Linear(A[X], B[X]), Linear(A[Y], B[Y]))); reflection_line.set_new_value(rline, true); } else { - center.param_setValue(C); + A = mline[0].initialPoint(); + B = mline[0].finalPoint(); + lineSeparation.setPoints(A,B); + Geom::Rotate rot = Geom::Rotate(lineSeparation.angle()); + Geom::Translate trans = Geom::Translate(center); + A = Geom::Point(center[X],center[Y]+(dist/2.0)); + B = Geom::Point(center[X],center[Y]-(dist/2.0)); + Piecewise > rline = Piecewise >(D2(Linear(A[X], B[X]), Linear(A[Y], B[Y]))); + rline *= rot; + rline *= trans; + reflection_line.set_new_value(rline, true); + A = mline[0].initialPoint(); + B = mline[0].finalPoint(); } lineSeparation.setPoints(A,B); if(knot_holder){ -- cgit v1.2.3 From b619510d9fc49fdfa636f50487acc5fea773afc9 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Tue, 18 Nov 2014 00:08:09 +0100 Subject: adding knot improvements pointed by su_v (bzr r13682.1.15) --- src/live_effects/lpe-mirror_symmetry.cpp | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp index 1205476a4..bc5dc747d 100644 --- a/src/live_effects/lpe-mirror_symmetry.cpp +++ b/src/live_effects/lpe-mirror_symmetry.cpp @@ -83,7 +83,6 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem) Point A(boundingbox_X.max(), boundingbox_Y.max()); Point B(boundingbox_X.max(), boundingbox_Y.min()); double dist = distance(A,B); - Point C = mline[0].pointAt(0.5); if(mode == MT_X){ A = Geom::Point(center[X]+(dist/2.0),center[Y]); B = Geom::Point(center[X]-(dist/2.0),center[Y]); @@ -93,27 +92,29 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem) B = Geom::Point(center[X],center[Y]-(dist/2.0)); } if( mode == MT_X || mode == MT_Y ){ - Piecewise > rline = Piecewise >(D2(Linear(A[X], B[X]), Linear(A[Y], B[Y]))); - reflection_line.set_new_value(rline, true); + Geom::Path path; + path.start( A ); + path.appendNew( B ); + reflection_line.set_new_value(path.toPwSb(), true); } else { A = mline[0].initialPoint(); B = mline[0].finalPoint(); + Point C = mline[0].pointAt(0.5); lineSeparation.setPoints(A,B); Geom::Rotate rot = Geom::Rotate(lineSeparation.angle()); Geom::Translate trans = Geom::Translate(center); A = Geom::Point(center[X],center[Y]+(dist/2.0)); B = Geom::Point(center[X],center[Y]-(dist/2.0)); - Piecewise > rline = Piecewise >(D2(Linear(A[X], B[X]), Linear(A[Y], B[Y]))); - rline *= rot; - rline *= trans; - reflection_line.set_new_value(rline, true); + Geom::Path path; + path.start( B ); + path.appendNew( A ); + path *= Geom::Affine(rot); + path *= Geom::Affine(trans); + reflection_line.set_new_value(path.toPwSb(), true); A = mline[0].initialPoint(); B = mline[0].finalPoint(); } lineSeparation.setPoints(A,B); - if(knot_holder){ - knot_holder->update_knots(); - } item->apply_to_clippath(item); item->apply_to_mask(item); } @@ -129,6 +130,8 @@ LPEMirrorSymmetry::doOnApply (SPLPEItem const* lpeitem) Point B(boundingbox_X.max(), boundingbox_Y.min()); Piecewise > rline = Piecewise >(D2(Linear(A[X], B[X]), Linear(A[Y], B[Y]))); reflection_line.set_new_value(rline, true); + Point C = rline[0].pointAt(0.5); + center.param_setValue(C); } int -- cgit v1.2.3 From 806baa5e2a2a7f7720e7fc32fa66e5055a66f765 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Tue, 18 Nov 2014 20:00:50 +0100 Subject: adding knot improvements pointed by su_v (bzr r13682.1.17) --- src/live_effects/lpe-mirror_symmetry.cpp | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp index bc5dc747d..2e34f2f6b 100644 --- a/src/live_effects/lpe-mirror_symmetry.cpp +++ b/src/live_effects/lpe-mirror_symmetry.cpp @@ -79,7 +79,6 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem) using namespace Geom; SPLPEItem * item = const_cast(lpeitem); - std::vector mline(reflection_line.get_pathvector()); Point A(boundingbox_X.max(), boundingbox_Y.max()); Point B(boundingbox_X.max(), boundingbox_Y.min()); double dist = distance(A,B); @@ -97,22 +96,23 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem) path.appendNew( B ); reflection_line.set_new_value(path.toPwSb(), true); } else { + std::vector mline(reflection_line.get_pathvector()); A = mline[0].initialPoint(); B = mline[0].finalPoint(); - Point C = mline[0].pointAt(0.5); lineSeparation.setPoints(A,B); + //Point C(boundingbox_X.max(), boundingbox_Y.middle()); Geom::Rotate rot = Geom::Rotate(lineSeparation.angle()); - Geom::Translate trans = Geom::Translate(center); + //Geom::Translate trans = Geom::Translate(center - C); A = Geom::Point(center[X],center[Y]+(dist/2.0)); B = Geom::Point(center[X],center[Y]-(dist/2.0)); Geom::Path path; - path.start( B ); - path.appendNew( A ); + path.start( A ); + path.appendNew( B ); path *= Geom::Affine(rot); - path *= Geom::Affine(trans); + //path *= Geom::Affine(trans); reflection_line.set_new_value(path.toPwSb(), true); - A = mline[0].initialPoint(); - B = mline[0].finalPoint(); + A = path.initialPoint(); + B = path.finalPoint(); } lineSeparation.setPoints(A,B); item->apply_to_clippath(item); @@ -128,9 +128,11 @@ LPEMirrorSymmetry::doOnApply (SPLPEItem const* lpeitem) Point A(boundingbox_X.max(), boundingbox_Y.max()); Point B(boundingbox_X.max(), boundingbox_Y.min()); - Piecewise > rline = Piecewise >(D2(Linear(A[X], B[X]), Linear(A[Y], B[Y]))); - reflection_line.set_new_value(rline, true); - Point C = rline[0].pointAt(0.5); + Point C(boundingbox_X.max(), boundingbox_Y.middle()); + Geom::Path path; + path.start( A ); + path.appendNew( B ); + reflection_line.set_new_value(path.toPwSb(), true); center.param_setValue(C); } @@ -152,8 +154,8 @@ LPEMirrorSymmetry::doEffect_path (std::vector const & path_in) Geom::PathVector const original_pathv = pathv_to_linear_and_cubic_beziers(path_in); std::vector path_out; Geom::Path mlineExpanded; - Geom::Point lineStart = lineSeparation.pointAt(-100000.0); - Geom::Point lineEnd = lineSeparation.pointAt(100000.0); + Geom::Point lineStart = lineSeparation.pointAt(100000.0); + Geom::Point lineEnd = lineSeparation.pointAt(-100000.0); mlineExpanded.start( lineStart); mlineExpanded.appendNew( lineEnd); @@ -271,8 +273,8 @@ LPEMirrorSymmetry::addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector PathVector pathv; Geom::Path mlineExpanded; - Geom::Point lineStart = lineSeparation.pointAt(-100000.0); - Geom::Point lineEnd = lineSeparation.pointAt(100000.0); + Geom::Point lineStart = lineSeparation.pointAt(100000.0); + Geom::Point lineEnd = lineSeparation.pointAt(-100000.0); mlineExpanded.start( lineStart); mlineExpanded.appendNew( lineEnd); pathv.push_back(mlineExpanded); -- cgit v1.2.3 From c287e23597d25cd743b44b48388a09151b18cdfc Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Fri, 21 Nov 2014 11:49:26 +0100 Subject: added knot improvements pointed by su_v (bzr r13682.1.19) --- src/live_effects/lpe-mirror_symmetry.cpp | 81 +++++++++++++++++--------------- src/live_effects/lpe-mirror_symmetry.h | 1 + 2 files changed, 44 insertions(+), 38 deletions(-) (limited to 'src') diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp index 2e34f2f6b..b0a4831f5 100644 --- a/src/live_effects/lpe-mirror_symmetry.cpp +++ b/src/live_effects/lpe-mirror_symmetry.cpp @@ -79,42 +79,48 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem) using namespace Geom; SPLPEItem * item = const_cast(lpeitem); - Point A(boundingbox_X.max(), boundingbox_Y.max()); - Point B(boundingbox_X.max(), boundingbox_Y.min()); - double dist = distance(A,B); - if(mode == MT_X){ - A = Geom::Point(center[X]+(dist/2.0),center[Y]); - B = Geom::Point(center[X]-(dist/2.0),center[Y]); - } + Point A(boundingbox_X.max(), boundingbox_Y.min()); + Point B(boundingbox_X.max(), boundingbox_Y.max()); + Point C(boundingbox_X.max(), boundingbox_Y.middle()); if(mode == MT_Y){ - A = Geom::Point(center[X],center[Y]+(dist/2.0)); - B = Geom::Point(center[X],center[Y]-(dist/2.0)); + A = Geom::Point(boundingbox_X.min(),center[Y]); + B = Geom::Point(boundingbox_X.max(),center[Y]); + } + if(mode == MT_X){ + A = Geom::Point(center[X],boundingbox_Y.min()); + B = Geom::Point(center[X],boundingbox_Y.max()); } if( mode == MT_X || mode == MT_Y ){ Geom::Path path; path.start( A ); path.appendNew( B ); reflection_line.set_new_value(path.toPwSb(), true); - } else { - std::vector mline(reflection_line.get_pathvector()); - A = mline[0].initialPoint(); - B = mline[0].finalPoint(); lineSeparation.setPoints(A,B); - //Point C(boundingbox_X.max(), boundingbox_Y.middle()); - Geom::Rotate rot = Geom::Rotate(lineSeparation.angle()); - //Geom::Translate trans = Geom::Translate(center - C); - A = Geom::Point(center[X],center[Y]+(dist/2.0)); - B = Geom::Point(center[X],center[Y]-(dist/2.0)); - Geom::Path path; - path.start( A ); - path.appendNew( B ); - path *= Geom::Affine(rot); - //path *= Geom::Affine(trans); - reflection_line.set_new_value(path.toPwSb(), true); - A = path.initialPoint(); - B = path.finalPoint(); + center.param_setValue(path.pointAt(0.5)); + if(knot_holder){ + knot_holder->update_knots(); + } + } else if( mode == MT_FREE) { + std::vector mline(reflection_line.get_pathvector()); + if(!are_near(previousCenter,center, 0.01)){ + Geom::Point trans = center - mline[0].pointAt(0.5); + mline[0] *= Geom::Affine(1,0,0,1,trans[X],trans[Y]); + A = mline[0].initialPoint(); + B = mline[0].finalPoint(); + reflection_line.set_new_value(mline[0].toPwSb(), true); + lineSeparation.setPoints(A,B); + } else { + center.param_setValue(mline[0].pointAt(0.5)); + A = mline[0].initialPoint(); + B = mline[0].finalPoint(); + lineSeparation.setPoints(A,B); + if(knot_holder){ + knot_holder->update_knots(); + } + } + previousCenter = center; } - lineSeparation.setPoints(A,B); + item->apply_to_clippath(item); item->apply_to_mask(item); } @@ -126,14 +132,15 @@ LPEMirrorSymmetry::doOnApply (SPLPEItem const* lpeitem) original_bbox(lpeitem); - Point A(boundingbox_X.max(), boundingbox_Y.max()); - Point B(boundingbox_X.max(), boundingbox_Y.min()); + Point A(boundingbox_X.max(), boundingbox_Y.min()); + Point B(boundingbox_X.max(), boundingbox_Y.max()); Point C(boundingbox_X.max(), boundingbox_Y.middle()); Geom::Path path; path.start( A ); path.appendNew( B ); reflection_line.set_new_value(path.toPwSb(), true); center.param_setValue(C); + previousCenter = center; } int @@ -154,8 +161,8 @@ LPEMirrorSymmetry::doEffect_path (std::vector const & path_in) Geom::PathVector const original_pathv = pathv_to_linear_and_cubic_beziers(path_in); std::vector path_out; Geom::Path mlineExpanded; - Geom::Point lineStart = lineSeparation.pointAt(100000.0); - Geom::Point lineEnd = lineSeparation.pointAt(-100000.0); + Geom::Point lineStart = lineSeparation.pointAt(-100000.0); + Geom::Point lineEnd = lineSeparation.pointAt(100000.0); mlineExpanded.start( lineStart); mlineExpanded.appendNew( lineEnd); @@ -210,7 +217,7 @@ LPEMirrorSymmetry::doEffect_path (std::vector const & path_in) if(reverseFusion){ position *= -1; } - if(position == -1){ + if(position == 1){ Geom::Path mirror = portion.reverse() * m; mirror.setInitial(portion.finalPoint()); portion.append(mirror); @@ -227,7 +234,7 @@ LPEMirrorSymmetry::doEffect_path (std::vector const & path_in) if(reverseFusion){ position *= -1; } - if(cs.size()!=0 && position == -1){ + if(cs.size()!=0 && position == 1){ Geom::Path portion = original.portion(timeStart, original.size()); portion = portion.reverse(); Geom::Path mirror = portion.reverse() * m; @@ -248,7 +255,7 @@ LPEMirrorSymmetry::doEffect_path (std::vector const & path_in) } portion.clear(); } - if(cs.size() == 0 && position == -1){ + if(cs.size() == 0 && position == 1){ temp_path.push_back(original); temp_path.push_back(original * m); } @@ -273,8 +280,8 @@ LPEMirrorSymmetry::addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector PathVector pathv; Geom::Path mlineExpanded; - Geom::Point lineStart = lineSeparation.pointAt(100000.0); - Geom::Point lineEnd = lineSeparation.pointAt(-100000.0); + Geom::Point lineStart = lineSeparation.pointAt(-100000.0); + Geom::Point lineEnd = lineSeparation.pointAt(100000.0); mlineExpanded.start( lineStart); mlineExpanded.appendNew( lineEnd); pathv.push_back(mlineExpanded); @@ -300,9 +307,7 @@ void KnotHolderEntityCenterMirrorSymmetry::knot_set(Geom::Point const &p, Geom::Point const &origin, guint state) { LPEMirrorSymmetry* lpe = dynamic_cast(_effect); - Geom::Point const s = snap_knot_position(p, state); - lpe->center.param_setValue(s); // FIXME: this should not directly ask for updating the item. It should write to SVG, which triggers updating. diff --git a/src/live_effects/lpe-mirror_symmetry.h b/src/live_effects/lpe-mirror_symmetry.h index 4a5ea4755..8c6c49c7d 100644 --- a/src/live_effects/lpe-mirror_symmetry.h +++ b/src/live_effects/lpe-mirror_symmetry.h @@ -64,6 +64,7 @@ private: BoolParam reverseFusion; PathParam reflection_line; Geom::Line lineSeparation; + Geom::Point previousCenter; PointParam center; LPEMirrorSymmetry(const LPEMirrorSymmetry&); -- cgit v1.2.3 From 6c067ce093126cf23d9b038011b2effa1390fd07 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Fri, 26 Dec 2014 23:57:43 +0100 Subject: warping into a layer (bzr r13682.1.21) --- src/live_effects/lpe-mirror_symmetry.cpp | 17 +++++++++++++++++ src/live_effects/lpe-mirror_symmetry.h | 3 +++ 2 files changed, 20 insertions(+) (limited to 'src') diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp index b0a4831f5..8df2eb176 100644 --- a/src/live_effects/lpe-mirror_symmetry.cpp +++ b/src/live_effects/lpe-mirror_symmetry.cpp @@ -55,6 +55,7 @@ LPEMirrorSymmetry::LPEMirrorSymmetry(LivePathEffectObject *lpeobject) : discard_orig_path(_("Discard original path?"), _("Check this to only keep the mirrored part of the path"), "discard_orig_path", &wr, this, false), fusionPaths(_("Fusioned symetry"), _("Fusion right side whith symm"), "fusionPaths", &wr, this, true), reverseFusion(_("Reverse fusion"), _("Reverse fusion"), "reverseFusion", &wr, this, false), + reflectionFromPage(_("Use page as relecion base"), _("Use page as relecion base"), "reflectionFromPage", &wr, this, false), reflection_line(_("Reflection line:"), _("Line which serves as 'mirror' for the reflection"), "reflection_line", &wr, this, "M0,0 L1,0"), center(_("Center of mirroring (X or Y)"), _("Center of the mirror"), "center", &wr, this, "Adjust the center of mirroring") { @@ -64,6 +65,7 @@ LPEMirrorSymmetry::LPEMirrorSymmetry(LivePathEffectObject *lpeobject) : registerParameter( &discard_orig_path); registerParameter( &fusionPaths); registerParameter( &reverseFusion); + registerParameter( &reflectionFromPage); registerParameter( &reflection_line); registerParameter( ¢er); @@ -73,6 +75,21 @@ LPEMirrorSymmetry::~LPEMirrorSymmetry() { } +void LPEMirrorSymmetry::doOnApply(SPLPEItem const* lpeitem) +{ + SPDocument *doc = lpeitem->document(); + Inkscape::XML::Document *xml_doc = doc->getReprDoc(); + sp_selection_group_impl(GSList *p, group, xml_doc, doc); + Inkscape::XML::Node *group = xml_doc->createElement("svg:g"); + group->setAttribute("inkscape:groupmode", "layer"); + sp_selection_group_impl(p, group, xml_doc, doc); + gchar *href = g_strdup_printf("#%s", this->lpeobject_href); + SP_LPE_ITEM(group)->addPathEffect(href, true); + lpeitem->removeCurrentPathEffect(false) + g_free(href); + Inkscape::GC::release(group); +} + void LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem) { diff --git a/src/live_effects/lpe-mirror_symmetry.h b/src/live_effects/lpe-mirror_symmetry.h index 8c6c49c7d..6e9e7dd1a 100644 --- a/src/live_effects/lpe-mirror_symmetry.h +++ b/src/live_effects/lpe-mirror_symmetry.h @@ -44,6 +44,8 @@ public: virtual void doOnApply (SPLPEItem const* lpeitem); + virtual void doOnApply(SPLPEItem const* lpeitem); + virtual void doBeforeEffect (SPLPEItem const* lpeitem); virtual int pointSideOfLine(Geom::Point A, Geom::Point B, Geom::Point X); @@ -62,6 +64,7 @@ private: BoolParam discard_orig_path; BoolParam fusionPaths; BoolParam reverseFusion; + BoolParam reflectionFromPage; PathParam reflection_line; Geom::Line lineSeparation; Geom::Point previousCenter; -- cgit v1.2.3 From bccbad7c2400905a823f9241294fa62e90c9a6a3 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Wed, 18 Mar 2015 21:41:04 +0100 Subject: fix to trunk (bzr r13682.1.24) --- src/knotholder.cpp | 11 ++------ src/live_effects/effect.cpp | 9 +----- src/live_effects/effect.h | 1 - src/live_effects/lpe-mirror_symmetry.cpp | 47 ++++++++++---------------------- src/live_effects/lpe-mirror_symmetry.h | 2 +- 5 files changed, 19 insertions(+), 51 deletions(-) (limited to 'src') diff --git a/src/knotholder.cpp b/src/knotholder.cpp index de1b88b2c..6d39fa5fa 100644 --- a/src/knotholder.cpp +++ b/src/knotholder.cpp @@ -68,14 +68,9 @@ KnotHolder::KnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolderReleasedFun sizeUpdatedConn = ControlManager::getManager().connectCtrlSizeChanged(sigc::mem_fun(*this, &KnotHolder::updateControlSizes)); } -KnotHolder::~KnotHolder() { - if(SP_IS_LPE_ITEM(item)){ - Inkscape::LivePathEffect::Effect *effect = SP_LPE_ITEM(item)->getCurrentLPE(); - if(effect){ - effect->removeHandles(); - } - } - sp_object_unref(item); +KnotHolder::~KnotHolder() +{ + sp_object_unref(item); for (std::list::iterator i = entity.begin(); i != entity.end(); ++i) { diff --git a/src/live_effects/effect.cpp b/src/live_effects/effect.cpp index 5cff0f352..042bac523 100644 --- a/src/live_effects/effect.cpp +++ b/src/live_effects/effect.cpp @@ -373,7 +373,6 @@ Effect::Effect(LivePathEffectObject *lpeobject) registerParameter( dynamic_cast(&is_visible) ); is_visible.widget_is_visible = false; current_zoom = 0.0; - knot_holder = NULL; } Effect::~Effect() @@ -620,7 +619,7 @@ Effect::registerParameter(Parameter * param) void Effect::addHandles(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) { using namespace Inkscape::LivePathEffect; - knot_holder = knotholder; + // add handles provided by the effect itself addKnotHolderEntities(knotholder, desktop, item); @@ -630,12 +629,6 @@ Effect::addHandles(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) { } } -void -Effect::removeHandles(){ - if(knot_holder){ - knot_holder = NULL; - } -} /** * Return a vector of PathVectors which contain all canvas indicators for this effect. * This is the function called by external code to get all canvas indicators (effect and its parameters) diff --git a/src/live_effects/effect.h b/src/live_effects/effect.h index bfce7b7dd..ac1f0b8dc 100644 --- a/src/live_effects/effect.h +++ b/src/live_effects/effect.h @@ -101,7 +101,6 @@ public: // (but spiro lpe still needs it!) virtual LPEPathFlashType pathFlashType() const { return DEFAULT; } void addHandles(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item); - void removeHandles(); std::vector getCanvasIndicators(SPLPEItem const* lpeitem); inline bool providesOwnFlashPaths() const { diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp index f39b92e58..e549ad697 100644 --- a/src/live_effects/lpe-mirror_symmetry.cpp +++ b/src/live_effects/lpe-mirror_symmetry.cpp @@ -27,7 +27,6 @@ #include "knot-holder-entity.h" #include "knotholder.h" - namespace Inkscape { namespace LivePathEffect { @@ -43,9 +42,12 @@ namespace MS { class KnotHolderEntityCenterMirrorSymmetry : public LPEKnotHolderEntity { public: - KnotHolderEntityCenterMirrorSymmetry(LPEMirrorSymmetry *effect) : LPEKnotHolderEntity(effect) {}; + KnotHolderEntityCenterMirrorSymmetry(LPEMirrorSymmetry *effect) : LPEKnotHolderEntity(effect) {this->knoth = effect->knoth;}; + virtual ~KnotHolderEntityCenterMirrorSymmetry() { this->knoth = NULL;} virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); virtual Geom::Point knot_get() const; +private: + KnotHolder *knoth; }; } // namespace MS @@ -56,19 +58,19 @@ LPEMirrorSymmetry::LPEMirrorSymmetry(LivePathEffectObject *lpeobject) : discard_orig_path(_("Discard original path?"), _("Check this to only keep the mirrored part of the path"), "discard_orig_path", &wr, this, false), fusionPaths(_("Fusioned symetry"), _("Fusion right side whith symm"), "fusionPaths", &wr, this, true), reverseFusion(_("Reverse fusion"), _("Reverse fusion"), "reverseFusion", &wr, this, false), - fixedReflectionLine(_("Fixed reflection line"), _("Fixed reflection line"), "fixedReflectionLine", &wr, this, false), reflection_line(_("Reflection line:"), _("Line which serves as 'mirror' for the reflection"), "reflection_line", &wr, this, "M0,0 L1,0"), - center(_("Center of mirroring (X or Y)"), _("Center of the mirror"), "center", &wr, this, "Adjust the center of mirroring") + center(_("Center of mirroring (X or Y)"), _("Center of the mirror"), "center", &wr, this, "Adjust the center of mirroring"), + knoth(NULL) { show_orig_path = true; + registerParameter(&mode); registerParameter( &discard_orig_path); registerParameter( &fusionPaths); registerParameter( &reverseFusion); - registerParameter( &distanceToX); - registerParameter( &distanceToY); registerParameter( &reflection_line); registerParameter( ¢er); + } LPEMirrorSymmetry::~LPEMirrorSymmetry() @@ -81,7 +83,6 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem) using namespace Geom; SPLPEItem * item = const_cast(lpeitem); - SPObject *subitem = static_cast(item); Point A(boundingbox_X.max(), boundingbox_Y.min()); Point B(boundingbox_X.max(), boundingbox_Y.max()); Point C(boundingbox_X.max(), boundingbox_Y.middle()); @@ -93,15 +94,15 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem) A = Geom::Point(center[X],boundingbox_Y.min()); B = Geom::Point(center[X],boundingbox_Y.max()); } - if( mode == MT_X || mode == MT_Y || mode == MT_FIXED_X || mode == MT_FIXED_Y ){ + if( mode == MT_X || mode == MT_Y ){ Geom::Path path; path.start( A ); path.appendNew( B ); reflection_line.set_new_value(path.toPwSb(), true); lineSeparation.setPoints(A,B); center.param_setValue(path.pointAt(0.5)); - if(knot_holder){ - knot_holder->update_knots(); + if(knoth){ + knoth->update_knots(); } } else if( mode == MT_FREE) { std::vector mline(reflection_line.get_pathvector()); @@ -117,8 +118,8 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem) A = mline[0].initialPoint(); B = mline[0].finalPoint(); lineSeparation.setPoints(A,B); - if(knot_holder){ - knot_holder->update_knots(); + if(knoth){ + knoth->update_knots(); } } previousCenter = center; @@ -133,27 +134,6 @@ LPEMirrorSymmetry::doOnApply (SPLPEItem const* lpeitem) { using namespace Geom; - /* - SPDocument *doc = lpeitem->document; - Inkscape::XML::Document *xml_doc = doc->getReprDoc(); - Inkscape::XML::Node *group = xml_doc->createElement("svg:g"); - group->setAttribute("inkscape:groupmode", "layer"); - SPLPEItem* item = const_cast(lpeitem); - Inkscape::XML::Node *current = item->getRepr(); - gint topmost = current->position(); - Inkscape::XML::Node *top_current = current->parent(); - Inkscape::XML::Node *spnew = current->duplicate(xml_doc); - sp_repr_unparent(current); - group->appendChild(spnew); - Inkscape::GC::release(spnew); - top_current->appendChild(group); - group->setPosition(topmost + 1); - gchar *href = g_strdup_printf("#%s", item->getCurrentLPE()->getRepr()->attribute("id")); - SP_LPE_ITEM(group)->addPathEffect(href, true); - item->removeCurrentPathEffect(false); - g_free(href); - Inkscape::GC::release(group); - */ original_bbox(lpeitem); Point A(boundingbox_X.max(), boundingbox_Y.min()); @@ -315,6 +295,7 @@ LPEMirrorSymmetry::addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector void LPEMirrorSymmetry::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) { { + knoth = knotholder; KnotHolderEntity *e = new MS::KnotHolderEntityCenterMirrorSymmetry(this); e->create( desktop, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN, _("Adjust the center") ); diff --git a/src/live_effects/lpe-mirror_symmetry.h b/src/live_effects/lpe-mirror_symmetry.h index c18fb265d..97d641bcc 100644 --- a/src/live_effects/lpe-mirror_symmetry.h +++ b/src/live_effects/lpe-mirror_symmetry.h @@ -62,11 +62,11 @@ private: BoolParam discard_orig_path; BoolParam fusionPaths; BoolParam reverseFusion; - BoolParam fixedReflectionLine; PathParam reflection_line; Geom::Line lineSeparation; Geom::Point previousCenter; PointParam center; + KnotHolder *knoth; LPEMirrorSymmetry(const LPEMirrorSymmetry&); LPEMirrorSymmetry& operator=(const LPEMirrorSymmetry&); -- cgit v1.2.3 From a34915d4a9af00a7bf4fe7fdc20dcadbaf619edd Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Fri, 10 Apr 2015 22:11:17 +0200 Subject: Fix coding style issues in mirror symmetry code (bzr r13682.1.25) --- src/live_effects/lpe-mirror_symmetry.cpp | 179 ++++++++++++++++--------------- src/live_effects/lpe-mirror_symmetry.h | 14 +-- 2 files changed, 100 insertions(+), 93 deletions(-) (limited to 'src') diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp index e549ad697..5bae6738b 100644 --- a/src/live_effects/lpe-mirror_symmetry.cpp +++ b/src/live_effects/lpe-mirror_symmetry.cpp @@ -42,8 +42,14 @@ namespace MS { class KnotHolderEntityCenterMirrorSymmetry : public LPEKnotHolderEntity { public: - KnotHolderEntityCenterMirrorSymmetry(LPEMirrorSymmetry *effect) : LPEKnotHolderEntity(effect) {this->knoth = effect->knoth;}; - virtual ~KnotHolderEntityCenterMirrorSymmetry() { this->knoth = NULL;} + KnotHolderEntityCenterMirrorSymmetry(LPEMirrorSymmetry *effect) : LPEKnotHolderEntity(effect) + { + this->knoth = effect->knoth; + }; + virtual ~KnotHolderEntityCenterMirrorSymmetry() + { + this->knoth = NULL; + } virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); virtual Geom::Point knot_get() const; private: @@ -56,8 +62,8 @@ LPEMirrorSymmetry::LPEMirrorSymmetry(LivePathEffectObject *lpeobject) : Effect(lpeobject), mode(_("Mode"), _("Symetry move mode"), "mode", MTConverter, &wr, this, MT_FREE), discard_orig_path(_("Discard original path?"), _("Check this to only keep the mirrored part of the path"), "discard_orig_path", &wr, this, false), - fusionPaths(_("Fusioned symetry"), _("Fusion right side whith symm"), "fusionPaths", &wr, this, true), - reverseFusion(_("Reverse fusion"), _("Reverse fusion"), "reverseFusion", &wr, this, false), + fusion_paths(_("Fusioned symetry"), _("Fusion right side whith symm"), "fusion_paths", &wr, this, true), + reverse_fusion(_("Reverse fusion"), _("Reverse fusion"), "reverse_fusion", &wr, this, false), reflection_line(_("Reflection line:"), _("Line which serves as 'mirror' for the reflection"), "reflection_line", &wr, this, "M0,0 L1,0"), center(_("Center of mirroring (X or Y)"), _("Center of the mirror"), "center", &wr, this, "Adjust the center of mirroring"), knoth(NULL) @@ -66,8 +72,8 @@ LPEMirrorSymmetry::LPEMirrorSymmetry(LivePathEffectObject *lpeobject) : registerParameter(&mode); registerParameter( &discard_orig_path); - registerParameter( &fusionPaths); - registerParameter( &reverseFusion); + registerParameter( &fusion_paths); + registerParameter( &reverse_fusion); registerParameter( &reflection_line); registerParameter( ¢er); @@ -83,46 +89,46 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem) using namespace Geom; SPLPEItem * item = const_cast(lpeitem); - Point A(boundingbox_X.max(), boundingbox_Y.min()); - Point B(boundingbox_X.max(), boundingbox_Y.max()); - Point C(boundingbox_X.max(), boundingbox_Y.middle()); - if(mode == MT_Y){ - A = Geom::Point(boundingbox_X.min(),center[Y]); - B = Geom::Point(boundingbox_X.max(),center[Y]); + Point point_a(boundingbox_X.max(), boundingbox_Y.min()); + Point point_b(boundingbox_X.max(), boundingbox_Y.max()); + Point point_c(boundingbox_X.max(), boundingbox_Y.middle()); + if(mode == MT_Y) { + point_a = Geom::Point(boundingbox_X.min(),center[Y]); + point_b = Geom::Point(boundingbox_X.max(),center[Y]); } - if(mode == MT_X){ - A = Geom::Point(center[X],boundingbox_Y.min()); - B = Geom::Point(center[X],boundingbox_Y.max()); + if(mode == MT_X) { + point_a = Geom::Point(center[X],boundingbox_Y.min()); + point_b = Geom::Point(center[X],boundingbox_Y.max()); } - if( mode == MT_X || mode == MT_Y ){ + if( mode == MT_X || mode == MT_Y ) { Geom::Path path; - path.start( A ); - path.appendNew( B ); + path.start( point_a ); + path.appendNew( point_b ); reflection_line.set_new_value(path.toPwSb(), true); - lineSeparation.setPoints(A,B); + line_separation.setPoints(point_a, point_b); center.param_setValue(path.pointAt(0.5)); - if(knoth){ + if(knoth) { knoth->update_knots(); } } else if( mode == MT_FREE) { - std::vector mline(reflection_line.get_pathvector()); - if(!are_near(previousCenter,center, 0.01)){ - Geom::Point trans = center - mline[0].pointAt(0.5); - mline[0] *= Geom::Affine(1,0,0,1,trans[X],trans[Y]); - A = mline[0].initialPoint(); - B = mline[0].finalPoint(); - reflection_line.set_new_value(mline[0].toPwSb(), true); - lineSeparation.setPoints(A,B); + std::vector line_m(reflection_line.get_pathvector()); + if(!are_near(previous_center,center, 0.01)) { + Geom::Point trans = center - line_m[0].pointAt(0.5); + line_m[0] *= Geom::Affine(1,0,0,1,trans[X],trans[Y]); + point_a = line_m[0].initialPoint(); + point_b = line_m[0].finalPoint(); + reflection_line.set_new_value(line_m[0].toPwSb(), true); + line_separation.setPoints(point_a, point_b); } else { - center.param_setValue(mline[0].pointAt(0.5)); - A = mline[0].initialPoint(); - B = mline[0].finalPoint(); - lineSeparation.setPoints(A,B); - if(knoth){ + center.param_setValue(line_m[0].pointAt(0.5)); + point_a = line_m[0].initialPoint(); + point_b = line_m[0].finalPoint(); + line_separation.setPoints(point_a, point_b); + if(knoth) { knoth->update_knots(); } } - previousCenter = center; + previous_center = center; } item->apply_to_clippath(item); @@ -136,22 +142,22 @@ LPEMirrorSymmetry::doOnApply (SPLPEItem const* lpeitem) original_bbox(lpeitem); - Point A(boundingbox_X.max(), boundingbox_Y.min()); - Point B(boundingbox_X.max(), boundingbox_Y.max()); - Point C(boundingbox_X.max(), boundingbox_Y.middle()); + Point point_a(boundingbox_X.max(), boundingbox_Y.min()); + Point point_b(boundingbox_X.max(), boundingbox_Y.max()); + Point point_c(boundingbox_X.max(), boundingbox_Y.middle()); Geom::Path path; - path.start( A ); - path.appendNew( B ); + path.start( point_a ); + path.appendNew( point_b ); reflection_line.set_new_value(path.toPwSb(), true); - center.param_setValue(C); - previousCenter = center; + center.param_setValue(point_c); + previous_center = center; } -int -LPEMirrorSymmetry::pointSideOfLine(Geom::Point A, Geom::Point B, Geom::Point X) +int +LPEMirrorSymmetry::pointSideOfLine(Geom::Point point_a, Geom::Point point_b, Geom::Point point_x) { //http://stackoverflow.com/questions/1560492/how-to-tell-whether-a-point-is-to-the-right-or-left-side-of-a-line - double pos = (B[Geom::X]-A[Geom::X])*(X[Geom::Y]-A[Geom::Y]) - (B[Geom::Y]-A[Geom::Y])*(X[Geom::X]-A[Geom::X]); + double pos = (point_b[Geom::X]-point_a[Geom::X])*(point_x[Geom::Y]-point_a[Geom::Y]) - (point_b[Geom::Y]-point_a[Geom::Y])*(point_x[Geom::X]-point_a[Geom::X]); return (pos < 0) ? -1 : (pos > 0); } @@ -164,23 +170,23 @@ LPEMirrorSymmetry::doEffect_path (std::vector const & path_in) } Geom::PathVector const original_pathv = pathv_to_linear_and_cubic_beziers(path_in); std::vector path_out; - Geom::Path mlineExpanded; - Geom::Point lineStart = lineSeparation.pointAt(-100000.0); - Geom::Point lineEnd = lineSeparation.pointAt(100000.0); - mlineExpanded.start( lineStart); - mlineExpanded.appendNew( lineEnd); + Geom::Path line_m_expanded; + Geom::Point line_start = line_separation.pointAt(-100000.0); + Geom::Point line_end = line_separation.pointAt(100000.0); + line_m_expanded.start( line_start); + line_m_expanded.appendNew( line_end); - if (!discard_orig_path && !fusionPaths) { + if (!discard_orig_path && !fusion_paths) { path_out = path_in; } - Geom::Point A(lineStart); - Geom::Point B(lineEnd); + Geom::Point point_a(line_start); + Geom::Point point_b(line_end); - Geom::Affine m1(1.0, 0.0, 0.0, 1.0, A[0], A[1]); - double hyp = Geom::distance(A, B); - double c = (B[0] - A[0]) / hyp; // cos(alpha) - double s = (B[1] - A[1]) / hyp; // sin(alpha) + Geom::Affine m1(1.0, 0.0, 0.0, 1.0, point_a[0], point_a[1]); + double hyp = Geom::distance(point_a, point_b); + double c = (point_b[0] - point_a[0]) / hyp; // cos(alpha) + double s = (point_b[1] - point_a[1]) / hyp; // sin(alpha) Geom::Affine m2(c, -s, s, c, 0.0, 0.0); Geom::Affine sca(1.0, 0.0, 0.0, -1.0, 0.0, 0.0); @@ -189,15 +195,15 @@ LPEMirrorSymmetry::doEffect_path (std::vector const & path_in) m = m * sca; m = m * m2.inverse(); m = m * m1; - - if(fusionPaths && !discard_orig_path){ + + if(fusion_paths && !discard_orig_path) { for (Geom::PathVector::const_iterator path_it = original_pathv.begin(); - path_it != original_pathv.end(); ++path_it) { - if (path_it->empty()){ + path_it != original_pathv.end(); ++path_it) { + if (path_it->empty()) { continue; } std::vector temp_path; - double timeStart = 0.0; + double time_start = 0.0; int position = 0; bool end_open = false; if (path_it->closed()) { @@ -207,48 +213,48 @@ LPEMirrorSymmetry::doEffect_path (std::vector const & path_in) } } Geom::Path original = (Geom::Path)(*path_it); - if(end_open && path_it->closed()){ + if(end_open && path_it->closed()) { original.close(false); original.appendNew( original.initialPoint() ); original.close(true); } - Geom::Crossings cs = crossings(original, mlineExpanded); + Geom::Crossings cs = crossings(original, line_m_expanded); for(unsigned int i = 0; i < cs.size(); i++) { double timeEnd = cs[i].ta; - Geom::Path portion = original.portion(timeStart, timeEnd); + Geom::Path portion = original.portion(time_start, timeEnd); Geom::Point middle = portion.pointAt((double)portion.size()/2.0); - position = pointSideOfLine(lineStart, lineEnd, middle); - if(reverseFusion){ + position = pointSideOfLine(line_start, line_end, middle); + if(reverse_fusion) { position *= -1; } - if(position == 1){ + if(position == 1) { Geom::Path mirror = portion.reverse() * m; mirror.setInitial(portion.finalPoint()); portion.append(mirror); - if(i!=0){ + if(i!=0) { portion.setFinal(portion.initialPoint()); portion.close(); } temp_path.push_back(portion); } portion.clear(); - timeStart = timeEnd; + time_start = timeEnd; } - position = pointSideOfLine(lineStart, lineEnd, original.finalPoint()); - if(reverseFusion){ + position = pointSideOfLine(line_start, line_end, original.finalPoint()); + if(reverse_fusion) { position *= -1; } - if(cs.size()!=0 && position == 1){ - Geom::Path portion = original.portion(timeStart, original.size()); + if(cs.size()!=0 && position == 1) { + Geom::Path portion = original.portion(time_start, original.size()); portion = portion.reverse(); Geom::Path mirror = portion.reverse() * m; mirror.setInitial(portion.finalPoint()); portion.append(mirror); portion = portion.reverse(); - if (!original.closed()){ + if (!original.closed()) { temp_path.push_back(portion); } else { - if(cs.size() >1 ){ + if(cs.size() >1 ) { portion.setFinal(temp_path[0].initialPoint()); portion.setInitial(temp_path[0].finalPoint()); temp_path[0].append(portion); @@ -259,7 +265,7 @@ LPEMirrorSymmetry::doEffect_path (std::vector const & path_in) } portion.clear(); } - if(cs.size() == 0 && position == 1){ + if(cs.size() == 0 && position == 1) { temp_path.push_back(original); temp_path.push_back(original * m); } @@ -267,8 +273,8 @@ LPEMirrorSymmetry::doEffect_path (std::vector const & path_in) temp_path.clear(); } } - - if (!fusionPaths || discard_orig_path) { + + if (!fusion_paths || discard_orig_path) { for (int i = 0; i < static_cast(path_in.size()); ++i) { path_out.push_back(path_in[i] * m); } @@ -283,17 +289,18 @@ LPEMirrorSymmetry::addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector using namespace Geom; PathVector pathv; - Geom::Path mlineExpanded; - Geom::Point lineStart = lineSeparation.pointAt(-100000.0); - Geom::Point lineEnd = lineSeparation.pointAt(100000.0); - mlineExpanded.start( lineStart); - mlineExpanded.appendNew( lineEnd); - pathv.push_back(mlineExpanded); + Geom::Path line_m_expanded; + Geom::Point line_start = line_separation.pointAt(-100000.0); + Geom::Point line_end = line_separation.pointAt(100000.0); + line_m_expanded.start( line_start); + line_m_expanded.appendNew( line_end); + pathv.push_back(line_m_expanded); hp_vec.push_back(pathv); } -void -LPEMirrorSymmetry::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) { +void +LPEMirrorSymmetry::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) +{ { knoth = knotholder; KnotHolderEntity *e = new MS::KnotHolderEntityCenterMirrorSymmetry(this); diff --git a/src/live_effects/lpe-mirror_symmetry.h b/src/live_effects/lpe-mirror_symmetry.h index 97d641bcc..43535650d 100644 --- a/src/live_effects/lpe-mirror_symmetry.h +++ b/src/live_effects/lpe-mirror_symmetry.h @@ -26,8 +26,8 @@ namespace Inkscape { namespace LivePathEffect { namespace MS { - // we need a separate namespace to avoid clashes with LPEPerpBisector - class KnotHolderEntityCenterMirrorSymmetry; +// we need a separate namespace to avoid clashes with LPEPerpBisector +class KnotHolderEntityCenterMirrorSymmetry; } enum ModeType { @@ -37,7 +37,7 @@ enum ModeType { MT_END }; -class LPEMirrorSymmetry : public Effect, GroupBBoxEffect{ +class LPEMirrorSymmetry : public Effect, GroupBBoxEffect { public: LPEMirrorSymmetry(LivePathEffectObject *lpeobject); virtual ~LPEMirrorSymmetry(); @@ -60,11 +60,11 @@ protected: private: EnumParam mode; BoolParam discard_orig_path; - BoolParam fusionPaths; - BoolParam reverseFusion; + BoolParam fusion_paths; + BoolParam reverse_fusion; PathParam reflection_line; - Geom::Line lineSeparation; - Geom::Point previousCenter; + Geom::Line line_separation; + Geom::Point previous_center; PointParam center; KnotHolder *knoth; -- cgit v1.2.3 From 8c56f58ee39a66e2a25252e01c795296a958ec40 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Sat, 25 Jul 2015 04:15:13 +0200 Subject: Fix helper path (bzr r13682.1.29) --- src/live_effects/lpe-mirror_symmetry.cpp | 44 ++++++++------------------------ src/live_effects/lpe-mirror_symmetry.h | 1 - 2 files changed, 10 insertions(+), 35 deletions(-) (limited to 'src') diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp index 7a9870d78..79cdf947d 100644 --- a/src/live_effects/lpe-mirror_symmetry.cpp +++ b/src/live_effects/lpe-mirror_symmetry.cpp @@ -42,18 +42,9 @@ namespace MS { class KnotHolderEntityCenterMirrorSymmetry : public LPEKnotHolderEntity { public: - KnotHolderEntityCenterMirrorSymmetry(LPEMirrorSymmetry *effect) : LPEKnotHolderEntity(effect) - { - this->knoth = effect->knoth; - }; - virtual ~KnotHolderEntityCenterMirrorSymmetry() - { - this->knoth = NULL; - } + KnotHolderEntityCenterMirrorSymmetry(LPEMirrorSymmetry *effect) : LPEKnotHolderEntity(effect){}; virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); virtual Geom::Point knot_get() const; -private: - KnotHolder *knoth; }; } // namespace MS @@ -65,8 +56,7 @@ LPEMirrorSymmetry::LPEMirrorSymmetry(LivePathEffectObject *lpeobject) : fusion_paths(_("Fusioned symetry"), _("Fusion right side whith symm"), "fusion_paths", &wr, this, true), reverse_fusion(_("Reverse fusion"), _("Reverse fusion"), "reverse_fusion", &wr, this, false), reflection_line(_("Reflection line:"), _("Line which serves as 'mirror' for the reflection"), "reflection_line", &wr, this, "M0,0 L1,0"), - center(_("Center of mirroring (X or Y)"), _("Center of the mirror"), "center", &wr, this, "Adjust the center of mirroring"), - knoth(NULL) + center(_("Center of mirroring (X or Y)"), _("Center of the mirror"), "center", &wr, this, "Adjust the center of mirroring") { show_orig_path = true; @@ -106,10 +96,7 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem) path.appendNew( point_b ); reflection_line.set_new_value(path.toPwSb(), true); line_separation.setPoints(point_a, point_b); - center.param_setValue(path.pointAt(0.5)); - if(knoth) { - knoth->update_knots(); - } + center.param_setValue(path.pointAt(0.5), true); } else if( mode == MT_FREE) { Geom::PathVector line_m(reflection_line.get_pathvector()); if(!are_near(previous_center,center, 0.01)) { @@ -120,13 +107,10 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem) reflection_line.set_new_value(line_m[0].toPwSb(), true); line_separation.setPoints(point_a, point_b); } else { - center.param_setValue(line_m[0].pointAt(0.5)); + center.param_setValue(line_m[0].pointAt(0.5), true); point_a = line_m[0].initialPoint(); point_b = line_m[0].finalPoint(); line_separation.setPoints(point_a, point_b); - if(knoth) { - knoth->update_knots(); - } } previous_center = center; } @@ -228,7 +212,7 @@ LPEMirrorSymmetry::doEffect_path (Geom::PathVector const & path_in) position *= -1; } if(position == 1) { - Geom::Path mirror = portion.reverse() * m; + Geom::Path mirror = portion.reversed() * m; mirror.setInitial(portion.finalPoint()); portion.append(mirror); if(i!=0) { @@ -246,11 +230,11 @@ LPEMirrorSymmetry::doEffect_path (Geom::PathVector const & path_in) } if(cs.size()!=0 && position == 1) { Geom::Path portion = original.portion(time_start, original.size()); - portion = portion.reverse(); - Geom::Path mirror = portion.reverse() * m; + portion = portion.reversed(); + Geom::Path mirror = portion.reversed() * m; mirror.setInitial(portion.finalPoint()); portion.append(mirror); - portion = portion.reverse(); + portion = portion.reversed(); if (!original.closed()) { temp_path.push_back(portion); } else { @@ -287,22 +271,14 @@ void LPEMirrorSymmetry::addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector &hp_vec) { using namespace Geom; - - PathVector pathv; - Geom::Path line_m_expanded; - Geom::Point line_start = line_separation.pointAt(-100000.0); - Geom::Point line_end = line_separation.pointAt(100000.0); - line_m_expanded.start( line_start); - line_m_expanded.appendNew( line_end); - pathv.push_back(line_m_expanded); - hp_vec.push_back(pathv); + hp_vec.clear(); + hp_vec.push_back(reflection_line.get_pathvector()); } void LPEMirrorSymmetry::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) { { - knoth = knotholder; KnotHolderEntity *e = new MS::KnotHolderEntityCenterMirrorSymmetry(this); e->create( desktop, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN, _("Adjust the center") ); diff --git a/src/live_effects/lpe-mirror_symmetry.h b/src/live_effects/lpe-mirror_symmetry.h index b30972308..12bf2e7d3 100644 --- a/src/live_effects/lpe-mirror_symmetry.h +++ b/src/live_effects/lpe-mirror_symmetry.h @@ -66,7 +66,6 @@ private: Geom::Line line_separation; Geom::Point previous_center; PointParam center; - KnotHolder *knoth; LPEMirrorSymmetry(const LPEMirrorSymmetry&); LPEMirrorSymmetry& operator=(const LPEMirrorSymmetry&); -- cgit v1.2.3 From e2386a9a6f485c6e1a1ea6d4ca4f7b3809fda9c6 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Sat, 25 Jul 2015 04:24:00 +0200 Subject: clean merge (bzr r13682.1.30) --- src/knotholder.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/knotholder.cpp b/src/knotholder.cpp index 6d39fa5fa..a2d1cf017 100644 --- a/src/knotholder.cpp +++ b/src/knotholder.cpp @@ -68,9 +68,8 @@ KnotHolder::KnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolderReleasedFun sizeUpdatedConn = ControlManager::getManager().connectCtrlSizeChanged(sigc::mem_fun(*this, &KnotHolder::updateControlSizes)); } -KnotHolder::~KnotHolder() -{ - sp_object_unref(item); +KnotHolder::~KnotHolder() { + sp_object_unref(item); for (std::list::iterator i = entity.begin(); i != entity.end(); ++i) { -- cgit v1.2.3 From 46df96973716748cde5c889a49379fcc6bbd82b9 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Sat, 25 Jul 2015 04:30:46 +0200 Subject: update credits (bzr r13682.1.31) --- src/live_effects/lpe-mirror_symmetry.cpp | 1 + src/live_effects/lpe-mirror_symmetry.h | 1 + 2 files changed, 2 insertions(+) (limited to 'src') diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp index 79cdf947d..685dc6354 100644 --- a/src/live_effects/lpe-mirror_symmetry.cpp +++ b/src/live_effects/lpe-mirror_symmetry.cpp @@ -6,6 +6,7 @@ * Maximilian Albert * Johan Engelen * Abhishek Sharma + * Jabiertxof * * Copyright (C) Johan Engelen 2007 * Copyright (C) Maximilin Albert 2008 diff --git a/src/live_effects/lpe-mirror_symmetry.h b/src/live_effects/lpe-mirror_symmetry.h index 12bf2e7d3..0874f0c7e 100644 --- a/src/live_effects/lpe-mirror_symmetry.h +++ b/src/live_effects/lpe-mirror_symmetry.h @@ -8,6 +8,7 @@ * Authors: * Maximilian Albert * Johan Engelen + * Jabiertxof * * Copyright (C) Johan Engelen 2007 * Copyright (C) Maximilin Albert 2008 -- cgit v1.2.3 From d9f06856ceb526436c47237546f3e18f24d65b9f Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Sat, 19 Mar 2016 21:08:57 +0100 Subject: Start fixing Krzysztof review (bzr r13682.1.34) --- src/live_effects/lpe-mirror_symmetry.cpp | 24 ++++++++++++------------ src/live_effects/lpe-mirror_symmetry.h | 9 ++------- 2 files changed, 14 insertions(+), 19 deletions(-) (limited to 'src') diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp index 9ea25dbb3..d25225797 100644 --- a/src/live_effects/lpe-mirror_symmetry.cpp +++ b/src/live_effects/lpe-mirror_symmetry.cpp @@ -52,18 +52,18 @@ public: LPEMirrorSymmetry::LPEMirrorSymmetry(LivePathEffectObject *lpeobject) : Effect(lpeobject), - mode(_("Mode"), _("Symetry move mode"), "mode", MTConverter, &wr, this, MT_FREE), + mode(_("Mode"), _("Symmetry move mode"), "mode", MTConverter, &wr, this, MT_FREE), discard_orig_path(_("Discard original path?"), _("Check this to only keep the mirrored part of the path"), "discard_orig_path", &wr, this, false), - fusion_paths(_("Fusioned symetry"), _("Fusion right side whith symm"), "fusion_paths", &wr, this, true), - reverse_fusion(_("Reverse fusion"), _("Reverse fusion"), "reverse_fusion", &wr, this, false), - reflection_line(_("Reflection line:"), _("Line which serves as 'mirror' for the reflection"), "reflection_line", &wr, this, "M0,0 L1,0"), - center(_("Center of mirroring (X or Y)"), _("Center of the mirror"), "center", &wr, this, "Adjust the center of mirroring") + fuse_paths(_("Fuse paths"), _("Fuse original and the reflection into a single path"), "fuse_paths", &wr, this, true), + oposite_fuse(_("Oposite fuse"), _("Picks the other side of the mirror as the original"), "oposite_fuse", &wr, this, false), + reflection_line(_("Axis of reflection:"), _("Line which serves as 'mirror' for the reflection"), "reflection_line", &wr, this, "M0,0 L1,0"), + center(_("Center of mirroring"), _("Center of the mirror"), "center", &wr, this, "Adjust the center of mirroring") { show_orig_path = true; registerParameter(&mode); registerParameter( &discard_orig_path); - registerParameter( &fusion_paths); - registerParameter( &reverse_fusion); + registerParameter( &fuse_paths); + registerParameter( &oposite_fuse); registerParameter( &reflection_line); registerParameter( ¢er); apply_to_clippath_and_mask = true; @@ -161,7 +161,7 @@ LPEMirrorSymmetry::doEffect_path (Geom::PathVector const & path_in) line_m_expanded.start( line_start); line_m_expanded.appendNew( line_end); - if (!discard_orig_path && !fusion_paths) { + if (!discard_orig_path && !fuse_paths) { path_out = path_in; } @@ -181,7 +181,7 @@ LPEMirrorSymmetry::doEffect_path (Geom::PathVector const & path_in) m = m * m2.inverse(); m = m * m1; - if(fusion_paths && !discard_orig_path) { + if(fuse_paths && !discard_orig_path) { for (Geom::PathVector::const_iterator path_it = original_pathv.begin(); path_it != original_pathv.end(); ++path_it) { if (path_it->empty()) { @@ -209,7 +209,7 @@ LPEMirrorSymmetry::doEffect_path (Geom::PathVector const & path_in) Geom::Path portion = original.portion(time_start, timeEnd); Geom::Point middle = portion.pointAt((double)portion.size()/2.0); position = pointSideOfLine(line_start, line_end, middle); - if(reverse_fusion) { + if(oposite_fuse) { position *= -1; } if(position == 1) { @@ -226,7 +226,7 @@ LPEMirrorSymmetry::doEffect_path (Geom::PathVector const & path_in) time_start = timeEnd; } position = pointSideOfLine(line_start, line_end, original.finalPoint()); - if(reverse_fusion) { + if(oposite_fuse) { position *= -1; } if(cs.size()!=0 && position == 1) { @@ -259,7 +259,7 @@ LPEMirrorSymmetry::doEffect_path (Geom::PathVector const & path_in) } } - if (!fusion_paths || discard_orig_path) { + if (!fuse_paths || discard_orig_path) { for (int i = 0; i < static_cast(path_in.size()); ++i) { path_out.push_back(path_in[i] * m); } diff --git a/src/live_effects/lpe-mirror_symmetry.h b/src/live_effects/lpe-mirror_symmetry.h index 0874f0c7e..f4e4678a7 100644 --- a/src/live_effects/lpe-mirror_symmetry.h +++ b/src/live_effects/lpe-mirror_symmetry.h @@ -42,15 +42,10 @@ class LPEMirrorSymmetry : public Effect, GroupBBoxEffect { public: LPEMirrorSymmetry(LivePathEffectObject *lpeobject); virtual ~LPEMirrorSymmetry(); - virtual void doOnApply (SPLPEItem const* lpeitem); - virtual void doBeforeEffect (SPLPEItem const* lpeitem); - virtual int pointSideOfLine(Geom::Point A, Geom::Point B, Geom::Point X); - virtual Geom::PathVector doEffect_path (Geom::PathVector const & path_in); - /* the knotholder entity classes must be declared friends */ friend class MS::KnotHolderEntityCenterMirrorSymmetry; void addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item); @@ -61,8 +56,8 @@ protected: private: EnumParam mode; BoolParam discard_orig_path; - BoolParam fusion_paths; - BoolParam reverse_fusion; + BoolParam fuse_paths; + BoolParam oposite_fuse; PathParam reflection_line; Geom::Line line_separation; Geom::Point previous_center; -- cgit v1.2.3 From 13783613a9af3770294713af80a8e17b51089266 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Thu, 24 Mar 2016 02:27:33 +0100 Subject: Fixing Krzysztof review (bzr r13682.1.36) --- src/live_effects/lpe-mirror_symmetry.cpp | 66 +++++++++++++++----------------- src/live_effects/lpe-mirror_symmetry.h | 1 - 2 files changed, 31 insertions(+), 36 deletions(-) (limited to 'src') diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp index d25225797..60ad13fc8 100644 --- a/src/live_effects/lpe-mirror_symmetry.cpp +++ b/src/live_effects/lpe-mirror_symmetry.cpp @@ -83,23 +83,28 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem) Point point_a(boundingbox_X.max(), boundingbox_Y.min()); Point point_b(boundingbox_X.max(), boundingbox_Y.max()); Point point_c(boundingbox_X.max(), boundingbox_Y.middle()); - if(mode == MT_Y) { + if (mode == MT_Y) { point_a = Geom::Point(boundingbox_X.min(),center[Y]); point_b = Geom::Point(boundingbox_X.max(),center[Y]); } - if(mode == MT_X) { + if (mode == MT_X) { point_a = Geom::Point(center[X],boundingbox_Y.min()); point_b = Geom::Point(center[X],boundingbox_Y.max()); } - if( mode == MT_X || mode == MT_Y ) { + if ( mode == MT_X || mode == MT_Y ) { Geom::Path path; path.start( point_a ); path.appendNew( point_b ); reflection_line.set_new_value(path.toPwSb(), true); line_separation.setPoints(point_a, point_b); center.param_setValue(path.pointAt(0.5), true); - } else if( mode == MT_FREE) { + } else if ( mode == MT_FREE) { Geom::PathVector line_m(reflection_line.get_pathvector()); + Geom::Line line_symm; + line_symm->setPoints(line_m->initialPoint(), line_m->finalPoint()); + Geom::GenericRect bbox(boundingbox_X.min(), boundingbox_Y.min(), boundingbox_X.max(), boundingbox_Y.max()); + line_m[0].initialPoint = bbox->nearestEdgePoint(line_m->initialPoint()); + line_m[0].finalPoint = bbox->nearestEdgePoint(line_m->finalPoint()) if(!are_near(previous_center,center, 0.01)) { Geom::Point trans = center - line_m[0].pointAt(0.5); line_m[0] *= Geom::Affine(1,0,0,1,trans[X],trans[Y]); @@ -111,6 +116,7 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem) center.param_setValue(line_m[0].pointAt(0.5), true); point_a = line_m[0].initialPoint(); point_b = line_m[0].finalPoint(); + reflection_line.set_new_value(line_m[0].toPwSb(), true); line_separation.setPoints(point_a, point_b); } previous_center = center; @@ -138,52 +144,42 @@ LPEMirrorSymmetry::doOnApply (SPLPEItem const* lpeitem) previous_center = center; } -int -LPEMirrorSymmetry::pointSideOfLine(Geom::Point point_a, Geom::Point point_b, Geom::Point point_x) -{ - //http://stackoverflow.com/questions/1560492/how-to-tell-whether-a-point-is-to-the-right-or-left-side-of-a-line - double pos = (point_b[Geom::X]-point_a[Geom::X])*(point_x[Geom::Y]-point_a[Geom::Y]) - (point_b[Geom::Y]-point_a[Geom::Y])*(point_x[Geom::X]-point_a[Geom::X]); - return (pos < 0) ? -1 : (pos > 0); -} Geom::PathVector LPEMirrorSymmetry::doEffect_path (Geom::PathVector const & path_in) { // Don't allow empty path parameter: - if ( reflection_line.get_pathvector().empty() ) { + Geom::PathVector line_m(reflection_line.get_pathvector()); + if ( line_m.empty() ) { return path_in; } Geom::PathVector const original_pathv = pathv_to_linear_and_cubic_beziers(path_in); Geom::PathVector path_out; - Geom::Path line_m_expanded; - Geom::Point line_start = line_separation.pointAt(-100000.0); - Geom::Point line_end = line_separation.pointAt(100000.0); - line_m_expanded.start( line_start); - line_m_expanded.appendNew( line_end); - + if (!discard_orig_path && !fuse_paths) { path_out = path_in; } - Geom::Point point_a(line_start); - Geom::Point point_b(line_end); + Geom::Point point_a(line_separation.initialPoint()); + Geom::Point point_b(line_separation.finalPoint()); - Geom::Affine m1(1.0, 0.0, 0.0, 1.0, point_a[0], point_a[1]); + Geom::Translate m1(point_a[0], point_a[1]); double hyp = Geom::distance(point_a, point_b); double c = (point_b[0] - point_a[0]) / hyp; // cos(alpha) double s = (point_b[1] - point_a[1]) / hyp; // sin(alpha) Geom::Affine m2(c, -s, s, c, 0.0, 0.0); - Geom::Affine sca(1.0, 0.0, 0.0, -1.0, 0.0, 0.0); + Geom::Scale sca(1.0, -1.0); Geom::Affine m = m1.inverse() * m2; m = m * sca; m = m * m2.inverse(); m = m * m1; - if(fuse_paths && !discard_orig_path) { + if (fuse_paths && !discard_orig_path) { for (Geom::PathVector::const_iterator path_it = original_pathv.begin(); - path_it != original_pathv.end(); ++path_it) { + path_it != original_pathv.end(); ++path_it) + { if (path_it->empty()) { continue; } @@ -197,22 +193,22 @@ LPEMirrorSymmetry::doEffect_path (Geom::PathVector const & path_in) end_open = true; } } - Geom::Path original = (Geom::Path)(*path_it); - if(end_open && path_it->closed()) { + Geom::Path original = path_it; + if (end_open && path_it->closed()) { original.close(false); original.appendNew( original.initialPoint() ); original.close(true); } - Geom::Crossings cs = crossings(original, line_m_expanded); - for(unsigned int i = 0; i < cs.size(); i++) { + Geom::Crossings cs = crossings(original, line_m); + for (unsigned int i = 0; i < cs.size(); i++) { double timeEnd = cs[i].ta; Geom::Path portion = original.portion(time_start, timeEnd); Geom::Point middle = portion.pointAt((double)portion.size()/2.0); - position = pointSideOfLine(line_start, line_end, middle); - if(oposite_fuse) { + position = Geom::sgn(Geom::cross(point_b - point_a, middle - point_a)); + if (oposite_fuse) { position *= -1; } - if(position == 1) { + if (position == 1) { Geom::Path mirror = portion.reversed() * m; mirror.setInitial(portion.finalPoint()); portion.append(mirror); @@ -225,11 +221,11 @@ LPEMirrorSymmetry::doEffect_path (Geom::PathVector const & path_in) portion.clear(); time_start = timeEnd; } - position = pointSideOfLine(line_start, line_end, original.finalPoint()); - if(oposite_fuse) { + position = position = Geom::sgn(Geom::cross(point_b - point_a, original.finalPoint() - point_a )); + if (oposite_fuse) { position *= -1; } - if(cs.size()!=0 && position == 1) { + if (cs.size()!=0 && position == 1) { Geom::Path portion = original.portion(time_start, original.size()); portion = portion.reversed(); Geom::Path mirror = portion.reversed() * m; @@ -250,7 +246,7 @@ LPEMirrorSymmetry::doEffect_path (Geom::PathVector const & path_in) } portion.clear(); } - if(cs.size() == 0 && position == 1) { + if (cs.size() == 0 && position == 1) { temp_path.push_back(original); temp_path.push_back(original * m); } diff --git a/src/live_effects/lpe-mirror_symmetry.h b/src/live_effects/lpe-mirror_symmetry.h index f4e4678a7..cd6f2a0ce 100644 --- a/src/live_effects/lpe-mirror_symmetry.h +++ b/src/live_effects/lpe-mirror_symmetry.h @@ -44,7 +44,6 @@ public: virtual ~LPEMirrorSymmetry(); virtual void doOnApply (SPLPEItem const* lpeitem); virtual void doBeforeEffect (SPLPEItem const* lpeitem); - virtual int pointSideOfLine(Geom::Point A, Geom::Point B, Geom::Point X); virtual Geom::PathVector doEffect_path (Geom::PathVector const & path_in); /* the knotholder entity classes must be declared friends */ friend class MS::KnotHolderEntityCenterMirrorSymmetry; -- cgit v1.2.3 From f72d5b89423864be61cf0399f6177986fc7ccd3b Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Thu, 24 Mar 2016 18:37:34 +0100 Subject: Fixes and added horizontal and vertical page mode (bzr r13682.1.38) --- src/live_effects/lpe-mirror_symmetry.cpp | 255 +++++++++++++++++++------------ src/live_effects/lpe-mirror_symmetry.h | 7 +- 2 files changed, 159 insertions(+), 103 deletions(-) (limited to 'src') diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp index 60ad13fc8..9a2a54a13 100644 --- a/src/live_effects/lpe-mirror_symmetry.cpp +++ b/src/live_effects/lpe-mirror_symmetry.cpp @@ -27,11 +27,14 @@ #include <2geom/affine.h> #include "knot-holder-entity.h" #include "knotholder.h" +#include "inkscape.h" namespace Inkscape { namespace LivePathEffect { static const Util::EnumData ModeTypeData[MT_END] = { + { MT_V, N_("Vertical Page Center"), "Vertical Page Center, use select tool to move item instead line" }, + { MT_H, N_("Horizontal Page Center"), "Horizontal Page Center, use select tool to move item instead line" }, { MT_FREE, N_("Free from reflection line"), "Free from path" }, { MT_X, N_("X from middle knot"), "X from middle knot" }, { MT_Y, N_("Y from middle knot"), "Y from middle knot" } @@ -48,24 +51,38 @@ public: virtual Geom::Point knot_get() const; }; +class KnotHolderEntityStartMirrorSymmetry : public LPEKnotHolderEntity { +public: + KnotHolderEntityStartMirrorSymmetry(LPEMirrorSymmetry *effect) : LPEKnotHolderEntity(effect){}; + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); + virtual Geom::Point knot_get() const; +}; + +class KnotHolderEntityEndMirrorSymmetry : public LPEKnotHolderEntity { +public: + KnotHolderEntityEndMirrorSymmetry(LPEMirrorSymmetry *effect) : LPEKnotHolderEntity(effect){}; + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); + virtual Geom::Point knot_get() const; +}; + } // namespace MS LPEMirrorSymmetry::LPEMirrorSymmetry(LivePathEffectObject *lpeobject) : Effect(lpeobject), mode(_("Mode"), _("Symmetry move mode"), "mode", MTConverter, &wr, this, MT_FREE), discard_orig_path(_("Discard original path?"), _("Check this to only keep the mirrored part of the path"), "discard_orig_path", &wr, this, false), - fuse_paths(_("Fuse paths"), _("Fuse original and the reflection into a single path"), "fuse_paths", &wr, this, true), + fuse_paths(_("Fuse paths"), _("Fuse original and the reflection into a single path"), "fuse_paths", &wr, this, false), oposite_fuse(_("Oposite fuse"), _("Picks the other side of the mirror as the original"), "oposite_fuse", &wr, this, false), - reflection_line(_("Axis of reflection:"), _("Line which serves as 'mirror' for the reflection"), "reflection_line", &wr, this, "M0,0 L1,0"), - center(_("Center of mirroring"), _("Center of the mirror"), "center", &wr, this, "Adjust the center of mirroring") + start_point(_("Start mirror line"), _("Start mirror line"), "start_point", &wr, this, "Adjust the start of mirroring"), + end_point(_("End mirror line"), _("End mirror line"), "end_point", &wr, this, "Adjust end of mirroring") { show_orig_path = true; registerParameter(&mode); registerParameter( &discard_orig_path); registerParameter( &fuse_paths); registerParameter( &oposite_fuse); - registerParameter( &reflection_line); - registerParameter( ¢er); + registerParameter( &start_point); + registerParameter( &end_point); apply_to_clippath_and_mask = true; } @@ -79,51 +96,60 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem) { using namespace Geom; - SPLPEItem * item = const_cast(lpeitem); Point point_a(boundingbox_X.max(), boundingbox_Y.min()); Point point_b(boundingbox_X.max(), boundingbox_Y.max()); Point point_c(boundingbox_X.max(), boundingbox_Y.middle()); if (mode == MT_Y) { - point_a = Geom::Point(boundingbox_X.min(),center[Y]); - point_b = Geom::Point(boundingbox_X.max(),center[Y]); + point_a = Geom::Point(boundingbox_X.min(),center_point[Y]); + point_b = Geom::Point(boundingbox_X.max(),center_point[Y]); } if (mode == MT_X) { - point_a = Geom::Point(center[X],boundingbox_Y.min()); - point_b = Geom::Point(center[X],boundingbox_Y.max()); + point_a = Geom::Point(center_point[X],boundingbox_Y.min()); + point_b = Geom::Point(center_point[X],boundingbox_Y.max()); } + line_separation.setPoints(point_a, point_b); if ( mode == MT_X || mode == MT_Y ) { - Geom::Path path; - path.start( point_a ); - path.appendNew( point_b ); - reflection_line.set_new_value(path.toPwSb(), true); - line_separation.setPoints(point_a, point_b); - center.param_setValue(path.pointAt(0.5), true); + start_point.param_setValue(point_a); + end_point.param_setValue(point_b); + center_point = Geom::middle_point(point_a, point_b); } else if ( mode == MT_FREE) { - Geom::PathVector line_m(reflection_line.get_pathvector()); - Geom::Line line_symm; - line_symm->setPoints(line_m->initialPoint(), line_m->finalPoint()); - Geom::GenericRect bbox(boundingbox_X.min(), boundingbox_Y.min(), boundingbox_X.max(), boundingbox_Y.max()); - line_m[0].initialPoint = bbox->nearestEdgePoint(line_m->initialPoint()); - line_m[0].finalPoint = bbox->nearestEdgePoint(line_m->finalPoint()) - if(!are_near(previous_center,center, 0.01)) { - Geom::Point trans = center - line_m[0].pointAt(0.5); - line_m[0] *= Geom::Affine(1,0,0,1,trans[X],trans[Y]); - point_a = line_m[0].initialPoint(); - point_b = line_m[0].finalPoint(); - reflection_line.set_new_value(line_m[0].toPwSb(), true); - line_separation.setPoints(point_a, point_b); + if(!are_near(previous_center,center_point, 0.01)) { + Geom::Point trans = center_point - previous_center; + start_point.param_setValue(start_point * trans); + end_point.param_setValue(end_point * trans); + line_separation.setPoints(start_point, end_point); } else { - center.param_setValue(line_m[0].pointAt(0.5), true); - point_a = line_m[0].initialPoint(); - point_b = line_m[0].finalPoint(); - reflection_line.set_new_value(line_m[0].toPwSb(), true); - line_separation.setPoints(point_a, point_b); + center_point = Geom::middle_point((Geom::Point)start_point, (Geom::Point)end_point); + line_separation.setPoints(start_point, end_point); + } + } else if ( mode == MT_V){ + if(SP_ACTIVE_DESKTOP){ + SPDocument * doc = SP_ACTIVE_DESKTOP->getDocument(); + Geom::Rect view_box_rect = doc->getViewBox(); + Geom::Point sp = Geom::Point(view_box_rect.width()/2.0, 0); + sp *= lpeitem->transform.inverse(); + start_point.param_setValue(sp); + Geom::Point ep = Geom::Point(view_box_rect.width()/2.0, view_box_rect.height()); + ep *= lpeitem->transform.inverse(); + end_point.param_setValue(ep); + center_point = Geom::middle_point((Geom::Point)start_point, (Geom::Point)end_point); + line_separation.setPoints(start_point, end_point); + } + } else { //horizontal page + if(SP_ACTIVE_DESKTOP){ + SPDocument * doc = SP_ACTIVE_DESKTOP->getDocument(); + Geom::Rect view_box_rect = doc->getViewBox(); + Geom::Point sp = Geom::Point(0, view_box_rect.height()/2.0); + sp *= lpeitem->transform.inverse(); + start_point.param_setValue(sp); + Geom::Point ep = Geom::Point(view_box_rect.width(), view_box_rect.height()/2.0); + ep *= lpeitem->transform.inverse(); + end_point.param_setValue(ep); + center_point = Geom::middle_point((Geom::Point)start_point, (Geom::Point)end_point); + line_separation.setPoints(start_point, end_point); } - previous_center = center; } - - item->apply_to_clippath(item); - item->apply_to_mask(item); + previous_center = center_point; } void @@ -136,23 +162,18 @@ LPEMirrorSymmetry::doOnApply (SPLPEItem const* lpeitem) Point point_a(boundingbox_X.max(), boundingbox_Y.min()); Point point_b(boundingbox_X.max(), boundingbox_Y.max()); Point point_c(boundingbox_X.max(), boundingbox_Y.middle()); - Geom::Path path; - path.start( point_a ); - path.appendNew( point_b ); - reflection_line.set_new_value(path.toPwSb(), true); - center.param_setValue(point_c); - previous_center = center; + start_point.param_setValue(point_a); + start_point.param_update_default(point_a); + end_point.param_setValue(point_b); + end_point.param_update_default(point_b); + center_point = point_c; + previous_center = center_point; } Geom::PathVector LPEMirrorSymmetry::doEffect_path (Geom::PathVector const & path_in) { - // Don't allow empty path parameter: - Geom::PathVector line_m(reflection_line.get_pathvector()); - if ( line_m.empty() ) { - return path_in; - } Geom::PathVector const original_pathv = pathv_to_linear_and_cubic_beziers(path_in); Geom::PathVector path_out; @@ -183,7 +204,7 @@ LPEMirrorSymmetry::doEffect_path (Geom::PathVector const & path_in) if (path_it->empty()) { continue; } - Geom::PathVector temp_path; + Geom::PathVector tmp_path; double time_start = 0.0; int position = 0; bool end_open = false; @@ -193,65 +214,88 @@ LPEMirrorSymmetry::doEffect_path (Geom::PathVector const & path_in) end_open = true; } } - Geom::Path original = path_it; + Geom::Path original = *path_it; if (end_open && path_it->closed()) { original.close(false); original.appendNew( original.initialPoint() ); original.close(true); } - Geom::Crossings cs = crossings(original, line_m); - for (unsigned int i = 0; i < cs.size(); i++) { - double timeEnd = cs[i].ta; - Geom::Path portion = original.portion(time_start, timeEnd); - Geom::Point middle = portion.pointAt((double)portion.size()/2.0); - position = Geom::sgn(Geom::cross(point_b - point_a, middle - point_a)); - if (oposite_fuse) { - position *= -1; - } - if (position == 1) { - Geom::Path mirror = portion.reversed() * m; - mirror.setInitial(portion.finalPoint()); - portion.append(mirror); - if(i!=0) { - portion.setFinal(portion.initialPoint()); - portion.close(); + Geom::Point s = start_point; + Geom::Point e = end_point; + double dir = line_separation.angle(); + double diagonal = Geom::distance(Geom::Point(boundingbox_X.min(),boundingbox_Y.min()),Geom::Point(boundingbox_X.max(),boundingbox_Y.max())); + Geom::Rect bbox(Geom::Point(boundingbox_X.min(),boundingbox_Y.min()),Geom::Point(boundingbox_X.max(),boundingbox_Y.max())); + double size_divider = Geom::distance(center_point, bbox) + diagonal; + s = Geom::Point::polar(dir,size_divider) + center_point; + e = Geom::Point::polar(dir + Geom::rad_from_deg(180),size_divider) + center_point; + Geom::Path divider = Geom::Path(s); + divider.appendNew(e); + Geom::Crossings cs = crossings(original, divider); + std::vector crossed; + for(unsigned int i = 0; i < cs.size(); i++) { + crossed.push_back(cs[i].ta); + } + std::sort(crossed.begin(), crossed.end()); + for (unsigned int i = 0; i < crossed.size(); i++) { + double time_end = crossed[i]; + if (time_start != time_end && time_end - time_start > Geom::EPSILON) { + Geom::Path portion = original.portion(time_start, time_end); + if (!portion.empty()) { + Geom::Point middle = portion.pointAt((double)portion.size()/2.0); + position = Geom::sgn(Geom::cross(e - s, middle - s)); + if (!oposite_fuse) { + position *= -1; + } + if (position == 1) { + Geom::Path mirror = portion.reversed() * m; + mirror.setInitial(portion.finalPoint()); + portion.append(mirror); + if(i!=0) { + portion.setFinal(portion.initialPoint()); + portion.close(); + } + tmp_path.push_back(portion); + } + portion.clear(); } - temp_path.push_back(portion); } - portion.clear(); - time_start = timeEnd; + time_start = time_end; } - position = position = Geom::sgn(Geom::cross(point_b - point_a, original.finalPoint() - point_a )); - if (oposite_fuse) { + position = Geom::sgn(Geom::cross(e - s, original.finalPoint() - s)); + if (!oposite_fuse) { position *= -1; } if (cs.size()!=0 && position == 1) { - Geom::Path portion = original.portion(time_start, original.size()); - portion = portion.reversed(); - Geom::Path mirror = portion.reversed() * m; - mirror.setInitial(portion.finalPoint()); - portion.append(mirror); - portion = portion.reversed(); - if (!original.closed()) { - temp_path.push_back(portion); - } else { - if(cs.size() >1 ) { - portion.setFinal(temp_path[0].initialPoint()); - portion.setInitial(temp_path[0].finalPoint()); - temp_path[0].append(portion); - } else { - temp_path.push_back(portion); + if (time_start != original.size() && original.size() - time_start > Geom::EPSILON) { + Geom::Path portion = original.portion(time_start, original.size()); + if (!portion.empty()) { + portion = portion.reversed(); + Geom::Path mirror = portion.reversed() * m; + mirror.setInitial(portion.finalPoint()); + portion.append(mirror); + portion = portion.reversed(); + if (!original.closed()) { + tmp_path.push_back(portion); + } else { + if (cs.size() > 1 && tmp_path.size() > 0 && tmp_path[0].size() > 0 ) { + portion.setFinal(tmp_path[0].initialPoint()); + portion.setInitial(tmp_path[0].finalPoint()); + tmp_path[0].append(portion); + } else { + tmp_path.push_back(portion); + } + tmp_path[0].close(); + } + portion.clear(); } - temp_path[0].close(); } - portion.clear(); } if (cs.size() == 0 && position == 1) { - temp_path.push_back(original); - temp_path.push_back(original * m); + tmp_path.push_back(original); + tmp_path.push_back(original * m); } - path_out.insert(path_out.end(), temp_path.begin(), temp_path.end()); - temp_path.clear(); + path_out.insert(path_out.end(), tmp_path.begin(), tmp_path.end()); + tmp_path.clear(); } } @@ -269,19 +313,28 @@ LPEMirrorSymmetry::addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector { using namespace Geom; hp_vec.clear(); - hp_vec.push_back(reflection_line.get_pathvector()); + Geom::Path path; + Geom::Point s = start_point; + Geom::Point e = end_point; + path.start( s ); + path.appendNew( e ); + Geom::PathVector helper; + helper.push_back(path); + hp_vec.push_back(helper); } void LPEMirrorSymmetry::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) { + SPKnotShapeType knot_shape = SP_KNOT_SHAPE_CIRCLE; + SPKnotModeType knot_mode = SP_KNOT_MODE_XOR; + guint32 knot_color = 0x0000ff00; { - KnotHolderEntity *e = new MS::KnotHolderEntityCenterMirrorSymmetry(this); - e->create( desktop, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN, - _("Adjust the center") ); - knotholder->add(e); + KnotHolderEntity *c = new MS::KnotHolderEntityCenterMirrorSymmetry(this); + c->create( desktop, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN, + _("Adjust the center"), knot_shape, knot_mode, knot_color ); + knotholder->add(c); } - }; namespace MS { @@ -293,7 +346,7 @@ KnotHolderEntityCenterMirrorSymmetry::knot_set(Geom::Point const &p, Geom::Point { LPEMirrorSymmetry* lpe = dynamic_cast(_effect); Geom::Point const s = snap_knot_position(p, state); - lpe->center.param_setValue(s); + lpe->center_point = s; // 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), false, true); @@ -303,7 +356,7 @@ Geom::Point KnotHolderEntityCenterMirrorSymmetry::knot_get() const { LPEMirrorSymmetry const *lpe = dynamic_cast(_effect); - return lpe->center; + return lpe->center_point; } } // namespace CR diff --git a/src/live_effects/lpe-mirror_symmetry.h b/src/live_effects/lpe-mirror_symmetry.h index cd6f2a0ce..3a244cb7e 100644 --- a/src/live_effects/lpe-mirror_symmetry.h +++ b/src/live_effects/lpe-mirror_symmetry.h @@ -32,6 +32,8 @@ class KnotHolderEntityCenterMirrorSymmetry; } enum ModeType { + MT_V, + MT_H, MT_FREE, MT_X, MT_Y, @@ -57,10 +59,11 @@ private: BoolParam discard_orig_path; BoolParam fuse_paths; BoolParam oposite_fuse; - PathParam reflection_line; + PointParam start_point; + PointParam end_point; Geom::Line line_separation; Geom::Point previous_center; - PointParam center; + Geom::Point center_point; LPEMirrorSymmetry(const LPEMirrorSymmetry&); LPEMirrorSymmetry& operator=(const LPEMirrorSymmetry&); -- cgit v1.2.3 From 96731f992a6c14dd8a6b80075e1648356b3544ef Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Sun, 8 May 2016 09:39:27 +0200 Subject: Fixing page transforms (bzr r13682.1.39) --- src/live_effects/lpe-mirror_symmetry.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp index 9a2a54a13..c4bd919f8 100644 --- a/src/live_effects/lpe-mirror_symmetry.cpp +++ b/src/live_effects/lpe-mirror_symmetry.cpp @@ -127,10 +127,10 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem) SPDocument * doc = SP_ACTIVE_DESKTOP->getDocument(); Geom::Rect view_box_rect = doc->getViewBox(); Geom::Point sp = Geom::Point(view_box_rect.width()/2.0, 0); - sp *= lpeitem->transform.inverse(); + sp *= lpeitem->i2dt_affine().inverse(); start_point.param_setValue(sp); Geom::Point ep = Geom::Point(view_box_rect.width()/2.0, view_box_rect.height()); - ep *= lpeitem->transform.inverse(); + ep *= lpeitem->i2dt_affine().inverse(); end_point.param_setValue(ep); center_point = Geom::middle_point((Geom::Point)start_point, (Geom::Point)end_point); line_separation.setPoints(start_point, end_point); @@ -140,10 +140,10 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem) SPDocument * doc = SP_ACTIVE_DESKTOP->getDocument(); Geom::Rect view_box_rect = doc->getViewBox(); Geom::Point sp = Geom::Point(0, view_box_rect.height()/2.0); - sp *= lpeitem->transform.inverse(); + sp *= lpeitem->i2dt_affine().inverse(); start_point.param_setValue(sp); Geom::Point ep = Geom::Point(view_box_rect.width(), view_box_rect.height()/2.0); - ep *= lpeitem->transform.inverse(); + ep *= lpeitem->i2dt_affine().inverse(); end_point.param_setValue(ep); center_point = Geom::middle_point((Geom::Point)start_point, (Geom::Point)end_point); line_separation.setPoints(start_point, end_point); -- cgit v1.2.3 From d756856a3abe21eba762bf7562402feb91f257b1 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Sun, 8 May 2016 11:08:40 +0200 Subject: Fix transform in document based axis (bzr r13682.1.41) --- src/live_effects/lpe-mirror_symmetry.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp index c4bd919f8..88fee4c47 100644 --- a/src/live_effects/lpe-mirror_symmetry.cpp +++ b/src/live_effects/lpe-mirror_symmetry.cpp @@ -127,10 +127,10 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem) SPDocument * doc = SP_ACTIVE_DESKTOP->getDocument(); Geom::Rect view_box_rect = doc->getViewBox(); Geom::Point sp = Geom::Point(view_box_rect.width()/2.0, 0); - sp *= lpeitem->i2dt_affine().inverse(); + sp *= i2anc_affine(SP_OBJECT(lpeitem), SP_OBJECT(SP_ACTIVE_DESKTOP->currentLayer()->parent)) .inverse(); start_point.param_setValue(sp); Geom::Point ep = Geom::Point(view_box_rect.width()/2.0, view_box_rect.height()); - ep *= lpeitem->i2dt_affine().inverse(); + ep *= i2anc_affine(SP_OBJECT(lpeitem), SP_OBJECT(SP_ACTIVE_DESKTOP->currentLayer()->parent)) .inverse(); end_point.param_setValue(ep); center_point = Geom::middle_point((Geom::Point)start_point, (Geom::Point)end_point); line_separation.setPoints(start_point, end_point); @@ -140,10 +140,10 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem) SPDocument * doc = SP_ACTIVE_DESKTOP->getDocument(); Geom::Rect view_box_rect = doc->getViewBox(); Geom::Point sp = Geom::Point(0, view_box_rect.height()/2.0); - sp *= lpeitem->i2dt_affine().inverse(); + sp *= i2anc_affine(SP_OBJECT(lpeitem), SP_OBJECT(SP_ACTIVE_DESKTOP->currentLayer()->parent)) .inverse(); start_point.param_setValue(sp); Geom::Point ep = Geom::Point(view_box_rect.width(), view_box_rect.height()/2.0); - ep *= lpeitem->i2dt_affine().inverse(); + ep *= i2anc_affine(SP_OBJECT(lpeitem), SP_OBJECT(SP_ACTIVE_DESKTOP->currentLayer()->parent)) .inverse(); end_point.param_setValue(ep); center_point = Geom::middle_point((Geom::Point)start_point, (Geom::Point)end_point); line_separation.setPoints(start_point, end_point); @@ -178,7 +178,7 @@ LPEMirrorSymmetry::doEffect_path (Geom::PathVector const & path_in) Geom::PathVector path_out; if (!discard_orig_path && !fuse_paths) { - path_out = path_in; + path_out = pathv_to_linear_and_cubic_beziers(path_in); } Geom::Point point_a(line_separation.initialPoint()); -- cgit v1.2.3