diff --git a/HISTORY.md b/HISTORY.md index 8264d2fb..9b5fe287 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,12 +1,14 @@ vis.js history http://visjs.org -## 2014-03-06, version 0.6.2 +## 2014-03-06, version 0.7.0 ### Graph - changed navigation CSS. Icons are now always correctly positioned. - added stabilizationIterations option to graph. +- added loadXYinDataset() method to save the XY positions of nodes in the dataset. +- seperated allowedToMove into allowedToMoveX and allowedToMoveY. This is required for initializing nodes from hierarchical layouts after loadXYinDataset(). ## 2014-03-06, version 0.6.1 diff --git a/dist/vis.js b/dist/vis.js index 114acb4a..a781dfb1 100644 --- a/dist/vis.js +++ b/dist/vis.js @@ -4,8 +4,8 @@ * * A dynamic, browser-based visualization library. * - * @version @@version - * @date @@date + * @version 0.7.0-SNAPSHOT + * @date 2014-03-06 * * @license * Copyright (C) 2011-2014 Almende B.V, http://almende.com @@ -9588,8 +9588,8 @@ Node.prototype.setProperties = function(properties, constants) { } } - this.xFixed = this.xFixed || (properties.x !== undefined && !properties.allowedToMove); - this.yFixed = this.yFixed || (properties.y !== undefined && !properties.allowedToMove); + this.xFixed = this.xFixed || (properties.x !== undefined && !properties.allowedToMoveX); + this.yFixed = this.yFixed || (properties.y !== undefined && !properties.allowedToMoveY); this.radiusFixed = this.radiusFixed || (properties.radius !== undefined); if (this.shape == 'image') { @@ -12995,7 +12995,7 @@ var manipulationMixin = { _addNode : function() { if (this._selectionIsEmpty() && this.editMode == true) { var positionObject = this._pointerToPositionObject(this.pointerPosition); - var defaultData = {id:util.randomUUID(),x:positionObject.left,y:positionObject.top,label:"new",allowedToMove:true}; + var defaultData = {id:util.randomUUID(),x:positionObject.left,y:positionObject.top,label:"new",allowedToMoveX:true,allowedToMoveY:true}; if (this.triggerFunctions.add) { if (this.triggerFunctions.add.length == 2) { var me = this; @@ -17697,6 +17697,23 @@ Graph.prototype._initializeMixinLoaders = function () { } }; +/** + * Load the XY positions of the nodes into the dataset. + */ +Graph.prototype.loadXYinDataset = function() { + var dataArray = []; + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + var node = this.nodes[nodeId]; + var allowedToMoveX = !this.nodes.xFixed; + var allowedToMoveY = !this.nodes.yFixed; + if (this.nodesData.data[nodeId].x != Math.round(node.x) || this.nodesData.data[nodeId].y != Math.round(node.y)) { + dataArray.push({id:nodeId,x:Math.round(node.x),y:Math.round(node.y),allowedToMoveX:allowedToMoveX,allowedToMoveY:allowedToMoveY}); + } + } + } + this.nodesData.update(dataArray); +}; diff --git a/docs/graph.html b/docs/graph.html index 236a82c5..61d2862f 100644 --- a/docs/graph.html +++ b/docs/graph.html @@ -863,13 +863,20 @@ var options = { Default border color of the node when selected. - allowedToMove + allowedToMoveX Boolean false - If allowedToMove is false, then the node will not move from its supplied position. - If only an x position has been supplied, it is only fixed in the x-direction. - The same holds for y. If both x and y have been defined, the node will not move. - If no x or y have been supplied, this argument will not do anything. + If allowedToMoveX is false, then the node will not move from its supplied position. + If an X position has been supplied, it is fixed in the X-direction. + If no X value has been supplied, this argument will not do anything. + + + allowedToMoveY + Boolean + false + If allowedToMoveY is false, then the node will not move from its supplied position. + If an Y position has been supplied, it is fixed in the Y-direction. + If no Y value has been supplied, this argument will not do anything. @@ -1768,6 +1775,13 @@ var options: { The selections are not ordered. + + loadXYinDataset() + none + This will put the X and Y positions of all nodes in the dataset. It will also include allowedToMoveX and allowedToMoveY with the correct values. + You can use this to stablize your graph once, then save the positions in a database so the next time you load the nodes, stabilization will be near instantaneous. + + on(event, callback) @@ -1826,7 +1840,7 @@ var options: { - zoomExtent + zoomExtent() none Scales the graph so all the nodes are in center view. diff --git a/src/graph/Graph.js b/src/graph/Graph.js index 0de45b13..15e44e65 100644 --- a/src/graph/Graph.js +++ b/src/graph/Graph.js @@ -1926,6 +1926,23 @@ Graph.prototype._initializeMixinLoaders = function () { } }; +/** + * Load the XY positions of the nodes into the dataset. + */ +Graph.prototype.loadXYinDataset = function() { + var dataArray = []; + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + var node = this.nodes[nodeId]; + var allowedToMoveX = !this.nodes.xFixed; + var allowedToMoveY = !this.nodes.yFixed; + if (this.nodesData.data[nodeId].x != Math.round(node.x) || this.nodesData.data[nodeId].y != Math.round(node.y)) { + dataArray.push({id:nodeId,x:Math.round(node.x),y:Math.round(node.y),allowedToMoveX:allowedToMoveX,allowedToMoveY:allowedToMoveY}); + } + } + } + this.nodesData.update(dataArray); +}; diff --git a/src/graph/Node.js b/src/graph/Node.js index f955b2e2..4d94e308 100644 --- a/src/graph/Node.js +++ b/src/graph/Node.js @@ -191,8 +191,8 @@ Node.prototype.setProperties = function(properties, constants) { } } - this.xFixed = this.xFixed || (properties.x !== undefined && !properties.allowedToMove); - this.yFixed = this.yFixed || (properties.y !== undefined && !properties.allowedToMove); + this.xFixed = this.xFixed || (properties.x !== undefined && !properties.allowedToMoveX); + this.yFixed = this.yFixed || (properties.y !== undefined && !properties.allowedToMoveY); this.radiusFixed = this.radiusFixed || (properties.radius !== undefined); if (this.shape == 'image') { diff --git a/src/graph/graphMixins/ManipulationMixin.js b/src/graph/graphMixins/ManipulationMixin.js index fff3e7d3..8749ca13 100644 --- a/src/graph/graphMixins/ManipulationMixin.js +++ b/src/graph/graphMixins/ManipulationMixin.js @@ -288,7 +288,7 @@ var manipulationMixin = { _addNode : function() { if (this._selectionIsEmpty() && this.editMode == true) { var positionObject = this._pointerToPositionObject(this.pointerPosition); - var defaultData = {id:util.randomUUID(),x:positionObject.left,y:positionObject.top,label:"new",allowedToMove:true}; + var defaultData = {id:util.randomUUID(),x:positionObject.left,y:positionObject.top,label:"new",allowedToMoveX:true,allowedToMoveY:true}; if (this.triggerFunctions.add) { if (this.triggerFunctions.add.length == 2) { var me = this;