base.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. /**
  2. * @fileOverview the Attribute base class
  3. */
  4. import { isString, isArray, isNil, mix, each } from '@antv/util';
  5. function toScaleString(scale, value) {
  6. if (isString(value)) {
  7. return value;
  8. }
  9. return scale.invert(scale.scale(value));
  10. }
  11. /**
  12. * 所有视觉通道属性的基类
  13. * @class Attr
  14. */
  15. class AttributeBase {
  16. constructor(cfg) {
  17. var _this = this;
  18. /**
  19. * 属性的类型
  20. * @type {String}
  21. */
  22. this.type = 'base';
  23. /**
  24. * 属性的名称
  25. * @type {String}
  26. */
  27. this.name = null;
  28. /**
  29. * 回调函数
  30. * @type {Function}
  31. */
  32. this.method = null;
  33. /**
  34. * 备选的值数组
  35. * @type {Array}
  36. */
  37. this.values = [];
  38. /**
  39. * 属性内部的度量
  40. * @type {Array}
  41. */
  42. this.scales = [];
  43. /**
  44. * 是否通过线性取值, 如果未指定,则根据数值的类型判定
  45. * @type {Boolean}
  46. */
  47. this.linear = null;
  48. /**
  49. * 当用户设置的 callback 返回 null 时, 应该返回默认 callback 中的值
  50. */
  51. var mixedCallback = null;
  52. var defaultCallback = this.callback;
  53. if (cfg.callback) {
  54. var userCallback = cfg.callback;
  55. mixedCallback = function mixedCallback() {
  56. for (var _len = arguments.length, params = new Array(_len), _key = 0; _key < _len; _key++) {
  57. params[_key] = arguments[_key];
  58. }
  59. var ret = userCallback(...params);
  60. if (isNil(ret)) {
  61. ret = defaultCallback.apply(_this, params);
  62. }
  63. return ret;
  64. };
  65. }
  66. mix(this, cfg);
  67. if (mixedCallback) {
  68. mix(this, {
  69. callback: mixedCallback
  70. });
  71. }
  72. } // 获取属性值,将值映射到视觉通道
  73. _getAttrValue(scale, value) {
  74. var values = this.values;
  75. if (scale.isCategory && !this.linear) {
  76. var index = scale.translate(value);
  77. return values[index % values.length];
  78. }
  79. var percent = scale.scale(value);
  80. return this.getLinearValue(percent);
  81. }
  82. /**
  83. * 如果进行线性映射,返回对应的映射值
  84. * @protected
  85. * @param {Number} percent 百分比
  86. * @return {*} 颜色值、形状、大小等
  87. */
  88. getLinearValue(percent) {
  89. var values = this.values;
  90. var steps = values.length - 1;
  91. var step = Math.floor(steps * percent);
  92. var leftPercent = steps * percent - step;
  93. var start = values[step];
  94. var end = step === steps ? start : values[step + 1];
  95. var rstValue = start + (end - start) * leftPercent;
  96. return rstValue;
  97. }
  98. /**
  99. * 默认的回调函数
  100. * @param {*} value 回调函数的值
  101. * @type {Function}
  102. * @return {Array} 返回映射后的值
  103. */
  104. callback(value) {
  105. var self = this;
  106. var scale = self.scales[0];
  107. var rstValue = null;
  108. if (scale.type === 'identity') {
  109. rstValue = scale.value;
  110. } else {
  111. rstValue = self._getAttrValue(scale, value);
  112. }
  113. return rstValue;
  114. }
  115. /**
  116. * 根据度量获取属性名
  117. * @return {Array} dims of this Attribute
  118. */
  119. getNames() {
  120. var scales = this.scales;
  121. var names = this.names;
  122. var length = Math.min(scales.length, names.length);
  123. var rst = [];
  124. for (var i = 0; i < length; i++) {
  125. rst.push(names[i]);
  126. }
  127. return rst;
  128. }
  129. /**
  130. * 根据度量获取维度名
  131. * @return {Array} dims of this Attribute
  132. */
  133. getFields() {
  134. var scales = this.scales;
  135. var rst = [];
  136. each(scales, function (scale) {
  137. rst.push(scale.field);
  138. });
  139. return rst;
  140. }
  141. /**
  142. * 根据名称获取度量
  143. * @param {String} name the name of scale
  144. * @return {Scale} scale
  145. */
  146. getScale(name) {
  147. var scales = this.scales;
  148. var names = this.names;
  149. var index = names.indexOf(name);
  150. return scales[index];
  151. }
  152. /**
  153. * 映射数据
  154. * @param {*} param1...paramn 多个数值
  155. * @return {Array} 映射的值组成的数组
  156. */
  157. mapping() {
  158. var scales = this.scales;
  159. var callback = this.callback;
  160. for (var _len2 = arguments.length, params = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
  161. params[_key2] = arguments[_key2];
  162. }
  163. var values = params;
  164. if (callback) {
  165. for (var i = 0, len = params.length; i < len; i++) {
  166. params[i] = this._toOriginParam(params[i], scales[i]);
  167. }
  168. values = callback.apply(this, params);
  169. }
  170. values = [].concat(values);
  171. return values;
  172. } // 原始的参数
  173. _toOriginParam(param, scale) {
  174. var rst = param;
  175. if (!scale.isLinear) {
  176. if (isArray(param)) {
  177. rst = [];
  178. for (var i = 0, len = param.length; i < len; i++) {
  179. rst.push(toScaleString(scale, param[i]));
  180. }
  181. } else {
  182. rst = toScaleString(scale, param);
  183. }
  184. }
  185. return rst;
  186. }
  187. }
  188. export default AttributeBase;