diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/live_effects/effect.cpp | 3 | ||||
| -rw-r--r-- | src/live_effects/effect.h | 4 | ||||
| -rw-r--r-- | src/live_effects/lpe-measure-segments.cpp | 134 | ||||
| -rw-r--r-- | src/live_effects/lpe-measure-segments.h | 3 | ||||
| -rw-r--r-- | src/live_effects/parameter/originalitemarray.cpp | 5 | ||||
| -rw-r--r-- | src/object/sp-item.cpp | 6 | ||||
| -rw-r--r-- | src/object/sp-lpe-item.cpp | 7 | ||||
| -rw-r--r-- | src/ui/tool/transform-handle-set.cpp | 2 |
8 files changed, 69 insertions, 95 deletions
diff --git a/src/live_effects/effect.cpp b/src/live_effects/effect.cpp index 941923a77..de248fbd2 100644 --- a/src/live_effects/effect.cpp +++ b/src/live_effects/effect.cpp @@ -468,7 +468,7 @@ Effect::isNodePointSelected(Geom::Point const &nodePoint) const } void -Effect::processObjects(LpeAction lpe_action) +Effect::processObjects(LPEAction lpe_action) { SPDocument * document = SP_ACTIVE_DOCUMENT; if (!document) { @@ -499,6 +499,7 @@ Effect::processObjects(LpeAction lpe_action) sp_item_list_to_curves(item_list, item_selected, item_to_select); } elemnode->setAttribute("sodipodi:insensitive", NULL); + SP_ITEM(elemref)->moveTo(SP_ITEM(sp_lpe_item), false); } break; diff --git a/src/live_effects/effect.h b/src/live_effects/effect.h index d162b8bb4..cd8f9d743 100644 --- a/src/live_effects/effect.h +++ b/src/live_effects/effect.h @@ -45,7 +45,7 @@ enum LPEPathFlashType { DEFAULT }; -enum LpeAction { +enum LPEAction { LPE_ERASE = 0, LPE_TO_OBJECTS, LPE_VISIBILITY @@ -82,7 +82,7 @@ public: void doAcceptPathPreparations(SPLPEItem *lpeitem); SPShape * getCurrentShape() const { return current_shape; }; void setCurrentShape(SPShape * shape) { current_shape = shape; } - void processObjects(LpeAction lpe_action); + void processObjects(LPEAction lpe_action); /* * isReady() indicates whether all preparations which are necessary to apply the LPE are done, diff --git a/src/live_effects/lpe-measure-segments.cpp b/src/live_effects/lpe-measure-segments.cpp index 2f95d1ace..5f62f0281 100644 --- a/src/live_effects/lpe-measure-segments.cpp +++ b/src/live_effects/lpe-measure-segments.cpp @@ -27,9 +27,6 @@ #include "object/sp-path.h" #include "object/sp-root.h" #include "object/sp-shape.h" -#include "object/sp-ellipse.h" -#include "object/sp-star.h" -#include "object/sp-spiral.h" #include "svg/stringstream.h" #include "svg/svg.h" #include "svg/svg-color.h" @@ -96,7 +93,10 @@ LPEMeasureSegments::LPEMeasureSegments(LivePathEffectObject *lpeobject) : angle_projection(_("Angle of projection"), _("Angle of projection"), "angle_projection", &wr, this, 0.0), active_projection(_("Activate projection"), _("Active projection mode"), "active_projection", &wr, this, false), avoid_overlapping(_("Avoid overlap measures"), _("Turn not fit measures"), "avoid_overlapping", &wr, this, true), - onbbox(_("Measure bounding box"), _("Measure Geometric bounding box"), "onbbox", &wr, this, false), + onbbox(_("Measure bounding box"), _("Measure geometric bounding box"), "onbbox", &wr, this, false), + bboxonly(_("Only bounding box"), _("Measure only bbox and hide nodes"), "bboxonly", &wr, this, false), + centers(_("Project center"), _("Use centers as measure"), "centers", &wr, this, false), + maxmin(_("Only max and min"), _("Compute only max min projection values"), "maxmin", &wr, this, false), general(_("General"), _("General"), "general", &wr, this, ""), projection(_("Projection"), _("Projection"), "projection", &wr, this, ""), options(_("Options"), _("Options"), "options", &wr, this, ""), @@ -133,6 +133,9 @@ LPEMeasureSegments::LPEMeasureSegments(LivePathEffectObject *lpeobject) : registerParameter(&angle_projection); registerParameter(&avoid_overlapping); registerParameter(&onbbox); + registerParameter(&bboxonly); + registerParameter(¢ers); + registerParameter(&maxmin); registerParameter(&general); registerParameter(&projection); registerParameter(&options); @@ -173,18 +176,15 @@ LPEMeasureSegments::LPEMeasureSegments(LivePathEffectObject *lpeobject) : helpline_overlap.param_set_range(-999999.0, 999999.0); helpline_overlap.param_set_increments(1, 1); helpline_overlap.param_set_digits(2); - distance_projection.param_set_range(-999999.0, 999999.0); distance_projection.param_set_increments(1, 1); distance_projection.param_set_digits(5); angle_projection.param_set_range(0.0, 360.0); angle_projection.param_set_increments(90.0, 90.0); angle_projection.param_set_digits(2); - spiral_star_fix = Geom::identity(); locale_base = strdup(setlocale(LC_NUMERIC, NULL)); previous_size = 0; pagenumber = 0; - transformed = false; general.param_update_default(_("Base of the lpe, focus on measure display and positioning")); projection.param_update_default(_("This section is optional. To activate pulse the icon down \"Active\" " " to set the elements on clipboard, the element is converted to a line with measures based on the selected items")); @@ -235,6 +235,9 @@ LPEMeasureSegments::newWidget() } else if (param->param_key == "active_projection" || param->param_key == "distance_projection" || param->param_key == "angle_projection" || + param->param_key == "maxmin" || + param->param_key == "centers" || + param->param_key == "bboxonly" || param->param_key == "onbbox" ) { vbox1->pack_start(*widg, false, true, 2); @@ -394,7 +397,6 @@ LPEMeasureSegments::createTextLabel(Geom::Point pos, size_t counter, double leng SPObject *elemref = NULL; Inkscape::XML::Node *rtspan = NULL; elemref = document->getObjectById(id.c_str()); - if (elemref) { rtext = elemref->getRepr(); sp_repr_set_svg_double(rtext, "x", pos[Geom::X]); @@ -497,18 +499,9 @@ LPEMeasureSegments::createTextLabel(Geom::Point pos, size_t counter, double leng rstring->setContent(label_value.c_str()); } if (!elemref) { - elemref = sp_lpe_item->parent->appendChildRepr(rtext); + elemref = document->getRoot()->appendChildRepr(rtext); Inkscape::GC::release(rtext); - } else if (elemref->parent != sp_lpe_item->parent) { - Inkscape::XML::Node *old_repr = elemref->getRepr(); - Inkscape::XML::Node *copy = old_repr->duplicate(xml_doc); - SPObject * elemref_copy = sp_lpe_item->parent->appendChildRepr(copy); - Inkscape::GC::release(copy); - elemref->deleteObject(true); - copy->setAttribute("id", id.c_str()); - elemref = elemref_copy; - } - SP_ITEM(elemref)->updateRepr(); + } Geom::OptRect bounds = SP_ITEM(elemref)->bounds(SPItem::GEOMETRIC_BBOX); if (bounds) { anotation_width = bounds->width() * 1.15; @@ -580,7 +573,6 @@ LPEMeasureSegments::createLine(Geom::Point start,Geom::Point end, Glib::ustring } if (elemref) { line = elemref->getRepr(); - gchar * line_str = sp_svg_write_path( line_pathv ); line->setAttribute("d" , line_str); line->setAttribute("transform", NULL); @@ -646,15 +638,8 @@ LPEMeasureSegments::createLine(Geom::Point start,Geom::Point end, Glib::ustring sp_repr_css_write_string(css,css_str); line->setAttribute("style", css_str.c_str()); if (!elemref) { - elemref = sp_lpe_item->parent->appendChildRepr(line); + elemref = document->getRoot()->appendChildRepr(line); Inkscape::GC::release(line); - } else if (elemref->parent != sp_lpe_item->parent) { - Inkscape::XML::Node *old_repr = elemref->getRepr(); - Inkscape::XML::Node *copy = old_repr->duplicate(xml_doc); - sp_lpe_item->parent->appendChildRepr(copy); - Inkscape::GC::release(copy); - elemref->deleteObject(true); - copy->setAttribute("id", id.c_str()); } } @@ -767,7 +752,7 @@ transformNodes(std::vector< Point > nodes, Geom::Affine transform) } std::vector< Point > -getNodes(SPItem * item, Geom::Affine transform, bool onbbox) +getNodes(SPItem * item, Geom::Affine transform, bool onbbox, bool centers, bool bboxonly) { std::vector< Point > current_nodes; SPShape * shape = dynamic_cast<SPShape *> (item); @@ -779,14 +764,14 @@ getNodes(SPItem * item, Geom::Affine transform, bool onbbox) std::vector<SPItem*> const item_list = sp_item_group_item_list(group); for ( std::vector<SPItem*>::const_iterator iter=item_list.begin();iter!=item_list.end();++iter) { SPItem *sub_item = *iter; - std::vector< Point > nodes = transformNodes(getNodes(sub_item, sub_item->transform, onbbox), transform); + std::vector< Point > nodes = transformNodes(getNodes(sub_item, sub_item->transform, onbbox, centers, bboxonly), transform); current_nodes.insert(current_nodes.end(), nodes.begin(), nodes.end()); } - } else if (shape) { + } else if (shape && !bboxonly) { SPCurve * c = shape->getCurve(); current_nodes = transformNodes(c->get_pathvector().nodes(), transform); c->unref(); - } else if (text || flowtext) { + } else if ((text || flowtext) && !bboxonly) { Inkscape::Text::Layout::iterator iter = te_get_layout(item)->begin(); do { Inkscape::Text::Layout::iterator iter_next = iter; @@ -813,13 +798,16 @@ getNodes(SPItem * item, Geom::Affine transform, bool onbbox) } else { onbbox = true; } - if (onbbox) { - Geom::OptRect bbox = item->geometricBounds(); - if (bbox) { - current_nodes.push_back((*bbox).corner(0)); - current_nodes.push_back((*bbox).corner(1)); - current_nodes.push_back((*bbox).corner(2)); - current_nodes.push_back((*bbox).corner(3)); + if (onbbox || centers) { + Geom::OptRect bbox = item->geometricBounds(item->transform); + if (bbox && onbbox) { + current_nodes.push_back((*bbox).corner(0) * transform); + current_nodes.push_back((*bbox).corner(1) * transform); + current_nodes.push_back((*bbox).corner(2) * transform); + current_nodes.push_back((*bbox).corner(3) * transform); + } + if (bbox && centers) { + current_nodes.push_back((*bbox).midpoint() * transform); } } return current_nodes; @@ -838,11 +826,14 @@ LPEMeasureSegments::doBeforeEffect (SPLPEItem const* lpeitem) if (!document) { return; } + //Avoid crashes on previews Inkscape::XML::Node *root = splpeitem->document->getReprRoot(); Inkscape::XML::Node *root_origin = document->getReprRoot(); if (root_origin != root) { return; } + Geom::Affine parentaffinetransform = i2anc_affine(SP_OBJECT(lpeitem->parent), SP_OBJECT(document->getRoot())); + Geom::Affine affinetransform = i2anc_affine(SP_OBJECT(lpeitem), SP_OBJECT(document->getRoot())); //Projection prepare Geom::PathVector pathvector; std::vector< Point > nodes; @@ -852,24 +843,14 @@ LPEMeasureSegments::doBeforeEffect (SPLPEItem const* lpeitem) if (bbox) { Geom::Point mid = bbox->midpoint(); double angle = Geom::rad_from_deg(angle_projection); - Geom::Affine writed_transform = Geom::identity(); - sp_svg_transform_read(splpeitem->getAttribute("transform"), &writed_transform ); - if (spiral_star_fix != Geom::identity()) { - writed_transform = spiral_star_fix; - } - Geom::Affine transform = writed_transform; - if (transformed) { - writed_transform = writed_transform.inverse(); - std::cout << "OKKKKKKKKKKKS" << std::endl; - } - std::cout << writed_transform << "writed_transform " << std::endl; + Geom::Affine transform = affinetransform; transform *= Geom::Translate(mid).inverse(); - //transform *= Geom::Rotate(angle).inverse(); + transform *= Geom::Rotate(angle).inverse(); transform *= Geom::Translate(mid); - std::vector< Point > current_nodes = getNodes(splpeitem, transform, onbbox); + std::vector< Point > current_nodes = getNodes(splpeitem, transform, onbbox, centers, bboxonly); nodes.insert(nodes.end(),current_nodes.begin(), current_nodes.end()); std::vector<Point> result; - Geom::OptRect bbox = sp_lpe_item->geometricBounds(); + Geom::OptRect bbox = sp_lpe_item->geometricBounds(sp_lpe_item->transform); Geom::Point pojpoint = Geom::Point(); double maxdistance = -std::numeric_limits<double>::max(); for ( std::vector<Point>::iterator iter = nodes.begin(); iter != nodes.end(); ++iter ) { @@ -886,13 +867,12 @@ LPEMeasureSegments::doBeforeEffect (SPLPEItem const* lpeitem) if ((*iter)->ref.isAttached() && (*iter)->actived && (obj = (*iter)->ref.getObject()) && SP_IS_ITEM(obj)) { SPItem * item = dynamic_cast<SPItem *>(obj); if (item) { - Geom::Affine writed_transform = Geom::identity(); - sp_svg_transform_read(item->getAttribute("transform"), &writed_transform ); - Geom::Affine transform = writed_transform; + Geom::Affine affinetransform_sub = i2anc_affine(SP_OBJECT(item), SP_OBJECT(document->getRoot())); + Geom::Affine transform = affinetransform_sub ; transform *= Geom::Translate(-mid); transform *= Geom::Rotate(angle).inverse(); transform *= Geom::Translate(mid); - std::vector< Point > current_nodes = getNodes(item, transform, onbbox); + std::vector< Point > current_nodes = getNodes(item, transform, onbbox, centers, bboxonly); nodes.insert(nodes.end(),current_nodes.begin(), current_nodes.end()); } } @@ -918,10 +898,15 @@ LPEMeasureSegments::doBeforeEffect (SPLPEItem const* lpeitem) path.setInitial(point); started = true; } else { - path.appendNew<Geom::LineSegment>(point); + if (!maxmin) { + path.appendNew<Geom::LineSegment>(point); + } } prevpoint = point; } + if (maxmin) { + path.appendNew<Geom::LineSegment>(result[result.size()-1]); + } pathvector.push_back(path); pathvector *= Geom::Translate(-mid); pathvector *= Geom::Rotate(angle); @@ -966,23 +951,11 @@ LPEMeasureSegments::doBeforeEffect (SPLPEItem const* lpeitem) Geom::Point start_stored = Geom::Point(0,0); Geom::Point end_stored = Geom::Point(0,0); Geom::Point next_stored = Geom::Point(0,0); - Geom::Affine affinetransform = i2anc_affine(SP_OBJECT(lpeitem->parent), SP_OBJECT(document->getRoot())); if (!active_projection) { pathvector = pathv_to_linear_and_cubic_beziers(c->get_pathvector()); - Geom::Affine writed_transform = Geom::identity(); - sp_svg_transform_read(splpeitem->getAttribute("transform"), &writed_transform ); - if (spiral_star_fix != Geom::identity()) { - pathvector *= spiral_star_fix; - } else { - pathvector *= writed_transform; - } + pathvector *= affinetransform; } - spiral_star_fix = Geom::identity(); - transformed = false; c->unref(); - Geom::Affine writed_transform = Geom::identity(); - sp_svg_transform_read(splpeitem->getAttribute("transform"), &writed_transform ); - pathvector *= writed_transform; gchar * format_str = format.param_getSVGValue(); if (Glib::ustring(format_str).empty()) { format.param_setValue(Glib::ustring("{measure}{unit}")); @@ -1089,21 +1062,24 @@ LPEMeasureSegments::doBeforeEffect (SPLPEItem const* lpeitem) infoline_on_start += Glib::ustring::format(counter); infoline_on_start += "-"; infoline_on_start += lpobjid; - items.push_back(infoline_on_start); + Glib::ustring infoline_on_end = "infoline-on-end-"; infoline_on_end += Glib::ustring::format(counter); infoline_on_end += "-"; infoline_on_end += lpobjid; - items.push_back(infoline_on_end); + Glib::ustring infoline = "infoline-"; infoline += Glib::ustring::format(counter); infoline += "-"; infoline += lpobjid; - items.push_back(infoline); + Glib::ustring texton = "text-on-"; texton += Glib::ustring::format(counter); texton += "-"; texton += lpobjid; + items.push_back(infoline_on_start); + items.push_back(infoline_on_end); + items.push_back(infoline); items.push_back(texton); if (!hide_arrows) { if (arrows_outside) { @@ -1228,19 +1204,19 @@ LPEMeasureSegments::doBeforeEffect (SPLPEItem const* lpeitem) } else { pos = pos + Point::polar(angle_cross, text_top_bottom + (fontsize/2.5)); } - double parents_scale = (affinetransform.expansionX() + affinetransform.expansionY()) / 2.0; - if (scale_sensitive) { - length *= parents_scale; + double parents_scale = (parentaffinetransform.expansionX() + parentaffinetransform.expansionY()) / 2.0; + if (!scale_sensitive) { + length /= parents_scale; } if ((anotation_width/2) > Geom::distance(hstart,hend)/2.0) { if (avoid_overlapping) { pos = pos - Point::polar(angle_cross, position + (anotation_width/2.0)); angle += Geom::rad_from_deg(90); } else { - pos = pos - Point::polar(angle_cross, position); + pos = pos - Point::polar(angle_cross, position); } } - if (scale_sensitive && !affinetransform.preservesAngles()) { + if (!scale_sensitive && !parentaffinetransform.preservesAngles()) { createTextLabel(pos, counter, length, angle, remove, false); } else { createTextLabel(pos, counter, length, angle, remove, true); diff --git a/src/live_effects/lpe-measure-segments.h b/src/live_effects/lpe-measure-segments.h index 1c8cfbca8..4f9df35c8 100644 --- a/src/live_effects/lpe-measure-segments.h +++ b/src/live_effects/lpe-measure-segments.h @@ -72,6 +72,9 @@ private: BoolParam hide_back; BoolParam hide_arrows; BoolParam onbbox; + BoolParam bboxonly; + BoolParam centers; + BoolParam maxmin; BoolParam smallx100; OriginalItemArrayParam linked_items; ScalarParam distance_projection; diff --git a/src/live_effects/parameter/originalitemarray.cpp b/src/live_effects/parameter/originalitemarray.cpp index a4c2e5087..a801d25f6 100644 --- a/src/live_effects/parameter/originalitemarray.cpp +++ b/src/live_effects/parameter/originalitemarray.cpp @@ -340,10 +340,9 @@ void OriginalItemArrayParam::remove_link(ItemAndActive* to) } } -void OriginalItemArrayParam::linked_delete(SPObject */*deleted*/, ItemAndActive* /*to*/) +void OriginalItemArrayParam::linked_delete(SPObject */*deleted*/, ItemAndActive* to) { - //remove_link(to); - + remove_link(to); gchar * full = param_getSVGValue(); param_write_to_repr(full); g_free(full); diff --git a/src/object/sp-item.cpp b/src/object/sp-item.cpp index 4b4d3e7cd..accf110ad 100644 --- a/src/object/sp-item.cpp +++ b/src/object/sp-item.cpp @@ -736,7 +736,7 @@ Inkscape::XML::Node* SPItem::write(Inkscape::XML::Document *xml_doc, Inkscape::X } } } - + gchar *c = sp_svg_transform_write(item->transform); repr->setAttribute("transform", c); g_free(c); @@ -1503,7 +1503,7 @@ void SPItem::doWriteTransform(Geom::Affine const &transform, Geom::Affine const // CPPIFY: check this code. // If onSetTransform is not overridden, CItem::onSetTransform will return the transform it was given as a parameter. // onSetTransform cannot be pure due to the fact that not all visible Items are transformable. - + SPLPEItem * lpeitem = SP_LPE_ITEM(this); if ( // run the object's set_transform (i.e. embed transform) only if: (dynamic_cast<SPText *>(this) && firstChild() && dynamic_cast<SPTextPath *>(firstChild())) || (!preserve && // user did not chose to preserve all transforms @@ -1518,7 +1518,6 @@ void SPItem::doWriteTransform(Geom::Affine const &transform, Geom::Affine const freeze_stroke_width_recursive(false); } } else { - SPLPEItem * lpeitem = SP_LPE_ITEM(this); if (lpeitem && lpeitem->hasPathEffectRecursive()) { lpeitem->adjust_livepatheffect(transform_attr); } @@ -1542,7 +1541,6 @@ void SPItem::doWriteTransform(Geom::Affine const &transform, Geom::Affine const // values if called in code handling the transformed signal. updateRepr(); - SPLPEItem * lpeitem = SP_LPE_ITEM(this); if (lpeitem && lpeitem->hasPathEffectRecursive()) { sp_lpe_item_update_patheffect(lpeitem, false, false); } diff --git a/src/object/sp-lpe-item.cpp b/src/object/sp-lpe-item.cpp index 7ff0a88d6..7b90319ab 100644 --- a/src/object/sp-lpe-item.cpp +++ b/src/object/sp-lpe-item.cpp @@ -170,11 +170,10 @@ void SPLPEItem::update(SPCtx* ctx, unsigned int flags) { } void SPLPEItem::modified(unsigned int flags) { - //TODO: remove if no regressions //stop update when modified and make the effect update on the LPE transform method if the effect require it - //if (SP_IS_GROUP(this) && (flags & SP_OBJECT_MODIFIED_FLAG) && (flags & SP_OBJECT_USER_MODIFIED_FLAG_B)) { - // sp_lpe_item_update_patheffect(this, true, true); - //} + if (SP_IS_GROUP(this) && (flags & SP_OBJECT_MODIFIED_FLAG) && (flags & SP_OBJECT_USER_MODIFIED_FLAG_B)) { + this->update_patheffect(false); + } } Inkscape::XML::Node* SPLPEItem::write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { diff --git a/src/ui/tool/transform-handle-set.cpp b/src/ui/tool/transform-handle-set.cpp index f64b9732e..23cd6b79d 100644 --- a/src/ui/tool/transform-handle-set.cpp +++ b/src/ui/tool/transform-handle-set.cpp @@ -258,7 +258,6 @@ protected: virtual Geom::Affine computeTransform(Geom::Point const &new_pos, GdkEventMotion *event) { Geom::Point scc = held_shift(*event) ? _sc_center : _sc_opposite; Geom::Point vold = _origin - scc, vnew = new_pos - scc; - // avoid exploding the selection if (Geom::are_near(vold[Geom::X], 0) || Geom::are_near(vold[Geom::Y], 0)) return Geom::identity(); @@ -286,7 +285,6 @@ protected: } m.snapTransformed(_snap_points, _origin, (*ptr)); m.unSetup(); - if (ptr->best_snapped_point.getSnapped()) { scale = ptr->getScaleSnapped(); } |
