MarkPointView.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. var zrUtil = require("zrender/lib/core/util");
  2. var SymbolDraw = require("../../chart/helper/SymbolDraw");
  3. var numberUtil = require("../../util/number");
  4. var List = require("../../data/List");
  5. var markerHelper = require("./markerHelper");
  6. var MarkerView = require("./MarkerView");
  7. function updateMarkerLayout(mpData, seriesModel, api) {
  8. var coordSys = seriesModel.coordinateSystem;
  9. mpData.each(function (idx) {
  10. var itemModel = mpData.getItemModel(idx);
  11. var point;
  12. var xPx = numberUtil.parsePercent(itemModel.get('x'), api.getWidth());
  13. var yPx = numberUtil.parsePercent(itemModel.get('y'), api.getHeight());
  14. if (!isNaN(xPx) && !isNaN(yPx)) {
  15. point = [xPx, yPx];
  16. } // Chart like bar may have there own marker positioning logic
  17. else if (seriesModel.getMarkerPosition) {
  18. // Use the getMarkerPoisition
  19. point = seriesModel.getMarkerPosition(mpData.getValues(mpData.dimensions, idx));
  20. } else if (coordSys) {
  21. var x = mpData.get(coordSys.dimensions[0], idx);
  22. var y = mpData.get(coordSys.dimensions[1], idx);
  23. point = coordSys.dataToPoint([x, y]);
  24. } // Use x, y if has any
  25. if (!isNaN(xPx)) {
  26. point[0] = xPx;
  27. }
  28. if (!isNaN(yPx)) {
  29. point[1] = yPx;
  30. }
  31. mpData.setItemLayout(idx, point);
  32. });
  33. }
  34. var _default = MarkerView.extend({
  35. type: 'markPoint',
  36. updateLayout: function (markPointModel, ecModel, api) {
  37. ecModel.eachSeries(function (seriesModel) {
  38. var mpModel = seriesModel.markPointModel;
  39. if (mpModel) {
  40. updateMarkerLayout(mpModel.getData(), seriesModel, api);
  41. this.markerGroupMap.get(seriesModel.id).updateLayout(mpModel);
  42. }
  43. }, this);
  44. },
  45. renderSeries: function (seriesModel, mpModel, ecModel, api) {
  46. var coordSys = seriesModel.coordinateSystem;
  47. var seriesId = seriesModel.id;
  48. var seriesData = seriesModel.getData();
  49. var symbolDrawMap = this.markerGroupMap;
  50. var symbolDraw = symbolDrawMap.get(seriesId) || symbolDrawMap.set(seriesId, new SymbolDraw());
  51. var mpData = createList(coordSys, seriesModel, mpModel); // FIXME
  52. mpModel.setData(mpData);
  53. updateMarkerLayout(mpModel.getData(), seriesModel, api);
  54. mpData.each(function (idx) {
  55. var itemModel = mpData.getItemModel(idx);
  56. var symbolSize = itemModel.getShallow('symbolSize');
  57. if (typeof symbolSize === 'function') {
  58. // FIXME 这里不兼容 ECharts 2.x,2.x 貌似参数是整个数据?
  59. symbolSize = symbolSize(mpModel.getRawValue(idx), mpModel.getDataParams(idx));
  60. }
  61. mpData.setItemVisual(idx, {
  62. symbolSize: symbolSize,
  63. color: itemModel.get('itemStyle.normal.color') || seriesData.getVisual('color'),
  64. symbol: itemModel.getShallow('symbol')
  65. });
  66. }); // TODO Text are wrong
  67. symbolDraw.updateData(mpData);
  68. this.group.add(symbolDraw.group); // Set host model for tooltip
  69. // FIXME
  70. mpData.eachItemGraphicEl(function (el) {
  71. el.traverse(function (child) {
  72. child.dataModel = mpModel;
  73. });
  74. });
  75. symbolDraw.__keep = true;
  76. symbolDraw.group.silent = mpModel.get('silent') || seriesModel.get('silent');
  77. }
  78. });
  79. /**
  80. * @inner
  81. * @param {module:echarts/coord/*} [coordSys]
  82. * @param {module:echarts/model/Series} seriesModel
  83. * @param {module:echarts/model/Model} mpModel
  84. */
  85. function createList(coordSys, seriesModel, mpModel) {
  86. var coordDimsInfos;
  87. if (coordSys) {
  88. coordDimsInfos = zrUtil.map(coordSys && coordSys.dimensions, function (coordDim) {
  89. var info = seriesModel.getData().getDimensionInfo(seriesModel.coordDimToDataDim(coordDim)[0]) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys
  90. info.name = coordDim;
  91. return info;
  92. });
  93. } else {
  94. coordDimsInfos = [{
  95. name: 'value',
  96. type: 'float'
  97. }];
  98. }
  99. var mpData = new List(coordDimsInfos, mpModel);
  100. var dataOpt = zrUtil.map(mpModel.get('data'), zrUtil.curry(markerHelper.dataTransform, seriesModel));
  101. if (coordSys) {
  102. dataOpt = zrUtil.filter(dataOpt, zrUtil.curry(markerHelper.dataFilter, coordSys));
  103. }
  104. mpData.initData(dataOpt, null, coordSys ? markerHelper.dimValueGetter : function (item) {
  105. return item.value;
  106. });
  107. return mpData;
  108. }
  109. module.exports = _default;