scale.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. "use strict";
  2. var Util = require('../../util/common');
  3. var Global = require('../../global');
  4. var Scale = require('../../scale/');
  5. var SCALE_TYPES_MAP = {
  6. linear: 'Linear',
  7. cat: 'Cat',
  8. timeCat: 'TimeCat',
  9. identity: 'Identity'
  10. };
  11. function isFullCircle(coord) {
  12. if (!coord.isPolar) {
  13. return false;
  14. }
  15. var startAngle = coord.startAngle;
  16. var endAngle = coord.endAngle;
  17. if (!Util.isNil(startAngle) && !Util.isNil(endAngle) && endAngle - startAngle < Math.PI * 2) {
  18. return false;
  19. }
  20. return true;
  21. }
  22. function clearObj(obj) {
  23. Object.keys(obj).forEach(function (key) {
  24. delete obj[key];
  25. });
  26. }
  27. var ScaleController = /*#__PURE__*/function () {
  28. function ScaleController(cfg) {
  29. // defs 列定义
  30. this.defs = {}; // 已经实例化的scale
  31. this.scales = {};
  32. Util.mix(this, cfg);
  33. }
  34. var _proto = ScaleController.prototype;
  35. _proto.setFieldDef = function setFieldDef(field, cfg) {
  36. var defs = this.defs;
  37. if (Util.isObject(field)) {
  38. Util.mix(defs, field);
  39. } else {
  40. defs[field] = cfg;
  41. } // 因为可能同时变更多个scale,所以要把所有已实例化的scale都更新下
  42. this.updateScales();
  43. };
  44. _proto._getDef = function _getDef(field) {
  45. var defs = this.defs;
  46. var def = null;
  47. if (Global.scales[field] || defs[field]) {
  48. def = Util.mix({}, Global.scales[field]);
  49. Util.each(defs[field], function (v, k) {
  50. if (Util.isNil(v)) {
  51. delete def[k];
  52. } else {
  53. def[k] = v;
  54. }
  55. });
  56. }
  57. return def;
  58. };
  59. _proto._getDefaultType = function _getDefaultType(field, data, def) {
  60. if (def && def.type) {
  61. return def.type;
  62. }
  63. var type = 'linear';
  64. var value = Util.Array.firstValue(data, field);
  65. if (Util.isArray(value)) {
  66. value = value[0];
  67. }
  68. if (Util.isString(value)) {
  69. type = 'cat';
  70. }
  71. return type;
  72. };
  73. _proto._getScaleDef = function _getScaleDef(type, field, data, def) {
  74. var values;
  75. if (def && def.values) {
  76. values = def.values;
  77. } else {
  78. values = Util.Array.values(data, field);
  79. }
  80. var cfg = {
  81. field: field,
  82. values: values
  83. };
  84. if (type !== 'cat' && type !== 'timeCat') {
  85. if (!def || !(def.min && def.max)) {
  86. var _Util$Array$getRange = Util.Array.getRange(values),
  87. min = _Util$Array$getRange.min,
  88. max = _Util$Array$getRange.max;
  89. cfg.min = min;
  90. cfg.max = max;
  91. cfg.nice = true;
  92. }
  93. } else {
  94. cfg.isRounding = false; // used for tickCount calculation
  95. }
  96. return cfg;
  97. } // 调整range,为了让图形居中
  98. ;
  99. _proto._adjustRange = function _adjustRange(type, cfg) {
  100. var range = cfg.range,
  101. values = cfg.values; // 如果是线性, 或者有自定义range都不处理
  102. if (type === 'linear' || range || !values) {
  103. return cfg;
  104. }
  105. var count = values.length; // 单只有一条数据时,在中间显示
  106. if (count === 1) {
  107. cfg.range = [0.5, 1];
  108. } else {
  109. var chart = this.chart;
  110. var coord = chart.get('coord');
  111. var widthRatio = Global.widthRatio.multiplePie;
  112. var offset = 0;
  113. if (isFullCircle(coord)) {
  114. if (!coord.transposed) {
  115. cfg.range = [0, 1 - 1 / count];
  116. } else {
  117. offset = 1 / count * widthRatio;
  118. cfg.range = [offset / 2, 1 - offset / 2];
  119. }
  120. } else {
  121. // 为了让图形居中,所以才设置range
  122. offset = 1 / count * 1 / 2;
  123. cfg.range = [offset, 1 - offset];
  124. }
  125. }
  126. return cfg;
  127. };
  128. _proto._getScaleCfg = function _getScaleCfg(field, data) {
  129. var self = this;
  130. var def = self._getDef(field);
  131. if (!data || !data.length) {
  132. if (def && def.type) {
  133. def.field = field;
  134. return {
  135. type: SCALE_TYPES_MAP[def.type],
  136. cfg: def
  137. };
  138. }
  139. return {
  140. type: 'Identity',
  141. cfg: {
  142. value: field,
  143. field: field.toString(),
  144. values: [field]
  145. }
  146. };
  147. }
  148. var firstObj = data[0];
  149. var firstValue = firstObj[field];
  150. if (firstValue === null) {
  151. firstValue = Util.Array.firstValue(data, field);
  152. }
  153. if (Util.isNumber(field) || Util.isNil(firstValue) && !def) {
  154. return {
  155. type: 'Identity',
  156. cfg: {
  157. value: field,
  158. field: field.toString(),
  159. values: [field]
  160. }
  161. };
  162. }
  163. var type = self._getDefaultType(field, data, def);
  164. var cfg = self._getScaleDef(type, field, data, def);
  165. def && Util.mix(cfg, def);
  166. cfg = this._adjustRange(type, cfg);
  167. return {
  168. type: SCALE_TYPES_MAP[type],
  169. cfg: cfg
  170. };
  171. };
  172. _proto.createScale = function createScale(field, data) {
  173. var scales = this.scales;
  174. var _this$_getScaleCfg = this._getScaleCfg(field, data),
  175. type = _this$_getScaleCfg.type,
  176. cfg = _this$_getScaleCfg.cfg;
  177. var scale = scales[field]; // 如果已经存在,且类型相等时直接返回
  178. if (scale && SCALE_TYPES_MAP[scale.type] === type) {
  179. scale.change(cfg);
  180. return scale;
  181. }
  182. var newScale = new Scale[type](cfg);
  183. scales[field] = newScale;
  184. return newScale;
  185. };
  186. _proto._updateScale = function _updateScale(scale) {
  187. var field = scale.field; // 因为每个field的数据都会不同
  188. var data = this.chart._getScaleData(field);
  189. var _this$_getScaleCfg2 = this._getScaleCfg(field, data),
  190. cfg = _this$_getScaleCfg2.cfg;
  191. scale.change(cfg);
  192. };
  193. _proto.updateScales = function updateScales() {
  194. var _this = this;
  195. var scales = this.scales; // 修改完列定义后,需要更新已经实例化的scale
  196. // 如果是还没有实例化的,在geom初始化的时候会被实例化,所以这里可以不用更新
  197. Util.each(scales, function (scale) {
  198. _this._updateScale(scale);
  199. });
  200. } // 调整scale从0开始
  201. ;
  202. _proto.adjustStartZero = function adjustStartZero(scale) {
  203. var defs = this.defs;
  204. var field = scale.field,
  205. min = scale.min,
  206. max = scale.max; // 如果有定义,则不处理
  207. if (defs[field] && defs[field].min) {
  208. return;
  209. }
  210. if (min > 0) {
  211. scale.change({
  212. min: 0
  213. });
  214. } else if (max < 0) {
  215. scale.change({
  216. max: 0
  217. });
  218. }
  219. };
  220. _proto.clear = function clear() {
  221. // this.defs = {};
  222. // this.scales = {};
  223. clearObj(this.defs);
  224. clearObj(this.scales);
  225. this.data = null;
  226. };
  227. return ScaleController;
  228. }();
  229. module.exports = ScaleController;