UNPKG

27 kBJavaScriptView Raw
1"use strict";
2var __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})();
12Object.defineProperty(exports, "__esModule", { value: true });
13//import * as createSVGPathCalculator from "point-at-length";
14exports.createSVGPathCalculator = require("point-at-length");
15var svg_points_1 = require("svg-points");
16var SVGPointElement = /** @class */ (function () {
17 function SVGPointElement(x, y) {
18 this.x = x;
19 this.y = y;
20 }
21 return SVGPointElement;
22}());
23exports.SVGPointElement = SVGPointElement;
24var SVGPathSegment = /** @class */ (function () {
25 function SVGPathSegment(type, values) {
26 this.type = type;
27 this.values = values;
28 }
29 return SVGPathSegment;
30}());
31exports.SVGPathSegment = SVGPathSegment;
32var 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}());
72exports.SVGPath = SVGPath;
73function 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}
78exports.changeDirection = changeDirection;
79var 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));
93exports.StraightLine = StraightLine;
94var 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));
126exports.ElbowLine = ElbowLine;
127var 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));
143exports.SegmentedLine = SegmentedLine;
144// Returns the dot product of the given four-element vectors.
145function 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.
150var d3_svg_lineBasisBezier1 = [0, 2 / 3, 1 / 3, 0];
151var d3_svg_lineBasisBezier2 = [0, 1 / 3, 2 / 3, 0];
152var 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.
155function 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}
171var 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));
283exports.CurvedLine = CurvedLine;
284//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRnZURyYXdlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZWRnZS9lZGdlRHJhd2Vycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSw2REFBNkQ7QUFDaEQsUUFBQSx1QkFBdUIsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUNsRSx5Q0FBc0M7QUFXdEM7SUFNRSx5QkFBWSxDQUFTLEVBQUUsQ0FBUztRQUM5QixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUNILHNCQUFDO0FBQUQsQ0FBQyxBQVZELElBVUM7QUFWWSwwQ0FBZTtBQW9DNUI7SUFHRSx3QkFBWSxJQUFxQixFQUFFLE1BQWdCO1FBQ2pELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFDSCxxQkFBQztBQUFELENBQUMsQUFQRCxJQU9DO0FBUFksd0NBQWM7QUFlM0I7SUFhRSxpQkFBWSxNQUF5QixFQUFFLHFCQUFxQjtRQUE1RCxpQkFTQztRQUNELDhCQUF5QixHQUFHLFVBQUMsUUFBMEI7WUFDckQsTUFBTSxDQUFDLFFBQVE7aUJBQ1osR0FBRyxDQUFDLFVBQVMsV0FBVztnQkFDdkIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekQsQ0FBQyxDQUFDO2lCQUNELElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNkLENBQUMsQ0FBQztRQUNGLHFCQUFnQixHQUFHLFVBQUMsTUFBYztZQUMxQixJQUFBLG9DQUF1QyxFQUF0QyxTQUFDLEVBQUUsU0FBQyxDQUFtQztZQUM5QyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxFQUFF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
\No newline at end of file