base.js 24 KB

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