utils.js 3.6 KB

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