summaryrefslogtreecommitdiffstats
path: root/src/ui/tool/path-manipulator.cpp
diff options
context:
space:
mode:
authorJabier Arraiza Cenoz <jabier.arraiza@marker.es>2014-03-31 22:48:28 +0000
committerJabiertxof <jtx@jtx.marker.es>2014-03-31 22:48:28 +0000
commit2b19c5f6508b7a59766d89f315f9f4fbc364f288 (patch)
tree11c692eb43b44fca5c9a636eb991d13495e0ddae /src/ui/tool/path-manipulator.cpp
parentuse <cmath> instead <math.h> by point of Vinícius (diff)
downloadinkscape-2b19c5f6508b7a59766d89f315f9f4fbc364f288.tar.gz
inkscape-2b19c5f6508b7a59766d89f315f9f4fbc364f288.zip
Some node.cpp/h work moved to path_manipulator.
Header variable bsplineWeight removed from all. Simplification of code with less functions in path_manipulator. To fix: tips stop working because is handled by two static functions and couldent call to path_manipulator from here. Vinícius, any work arround? lines 480,481,1426,1427,1462 of node.cpp. gez: ¿Puedes probar si notas algun bug o problema? principalmente con la herramienta nodo, gracias. (bzr r11950.1.322)
Diffstat (limited to 'src/ui/tool/path-manipulator.cpp')
-rw-r--r--src/ui/tool/path-manipulator.cpp46
1 files changed, 15 insertions, 31 deletions
diff --git a/src/ui/tool/path-manipulator.cpp b/src/ui/tool/path-manipulator.cpp
index 841ab659a..905df61f4 100644
--- a/src/ui/tool/path-manipulator.cpp
+++ b/src/ui/tool/path-manipulator.cpp
@@ -666,14 +666,11 @@ unsigned PathManipulator::_deleteStretch(NodeList::iterator start, NodeList::ite
}
// if we are removing, we readjust the handlers
if(isBSpline()){
- double pos = 0.0000;
if(start.prev()){
- pos = BSplineHandlePosition(start.prev()->back());
- start.prev()->front()->setPosition(BSplineHandleReposition(start.prev()->front(),pos));
+ start.prev()->front()->setPosition(BSplineHandleReposition(start.prev()->front(),true));
}
if(end){
- pos = BSplineHandlePosition(end->front());
- end->back()->setPosition(BSplineHandleReposition(end->back(),pos));
+ end->back()->setPosition(BSplineHandleReposition(end->back(),true));
}
}
@@ -1209,31 +1206,36 @@ bool PathManipulator::isBSpline(bool recalculate){
return _is_bspline;
}
-// returns the corresponding strength to the position of a handler
-double PathManipulator::BSplineHandlePosition(Handle *h){
+// returns the corresponding strength to the position of the handlers
+double PathManipulator::BSplineHandlePosition(Handle *h, bool other){
using Geom::X;
using Geom::Y;
double pos = 0.0000;
Node *n = h->parent();
Node * nextNode = NULL;
+ if(other){
+ h = h->other();
+ }
nextNode = n->nodeToward(h);
- if(nextNode && n->position() != h->position()){
+ if(nextNode && !Geom::are_near(n->position(), h->position())){
SPCurve *lineInsideNodes = new SPCurve();
lineInsideNodes->moveto(n->position());
lineInsideNodes->lineto(nextNode->position());
pos = Geom::nearest_point(h->position(),*lineInsideNodes->first_segment());
}
- n->bsplineWeight = pos;
+ if ((pos == 0.0000 || pos == 1.0000) && other == false){
+ return BSplineHandlePosition(h, true);
+ }
return pos;
}
-// moves the handler to the corresponding position
-Geom::Point PathManipulator::BSplineHandleReposition(Handle *h){
- double pos = this->BSplineHandlePosition(h);
+// give the location for the handler in the corresponding position
+Geom::Point PathManipulator::BSplineHandleReposition(Handle *h, bool other){
+ double pos = this->BSplineHandlePosition(h, other);
return BSplineHandleReposition(h,pos);
}
-// moves the handler to the specified position
+// give the location for the handler to the specified position
Geom::Point PathManipulator::BSplineHandleReposition(Handle *h,double pos){
using Geom::X;
using Geom::Y;
@@ -1247,34 +1249,16 @@ Geom::Point PathManipulator::BSplineHandleReposition(Handle *h,double pos){
lineInsideNodes->moveto(n->position());
lineInsideNodes->lineto(nextNode->position());
SBasisInsideNodes = lineInsideNodes->first_segment()->toSBasis();
- n->bsplineWeight = pos;
ret = SBasisInsideNodes.valueAt(pos);
ret = Geom::Point(ret[X] + 0.005,ret[Y] + 0.005);
}else{
if(pos == 0.0000){
- n->bsplineWeight = 0.0000;
ret = n->position();
}
}
return ret;
}
-//moves the node handlers and its oposite handlers to the strength of its nodes
-void PathManipulator::BSplineNodeHandlesReposition(Node *n){
- Node * nextNode = n->nodeToward(n->front());
- Node * prevNode = n->nodeToward(n->back());
- if(prevNode){
- if(!prevNode->isEndNode())
- prevNode->back()->setPosition(BSplineHandleReposition(prevNode->back(),prevNode->bsplineWeight));
- prevNode->front()->setPosition(BSplineHandleReposition(prevNode->front(),prevNode->bsplineWeight));
- }
- if(nextNode){
- if(!nextNode->isEndNode())
- nextNode->front()->setPosition(BSplineHandleReposition(nextNode->front(),nextNode->bsplineWeight));
- nextNode->back()->setPosition(BSplineHandleReposition(nextNode->back(),nextNode->bsplineWeight));
- }
-}
-
/** Construct the geometric representation of nodes and handles, update the outline
* and display
* \param alert_LPE if true, first the LPE is warned what the new path is going to be before updating it