index.js 7.1 KB

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