utils.js 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import { __assign } from "tslib";
  2. import { assign, memoize } from '@antv/util';
  3. import { LEVEL, log } from '../../utils';
  4. import { blend } from '../../utils/color/blend';
  5. import { ID_FIELD, PATH_FIELD } from './constant';
  6. import { computeTextCentres, intersectionAreaPath } from './layout/diagram';
  7. import { scaleSolution, venn } from './layout/layout';
  8. /**
  9. * 获取 颜色映射
  10. * @usage colorMap.get(id) => color
  11. *
  12. * @returns Map<string, string>
  13. */
  14. export var getColorMap = memoize((function (colorPalette, data, blendMode, setsField) {
  15. var colorMap = new Map();
  16. var colorPaletteLen = colorPalette.length;
  17. data.forEach(function (d, idx) {
  18. if (d[setsField].length === 1) {
  19. colorMap.set(d[ID_FIELD], colorPalette[(idx + colorPaletteLen) % colorPaletteLen]);
  20. }
  21. else {
  22. /** 一般都是可以获取到颜色的,如果不正确 就是输入了非法数据 */
  23. var colorArr = d[setsField].map(function (id) { return colorMap.get(id); });
  24. colorMap.set(d[ID_FIELD], colorArr.slice(1).reduce(function (a, b) { return blend(a, b, blendMode); }, colorArr[0]));
  25. }
  26. });
  27. return colorMap;
  28. }), function () {
  29. var params = [];
  30. for (var _i = 0; _i < arguments.length; _i++) {
  31. params[_i] = arguments[_i];
  32. }
  33. return JSON.stringify(params);
  34. });
  35. /**
  36. * 给韦恩图数据进行布局
  37. *
  38. * @param data
  39. * @param width
  40. * @param height
  41. * @param padding
  42. * @returns 韦恩图数据
  43. */
  44. export function layoutVennData(options, width, height, padding) {
  45. if (padding === void 0) { padding = 0; }
  46. var data = options.data, setsField = options.setsField, sizeField = options.sizeField;
  47. // 处理空数据的情况
  48. if (data.length === 0) {
  49. log(LEVEL.WARN, false, 'warn: %s', '数据不能为空');
  50. return [];
  51. }
  52. var vennData = data.map(function (d) {
  53. var _a;
  54. return (__assign(__assign({}, d), (_a = { sets: d[setsField] || [], size: d[sizeField] }, _a[PATH_FIELD] = '', _a[ID_FIELD] = '', _a)));
  55. });
  56. // 1. 进行排序,避免图形元素遮挡
  57. vennData.sort(function (a, b) { return a.sets.length - b.sets.length; });
  58. // todo 2. 可以在这里处理下非法数据输入,避免直接 crash
  59. var solution = venn(vennData);
  60. var circles = scaleSolution(solution, width, height, padding);
  61. var textCenters = computeTextCentres(circles, vennData);
  62. vennData.forEach(function (row) {
  63. var sets = row.sets;
  64. var id = sets.join(',');
  65. row[ID_FIELD] = id;
  66. // 保留 vennText 布局方法
  67. var setCircles = sets.map(function (set) { return circles[set]; });
  68. var path = intersectionAreaPath(setCircles);
  69. if (!/[zZ]$/.test(path)) {
  70. path += ' Z';
  71. }
  72. row[PATH_FIELD] = path;
  73. var center = textCenters[id] || { x: 0, y: 0 };
  74. assign(row, center);
  75. });
  76. return vennData;
  77. }
  78. /**
  79. * 检查是否存在 非法元素
  80. * @param legalArr 合法集合:['A', 'B']
  81. * @param testArr 检查集合:['A', 'B', 'C'] or ['A', 'C'](存在非法 'C')
  82. * @return boolean
  83. */
  84. export function islegalSets(legalArr, testArr) {
  85. for (var i = 0; i < testArr.length; i++) {
  86. if (!legalArr.includes(testArr[i])) {
  87. return false;
  88. }
  89. }
  90. return true;
  91. }
  92. //# sourceMappingURL=utils.js.map