mirror of
https://github.com/node-red/node-red.git
synced 2023-10-10 13:36:53 +02:00
Better vertical path routing
This commit is contained in:
parent
fb1918d839
commit
e2b7377ab7
@ -596,12 +596,101 @@ RED.view = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function generateLinkPathV(origX,origY, destX, destY, sc) {
|
||||||
|
var dy = destY-origY;
|
||||||
|
var dx = destX-origX;
|
||||||
|
var delta = Math.sqrt(dy*dy+dx*dx);
|
||||||
|
var scale = lineCurveScale*2;
|
||||||
|
var fullScale = scale;
|
||||||
|
|
||||||
|
if (dy*sc > 0) {
|
||||||
|
if (delta < node_height) {
|
||||||
|
scale = scale-scale*((node_height-delta)/node_height);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
scale = 0.4-0.2*(Math.max(0,(node_height-Math.min(Math.abs(dx),Math.abs(dy)))/node_height));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dy*sc > 0) {
|
||||||
|
if (delta < (1.5*node_width)) {
|
||||||
|
scale = fullScale-fullScale*(((1.5*node_width)-delta)/(1.5*node_width));
|
||||||
|
}
|
||||||
|
|
||||||
|
return "M "+origX+" "+origY+
|
||||||
|
" C "+origX+" "+(origY+sc*node_height*scale)+" "+
|
||||||
|
destX+" "+(destY-sc*scale*node_height)+" "+
|
||||||
|
destX+" "+destY
|
||||||
|
// +drawCross(origX,(origY+sc*(node_height*scale)))
|
||||||
|
// +drawCross(destX,(destY-sc*scale*node_height))
|
||||||
|
|
||||||
|
} else {
|
||||||
|
var scx = dx>0?1:-1;
|
||||||
|
|
||||||
|
var midX = Math.floor(destX-dx/2);
|
||||||
|
var midY = Math.floor(destY-dy/2);
|
||||||
|
//
|
||||||
|
if (Math.abs(dx) < node_width) {
|
||||||
|
midX = destX - 1.3*scx*node_width;
|
||||||
|
}
|
||||||
|
var cp_width = node_width/2;
|
||||||
|
var x1 = (destX + midX)/2
|
||||||
|
var topY = origY + 2*sc*node_height*scale;
|
||||||
|
var topX = dx>0?Math.min(x1 - dx/2 , origX+cp_width):Math.max(x1 - dx/2 , origX-cp_width);
|
||||||
|
var bottomY = destY - 2*sc*node_height*scale;
|
||||||
|
var bottomX = dx>0?Math.max(x1, destX-cp_width):Math.min(x1, destX+cp_width);
|
||||||
|
var y1 = (origY+topY)/2;
|
||||||
|
var cp = [
|
||||||
|
// Orig -> Top
|
||||||
|
[origX,y1],
|
||||||
|
[dx>0?Math.max(origX, topX-cp_width):Math.min(origX, topX+cp_width),topY],
|
||||||
|
// Top -> Mid
|
||||||
|
// [Mirror previous cp]
|
||||||
|
[dx>0?Math.min(midX, topX+cp_width):Math.max(midX, topX-cp_width),y1],
|
||||||
|
// Mid -> Bottom
|
||||||
|
// [Mirror previous cp]
|
||||||
|
[dx>0?Math.max(midX, bottomX-cp_width):Math.min(midX, bottomX+cp_width), bottomY],
|
||||||
|
// Bottom -> Dest
|
||||||
|
// [Mirror previous cp]
|
||||||
|
[destX, (destY+bottomY)/2]
|
||||||
|
];
|
||||||
|
// if (cp[2][0] === topX+scx*cp_width) {
|
||||||
|
// if (Math.abs(dx) < cp_width*10) {
|
||||||
|
// cp[1][0] = topX-scx*cp_width/2;
|
||||||
|
// cp[3][0] = bottomX-scx*cp_width/2;
|
||||||
|
// }
|
||||||
|
// cp[2][1] = topY;
|
||||||
|
// }
|
||||||
|
return "M "+origX+" "+origY+
|
||||||
|
" C "+
|
||||||
|
cp[0][0]+" "+cp[0][1]+" "+
|
||||||
|
cp[1][0]+" "+cp[1][1]+" "+
|
||||||
|
topX+" "+topY+
|
||||||
|
" S "+
|
||||||
|
cp[2][0]+" "+cp[2][1]+" "+
|
||||||
|
midX+" "+midY+
|
||||||
|
" S "+
|
||||||
|
cp[3][0]+" "+cp[3][1]+" "+
|
||||||
|
bottomX+" "+bottomY+
|
||||||
|
" S "+
|
||||||
|
cp[4][0]+" "+cp[4][1]+" "+
|
||||||
|
destX+" "+destY
|
||||||
|
// +drawCross(cp[0][0],cp[0][1])
|
||||||
|
// +drawCross(cp[1][0],cp[1][1])
|
||||||
|
// +drawCross(cp[2][0],cp[2][1])
|
||||||
|
// +drawCross(cp[3][0],cp[3][1])
|
||||||
|
// +drawCross(cp[4][0],cp[4][1])
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function drawCross(x,y,i) {
|
function drawCross(x,y,i) {
|
||||||
var res = " M "+(x-4)+" "+y+" h8 M "+x+" "+(y-4)+" v8 ";
|
var res = " M "+(x-4)+" "+y+" h8 M "+x+" "+(y-4)+" v8 ";
|
||||||
res += " M "+(x-8)+" "+(y-8)+" h2 ";
|
// res += " M "+(x-8)+" "+(y-8)+" h2 ";
|
||||||
if (i>0) res += " M "+(x+8)+" "+(y-8)+" h2 ";
|
// if (i>0) res += " M "+(x+8)+" "+(y-8)+" h2 ";
|
||||||
if (i>1) res += " M "+(x+8)+" "+(y+8)+" h2 ";
|
// if (i>1) res += " M "+(x+8)+" "+(y+8)+" h2 ";
|
||||||
if (i>2) res += " M "+(x-8)+" "+(y+8)+" h2 ";
|
// if (i>2) res += " M "+(x-8)+" "+(y+8)+" h2 ";
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
function drawCircle(x,y,w) {
|
function drawCircle(x,y,w) {
|
||||||
@ -613,31 +702,6 @@ RED.view = (function() {
|
|||||||
return " M "+x1+","+y1+" L "+x2+","+y2+" "
|
return " M "+x1+","+y1+" L "+x2+","+y2+" "
|
||||||
}
|
}
|
||||||
|
|
||||||
function generateLinkPathV(origX,origY, destX, destY, sc) {
|
|
||||||
var dy = destY-origY;
|
|
||||||
var dx = destX-origX;
|
|
||||||
var delta = Math.sqrt(dy*dy+dx*dx);
|
|
||||||
var fullScale = lineCurveScale*4;
|
|
||||||
var scale = fullScale;
|
|
||||||
var scaleX = 0;
|
|
||||||
if (dy*sc <= 0) {
|
|
||||||
var r = 1-Math.max(0,((2*node_height) - Math.abs(dy*sc))/(2*node_height));
|
|
||||||
scale = fullScale+(fullScale*r);
|
|
||||||
|
|
||||||
} else if (delta < (1.5*node_width)) {
|
|
||||||
scale = fullScale-fullScale*(((1.5*node_width)-delta)/(1.5*node_width));
|
|
||||||
}
|
|
||||||
var cp = [
|
|
||||||
[origX, origY+sc*scale*node_height],
|
|
||||||
[destX, destY-sc*scale*node_height]
|
|
||||||
];
|
|
||||||
return "M "+origX+" "+origY+
|
|
||||||
" C "+cp[0][0]+" "+cp[0][1]+" "+
|
|
||||||
cp[1][0]+" "+cp[1][1]+" "+
|
|
||||||
destX+" "+destY
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function addNode(type,x,y) {
|
function addNode(type,x,y) {
|
||||||
var m = /^subflow:(.+)$/.exec(type);
|
var m = /^subflow:(.+)$/.exec(type);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user