forceLayout.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. var _forceHelper = require("./forceHelper");
  2. var forceLayout = _forceHelper.forceLayout;
  3. var _simpleLayoutHelper = require("./simpleLayoutHelper");
  4. var simpleLayout = _simpleLayoutHelper.simpleLayout;
  5. var _circularLayoutHelper = require("./circularLayoutHelper");
  6. var circularLayout = _circularLayoutHelper.circularLayout;
  7. var _number = require("../../util/number");
  8. var linearMap = _number.linearMap;
  9. var vec2 = require("zrender/lib/core/vector");
  10. var zrUtil = require("zrender/lib/core/util");
  11. function _default(ecModel) {
  12. ecModel.eachSeriesByType('graph', function (graphSeries) {
  13. var coordSys = graphSeries.coordinateSystem;
  14. if (coordSys && coordSys.type !== 'view') {
  15. return;
  16. }
  17. if (graphSeries.get('layout') === 'force') {
  18. var preservedPoints = graphSeries.preservedPoints || {};
  19. var graph = graphSeries.getGraph();
  20. var nodeData = graph.data;
  21. var edgeData = graph.edgeData;
  22. var forceModel = graphSeries.getModel('force');
  23. var initLayout = forceModel.get('initLayout');
  24. if (graphSeries.preservedPoints) {
  25. nodeData.each(function (idx) {
  26. var id = nodeData.getId(idx);
  27. nodeData.setItemLayout(idx, preservedPoints[id] || [NaN, NaN]);
  28. });
  29. } else if (!initLayout || initLayout === 'none') {
  30. simpleLayout(graphSeries);
  31. } else if (initLayout === 'circular') {
  32. circularLayout(graphSeries);
  33. }
  34. var nodeDataExtent = nodeData.getDataExtent('value');
  35. var edgeDataExtent = edgeData.getDataExtent('value'); // var edgeDataExtent = edgeData.getDataExtent('value');
  36. var repulsion = forceModel.get('repulsion');
  37. var edgeLength = forceModel.get('edgeLength');
  38. if (!zrUtil.isArray(repulsion)) {
  39. repulsion = [repulsion, repulsion];
  40. }
  41. if (!zrUtil.isArray(edgeLength)) {
  42. edgeLength = [edgeLength, edgeLength];
  43. } // Larger value has smaller length
  44. edgeLength = [edgeLength[1], edgeLength[0]];
  45. var nodes = nodeData.mapArray('value', function (value, idx) {
  46. var point = nodeData.getItemLayout(idx);
  47. var rep = linearMap(value, nodeDataExtent, repulsion);
  48. if (isNaN(rep)) {
  49. rep = (repulsion[0] + repulsion[1]) / 2;
  50. }
  51. return {
  52. w: rep,
  53. rep: rep,
  54. fixed: nodeData.getItemModel(idx).get('fixed'),
  55. p: !point || isNaN(point[0]) || isNaN(point[1]) ? null : point
  56. };
  57. });
  58. var edges = edgeData.mapArray('value', function (value, idx) {
  59. var edge = graph.getEdgeByIndex(idx);
  60. var d = linearMap(value, edgeDataExtent, edgeLength);
  61. if (isNaN(d)) {
  62. d = (edgeLength[0] + edgeLength[1]) / 2;
  63. }
  64. return {
  65. n1: nodes[edge.node1.dataIndex],
  66. n2: nodes[edge.node2.dataIndex],
  67. d: d,
  68. curveness: edge.getModel().get('lineStyle.normal.curveness') || 0
  69. };
  70. });
  71. var coordSys = graphSeries.coordinateSystem;
  72. var rect = coordSys.getBoundingRect();
  73. var forceInstance = forceLayout(nodes, edges, {
  74. rect: rect,
  75. gravity: forceModel.get('gravity')
  76. });
  77. var oldStep = forceInstance.step;
  78. forceInstance.step = function (cb) {
  79. for (var i = 0, l = nodes.length; i < l; i++) {
  80. if (nodes[i].fixed) {
  81. // Write back to layout instance
  82. vec2.copy(nodes[i].p, graph.getNodeByIndex(i).getLayout());
  83. }
  84. }
  85. oldStep(function (nodes, edges, stopped) {
  86. for (var i = 0, l = nodes.length; i < l; i++) {
  87. if (!nodes[i].fixed) {
  88. graph.getNodeByIndex(i).setLayout(nodes[i].p);
  89. }
  90. preservedPoints[nodeData.getId(i)] = nodes[i].p;
  91. }
  92. for (var i = 0, l = edges.length; i < l; i++) {
  93. var e = edges[i];
  94. var edge = graph.getEdgeByIndex(i);
  95. var p1 = e.n1.p;
  96. var p2 = e.n2.p;
  97. var points = edge.getLayout();
  98. points = points ? points.slice() : [];
  99. points[0] = points[0] || [];
  100. points[1] = points[1] || [];
  101. vec2.copy(points[0], p1);
  102. vec2.copy(points[1], p2);
  103. if (+e.curveness) {
  104. points[2] = [(p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * e.curveness, (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * e.curveness];
  105. }
  106. edge.setLayout(points);
  107. } // Update layout
  108. cb && cb(stopped);
  109. });
  110. };
  111. graphSeries.forceLayout = forceInstance;
  112. graphSeries.preservedPoints = preservedPoints; // Step to get the layout
  113. forceInstance.step();
  114. } else {
  115. // Remove prev injected forceLayout instance
  116. graphSeries.forceLayout = null;
  117. }
  118. });
  119. }
  120. module.exports = _default;