scale.js 6.7 KB

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