base.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. import { isArray, isNil, isString } from '@antv/util';
  2. // todo 这个到底目的是什么?
  3. var toScaleString = function (scale, value) {
  4. if (isString(value)) {
  5. return value;
  6. }
  7. return scale.invert(scale.scale(value));
  8. };
  9. /**
  10. * 所有视觉通道属性的基类
  11. * @class Base
  12. */
  13. var Attribute = /** @class */ (function () {
  14. function Attribute(cfg) {
  15. this.names = [];
  16. this.scales = [];
  17. this.linear = false;
  18. this.values = [];
  19. this.callback = function () { return []; };
  20. // 解析配置
  21. this._parseCfg(cfg);
  22. }
  23. /**
  24. * 映射的值组成的数组
  25. * @param params 对应 scale 顺序的值传入
  26. */
  27. Attribute.prototype.mapping = function () {
  28. var _this = this;
  29. var params = [];
  30. for (var _i = 0; _i < arguments.length; _i++) {
  31. params[_i] = arguments[_i];
  32. }
  33. var values = params.map(function (param, idx) {
  34. return _this._toOriginParam(param, _this.scales[idx]);
  35. });
  36. return this.callback.apply(this, values);
  37. };
  38. /**
  39. * 如果进行线性映射,返回对应的映射值
  40. * @param percent
  41. */
  42. Attribute.prototype.getLinearValue = function (percent) {
  43. // 分段数量
  44. var steps = this.values.length - 1;
  45. var step = Math.floor(steps * percent);
  46. var leftPercent = steps * percent - step;
  47. // todo 不懂这个逻辑
  48. var start = this.values[step];
  49. var end = step === steps ? start : this.values[step + 1];
  50. // 线性方程
  51. return start + (end - start) * leftPercent;
  52. };
  53. /**
  54. * 根据度量获取属性名
  55. */
  56. Attribute.prototype.getNames = function () {
  57. var scales = this.scales;
  58. var names = this.names;
  59. var length = Math.min(scales.length, names.length);
  60. var rst = [];
  61. for (var i = 0; i < length; i += 1) {
  62. rst.push(names[i]);
  63. }
  64. return rst;
  65. };
  66. /**
  67. * 获取所有的维度名
  68. */
  69. Attribute.prototype.getFields = function () {
  70. return this.scales.map(function (scale) { return scale.field; });
  71. };
  72. /**
  73. * 根据名称获取度量
  74. * @param name
  75. */
  76. Attribute.prototype.getScale = function (name) {
  77. return this.scales[this.names.indexOf(name)];
  78. };
  79. /**
  80. * 默认的回调函数(用户没有自定义 callback,或者用户自定义 callback 返回空的时候,使用 values 映射)
  81. * @param params
  82. */
  83. Attribute.prototype.defaultCallback = function () {
  84. var _this = this;
  85. var params = [];
  86. for (var _i = 0; _i < arguments.length; _i++) {
  87. params[_i] = arguments[_i];
  88. }
  89. // 没有 params 的情况,是指没有指定 fields,直接返回配置的 values 常量
  90. if (params.length === 0) {
  91. return this.values;
  92. }
  93. return params.map(function (param, idx) {
  94. var scale = _this.scales[idx];
  95. return scale.type === 'identity' ? scale.values[0] : _this._getAttributeValue(scale, param);
  96. });
  97. };
  98. // 解析配置
  99. Attribute.prototype._parseCfg = function (cfg) {
  100. var _this = this;
  101. var _a = cfg.type, type = _a === void 0 ? 'base' : _a, _b = cfg.names, names = _b === void 0 ? [] : _b, _c = cfg.scales, scales = _c === void 0 ? [] : _c, _d = cfg.values, values = _d === void 0 ? [] : _d, callback = cfg.callback;
  102. this.type = type;
  103. this.scales = scales;
  104. this.values = values;
  105. this.names = names;
  106. // 构造 callback 方法
  107. this.callback = function () {
  108. var params = [];
  109. for (var _i = 0; _i < arguments.length; _i++) {
  110. params[_i] = arguments[_i];
  111. }
  112. /**
  113. * 当用户设置的 callback 返回 null 时, 应该返回默认 callback 中的值
  114. */
  115. if (callback) {
  116. // 使用用户返回的值处理
  117. var ret = callback.apply(void 0, params);
  118. if (!isNil(ret)) {
  119. return [ret];
  120. }
  121. }
  122. // 没有 callback 或者用户 callback 返回值为空,则使用默认的逻辑处理
  123. return _this.defaultCallback.apply(_this, params);
  124. };
  125. };
  126. // 获取属性值,将值映射到视觉通道
  127. Attribute.prototype._getAttributeValue = function (scale, value) {
  128. // 如果是非线性的字段,直接从 values 中取值即可
  129. if (scale.isCategory && !this.linear) {
  130. // 离散 scale 变换成索引
  131. var idx = scale.translate(value);
  132. return this.values[idx % this.values.length];
  133. }
  134. // 线性则使用线性值
  135. var percent = scale.scale(value);
  136. return this.getLinearValue(percent);
  137. };
  138. /**
  139. * 通过 scale 拿到数据对应的原始的参数
  140. * @param param
  141. * @param scale
  142. * @private
  143. */
  144. Attribute.prototype._toOriginParam = function (param, scale) {
  145. // 是线性,直接返回
  146. // 非线性,使用 scale 变换
  147. return !scale.isLinear
  148. ? isArray(param)
  149. ? param.map(function (p) { return toScaleString(scale, p); })
  150. : toScaleString(scale, param)
  151. : param;
  152. };
  153. return Attribute;
  154. }());
  155. export default Attribute;
  156. //# sourceMappingURL=base.js.map