base.js 27 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061
  1. "use strict";
  2. exports.__esModule = true;
  3. exports["default"] = void 0;
  4. var Attr = _interopRequireWildcard(require("../attr/index"));
  5. var _common = require("../util/common");
  6. var _base = _interopRequireDefault(require("../base"));
  7. var _global = _interopRequireWildcard(require("../global"));
  8. var _shape = _interopRequireDefault(require("./shape/shape"));
  9. var _base2 = _interopRequireDefault(require("@antv/adjust/lib/base"));
  10. var _util = require("./aria/util");
  11. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
  12. function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
  13. function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
  14. function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
  15. function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
  16. var GROUP_ATTRS = ['color', 'size', 'shape'];
  17. var FIELD_ORIGIN = '_origin';
  18. var FIELD_ORIGIN_Y = '_originY';
  19. function parseFields(field) {
  20. if ((0, _common.isArray)(field)) {
  21. return field;
  22. }
  23. if ((0, _common.isString)(field)) {
  24. return field.split('*');
  25. }
  26. return [field];
  27. }
  28. /**
  29. * The parent class for Geometry
  30. * @class Geom
  31. */
  32. var Geom = /*#__PURE__*/function (_Base) {
  33. _inheritsLoose(Geom, _Base);
  34. function Geom() {
  35. return _Base.apply(this, arguments) || this;
  36. }
  37. var _proto = Geom.prototype;
  38. _proto.getDefaultCfg = function getDefaultCfg() {
  39. return {
  40. /**
  41. * geometry type
  42. * @type {String}
  43. */
  44. type: null,
  45. /**
  46. * the data of geometry
  47. * @type {Array}
  48. */
  49. data: null,
  50. /**
  51. * the attrs of geo,etry
  52. * @type {Object}
  53. */
  54. attrs: {},
  55. scales: {},
  56. /**
  57. * group for storing the shapes
  58. * @type {Canvas}
  59. */
  60. container: null,
  61. /**
  62. * style options
  63. * @type {Object}
  64. */
  65. styleOptions: null,
  66. chart: null,
  67. shapeType: '',
  68. /**
  69. * wether to generate key points for each shape
  70. * @protected
  71. * @type {Boolean}
  72. */
  73. generatePoints: false,
  74. attrOptions: {},
  75. sortable: false,
  76. startOnZero: true,
  77. visible: true,
  78. connectNulls: false,
  79. // 是否丢弃没有值的分组。
  80. ignoreEmptyGroup: false,
  81. // 是否已经初始化
  82. isInit: false
  83. };
  84. };
  85. _proto.init = function init() {
  86. var self = this;
  87. var isInit = self.get('isInit');
  88. if (isInit) {
  89. return;
  90. }
  91. self._initAttrs();
  92. self._processData();
  93. self.set('isInit', true);
  94. };
  95. _proto._getGroupScales = function _getGroupScales() {
  96. var self = this;
  97. var scales = [];
  98. (0, _common.each)(GROUP_ATTRS, function (attrName) {
  99. var attr = self.getAttr(attrName);
  100. if (attr) {
  101. var attrScales = attr.scales;
  102. (0, _common.each)(attrScales, function (scale) {
  103. if (scale && scale.isCategory && scales.indexOf(scale) === -1) {
  104. scales.push(scale);
  105. }
  106. });
  107. }
  108. });
  109. return scales;
  110. };
  111. _proto._groupData = function _groupData(data) {
  112. var self = this;
  113. var colDefs = self.get('colDefs');
  114. var groupScales = self._getGroupScales();
  115. if (groupScales.length) {
  116. var appendConditions = {};
  117. var names = [];
  118. (0, _common.each)(groupScales, function (scale) {
  119. var field = scale.field;
  120. names.push(field);
  121. if (colDefs && colDefs[field] && colDefs[field].values) {
  122. // users have defined
  123. appendConditions[scale.field] = colDefs[field].values;
  124. }
  125. });
  126. return _common.Array.group(data, names, appendConditions);
  127. }
  128. return [data];
  129. };
  130. _proto._setAttrOptions = function _setAttrOptions(attrName, attrCfg) {
  131. var options = this.get('attrOptions');
  132. options[attrName] = attrCfg;
  133. var attrs = this.get('attrs'); // 说明已经初始化过了
  134. if (Object.keys(attrs).length) {
  135. this._createAttr(attrName, attrCfg);
  136. }
  137. };
  138. _proto._createAttrOption = function _createAttrOption(attrName, field, cfg, defaultValues) {
  139. var attrCfg = {};
  140. attrCfg.field = field;
  141. if (cfg) {
  142. if ((0, _common.isFunction)(cfg)) {
  143. attrCfg.callback = cfg;
  144. } else {
  145. attrCfg.values = cfg;
  146. }
  147. } else {
  148. attrCfg.values = defaultValues;
  149. }
  150. this._setAttrOptions(attrName, attrCfg);
  151. };
  152. _proto._createAttr = function _createAttr(type, option) {
  153. var self = this;
  154. var attrs = self.get('attrs');
  155. var coord = self.get('coord');
  156. var className = (0, _common.upperFirst)(type);
  157. var fields = parseFields(option.field);
  158. if (type === 'position') {
  159. option.coord = coord;
  160. }
  161. var scales = [];
  162. for (var i = 0, len = fields.length; i < len; i++) {
  163. var field = fields[i];
  164. var scale = self._createScale(field);
  165. scales.push(scale);
  166. }
  167. if (type === 'position') {
  168. var yScale = scales[1]; // 饼图的处理,但是还不知道为啥
  169. if (coord.type === 'polar' && coord.transposed && self.hasAdjust('stack')) {
  170. if (yScale.values.length) {
  171. yScale.change({
  172. nice: false,
  173. min: 0,
  174. max: Math.max.apply(null, yScale.values)
  175. });
  176. }
  177. }
  178. }
  179. option.scales = scales;
  180. var attr = new Attr[className](option);
  181. attrs[type] = attr;
  182. return attr;
  183. };
  184. _proto._initAttrs = function _initAttrs() {
  185. var self = this;
  186. var attrOptions = self.get('attrOptions');
  187. for (var type in attrOptions) {
  188. if (attrOptions.hasOwnProperty(type)) {
  189. this._createAttr(type, attrOptions[type]);
  190. }
  191. }
  192. };
  193. _proto._createScale = function _createScale(field) {
  194. var scales = this.get('scales');
  195. var scale = scales[field];
  196. if (!scale) {
  197. scale = this.get('chart').createScale(field);
  198. scales[field] = scale;
  199. }
  200. return scale;
  201. };
  202. _proto._processData = function _processData() {
  203. var self = this;
  204. var data = this.get('data');
  205. var dataArray = [];
  206. var groupedArray = this._groupData(data);
  207. if (this.get('ignoreEmptyGroup')) {
  208. var yScale = this.getYScale();
  209. groupedArray = groupedArray.filter(function (group) {
  210. return group.some(function (item) {
  211. return typeof item[yScale.field] !== 'undefined';
  212. });
  213. });
  214. }
  215. for (var i = 0, len = groupedArray.length; i < len; i++) {
  216. var subData = groupedArray[i];
  217. var tempData = self._saveOrigin(subData);
  218. if (this.hasAdjust('dodge')) {
  219. self._numberic(tempData);
  220. }
  221. dataArray.push(tempData);
  222. }
  223. if (self.get('adjust')) {
  224. self._adjustData(dataArray);
  225. }
  226. if (self.get('sortable')) {
  227. self._sort(dataArray);
  228. }
  229. self.emit('afterprocessdata', {
  230. dataArray: dataArray
  231. });
  232. self.set('mappingData', dataArray);
  233. self.set('dataArray', dataArray);
  234. return dataArray;
  235. };
  236. _proto._saveOrigin = function _saveOrigin(data) {
  237. var rst = [];
  238. for (var i = 0, len = data.length; i < len; i++) {
  239. var origin = data[i];
  240. var obj = {};
  241. for (var k in origin) {
  242. obj[k] = origin[k];
  243. }
  244. obj[FIELD_ORIGIN] = origin;
  245. rst.push(obj);
  246. }
  247. return rst;
  248. };
  249. _proto._numberic = function _numberic(data) {
  250. var positionAttr = this.getAttr('position');
  251. var scales = positionAttr.scales;
  252. for (var j = 0, len = data.length; j < len; j++) {
  253. var obj = data[j];
  254. var count = Math.min(2, scales.length);
  255. for (var i = 0; i < count; i++) {
  256. var scale = scales[i];
  257. if (scale.isCategory) {
  258. var field = scale.field;
  259. obj[field] = scale.translate(obj[field]);
  260. }
  261. }
  262. }
  263. };
  264. _proto._adjustData = function _adjustData(dataArray) {
  265. var self = this;
  266. var adjust = self.get('adjust');
  267. if (adjust) {
  268. var adjustType = (0, _common.upperFirst)(adjust.type);
  269. if (!_base2["default"][adjustType]) {
  270. throw new Error('not support such adjust : ' + adjust);
  271. }
  272. var xScale = self.getXScale();
  273. var yScale = self.getYScale();
  274. var cfg = (0, _common.mix)({
  275. xField: xScale.field,
  276. yField: yScale.field
  277. }, adjust);
  278. var adjustObject = new _base2["default"][adjustType](cfg);
  279. adjustObject.processAdjust(dataArray);
  280. if (adjustType === 'Stack') {
  281. self._updateStackRange(yScale.field, yScale, dataArray);
  282. }
  283. }
  284. };
  285. _proto._updateStackRange = function _updateStackRange(field, scale, dataArray) {
  286. var mergeArray = _common.Array.merge(dataArray);
  287. var min = scale.min;
  288. var max = scale.max;
  289. for (var i = 0, len = mergeArray.length; i < len; i++) {
  290. var obj = mergeArray[i];
  291. var tmpMin = Math.min.apply(null, obj[field]);
  292. var tmpMax = Math.max.apply(null, obj[field]);
  293. if (tmpMin < min) {
  294. min = tmpMin;
  295. }
  296. if (tmpMax > max) {
  297. max = tmpMax;
  298. }
  299. }
  300. if (min < scale.min || max > scale.max) {
  301. scale.change({
  302. min: min,
  303. max: max
  304. });
  305. }
  306. };
  307. _proto._sort = function _sort(mappedArray) {
  308. var self = this;
  309. var xScale = self.getXScale();
  310. var field = xScale.field,
  311. type = xScale.type;
  312. if (type !== 'identity' && xScale.values.length > 1) {
  313. (0, _common.each)(mappedArray, function (itemArr) {
  314. itemArr.sort(function (obj1, obj2) {
  315. if (type === 'timeCat') {
  316. return (0, _common.toTimeStamp)(obj1[FIELD_ORIGIN][field]) - (0, _common.toTimeStamp)(obj2[FIELD_ORIGIN][field]);
  317. }
  318. return xScale.translate(obj1[FIELD_ORIGIN][field]) - xScale.translate(obj2[FIELD_ORIGIN][field]);
  319. });
  320. });
  321. }
  322. self.set('hasSorted', true);
  323. self.set('dataArray', mappedArray);
  324. };
  325. _proto.paint = function paint() {
  326. var self = this;
  327. var dataArray = self.get('mappingData');
  328. var mappedArray = [];
  329. var shapeFactory = self.getShapeFactory();
  330. shapeFactory.setCoord(self.get('coord'));
  331. self._beforeMapping(dataArray);
  332. for (var i = 0, len = dataArray.length; i < len; i++) {
  333. var data = dataArray[i];
  334. if (data.length) {
  335. var mappedData = self._mapping(data);
  336. mappedArray.push(mappedData);
  337. self.draw(mappedData, shapeFactory);
  338. }
  339. }
  340. self.set('dataArray', mappedArray);
  341. this.generateAria();
  342. };
  343. _proto.getShapeFactory = function getShapeFactory() {
  344. var shapeFactory = this.get('shapeFactory');
  345. if (!shapeFactory) {
  346. var shapeType = this.get('shapeType');
  347. shapeFactory = _shape["default"].getShapeFactory(shapeType);
  348. this.set('shapeFactory', shapeFactory);
  349. }
  350. return shapeFactory;
  351. };
  352. _proto._mapping = function _mapping(data) {
  353. var self = this;
  354. var attrs = self.get('attrs');
  355. var yField = self.getYScale().field; // 用来缓存转换的值,减少mapping耗时
  356. var mappedCache = {};
  357. var mappedData = new Array(data.length);
  358. for (var k in attrs) {
  359. if (attrs.hasOwnProperty(k)) {
  360. var attr = attrs[k];
  361. var names = attr.names;
  362. var scales = attr.scales;
  363. for (var i = 0, len = data.length; i < len; i++) {
  364. var record = data[i];
  365. var mappedRecord = _extends({}, record, mappedData[i]);
  366. mappedRecord[FIELD_ORIGIN_Y] = record[yField]; // 获取视觉属性对应的value值
  367. // 位置的缓存命中率低,还是每次单独计算
  368. if (attr.type === 'position') {
  369. var values = self._getAttrValues(attr, record);
  370. for (var j = 0, _len = values.length; j < _len; j++) {
  371. var val = values[j];
  372. var name = names[j];
  373. mappedRecord[name] = (0, _common.isArray)(val) && val.length === 1 ? val[0] : val;
  374. }
  375. } else {
  376. // 除了position其他都只有一项
  377. var _name = names[0];
  378. var field = scales[0].field;
  379. var value = record[field];
  380. var key = "" + _name + value;
  381. var _values = mappedCache[key];
  382. if (!_values) {
  383. _values = self._getAttrValues(attr, record);
  384. mappedCache[key] = _values;
  385. }
  386. mappedRecord[_name] = _values[0];
  387. } // 设置新数组
  388. mappedData[i] = mappedRecord;
  389. }
  390. }
  391. }
  392. return mappedData;
  393. };
  394. _proto._getAttrValues = function _getAttrValues(attr, record) {
  395. var scales = attr.scales;
  396. var params = [];
  397. for (var i = 0, len = scales.length; i < len; i++) {
  398. var scale = scales[i];
  399. var field = scale.field;
  400. if (scale.type === 'identity') {
  401. params.push(scale.value);
  402. } else {
  403. params.push(record[field]);
  404. }
  405. }
  406. var values = attr.mapping.apply(attr, params);
  407. return values;
  408. };
  409. _proto.getAttrValue = function getAttrValue(attrName, record) {
  410. var attr = this.getAttr(attrName);
  411. var rst = null;
  412. if (attr) {
  413. var values = this._getAttrValues(attr, record);
  414. rst = values[0];
  415. }
  416. return rst;
  417. };
  418. _proto._beforeMapping = function _beforeMapping(dataArray) {
  419. var self = this;
  420. if (self.get('generatePoints')) {
  421. self._generatePoints(dataArray);
  422. }
  423. };
  424. _proto.isInCircle = function isInCircle() {
  425. var coord = this.get('coord');
  426. return coord && coord.isPolar;
  427. };
  428. _proto.getCallbackCfg = function getCallbackCfg(fields, cfg, origin) {
  429. if (!fields) {
  430. return cfg;
  431. }
  432. var tmpCfg = {};
  433. var params = fields.map(function (field) {
  434. return origin[field];
  435. });
  436. (0, _common.each)(cfg, function (v, k) {
  437. if ((0, _common.isFunction)(v)) {
  438. tmpCfg[k] = v.apply(null, params);
  439. } else {
  440. tmpCfg[k] = v;
  441. }
  442. });
  443. return tmpCfg;
  444. };
  445. _proto.getDrawCfg = function getDrawCfg(obj) {
  446. var self = this;
  447. var isInCircle = self.isInCircle();
  448. var cfg = {
  449. origin: obj,
  450. x: obj.x,
  451. y: obj.y,
  452. color: obj.color,
  453. size: obj.size,
  454. shape: obj.shape,
  455. isInCircle: isInCircle,
  456. opacity: obj.opacity
  457. };
  458. var styleOptions = self.get('styleOptions');
  459. if (styleOptions && styleOptions.style) {
  460. cfg.style = self.getCallbackCfg(styleOptions.fields, styleOptions.style, obj[FIELD_ORIGIN]);
  461. }
  462. if (self.get('generatePoints')) {
  463. cfg.points = obj.points;
  464. cfg.nextPoints = obj.nextPoints;
  465. }
  466. if (isInCircle) {
  467. cfg.center = self.get('coord').center;
  468. }
  469. return cfg;
  470. };
  471. _proto.draw = function draw(data, shapeFactory) {
  472. var self = this;
  473. var container = self.get('container');
  474. var yScale = self.getYScale();
  475. (0, _common.each)(data, function (obj, index) {
  476. if (yScale && (0, _common.isNil)(obj._origin[yScale.field])) {
  477. return;
  478. }
  479. obj.index = index;
  480. var cfg = self.getDrawCfg(obj);
  481. var shape = obj.shape;
  482. self.drawShape(shape, obj, cfg, container, shapeFactory);
  483. });
  484. };
  485. _proto.drawShape = function drawShape(shape, shapeData, cfg, container, shapeFactory) {
  486. var gShape = shapeFactory.drawShape(shape, cfg, container);
  487. if (gShape) {
  488. (0, _common.each)([].concat(gShape), function (s) {
  489. s.set('origin', shapeData);
  490. });
  491. }
  492. };
  493. _proto._generatePoints = function _generatePoints(dataArray) {
  494. var self = this;
  495. var shapeFactory = self.getShapeFactory();
  496. var shapeAttr = self.getAttr('shape');
  497. (0, _common.each)(dataArray, function (data) {
  498. for (var i = 0, len = data.length; i < len; i++) {
  499. var obj = data[i];
  500. var cfg = self.createShapePointsCfg(obj);
  501. var shape = shapeAttr ? self._getAttrValues(shapeAttr, obj) : null;
  502. var points = shapeFactory.getShapePoints(shape, cfg);
  503. obj.points = points;
  504. }
  505. }); // 添加nextPoints
  506. (0, _common.each)(dataArray, function (data, index) {
  507. var nextData = dataArray[index + 1];
  508. if (nextData) {
  509. data[0].nextPoints = nextData[0].points;
  510. }
  511. });
  512. } // 生成无障碍文本
  513. ;
  514. _proto.generateAria = function generateAria() {
  515. var container = this.get('container');
  516. var aria = container.get('aria');
  517. if (!aria) {
  518. return;
  519. }
  520. var ariaLables = [];
  521. var coord = this.get('coord');
  522. var xScale = this.getXScale();
  523. var yScale = this.getYScale();
  524. var coordAriaLabel = (0, _util.generateCoordAria)(coord, xScale, yScale);
  525. ariaLables.push(coordAriaLabel);
  526. var _lang$geometry = _global.lang.geometry,
  527. prefix = _lang$geometry.prefix,
  528. oneData = _lang$geometry.oneData,
  529. partData = _lang$geometry.partData,
  530. allData = _lang$geometry.allData;
  531. var dataArray = this.get('dataArray');
  532. var count = dataArray.length; // 只处理一个,不然太复杂
  533. var groupScale = this._getGroupScales()[0];
  534. if (groupScale) {
  535. var prefixLabel = (0, _common.substitute)(prefix, {
  536. count: count
  537. });
  538. ariaLables.push(prefixLabel);
  539. (0, _common.each)(dataArray, function (data, index) {
  540. var len = data.length;
  541. if (!len) return;
  542. var firstObj = data[0]._origin;
  543. if (len === 1) {
  544. ariaLables.push((0, _common.substitute)(oneData, {
  545. index: index + 1,
  546. count: len,
  547. name: firstObj[groupScale.field],
  548. values: firstObj[yScale.field]
  549. }));
  550. } else {
  551. var template = len > 5 ? partData : allData;
  552. var values = data.slice(0, 5).map(function (record) {
  553. var _origin = record._origin;
  554. var xValue = xScale.getText(_origin[xScale.field]);
  555. var yValue = yScale.getText(_origin[yScale.field]);
  556. return xValue + ":" + yValue;
  557. });
  558. ariaLables.push((0, _common.substitute)(template, {
  559. index: index + 1,
  560. count: len,
  561. part: 3,
  562. name: firstObj[groupScale.field],
  563. values: values.join(' ')
  564. }));
  565. }
  566. });
  567. }
  568. container.set('ariaLabel', ariaLables.join(''));
  569. }
  570. /**
  571. * get the info of each shape
  572. * @protected
  573. * @param {Object} obj the data item
  574. * @return {Object} cfg return the result
  575. */
  576. ;
  577. _proto.createShapePointsCfg = function createShapePointsCfg(obj) {
  578. var xScale = this.getXScale();
  579. var yScale = this.getYScale();
  580. var x = this._normalizeValues(obj[xScale.field], xScale);
  581. var y;
  582. if (yScale) {
  583. y = this._normalizeValues(obj[yScale.field], yScale);
  584. } else {
  585. y = obj.y ? obj.y : 0.1;
  586. }
  587. return {
  588. x: x,
  589. y: y,
  590. y0: yScale ? yScale.scale(this.getYMinValue()) : undefined
  591. };
  592. };
  593. _proto.getYMinValue = function getYMinValue() {
  594. var yScale = this.getYScale();
  595. var min = yScale.min,
  596. max = yScale.max;
  597. var value;
  598. if (this.get('startOnZero')) {
  599. if (max <= 0 && min <= 0) {
  600. value = max;
  601. } else {
  602. value = min >= 0 ? min : 0;
  603. }
  604. } else {
  605. value = min;
  606. }
  607. return value;
  608. };
  609. _proto._normalizeValues = function _normalizeValues(values, scale) {
  610. var rst = [];
  611. if ((0, _common.isArray)(values)) {
  612. for (var i = 0, len = values.length; i < len; i++) {
  613. var v = values[i];
  614. rst.push(scale.scale(v));
  615. }
  616. } else {
  617. rst = scale.scale(values);
  618. }
  619. return rst;
  620. };
  621. _proto.getAttr = function getAttr(name) {
  622. return this.get('attrs')[name];
  623. };
  624. _proto.getXScale = function getXScale() {
  625. return this.getAttr('position').scales[0];
  626. };
  627. _proto.getYScale = function getYScale() {
  628. return this.getAttr('position').scales[1];
  629. };
  630. _proto.hasAdjust = function hasAdjust(adjust) {
  631. return this.get('adjust') && this.get('adjust').type === adjust;
  632. };
  633. _proto._getSnap = function _getSnap(scale, item, arr) {
  634. var i = 0;
  635. var values;
  636. var yField = this.getYScale().field; // 叠加的维度
  637. if (this.hasAdjust('stack') && scale.field === yField) {
  638. values = [];
  639. arr.forEach(function (obj) {
  640. values.push(obj[FIELD_ORIGIN_Y]);
  641. });
  642. for (var len = values.length; i < len; i++) {
  643. if (values[0][0] > item) {
  644. break;
  645. }
  646. if (values[values.length - 1][1] <= item) {
  647. i = values.length - 1;
  648. break;
  649. }
  650. if (values[i][0] <= item && values[i][1] > item) {
  651. break;
  652. }
  653. }
  654. } else {
  655. values = scale.values;
  656. values.sort(function (a, b) {
  657. return a - b;
  658. });
  659. for (var _len2 = values.length; i < _len2; i++) {
  660. // 如果只有1个点直接返回第1个点
  661. if (_len2 <= 1) {
  662. break;
  663. } // 第1个点和第2个点之间
  664. if ((values[0] + values[1]) / 2 > item) {
  665. break;
  666. } // 中间的点
  667. if ((values[i - 1] + values[i]) / 2 <= item && (values[i + 1] + values[i]) / 2 > item) {
  668. break;
  669. } // 最后2个点
  670. if ((values[values.length - 2] + values[values.length - 1]) / 2 <= item) {
  671. i = values.length - 1;
  672. break;
  673. }
  674. }
  675. }
  676. var result = values[i];
  677. return result;
  678. };
  679. _proto.getSnapRecords = function getSnapRecords(point) {
  680. var self = this;
  681. var coord = self.get('coord');
  682. var xScale = self.getXScale();
  683. var yScale = self.getYScale();
  684. var xfield = xScale.field;
  685. var dataArray = self.get('dataArray');
  686. if (!this.get('hasSorted')) {
  687. this._sort(dataArray);
  688. }
  689. var rst = [];
  690. var invertPoint = coord.invertPoint(point);
  691. var invertPointX = invertPoint.x;
  692. if (self.isInCircle() && !coord.transposed && invertPointX > (1 + xScale.rangeMax()) / 2) {
  693. invertPointX = xScale.rangeMin();
  694. }
  695. var xValue = xScale.invert(invertPointX);
  696. if (!xScale.isCategory) {
  697. xValue = self._getSnap(xScale, xValue);
  698. }
  699. var tmp = [];
  700. dataArray.forEach(function (data) {
  701. data.forEach(function (obj) {
  702. var originValue = (0, _common.isNil)(obj[FIELD_ORIGIN]) ? obj[xfield] : obj[FIELD_ORIGIN][xfield];
  703. if (self._isEqual(originValue, xValue, xScale)) {
  704. tmp.push(obj);
  705. }
  706. });
  707. }); // special for pie chart
  708. if (this.hasAdjust('stack') && coord.isPolar && coord.transposed) {
  709. if (invertPointX >= 0 && invertPointX <= 1) {
  710. var yValue = yScale.invert(invertPoint.y);
  711. yValue = self._getSnap(yScale, yValue, tmp);
  712. tmp.forEach(function (obj) {
  713. if ((0, _common.isArray)(yValue) ? obj[FIELD_ORIGIN_Y].toString() === yValue.toString() : obj[FIELD_ORIGIN_Y] === yValue) {
  714. rst.push(obj);
  715. }
  716. });
  717. }
  718. } else {
  719. rst = tmp;
  720. }
  721. return rst;
  722. };
  723. _proto.getRecords = function getRecords(value) {
  724. var _this = this;
  725. var xScale = this.getXScale();
  726. var dataArray = this.get('dataArray');
  727. var xfield = xScale.field;
  728. return dataArray.map(function (data) {
  729. for (var len = data.length, i = len - 1; i >= 0; i--) {
  730. var obj = data[i];
  731. var originValue = (0, _common.isNil)(obj[FIELD_ORIGIN]) ? obj[xfield] : obj[FIELD_ORIGIN][xfield];
  732. if (_this._isEqual(originValue, value, xScale)) {
  733. return obj;
  734. }
  735. }
  736. return null;
  737. });
  738. };
  739. _proto._isEqual = function _isEqual(originValue, value, scale) {
  740. if (scale.type === 'timeCat') {
  741. return (0, _common.toTimeStamp)(originValue) === value;
  742. }
  743. return value === originValue;
  744. };
  745. _proto.position = function position(field) {
  746. this._setAttrOptions('position', {
  747. field: field
  748. });
  749. return this;
  750. };
  751. _proto.color = function color(field, values) {
  752. this._createAttrOption('color', field, values, _global["default"].colors);
  753. return this;
  754. };
  755. _proto.size = function size(field, values) {
  756. this._createAttrOption('size', field, values, _global["default"].sizes);
  757. return this;
  758. };
  759. _proto.shape = function shape(field, values) {
  760. var type = this.get('type');
  761. var shapes = _global["default"].shapes[type] || [];
  762. this._createAttrOption('shape', field, values, shapes);
  763. return this;
  764. };
  765. _proto.style = function style(field, cfg) {
  766. var styleOptions = this.get('styleOptions');
  767. if (!styleOptions) {
  768. styleOptions = {};
  769. this.set('styleOptions', styleOptions);
  770. }
  771. if ((0, _common.isObject)(field)) {
  772. cfg = field;
  773. field = null;
  774. }
  775. var fields;
  776. if (field) {
  777. fields = parseFields(field);
  778. }
  779. styleOptions.fields = fields;
  780. styleOptions.style = cfg;
  781. return this;
  782. };
  783. _proto.adjust = function adjust(type) {
  784. if ((0, _common.isString)(type)) {
  785. type = {
  786. type: type
  787. };
  788. }
  789. this.set('adjust', type);
  790. return this;
  791. };
  792. _proto.animate = function animate(cfg) {
  793. this.set('animateCfg', cfg);
  794. return this;
  795. };
  796. _proto.changeData = function changeData(data) {
  797. this.set('data', data); // 改变数据后,情况度量,因为需要重新实例化
  798. this.set('scales', {});
  799. if (!this.get('isInit')) return;
  800. this.set('isInit', false);
  801. this.init();
  802. };
  803. _proto.clearInner = function clearInner() {
  804. var container = this.get('container');
  805. if (container) {
  806. container.clear(); // container.setMatrix([ 1, 0, 0, 1, 0, 0 ]);
  807. }
  808. };
  809. _proto.reset = function reset() {
  810. this.set('isInit', false);
  811. this.set('attrs', {});
  812. this.set('attrOptions', {});
  813. this.set('adjust', null);
  814. this.clearInner();
  815. };
  816. _proto.clear = function clear() {
  817. this.clearInner();
  818. };
  819. _proto.destroy = function destroy() {
  820. this.set('isInit', false);
  821. this.clear();
  822. _Base.prototype.destroy.call(this);
  823. };
  824. _proto._display = function _display(visible) {
  825. this.set('visible', visible);
  826. var container = this.get('container');
  827. var canvas = container.get('canvas');
  828. container.set('visible', visible);
  829. canvas.draw();
  830. };
  831. _proto.show = function show() {
  832. this._display(true);
  833. };
  834. _proto.hide = function hide() {
  835. this._display(false);
  836. };
  837. return Geom;
  838. }(_base["default"]);
  839. var _default = Geom;
  840. exports["default"] = _default;