index.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.Grid = void 0;
  4. var tslib_1 = require("tslib");
  5. var animation_1 = require("../../animation");
  6. var core_1 = require("../../core");
  7. var util_1 = require("../../util");
  8. var CLASS_NAMES = (0, util_1.classNames)({
  9. lineGroup: 'line-group',
  10. line: 'line',
  11. regionGroup: 'region-group',
  12. region: 'region',
  13. }, 'grid');
  14. function getStraightPath(points) {
  15. return points.reduce(function (acc, curr, idx) {
  16. acc.push(tslib_1.__spreadArray([idx === 0 ? 'M' : 'L'], tslib_1.__read(curr), false));
  17. return acc;
  18. }, []);
  19. }
  20. function getSurroundPath(points, attr, reversed) {
  21. var _a = attr.connect, connect = _a === void 0 ? 'line' : _a, center = attr.center;
  22. if (connect === 'line')
  23. return getStraightPath(points);
  24. if (!center)
  25. return [];
  26. var radius = (0, util_1.distance)(points[0], center);
  27. var sweepFlag = reversed ? 0 : 1;
  28. return points.reduce(function (r, p, idx) {
  29. if (idx === 0)
  30. r.push(tslib_1.__spreadArray(['M'], tslib_1.__read(p), false));
  31. else
  32. r.push(tslib_1.__spreadArray(['A', radius, radius, 0, 0, sweepFlag], tslib_1.__read(p), false));
  33. return r;
  34. }, []);
  35. }
  36. function getLinePath(points, cfg, reversed) {
  37. if (cfg.type === 'surround')
  38. return getSurroundPath(points, cfg, reversed);
  39. return getStraightPath(points);
  40. }
  41. function connectPaths(from, to, cfg) {
  42. var type = cfg.type, connect = cfg.connect, center = cfg.center, closed = cfg.closed;
  43. var closeFlag = closed ? [['Z']] : [];
  44. var _a = tslib_1.__read([getLinePath(from, cfg), getLinePath(to.slice().reverse(), cfg, true)], 2), path1 = _a[0], path2 = _a[1];
  45. var _b = tslib_1.__read([from[0], to.slice(-1)[0]], 2), startOfFrom = _b[0], endOfTo = _b[1];
  46. var createPath = function (insertA, insertB) {
  47. return [path1, insertA, path2, insertB, closeFlag].flat();
  48. };
  49. if (connect === 'line' || type === 'surround') {
  50. return createPath([tslib_1.__spreadArray(['L'], tslib_1.__read(endOfTo), false)], [tslib_1.__spreadArray(['L'], tslib_1.__read(startOfFrom), false)]);
  51. }
  52. if (!center)
  53. throw new Error('Arc grid need to specified center');
  54. var _c = tslib_1.__read([(0, util_1.distance)(endOfTo, center), (0, util_1.distance)(startOfFrom, center)], 2), raduis1 = _c[0], radius2 = _c[1];
  55. return createPath([
  56. tslib_1.__spreadArray(['A', raduis1, raduis1, 0, 0, 1], tslib_1.__read(endOfTo), false),
  57. tslib_1.__spreadArray(['L'], tslib_1.__read(endOfTo), false),
  58. ], [
  59. tslib_1.__spreadArray(['A', radius2, radius2, 0, 0, 0], tslib_1.__read(startOfFrom), false),
  60. tslib_1.__spreadArray(['L'], tslib_1.__read(startOfFrom), false),
  61. ]);
  62. }
  63. function renderGridLine(container, data, attr, style) {
  64. var animate = attr.animate;
  65. var lines = data.map(function (item, idx) { return ({
  66. id: item.id || "grid-line-".concat(idx),
  67. path: getLinePath(item.points, attr),
  68. }); });
  69. return container
  70. .selectAll(CLASS_NAMES.line.class)
  71. .data(lines, function (d) { return d.id; })
  72. .join(function (enter) {
  73. return enter.append('path').each(function (datum, index) {
  74. var lineStyle = (0, util_1.getCallbackValue)((0, util_1.getPrimitiveAttributes)(tslib_1.__assign({ path: datum.path }, style)), [
  75. datum,
  76. index,
  77. lines,
  78. ]);
  79. this.attr(tslib_1.__assign({ class: CLASS_NAMES.line.name, stroke: '#D9D9D9', lineWidth: 1, lineDash: [4, 4] }, lineStyle));
  80. });
  81. }, function (update) {
  82. return update.transition(function (datum, index) {
  83. var lineStyle = (0, util_1.getCallbackValue)((0, util_1.getPrimitiveAttributes)(tslib_1.__assign({ path: datum.path }, style)), [
  84. datum,
  85. index,
  86. lines,
  87. ]);
  88. return (0, animation_1.transition)(this, lineStyle, animate.update);
  89. });
  90. }, function (exit) {
  91. return exit.transition(function () {
  92. var _this = this;
  93. var animation = (0, animation_1.fadeOut)(this, animate.exit);
  94. (0, animation_1.onAnimateFinished)(animation, function () { return _this.remove(); });
  95. return animation;
  96. });
  97. })
  98. .transitions();
  99. }
  100. function renderAlternateRegion(container, data, style) {
  101. var animate = style.animate, connect = style.connect, areaFill = style.areaFill;
  102. if (data.length < 2 || !areaFill || !connect)
  103. return [];
  104. var colors = Array.isArray(areaFill) ? areaFill : [areaFill, 'transparent'];
  105. var getColor = function (idx) { return colors[idx % colors.length]; };
  106. var regions = [];
  107. for (var idx = 0; idx < data.length - 1; idx++) {
  108. var _a = tslib_1.__read([data[idx].points, data[idx + 1].points], 2), prev = _a[0], curr = _a[1];
  109. var path = connectPaths(prev, curr, style);
  110. regions.push({ path: path, fill: getColor(idx) });
  111. }
  112. return container
  113. .selectAll(CLASS_NAMES.region.class)
  114. .data(regions, function (_, i) { return i; })
  115. .join(function (enter) {
  116. return enter
  117. .append('path')
  118. .each(function (datum, index) {
  119. var regionStyle = (0, util_1.getCallbackValue)(datum, [datum, index, regions]);
  120. this.attr(regionStyle);
  121. })
  122. .attr('className', CLASS_NAMES.region.name);
  123. }, function (update) {
  124. return update.transition(function (datum, index) {
  125. var regionStyle = (0, util_1.getCallbackValue)(datum, [datum, index, regions]);
  126. return (0, animation_1.transition)(this, regionStyle, animate.update);
  127. });
  128. }, function (exit) {
  129. return exit.transition(function () {
  130. var _this = this;
  131. var animation = (0, animation_1.fadeOut)(this, animate.exit);
  132. (0, animation_1.onAnimateFinished)(animation, function () { return _this.remove(); });
  133. return animation;
  134. });
  135. })
  136. .transitions();
  137. }
  138. function getData(attr) {
  139. var _a = attr.data, data = _a === void 0 ? [] : _a, closed = attr.closed;
  140. if (!closed)
  141. return data;
  142. return data.map(function (datum) {
  143. var points = datum.points;
  144. var _a = tslib_1.__read(points, 1), start = _a[0];
  145. return tslib_1.__assign(tslib_1.__assign({}, datum), { points: tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(points), false), [start], false) });
  146. });
  147. }
  148. var Grid = /** @class */ (function (_super) {
  149. tslib_1.__extends(Grid, _super);
  150. function Grid() {
  151. return _super !== null && _super.apply(this, arguments) || this;
  152. }
  153. Grid.prototype.render = function (attributes, container) {
  154. // @ts-ignore do no passBy className
  155. var type = attributes.type, center = attributes.center, areaFill = attributes.areaFill, closed = attributes.closed, style = tslib_1.__rest(attributes, ["type", "center", "areaFill", "closed"]);
  156. var data = getData(attributes);
  157. var lineGroup = (0, util_1.select)(container).maybeAppendByClassName(CLASS_NAMES.lineGroup, 'g');
  158. var regionGroup = (0, util_1.select)(container).maybeAppendByClassName(CLASS_NAMES.regionGroup, 'g');
  159. var lineTransitions = renderGridLine(lineGroup, data, attributes, style);
  160. var reigionTransitions = renderAlternateRegion(regionGroup, data, attributes);
  161. return tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(lineTransitions), false), tslib_1.__read(reigionTransitions), false);
  162. };
  163. return Grid;
  164. }(core_1.GUI));
  165. exports.Grid = Grid;
  166. //# sourceMappingURL=index.js.map