summaryrefslogtreecommitdiffstats
path: root/src/live_effects
diff options
context:
space:
mode:
authorJabier Arraiza <jabier.arraiza@marker.es>2018-04-15 21:57:46 +0000
committerJabier Arraiza <jabier.arraiza@marker.es>2018-04-23 21:37:56 +0000
commit68b814629fa76cca0e2bdb36dfd1aa0d09e1ce7f (patch)
tree3fd3ba1952ed5dac5d15e50c52cc7c93c63db2b5 /src/live_effects
parentRevert TAV d work for testing (diff)
downloadinkscape-68b814629fa76cca0e2bdb36dfd1aa0d09e1ce7f.tar.gz
inkscape-68b814629fa76cca0e2bdb36dfd1aa0d09e1ce7f.zip
Noumerous bugfixes pointed by Lazur on IRC
Diffstat (limited to 'src/live_effects')
-rw-r--r--src/live_effects/effect.cpp3
-rw-r--r--src/live_effects/effect.h4
-rw-r--r--src/live_effects/lpe-measure-segments.cpp134
-rw-r--r--src/live_effects/lpe-measure-segments.h3
-rw-r--r--src/live_effects/parameter/originalitemarray.cpp5
5 files changed, 64 insertions, 85 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(&centers);
+ 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);