base.js 5.4 KB

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