8c69d90914fdcab9980309751842b4ded169d275038ad065197b6bba19512b272f91ffdd907fb63c0a95be9ed642ea650680ac1a3601e24ddfd40bd673ef0c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.pie = pie;
  7. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  8. var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
  9. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  10. var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
  11. var _updater = require("../class/updater.class");
  12. var _pie = require("../config/pie");
  13. var _util = require("@jiaminghi/c-render/lib/plugin/util");
  14. var _util2 = require("../util");
  15. 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; }
  16. 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) { (0, _defineProperty2["default"])(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; }
  17. function pie(chart) {
  18. var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  19. var series = option.series;
  20. if (!series) series = [];
  21. var pies = (0, _util2.initNeedSeries)(series, _pie.pieConfig, 'pie');
  22. pies = calcPiesCenter(pies, chart);
  23. pies = calcPiesRadius(pies, chart);
  24. pies = calcRosePiesRadius(pies, chart);
  25. pies = calcPiesPercent(pies);
  26. pies = calcPiesAngle(pies, chart);
  27. pies = calcPiesInsideLabelPos(pies);
  28. pies = calcPiesEdgeCenterPos(pies);
  29. pies = calcPiesOutSideLabelPos(pies);
  30. (0, _updater.doUpdate)({
  31. chart: chart,
  32. series: pies,
  33. key: 'pie',
  34. getGraphConfig: getPieConfig,
  35. getStartGraphConfig: getStartPieConfig,
  36. beforeChange: beforeChangePie
  37. });
  38. (0, _updater.doUpdate)({
  39. chart: chart,
  40. series: pies,
  41. key: 'pieInsideLabel',
  42. getGraphConfig: getInsideLabelConfig
  43. });
  44. (0, _updater.doUpdate)({
  45. chart: chart,
  46. series: pies,
  47. key: 'pieOutsideLabelLine',
  48. getGraphConfig: getOutsideLabelLineConfig,
  49. getStartGraphConfig: getStartOutsideLabelLineConfig
  50. });
  51. (0, _updater.doUpdate)({
  52. chart: chart,
  53. series: pies,
  54. key: 'pieOutsideLabel',
  55. getGraphConfig: getOutsideLabelConfig,
  56. getStartGraphConfig: getStartOutsideLabelConfig
  57. });
  58. }
  59. function calcPiesCenter(pies, chart) {
  60. var area = chart.render.area;
  61. pies.forEach(function (pie) {
  62. var center = pie.center;
  63. center = center.map(function (pos, i) {
  64. if (typeof pos === 'number') return pos;
  65. return parseInt(pos) / 100 * area[i];
  66. });
  67. pie.center = center;
  68. });
  69. return pies;
  70. }
  71. function calcPiesRadius(pies, chart) {
  72. var maxRadius = Math.min.apply(Math, (0, _toConsumableArray2["default"])(chart.render.area)) / 2;
  73. pies.forEach(function (pie) {
  74. var radius = pie.radius,
  75. data = pie.data;
  76. radius = getNumberRadius(radius, maxRadius);
  77. data.forEach(function (item) {
  78. var itemRadius = item.radius;
  79. if (!itemRadius) itemRadius = radius;
  80. itemRadius = getNumberRadius(itemRadius, maxRadius);
  81. item.radius = itemRadius;
  82. });
  83. pie.radius = radius;
  84. });
  85. return pies;
  86. }
  87. function getNumberRadius(radius, maxRadius) {
  88. if (!(radius instanceof Array)) radius = [0, radius];
  89. radius = radius.map(function (r) {
  90. if (typeof r === 'number') return r;
  91. return parseInt(r) / 100 * maxRadius;
  92. });
  93. return radius;
  94. }
  95. function calcRosePiesRadius(pies, chart) {
  96. var rosePie = pies.filter(function (_ref) {
  97. var roseType = _ref.roseType;
  98. return roseType;
  99. });
  100. rosePie.forEach(function (pie) {
  101. var radius = pie.radius,
  102. data = pie.data,
  103. roseSort = pie.roseSort;
  104. var roseIncrement = getRoseIncrement(pie);
  105. var dataCopy = (0, _toConsumableArray2["default"])(data);
  106. data = sortData(data);
  107. data.forEach(function (item, i) {
  108. item.radius[1] = radius[1] - roseIncrement * i;
  109. });
  110. if (roseSort) {
  111. data.reverse();
  112. } else {
  113. pie.data = dataCopy;
  114. }
  115. pie.roseIncrement = roseIncrement;
  116. });
  117. return pies;
  118. }
  119. function sortData(data) {
  120. return data.sort(function (_ref2, _ref3) {
  121. var a = _ref2.value;
  122. var b = _ref3.value;
  123. if (a === b) return 0;
  124. if (a > b) return -1;
  125. if (a < b) return 1;
  126. });
  127. }
  128. function getRoseIncrement(pie) {
  129. var radius = pie.radius,
  130. roseIncrement = pie.roseIncrement;
  131. if (typeof roseIncrement === 'number') return roseIncrement;
  132. if (roseIncrement === 'auto') {
  133. var data = pie.data;
  134. var allRadius = data.reduce(function (all, _ref4) {
  135. var radius = _ref4.radius;
  136. return [].concat((0, _toConsumableArray2["default"])(all), (0, _toConsumableArray2["default"])(radius));
  137. }, []);
  138. var minRadius = Math.min.apply(Math, (0, _toConsumableArray2["default"])(allRadius));
  139. var maxRadius = Math.max.apply(Math, (0, _toConsumableArray2["default"])(allRadius));
  140. return (maxRadius - minRadius) * 0.6 / (data.length - 1 || 1);
  141. }
  142. return parseInt(roseIncrement) / 100 * radius[1];
  143. }
  144. function calcPiesPercent(pies) {
  145. pies.forEach(function (pie) {
  146. var data = pie.data,
  147. percentToFixed = pie.percentToFixed;
  148. var sum = getDataSum(data);
  149. data.forEach(function (item) {
  150. var value = item.value;
  151. item.percent = value / sum * 100;
  152. item.percentForLabel = toFixedNoCeil(value / sum * 100, percentToFixed);
  153. });
  154. var percentSumNoLast = (0, _util2.mulAdd)(data.slice(0, -1).map(function (_ref5) {
  155. var percent = _ref5.percent;
  156. return percent;
  157. }));
  158. data.slice(-1)[0].percent = 100 - percentSumNoLast;
  159. data.slice(-1)[0].percentForLabel = toFixedNoCeil(100 - percentSumNoLast, percentToFixed);
  160. });
  161. return pies;
  162. }
  163. function toFixedNoCeil(number) {
  164. var toFixed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  165. var stringNumber = number.toString();
  166. var splitedNumber = stringNumber.split('.');
  167. var decimal = splitedNumber[1] || '0';
  168. var fixedDecimal = decimal.slice(0, toFixed);
  169. splitedNumber[1] = fixedDecimal;
  170. return parseFloat(splitedNumber.join('.'));
  171. }
  172. function getDataSum(data) {
  173. return (0, _util2.mulAdd)(data.map(function (_ref6) {
  174. var value = _ref6.value;
  175. return value;
  176. }));
  177. }
  178. function calcPiesAngle(pies) {
  179. pies.forEach(function (pie) {
  180. var start = pie.startAngle,
  181. data = pie.data;
  182. data.forEach(function (item, i) {
  183. var _getDataAngle = getDataAngle(data, i),
  184. _getDataAngle2 = (0, _slicedToArray2["default"])(_getDataAngle, 2),
  185. startAngle = _getDataAngle2[0],
  186. endAngle = _getDataAngle2[1];
  187. item.startAngle = start + startAngle;
  188. item.endAngle = start + endAngle;
  189. });
  190. });
  191. return pies;
  192. }
  193. function getDataAngle(data, i) {
  194. var fullAngle = Math.PI * 2;
  195. var needAddData = data.slice(0, i + 1);
  196. var percentSum = (0, _util2.mulAdd)(needAddData.map(function (_ref7) {
  197. var percent = _ref7.percent;
  198. return percent;
  199. }));
  200. var percent = data[i].percent;
  201. var startPercent = percentSum - percent;
  202. return [fullAngle * startPercent / 100, fullAngle * percentSum / 100];
  203. }
  204. function calcPiesInsideLabelPos(pies) {
  205. pies.forEach(function (pieItem) {
  206. var data = pieItem.data;
  207. data.forEach(function (item) {
  208. item.insideLabelPos = getPieInsideLabelPos(pieItem, item);
  209. });
  210. });
  211. return pies;
  212. }
  213. function getPieInsideLabelPos(pieItem, dataItem) {
  214. var center = pieItem.center;
  215. var startAngle = dataItem.startAngle,
  216. endAngle = dataItem.endAngle,
  217. _dataItem$radius = (0, _slicedToArray2["default"])(dataItem.radius, 2),
  218. ir = _dataItem$radius[0],
  219. or = _dataItem$radius[1];
  220. var radius = (ir + or) / 2;
  221. var angle = (startAngle + endAngle) / 2;
  222. return _util.getCircleRadianPoint.apply(void 0, (0, _toConsumableArray2["default"])(center).concat([radius, angle]));
  223. }
  224. function calcPiesEdgeCenterPos(pies) {
  225. pies.forEach(function (pie) {
  226. var data = pie.data,
  227. center = pie.center;
  228. data.forEach(function (item) {
  229. var startAngle = item.startAngle,
  230. endAngle = item.endAngle,
  231. radius = item.radius;
  232. var centerAngle = (startAngle + endAngle) / 2;
  233. var pos = _util.getCircleRadianPoint.apply(void 0, (0, _toConsumableArray2["default"])(center).concat([radius[1], centerAngle]));
  234. item.edgeCenterPos = pos;
  235. });
  236. });
  237. return pies;
  238. }
  239. function calcPiesOutSideLabelPos(pies) {
  240. pies.forEach(function (pieItem) {
  241. var leftPieDataItems = getLeftOrRightPieDataItems(pieItem);
  242. var rightPieDataItems = getLeftOrRightPieDataItems(pieItem, false);
  243. leftPieDataItems = sortPiesFromTopToBottom(leftPieDataItems);
  244. rightPieDataItems = sortPiesFromTopToBottom(rightPieDataItems);
  245. addLabelLineAndAlign(leftPieDataItems, pieItem);
  246. addLabelLineAndAlign(rightPieDataItems, pieItem, false);
  247. });
  248. return pies;
  249. }
  250. function getLabelLineBendRadius(pieItem) {
  251. var labelLineBendGap = pieItem.outsideLabel.labelLineBendGap;
  252. var maxRadius = getPieMaxRadius(pieItem);
  253. if (typeof labelLineBendGap !== 'number') {
  254. labelLineBendGap = parseInt(labelLineBendGap) / 100 * maxRadius;
  255. }
  256. return labelLineBendGap + maxRadius;
  257. }
  258. function getPieMaxRadius(pieItem) {
  259. var data = pieItem.data;
  260. var radius = data.map(function (_ref8) {
  261. var _ref8$radius = (0, _slicedToArray2["default"])(_ref8.radius, 2),
  262. foo = _ref8$radius[0],
  263. r = _ref8$radius[1];
  264. return r;
  265. });
  266. return Math.max.apply(Math, (0, _toConsumableArray2["default"])(radius));
  267. }
  268. function getLeftOrRightPieDataItems(pieItem) {
  269. var left = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
  270. var data = pieItem.data,
  271. center = pieItem.center;
  272. var centerXPos = center[0];
  273. return data.filter(function (_ref9) {
  274. var edgeCenterPos = _ref9.edgeCenterPos;
  275. var xPos = edgeCenterPos[0];
  276. if (left) return xPos <= centerXPos;
  277. return xPos > centerXPos;
  278. });
  279. }
  280. function sortPiesFromTopToBottom(dataItem) {
  281. dataItem.sort(function (_ref10, _ref11) {
  282. var _ref10$edgeCenterPos = (0, _slicedToArray2["default"])(_ref10.edgeCenterPos, 2),
  283. t = _ref10$edgeCenterPos[0],
  284. ay = _ref10$edgeCenterPos[1];
  285. var _ref11$edgeCenterPos = (0, _slicedToArray2["default"])(_ref11.edgeCenterPos, 2),
  286. tt = _ref11$edgeCenterPos[0],
  287. by = _ref11$edgeCenterPos[1];
  288. if (ay > by) return 1;
  289. if (ay < by) return -1;
  290. if (ay === by) return 0;
  291. });
  292. return dataItem;
  293. }
  294. function addLabelLineAndAlign(dataItem, pieItem) {
  295. var left = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  296. var center = pieItem.center,
  297. outsideLabel = pieItem.outsideLabel;
  298. var radius = getLabelLineBendRadius(pieItem);
  299. dataItem.forEach(function (item) {
  300. var edgeCenterPos = item.edgeCenterPos,
  301. startAngle = item.startAngle,
  302. endAngle = item.endAngle;
  303. var labelLineEndLength = outsideLabel.labelLineEndLength;
  304. var angle = (startAngle + endAngle) / 2;
  305. var bendPoint = _util.getCircleRadianPoint.apply(void 0, (0, _toConsumableArray2["default"])(center).concat([radius, angle]));
  306. var endPoint = (0, _toConsumableArray2["default"])(bendPoint);
  307. endPoint[0] += labelLineEndLength * (left ? -1 : 1);
  308. item.labelLine = [edgeCenterPos, bendPoint, endPoint];
  309. item.labelLineLength = (0, _util2.getPolylineLength)(item.labelLine);
  310. item.align = {
  311. textAlign: 'left',
  312. textBaseline: 'middle'
  313. };
  314. if (left) item.align.textAlign = 'right';
  315. });
  316. }
  317. function getPieConfig(pieItem) {
  318. var data = pieItem.data,
  319. animationCurve = pieItem.animationCurve,
  320. animationFrame = pieItem.animationFrame,
  321. rLevel = pieItem.rLevel;
  322. return data.map(function (foo, i) {
  323. return {
  324. name: 'pie',
  325. index: rLevel,
  326. animationCurve: animationCurve,
  327. animationFrame: animationFrame,
  328. shape: getPieShape(pieItem, i),
  329. style: getPieStyle(pieItem, i)
  330. };
  331. });
  332. }
  333. function getStartPieConfig(pieItem) {
  334. var animationDelayGap = pieItem.animationDelayGap,
  335. startAnimationCurve = pieItem.startAnimationCurve;
  336. var configs = getPieConfig(pieItem);
  337. configs.forEach(function (config, i) {
  338. config.animationCurve = startAnimationCurve;
  339. config.animationDelay = i * animationDelayGap;
  340. config.shape.or = config.shape.ir;
  341. });
  342. return configs;
  343. }
  344. function beforeChangePie(graph) {
  345. graph.animationDelay = 0;
  346. }
  347. function getPieShape(pieItem, i) {
  348. var center = pieItem.center,
  349. data = pieItem.data;
  350. var dataItem = data[i];
  351. var radius = dataItem.radius,
  352. startAngle = dataItem.startAngle,
  353. endAngle = dataItem.endAngle;
  354. return {
  355. startAngle: startAngle,
  356. endAngle: endAngle,
  357. ir: radius[0],
  358. or: radius[1],
  359. rx: center[0],
  360. ry: center[1]
  361. };
  362. }
  363. function getPieStyle(pieItem, i) {
  364. var pieStyle = pieItem.pieStyle,
  365. data = pieItem.data;
  366. var dataItem = data[i];
  367. var color = dataItem.color;
  368. return (0, _util2.deepMerge)({
  369. fill: color
  370. }, pieStyle);
  371. }
  372. function getInsideLabelConfig(pieItem) {
  373. var animationCurve = pieItem.animationCurve,
  374. animationFrame = pieItem.animationFrame,
  375. data = pieItem.data,
  376. rLevel = pieItem.rLevel;
  377. return data.map(function (foo, i) {
  378. return {
  379. name: 'text',
  380. index: rLevel,
  381. visible: pieItem.insideLabel.show,
  382. animationCurve: animationCurve,
  383. animationFrame: animationFrame,
  384. shape: getInsideLabelShape(pieItem, i),
  385. style: getInsideLabelStyle(pieItem, i)
  386. };
  387. });
  388. }
  389. function getInsideLabelShape(pieItem, i) {
  390. var insideLabel = pieItem.insideLabel,
  391. data = pieItem.data;
  392. var formatter = insideLabel.formatter;
  393. var dataItem = data[i];
  394. var formatterType = (0, _typeof2["default"])(formatter);
  395. var label = '';
  396. if (formatterType === 'string') {
  397. label = formatter.replace('{name}', dataItem.name);
  398. label = label.replace('{percent}', dataItem.percentForLabel);
  399. label = label.replace('{value}', dataItem.value);
  400. }
  401. if (formatterType === 'function') {
  402. label = formatter(dataItem);
  403. }
  404. return {
  405. content: label,
  406. position: dataItem.insideLabelPos
  407. };
  408. }
  409. function getInsideLabelStyle(pieItem, i) {
  410. var style = pieItem.insideLabel.style;
  411. return style;
  412. }
  413. function getOutsideLabelLineConfig(pieItem) {
  414. var animationCurve = pieItem.animationCurve,
  415. animationFrame = pieItem.animationFrame,
  416. data = pieItem.data,
  417. rLevel = pieItem.rLevel;
  418. return data.map(function (foo, i) {
  419. return {
  420. name: 'polyline',
  421. index: rLevel,
  422. visible: pieItem.outsideLabel.show,
  423. animationCurve: animationCurve,
  424. animationFrame: animationFrame,
  425. shape: getOutsideLabelLineShape(pieItem, i),
  426. style: getOutsideLabelLineStyle(pieItem, i)
  427. };
  428. });
  429. }
  430. function getStartOutsideLabelLineConfig(pieItem) {
  431. var data = pieItem.data;
  432. var configs = getOutsideLabelLineConfig(pieItem);
  433. configs.forEach(function (config, i) {
  434. config.style.lineDash = [0, data[i].labelLineLength];
  435. });
  436. return configs;
  437. }
  438. function getOutsideLabelLineShape(pieItem, i) {
  439. var data = pieItem.data;
  440. var dataItem = data[i];
  441. return {
  442. points: dataItem.labelLine
  443. };
  444. }
  445. function getOutsideLabelLineStyle(pieItem, i) {
  446. var outsideLabel = pieItem.outsideLabel,
  447. data = pieItem.data;
  448. var labelLineStyle = outsideLabel.labelLineStyle;
  449. var color = data[i].color;
  450. return (0, _util2.deepMerge)({
  451. stroke: color,
  452. lineDash: [data[i].labelLineLength, 0]
  453. }, labelLineStyle);
  454. }
  455. function getOutsideLabelConfig(pieItem) {
  456. var animationCurve = pieItem.animationCurve,
  457. animationFrame = pieItem.animationFrame,
  458. data = pieItem.data,
  459. rLevel = pieItem.rLevel;
  460. return data.map(function (foo, i) {
  461. return {
  462. name: 'text',
  463. index: rLevel,
  464. visible: pieItem.outsideLabel.show,
  465. animationCurve: animationCurve,
  466. animationFrame: animationFrame,
  467. shape: getOutsideLabelShape(pieItem, i),
  468. style: getOutsideLabelStyle(pieItem, i)
  469. };
  470. });
  471. }
  472. function getStartOutsideLabelConfig(pieItem) {
  473. var data = pieItem.data;
  474. var configs = getOutsideLabelConfig(pieItem);
  475. configs.forEach(function (config, i) {
  476. config.shape.position = data[i].labelLine[1];
  477. });
  478. return configs;
  479. }
  480. function getOutsideLabelShape(pieItem, i) {
  481. var outsideLabel = pieItem.outsideLabel,
  482. data = pieItem.data;
  483. var formatter = outsideLabel.formatter;
  484. var _data$i = data[i],
  485. labelLine = _data$i.labelLine,
  486. name = _data$i.name,
  487. percentForLabel = _data$i.percentForLabel,
  488. value = _data$i.value;
  489. var formatterType = (0, _typeof2["default"])(formatter);
  490. var label = '';
  491. if (formatterType === 'string') {
  492. label = formatter.replace('{name}', name);
  493. label = label.replace('{percent}', percentForLabel);
  494. label = label.replace('{value}', value);
  495. }
  496. if (formatterType === 'function') {
  497. label = formatter(data[i]);
  498. }
  499. return {
  500. content: label,
  501. position: labelLine[2]
  502. };
  503. }
  504. function getOutsideLabelStyle(pieItem, i) {
  505. var outsideLabel = pieItem.outsideLabel,
  506. data = pieItem.data;
  507. var _data$i2 = data[i],
  508. color = _data$i2.color,
  509. align = _data$i2.align;
  510. var style = outsideLabel.style;
  511. return (0, _util2.deepMerge)(_objectSpread({
  512. fill: color
  513. }, align), style);
  514. }