alias relDoLayout { var %SpringEmbedderIterations = 1000 var %k = 2 var %c = 0.01 var %MaxRepulsiveForceDistance = 6 var %MaxNodeMovement = 0.5 while (%SpringEmbedderIterations) { var %a = 1 var %b = 2 var %totalNodes = $hget(relNodeLink,0).item while (%a <= %totalNodes) { while (%b <= %totalNodes) { var %bl = $hget(relNodeLink,%b).item var %al = $hget(relNodeLink,%a).item var %deltaX = $calc($hget(relNodeX,%bl) - $hget(relNodeX,%al)) var %deltaY = $calc($hget(relNodeY,%bl) - $hget(relNodeY,%al)) var %distanceSquared = $calc(%deltaX ^2 + %deltaY ^2) if (%distanceSquared < 0.01) { var %deltaX = $calc($rand(0,1) / 10 + 0.1) var %deltaY = $calc($rand(0,1) / 10 + 0.1) var %distanceSquared = $calc(%deltaX ^2 + %deltaY ^2) } var %distance = $sqrt(%distanceSquared) if (%distance < %MaxRepulsiveForceDistance) { var %repulsiveForce = $calc(%k * %k / %distance) hadd relNodeFX %bl $calc($calc(%repulsiveForce * %deltaX / %distance) + $hget(relNodeFX,%bl)) hadd relNodeFY %bl $calc($calc(%repulsiveForce * %deltaY / %distance) + $hget(relNodeFY,%bl)) hadd relNodeFX %al $calc($calc(%repulsiveForce * %deltaX / %distance) - $hget(relNodeFX,%al)) hadd relNodeFY %al $calc($calc(%repulsiveForce * %deltaY / %distance) - $hget(relNodeFY,%al)) } inc %b } inc %a } var %edge = 1 var %edges = $hget(relLineSize,0).item while (%edge <= %edges) { var %el = $hget(relLineSize,%edge).item var %nodeA = $gettok(%el,1,45) var %nodeB = $gettok(%el,2,45) var %deltaX = $calc($hget(relNodeX,%nodeB) - $hget(relNodeX,%nodeA)) var %deltaY = $calc($hget(relNodeY,%nodeB) - $hget(relNodeY,%nodeA)) var %distanceSquared = $calc(%deltaX ^2 + %deltaY ^2) if (%distanceSquared < 0.01) { var %deltaX = $calc($rand(0,1) / 10 + 0.1) var %deltaY = $calc($rand(0,1) / 10 + 0.1) var %distanceSquared = $calc(%deltaX ^2 * %deltaY ^2) } var %distane $sqrt(%distanceSquared) if (%distance > %MaxRepulsiveForceDistance) { var %distance = %MaxRepulsiveForceDistance } var %distanceSquared = $calc(%distance ^2) var %attractiveForce = $calc($calc(%distanceSquared - $calc(%k * %k)) / %k) var %attractiveForce = $calc(%attractiveForce * $calc($log($iif($calc($hget(relLineSize,%el) / 1) < 1,1,$v1) ) *0.5) +1) hadd relNodeFX %nodeB $calc($calc(%attractiveForce * %deltaX / %distance) - $hget(relNodeFX,%nodeB)) hadd relNodeFY %nodeB $calc($calc(%attractiveForce * %deltaY / %distance) - $hget(relNodeFY,%nodeB)) hadd relNodeFX %nodeA $calc($calc(%attractiveForce * %deltaX / %distance) + $hget(relNodeFX,%nodeA)) hadd relNodeFY %nodeA $calc($calc(%attractiveForce * %deltaY / %distance) + $hget(relNodeFY,%nodeA)) var %a = 1 while (%totalNodes >= %a) { var %al = $hget(relNodeLink,%a).item var %xMovement = $calc(%c * $hget(relNodeFX,%al)) var %yMovement = $calc(%c * $hget(relNodeFY,%al)) var %max = %MaxNodeMovement var %nmax = $calc(%MaxNodeMovement * -1) if (%xMovement > %max) { var %xMovement = %max } elseif (%xMovement < %nmax) { var %xMovement = %nmax } if (%yMovement > %max) { var %yMovement = %max } elseif (%yMovement < %nmax) { var %yMovement = %nmax } hadd relNodeX %al $calc(%xMovement + $hget(relNodeX,%al)) hadd relNodeY %al $calc(%yMovement + $hget(relNodeY,%al)) hadd relNodeFX %al 0 hadd relNodeFY %al 0 inc %a } inc %edge } dec %SpringEmbedderIterations echo -a ITERS LEFT: %SpringEmbedderIterations } } alias relCalcbounds { var %width = 1500 var %height = 900 var %BorderSize = 50 var %MinDiagramSize = 10 var %minX = $hget(relNodeX,1) var %minY = $hget(relNodeY,1) var %maxX = %minX var %maxY = %minY var %totalNodes = $hget(relNodeLink,0).item var %node = 1 while (%totalNodes >= %node) { var %al = $hget(relNodeLink,%node).item var %nodeX = $hget(relNodeX,%al) var %nodeY = $hget(relNodeY,%al) if (%nodeX > %maxX) { var %maxX = %nodeX } elseif (%nodeX < %minX) { var %minX = %nodeX } if (%nodeY > %maxY) { var %maxY = %nodeY } if (%nodeY < %minY) { var %minY = %nodeY } inc %node } echo -a %minX %maxX %minY %maxY if ($calc(%maxX - %minX) < %MinDiagramSize) { var %midX = $calc($calc(%maxX + %minX) / 2) var %minX = $calc(%midX - $calc(%MinDiagramSize / 2)) var %maxX = $calc(%midX + $calc(%MinDiagramSize / 2)) } if ($calc(%maxY - %minY) < %MinDiagramSize) { var %midY = $calc($calc(%maxY + %minY) / 2) var %minY = $calc(%midY - $calc(%MinDiagramSize / 2)) var %maxY = $calc(%midY + $calc(%MinDiagramSize / 2)) } var %xyRatio = $calc($calc(%maxX - %minX) / $calc(%maxY - %minY) / $calc(%width / %height)) if (%xyRatio > 1) { var %dy = $calc(%maxY - %minY) var %dy = $calc(%dy * %xyRatio - %dy) var %minY = $calc(%minY - $calc(%dy / 2)) var %maxY = $calc(%maxY - $calc(%dy / 2)) } else if (%xyRatio < 1) { var %dx = $calc(%maxX - %minX) var %dx = $calc(%dx * %xyRatio - %dx) var %minX = $calc(%minX - $calc(%dx / 2)) var %maxX = $calc(%maxX - $calc(%dx / 2)) } echo -a %minX %maxX %minY %maxY var %relLineSize = $hget(relLineSize,0).item var %maxWeight = 0 var %maxminX = $calc(%maxX - %minX) var %maxminY = $calc(%maxY - %minY) while (%relLineSize) { var %edge = $hget(relLineSize,%relLineSize).item if ($hget(relLineSize,%edge) > %maxWeight) { var %maxWeight = $v1 } var %nodeA = $gettok(%edge,1,45) var %nodeB = $gettok(%edge,2,45) var %x1 = $calc($calc(%width * $calc($hget(relNodeX,%nodeA) - minX) / %maxminX) + %borderSize) var %x2 = $calc($calc(%height * $calc($hget(relNodeY,%nodeA) - minY) / %maxminY) + %borderSize) var %x3 = $calc($calc(%width * $calc($hget(relNodeX,%nodeB) - minX) / %maxminX) + %borderSize) var %x4 = $calc($calc(%height * $calc($hget(relNodeY,%nodeB) - minY) / %maxminY) + %borderSize) echo -a %nodeA %nodeB %x1 %x2 %x3 %x4 $hget(relNodeX,%nodeA) $hget(relNodeY,%nodeA) $hget(relNodeY,%nodeB) $hget(relNodeY,%nodeB) hadd relNodeNX %nodeA $int(%x1) hadd relNodeNY %nodeA $int(%x2) hadd relNodeNX %nodeB $int(%x3) hadd relNodeNY %nodeB $int(%x4) dec %relLineSize } echo -a MAX WEIGHT %maxWeight }