-
@@ -485,7 +498,7 @@ var locales = {
-
@@ -532,7 +545,7 @@ var locales = {
Set the size of the canvas. This is automatically done on a window resize.
-
@@ -607,6 +620,49 @@ var locales = {
network.clustering.findNode('fred')
will return ['A','B','C','fred']
.
+
+ getClusteredEdges(
+ String baseEdgeId
)
+
+
+ Returns: Array
+ Similiar to findNode
in that it returns all the edge ids that were created from the provided edge during clustering
+
+
+
+ getBaseEdge(
+ String clusteredEdgeId
)
+
+
+ Returns: Value
+ When a clusteredEdgeId is available, this method will return the original baseEdgeId provided in data.edges
+ ie. After clustering the 'SelectEdge' event is fired but provides only the clustered edge. This method can then be used to return the baseEdgeId.
+
+
+
+ updateEdge(
+ String startEdgeId, Object options
)
+
+
+ Returns: none
+ Visible edges between clustered nodes are not the same edge as the ones provided in data.edges
passed on network
creation
+ With each layer of clustering, copies of the edges between clusters are created and the previous edges are hidden, until the cluster is opened.
+ This method takes an edgeId (ie. a base edgeId from data.edges) and applys the options to it and any edges that were created from it while clustering. Example:
+ network.clustering.updateEdge(originalEdge.id, {color : '#aa0000'});
+ This would turn the base edge and any subsequent edges red, so when opening clusters the edges will all be the same color.
+
+
+
+ updateClusteredNode(
+ String clusteredNodeId, Object options
)
+
+
+ Returns: none
+ Clustered Nodes when created are not contained in the original data.nodes
passed on network
creation
+ This method updates the cluster node. Example:
+ network.clustering.updateClusteredNode(clusteredNodeId, {shape : 'star'});
+
+
isCluster(
String nodeId
)
@@ -649,7 +705,7 @@ function releaseFunction (clusterPosition, containedNodesPositions) {
-
@@ -666,7 +722,7 @@ function releaseFunction (clusterPosition, containedNodesPositions) {
-
@@ -727,7 +783,7 @@ function releaseFunction (clusterPosition, containedNodesPositions) {
-
@@ -825,7 +881,7 @@ function releaseFunction (clusterPosition, containedNodesPositions) {
-
@@ -856,7 +912,7 @@ function releaseFunction (clusterPosition, containedNodesPositions) {
-
@@ -971,7 +1027,7 @@ function releaseFunction (clusterPosition, containedNodesPositions) {
-
@@ -1083,7 +1139,7 @@ function releaseFunction (clusterPosition, containedNodesPositions) {
Returns: none
Programatically release the focussed node.
-
diff --git a/examples/network/other/changingClusteredEdgesNodes.html b/examples/network/other/changingClusteredEdgesNodes.html
new file mode 100644
index 00000000..098c3592
--- /dev/null
+++ b/examples/network/other/changingClusteredEdgesNodes.html
@@ -0,0 +1,107 @@
+
+
+
+ Network | Clustering
+
+
+
+
+
+
+
+
+
+
+
+
+Demonstrating getBaseEdge, getClusteredEdges updateEdge and updateClusteredNode.
Clicking on the cluster will change it to a star (updateClusteredNode).
+Clicking on an edge will make it red regardless of whether it is a clusteredEdge or not (updateEdge)
+Clicking on an edge will also show the results of getBaseEdge and getClusteredEdge
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/network/modules/Clustering.js b/lib/network/modules/Clustering.js
index 6b3c14b2..cb4d503e 100644
--- a/lib/network/modules/Clustering.js
+++ b/lib/network/modules/Clustering.js
@@ -15,12 +15,6 @@ class ClusterEngine {
this.body.emitter.on('_resetData', () => {this.clusteredNodes = {}; this.clusteredEdges = {};})
}
- setOptions(options) {
- if (options !== undefined) {
-
- }
- }
-
/**
*
* @param hubsize
@@ -317,6 +311,9 @@ class ClusterEngine {
let newEdge = this.body.functions.createEdge(clonedOptions);
newEdge.clusteringEdgeReplacingId = edge.id;
+ // also reference the new edge in the old edge
+ this.body.edges[edge.id].edgeReplacedById = newEdge.id;
+
// connect the edge.
this.body.edges[newEdge.id] = newEdge;
newEdge.connect();
@@ -696,6 +693,76 @@ class ClusterEngine {
return stack;
}
+ /**
+ * Using a clustered nodeId, update with the new options
+ * @param clusteredNodeId
+ * @param {object} newOptions
+ */
+ updateClusteredNode(clusteredNodeId, newOptions) {
+ if (clusteredNodeId === undefined) {throw new Error("No clusteredNodeId supplied to updateClusteredNode.");}
+ if (newOptions === undefined) {throw new Error("No newOptions supplied to updateClusteredNode.");}
+ if (this.body.nodes[clusteredNodeId] === undefined) {throw new Error("The clusteredNodeId supplied to updateClusteredNode does not exist.");}
+
+ this.body.nodes[clusteredNodeId].setOptions(newOptions);
+ this.body.emitter.emit('_dataChanged');
+ }
+
+ /**
+ * Using a base edgeId, update all related clustered edges with the new options
+ * @param startEdgeId
+ * @param {object} newOptions
+ */
+ updateEdge(startEdgeId, newOptions) {
+ if (startEdgeId === undefined) {throw new Error("No startEdgeId supplied to updateEdge.");}
+ if (newOptions === undefined) {throw new Error("No newOptions supplied to updateEdge.");}
+ if (this.body.edges[startEdgeId] === undefined) {throw new Error("The startEdgeId supplied to updateEdge does not exist.");}
+
+ let allEdgeIds = this.getClusteredEdges(startEdgeId);
+ for (let i = 0; i < allEdgeIds.length; i++) {
+ var edge = this.body.edges[allEdgeIds[i]];
+ edge.setOptions(newOptions);
+ }
+ this.body.emitter.emit('_dataChanged');
+ }
+
+ /**
+ * Get a stack of clusterEdgeId's (+base edgeid) that a base edge is the same as. cluster edge C -> cluster edge B -> cluster edge A -> base edge(edgeId)
+ * @param edgeId
+ * @returns {Array}
+ */
+ getClusteredEdges(edgeId) {
+ let stack = [];
+ let max = 100;
+ let counter = 0;
+
+ while (edgeId !== undefined && this.body.edges[edgeId] !== undefined && counter < max) {
+ stack.push(this.body.edges[edgeId].id);
+ edgeId = this.body.edges[edgeId].edgeReplacedById;
+ counter++;
+ }
+ stack.reverse();
+ return stack;
+ }
+
+ /**
+ * Get the base edge id of clusterEdgeId. cluster edge (clusteredEdgeId) -> cluster edge B -> cluster edge C -> base edge
+ * @param clusteredEdgeId
+ * @returns baseEdgeId
+ */
+ getBaseEdge(clusteredEdgeId) {
+ let baseEdgeId = clusteredEdgeId;
+ let max = 100;
+ let counter = 0;
+
+ while (clusteredEdgeId !== undefined && this.body.edges[clusteredEdgeId] !== undefined && counter < max) {
+ clusteredEdgeId = this.body.edges[clusteredEdgeId].clusteringEdgeReplacingId;
+ counter++;
+ if (clusteredEdgeId !== undefined) {
+ baseEdgeId = clusteredEdgeId;
+ }
+ }
+ return baseEdgeId;
+ }
/**
* Get the Id the node is connected to