1 | ;
|
2 | var __extends = (this && this.__extends) || (function () {
|
3 | var extendStatics = Object.setPrototypeOf ||
|
4 | ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
5 | function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
|
6 | return function (d, b) {
|
7 | extendStatics(d, b);
|
8 | function __() { this.constructor = d; }
|
9 | d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
10 | };
|
11 | })();
|
12 | Object.defineProperty(exports, "__esModule", { value: true });
|
13 | //import * as createSVGPathCalculator from "point-at-length";
|
14 | exports.createSVGPathCalculator = require("point-at-length");
|
15 | var svg_points_1 = require("svg-points");
|
16 | var SVGPointElement = /** @class */ (function () {
|
17 | function SVGPointElement(x, y) {
|
18 | this.x = x;
|
19 | this.y = y;
|
20 | }
|
21 | return SVGPointElement;
|
22 | }());
|
23 | exports.SVGPointElement = SVGPointElement;
|
24 | var SVGPathSegment = /** @class */ (function () {
|
25 | function SVGPathSegment(type, values) {
|
26 | this.type = type;
|
27 | this.values = values;
|
28 | }
|
29 | return SVGPathSegment;
|
30 | }());
|
31 | exports.SVGPathSegment = SVGPathSegment;
|
32 | var SVGPath = /** @class */ (function () {
|
33 | function SVGPath(points, getPathDataFromPoints) {
|
34 | var _this = this;
|
35 | this.getPathStringFromPathData = function (pathData) {
|
36 | return pathData
|
37 | .map(function (pathSegment) {
|
38 | return pathSegment.type + pathSegment.values.join(",");
|
39 | })
|
40 | .join("");
|
41 | };
|
42 | this.getPointAtLength = function (length) {
|
43 | var _a = _this.pathCalculator.at(length), x = _a[0], y = _a[1];
|
44 | return new SVGPointElement(x, y);
|
45 | };
|
46 | this.getTotalLength = function () {
|
47 | return _this.pathCalculator.length();
|
48 | };
|
49 | this.getPathData = function (settings) {
|
50 | return _this.pathData;
|
51 | };
|
52 | this.setPathData = function (pathData) {
|
53 | _this.pathData = pathData;
|
54 | _this.d = _this.getPathStringFromPathData(_this.pathData);
|
55 | _this.pathCalculator = exports.createSVGPathCalculator(_this.d);
|
56 | };
|
57 | this.getPointAtPosition = function (position) {
|
58 | var totalLength = _this.getTotalLength();
|
59 | return _this.getPointAtLength(position * totalLength);
|
60 | };
|
61 | this.getPathDataFromPoints = getPathDataFromPoints;
|
62 | this.pathData = getPathDataFromPoints(points);
|
63 | this.d = this.getPathStringFromPathData(this.pathData);
|
64 | this.points = svg_points_1.toPoints({
|
65 | type: "path",
|
66 | d: this.d
|
67 | });
|
68 | this.pathCalculator = exports.createSVGPathCalculator(this.d);
|
69 | }
|
70 | return SVGPath;
|
71 | }());
|
72 | exports.SVGPath = SVGPath;
|
73 | function changeDirection(currentDirection) {
|
74 | var xDirection = Math.abs(Math.abs(currentDirection[0]) - 1);
|
75 | var yDirection = Math.abs(Math.abs(currentDirection[1]) - 1);
|
76 | return [xDirection, yDirection];
|
77 | }
|
78 | exports.changeDirection = changeDirection;
|
79 | var StraightLine = /** @class */ (function (_super) {
|
80 | __extends(StraightLine, _super);
|
81 | function StraightLine(points) {
|
82 | return _super.call(this, points, function getPathDataFromPoints(points) {
|
83 | var _a = points[0], x0 = _a.x, y0 = _a.y;
|
84 | var _b = points[points.length - 1], x1 = _b.x, y1 = _b.y;
|
85 | return [
|
86 | new SVGPathSegment("M", [x0, y0]),
|
87 | new SVGPathSegment("L", [x1, y1])
|
88 | ];
|
89 | }) || this;
|
90 | }
|
91 | return StraightLine;
|
92 | }(SVGPath));
|
93 | exports.StraightLine = StraightLine;
|
94 | var ElbowLine = /** @class */ (function (_super) {
|
95 | __extends(ElbowLine, _super);
|
96 | function ElbowLine(points) {
|
97 | return _super.call(this, points, function getPathDataFromPoints(points) {
|
98 | var pointCount = points.length;
|
99 | var firstPoint = points[0], lastPoint = points[pointCount - 1];
|
100 | var pathData = [new SVGPathSegment("M", [firstPoint.x, firstPoint.y])];
|
101 | var direction = [];
|
102 | if (firstPoint.orientation) {
|
103 | direction.push(firstPoint.orientation[0]);
|
104 | direction.push(firstPoint.orientation[1]);
|
105 | }
|
106 | else {
|
107 | console.error("points");
|
108 | console.error(points);
|
109 | throw new Error("No orientation specified for elbowline edge w/ points logged above");
|
110 | }
|
111 | points.forEach(function (point, index) {
|
112 | if (index > 0 && index < pointCount) {
|
113 | var x0 = Math.abs(direction[0]) * (points[index].x - points[index - 1].x) +
|
114 | points[index - 1].x, y0 = Math.abs(direction[1]) * (points[index].y - points[index - 1].y) +
|
115 | points[index - 1].y;
|
116 | pathData.push(new SVGPathSegment("L", [x0, y0]));
|
117 | direction = changeDirection(direction);
|
118 | }
|
119 | });
|
120 | pathData.push(new SVGPathSegment("L", [lastPoint.x, lastPoint.y]));
|
121 | return pathData;
|
122 | }) || this;
|
123 | }
|
124 | return ElbowLine;
|
125 | }(SVGPath));
|
126 | exports.ElbowLine = ElbowLine;
|
127 | var SegmentedLine = /** @class */ (function (_super) {
|
128 | __extends(SegmentedLine, _super);
|
129 | function SegmentedLine(points) {
|
130 | return _super.call(this, points, function getPathDataFromPoints(points) {
|
131 | var firstPoint = points[0];
|
132 | var pathData = [new SVGPathSegment("M", [firstPoint.x, firstPoint.y])];
|
133 | points.forEach(function (point, index) {
|
134 | if (index > 0) {
|
135 | pathData.push(new SVGPathSegment("L", [point.x, point.y]));
|
136 | }
|
137 | });
|
138 | return pathData;
|
139 | }) || this;
|
140 | }
|
141 | return SegmentedLine;
|
142 | }(SVGPath));
|
143 | exports.SegmentedLine = SegmentedLine;
|
144 | // Returns the dot product of the given four-element vectors.
|
145 | function d3_svg_lineDot4(a, b) {
|
146 | return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
|
147 | }
|
148 | // Matrix to transform basis (b-spline) control points to bezier
|
149 | // control points. Derived from FvD 11.2.8.
|
150 | var d3_svg_lineBasisBezier1 = [0, 2 / 3, 1 / 3, 0];
|
151 | var d3_svg_lineBasisBezier2 = [0, 1 / 3, 2 / 3, 0];
|
152 | var d3_svg_lineBasisBezier3 = [0, 1 / 6, 2 / 3, 1 / 6];
|
153 | // Pushes a "C" Bézier curve onto the specified path array, given the
|
154 | // two specified four-element arrays which define the control points.
|
155 | function lineBasisBezier(pathData, x, y) {
|
156 | var pointsForBezier = [];
|
157 | pointsForBezier.push([
|
158 | d3_svg_lineDot4(d3_svg_lineBasisBezier1, x),
|
159 | d3_svg_lineDot4(d3_svg_lineBasisBezier1, y)
|
160 | ]);
|
161 | pointsForBezier.push([
|
162 | d3_svg_lineDot4(d3_svg_lineBasisBezier2, x),
|
163 | d3_svg_lineDot4(d3_svg_lineBasisBezier2, y)
|
164 | ]);
|
165 | pointsForBezier.push([
|
166 | d3_svg_lineDot4(d3_svg_lineBasisBezier3, x),
|
167 | d3_svg_lineDot4(d3_svg_lineBasisBezier3, y)
|
168 | ]);
|
169 | pathData.push(new SVGPathSegment("C", pointsForBezier));
|
170 | }
|
171 | var CurvedLine = /** @class */ (function (_super) {
|
172 | __extends(CurvedLine, _super);
|
173 | function CurvedLine(points, markerStart, markerEnd) {
|
174 | var _this = _super.call(this, points, function getPathDataFromPoints(elbowPoints, markerStart, markerEnd) {
|
175 | // modified from d3js: https://github.com/mbostock/d3/blob/ed54503fc7781d8bfe9e9fe125b76b9bbb5ac05c/src/svg/line.js
|
176 | // TODO this code is kind of hacky. it seems to work OK, but it's probably confusing and should be refactored for readability/maintainability.
|
177 | var elbowPointCount = elbowPoints.length;
|
178 | var firstPoint = elbowPoints[0];
|
179 | var lastPoint = elbowPoints[elbowPointCount - 1];
|
180 | var points = [];
|
181 | points.push(firstPoint);
|
182 | var lastSegment = [];
|
183 | var pathData = [new SVGPathSegment("M", [firstPoint.x, firstPoint.y])];
|
184 | var direction = [];
|
185 | if (firstPoint.orientation) {
|
186 | var orientation_1 = firstPoint.orientation;
|
187 | direction.push(orientation_1[0]);
|
188 | direction.push(orientation_1[1]);
|
189 | }
|
190 | else {
|
191 | console.error("points");
|
192 | console.error(points);
|
193 | throw new Error("No orientation specified for curvedline edge w/ points logged above");
|
194 | }
|
195 | // for curves, I'm calculating and using the points representing the elbow vertices, from the given points (which represent the first point, any elbow segment mid-points and the last point).
|
196 | // I'm making sure the curve passes through the midpoint of the marker side that is furthest away from the node it is attached to
|
197 | // TODO this code might be confusing, because it involves redefining the points. Look at refactoring it for readability.
|
198 | var markerHeightFactor = 0.75;
|
199 | if (!!markerStart &&
|
200 | firstPoint.orientation &&
|
201 | typeof firstPoint.orientation[0] !== "undefined" &&
|
202 | typeof firstPoint.orientation[1] !== "undefined") {
|
203 | var firstPointWithOffset = {};
|
204 | var firstOffset;
|
205 | var firstMarkerData = { x: 0, y: 0, markerWidth: 12, markerHeight: 12 };
|
206 | if (!!firstMarkerData) {
|
207 | firstOffset = markerHeightFactor * firstMarkerData.markerHeight;
|
208 | }
|
209 | else {
|
210 | firstOffset = 12;
|
211 | }
|
212 | firstPointWithOffset.x =
|
213 | firstPoint.orientation[0] * firstOffset + firstPoint.x;
|
214 | firstPointWithOffset.y =
|
215 | firstPoint.orientation[1] * firstOffset + firstPoint.y;
|
216 | pathData.push(new SVGPathSegment("L", [
|
217 | firstPointWithOffset.x,
|
218 | firstPointWithOffset.y
|
219 | ]));
|
220 | points[0] = firstPointWithOffset;
|
221 | }
|
222 | if (!!markerEnd &&
|
223 | lastPoint.orientation &&
|
224 | typeof lastPoint.orientation[0] !== "undefined" &&
|
225 | typeof lastPoint.orientation[1] !== "undefined") {
|
226 | lastSegment.push(new SVGPathSegment("L", [lastPoint.x, lastPoint.y]));
|
227 | var lastPointWithOffset = {};
|
228 | var lastOffset;
|
229 | var lastMarkerData = { x: 0, y: 0, markerWidth: 12, markerHeight: 12 };
|
230 | if (!!lastMarkerData) {
|
231 | lastOffset = markerHeightFactor * lastMarkerData.markerHeight;
|
232 | }
|
233 | else {
|
234 | lastOffset = 12;
|
235 | }
|
236 | lastPointWithOffset.x =
|
237 | lastPoint.orientation[0] * lastOffset + lastPoint.x;
|
238 | lastPointWithOffset.y =
|
239 | lastPoint.orientation[1] * lastOffset + lastPoint.y;
|
240 | elbowPoints[elbowPointCount - 1] = lastPoint = lastPointWithOffset;
|
241 | }
|
242 | elbowPoints.forEach(function (elbowPoint, index) {
|
243 | var x0, y0, x1, y1;
|
244 | if (index > 0 && index < elbowPointCount) {
|
245 | x0 =
|
246 | Math.abs(direction[0]) *
|
247 | (elbowPoints[index].x - elbowPoints[index - 1].x) +
|
248 | elbowPoints[index - 1].x;
|
249 | y0 =
|
250 | Math.abs(direction[1]) *
|
251 | (elbowPoints[index].y - elbowPoints[index - 1].y) +
|
252 | elbowPoints[index - 1].y;
|
253 | points.push({ x: x0, y: y0 });
|
254 | direction = changeDirection(direction);
|
255 | }
|
256 | });
|
257 | points.push(lastPoint);
|
258 | var i = 1, n = points.length, pi = points[0], x0 = pi.x, y0 = pi.y, px = [x0, x0, x0, (pi = points[1]).x], py = [y0, y0, y0, pi.y];
|
259 | pathData.push(new SVGPathSegment("L", [
|
260 | d3_svg_lineDot4(d3_svg_lineBasisBezier3, px),
|
261 | d3_svg_lineDot4(d3_svg_lineBasisBezier3, py)
|
262 | ]));
|
263 | points.push(points[n - 1]);
|
264 | while (++i <= n) {
|
265 | pi = points[i];
|
266 | px.shift();
|
267 | px.push(pi.x);
|
268 | py.shift();
|
269 | py.push(pi.y);
|
270 | lineBasisBezier(pathData, px, py);
|
271 | }
|
272 | points.pop();
|
273 | pathData.push(new SVGPathSegment("L", [pi.x, pi.y]));
|
274 | pathData = pathData.concat(lastSegment);
|
275 | return pathData;
|
276 | }) || this;
|
277 | _this.pathData = _this.getPathDataFromPoints(points, markerStart, markerEnd);
|
278 | _this.d = _this.getPathStringFromPathData(_this.pathData);
|
279 | return _this;
|
280 | }
|
281 | return CurvedLine;
|
282 | }(SVGPath));
|
283 | exports.CurvedLine = CurvedLine;
|
284 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRnZURyYXdlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZWRnZS9lZGdlRHJhd2Vycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSw2REFBNkQ7QUFDaEQsUUFBQSx1QkFBdUIsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUNsRSx5Q0FBc0M7QUFXdEM7SUFNRSx5QkFBWSxDQUFTLEVBQUUsQ0FBUztRQUM5QixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUNILHNCQUFDO0FBQUQsQ0FBQyxBQVZELElBVUM7QUFWWSwwQ0FBZTtBQW9DNUI7SUFHRSx3QkFBWSxJQUFxQixFQUFFLE1BQWdCO1FBQ2pELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFDSCxxQkFBQztBQUFELENBQUMsQUFQRCxJQU9DO0FBUFksd0NBQWM7QUFlM0I7SUFhRSxpQkFBWSxNQUF5QixFQUFFLHFCQUFxQjtRQUE1RCxpQkFTQztRQUNELDhCQUF5QixHQUFHLFVBQUMsUUFBMEI7WUFDckQsTUFBTSxDQUFDLFFBQVE7aUJBQ1osR0FBRyxDQUFDLFVBQVMsV0FBVztnQkFDdkIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekQsQ0FBQyxDQUFDO2lCQUNELElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNkLENBQUMsQ0FBQztRQUNGLHFCQUFnQixHQUFHLFVBQUMsTUFBYztZQUMxQixJQUFBLG9DQUF1QyxFQUF0QyxTQUFDLEVBQUUsU0FBQyxDQUFtQztZQUM5QyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxFQUFF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 |
\ | No newline at end of file |