UNPKG

gpml2pvjson

Version:
288 lines 27.1 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.CurvedLine = exports.SegmentedLine = exports.ElbowLine = exports.StraightLine = exports.changeDirection = exports.SVGPath = exports.SVGPathSegment = exports.SVGPointElement = exports.createSVGPathCalculator = void 0; //import * as createSVGPathCalculator from "point-at-length"; exports.createSVGPathCalculator = require("point-at-length"); var svg_points_1 = require("svg-points"); var SVGPointElement = /** @class */ (function () { function SVGPointElement(x, y) { this.x = x; this.y = y; } return SVGPointElement; }()); exports.SVGPointElement = SVGPointElement; var SVGPathSegment = /** @class */ (function () { function SVGPathSegment(type, values) { this.type = type; this.values = values; } return SVGPathSegment; }()); exports.SVGPathSegment = SVGPathSegment; var SVGPath = /** @class */ (function () { function SVGPath(points, getPathDataFromPoints) { var _this = this; this.getPathStringFromPathData = function (pathData) { return pathData .map(function (pathSegment) { return pathSegment.type + pathSegment.values.join(","); }) .join(""); }; this.getPointAtLength = function (length) { var _a = _this.pathCalculator.at(length), x = _a[0], y = _a[1]; return new SVGPointElement(x, y); }; this.getTotalLength = function () { return _this.pathCalculator.length(); }; this.getPathData = function (settings) { return _this.pathData; }; this.setPathData = function (pathData) { _this.pathData = pathData; _this.d = _this.getPathStringFromPathData(_this.pathData); _this.pathCalculator = exports.createSVGPathCalculator(_this.d); }; this.getPointAtPosition = function (position) { var totalLength = _this.getTotalLength(); return _this.getPointAtLength(position * totalLength); }; this.getPathDataFromPoints = getPathDataFromPoints; this.pathData = getPathDataFromPoints(points); this.d = this.getPathStringFromPathData(this.pathData); this.points = svg_points_1.toPoints({ type: "path", d: this.d }); this.pathCalculator = exports.createSVGPathCalculator(this.d); } return SVGPath; }()); exports.SVGPath = SVGPath; function changeDirection(currentDirection) { var xDirection = Math.abs(Math.abs(currentDirection[0]) - 1); var yDirection = Math.abs(Math.abs(currentDirection[1]) - 1); return [xDirection, yDirection]; } exports.changeDirection = changeDirection; var StraightLine = /** @class */ (function (_super) { __extends(StraightLine, _super); function StraightLine(points) { return _super.call(this, points, function getPathDataFromPoints(points) { var _a = points[0], x0 = _a.x, y0 = _a.y; var _b = points[points.length - 1], x1 = _b.x, y1 = _b.y; return [ new SVGPathSegment("M", [x0, y0]), new SVGPathSegment("L", [x1, y1]) ]; }) || this; } return StraightLine; }(SVGPath)); exports.StraightLine = StraightLine; var ElbowLine = /** @class */ (function (_super) { __extends(ElbowLine, _super); function ElbowLine(points) { return _super.call(this, points, function getPathDataFromPoints(points) { var pointCount = points.length; var firstPoint = points[0], lastPoint = points[pointCount - 1]; var pathData = [new SVGPathSegment("M", [firstPoint.x, firstPoint.y])]; var direction = []; if (firstPoint.orientation) { direction.push(firstPoint.orientation[0]); direction.push(firstPoint.orientation[1]); } else { console.error("points"); console.error(points); throw new Error("No orientation specified for elbowline edge w/ points logged above"); } points.forEach(function (point, index) { if (index > 0 && index < pointCount) { var x0 = Math.abs(direction[0]) * (points[index].x - points[index - 1].x) + points[index - 1].x, y0 = Math.abs(direction[1]) * (points[index].y - points[index - 1].y) + points[index - 1].y; pathData.push(new SVGPathSegment("L", [x0, y0])); direction = changeDirection(direction); } }); pathData.push(new SVGPathSegment("L", [lastPoint.x, lastPoint.y])); return pathData; }) || this; } return ElbowLine; }(SVGPath)); exports.ElbowLine = ElbowLine; var SegmentedLine = /** @class */ (function (_super) { __extends(SegmentedLine, _super); function SegmentedLine(points) { return _super.call(this, points, function getPathDataFromPoints(points) { var firstPoint = points[0]; var pathData = [new SVGPathSegment("M", [firstPoint.x, firstPoint.y])]; points.forEach(function (point, index) { if (index > 0) { pathData.push(new SVGPathSegment("L", [point.x, point.y])); } }); return pathData; }) || this; } return SegmentedLine; }(SVGPath)); exports.SegmentedLine = SegmentedLine; // Returns the dot product of the given four-element vectors. function d3_svg_lineDot4(a, b) { return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; } // Matrix to transform basis (b-spline) control points to bezier // control points. Derived from FvD 11.2.8. var d3_svg_lineBasisBezier1 = [0, 2 / 3, 1 / 3, 0]; var d3_svg_lineBasisBezier2 = [0, 1 / 3, 2 / 3, 0]; var d3_svg_lineBasisBezier3 = [0, 1 / 6, 2 / 3, 1 / 6]; // Pushes a "C" Bézier curve onto the specified path array, given the // two specified four-element arrays which define the control points. function lineBasisBezier(pathData, x, y) { var pointsForBezier = []; pointsForBezier.push([ d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), d3_svg_lineDot4(d3_svg_lineBasisBezier1, y) ]); pointsForBezier.push([ d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), d3_svg_lineDot4(d3_svg_lineBasisBezier2, y) ]); pointsForBezier.push([ d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), d3_svg_lineDot4(d3_svg_lineBasisBezier3, y) ]); pathData.push(new SVGPathSegment("C", pointsForBezier)); } var CurvedLine = /** @class */ (function (_super) { __extends(CurvedLine, _super); function CurvedLine(points, markerStart, markerEnd) { var _this = _super.call(this, points, function getPathDataFromPoints(elbowPoints, markerStart, markerEnd) { // modified from d3js: https://github.com/mbostock/d3/blob/ed54503fc7781d8bfe9e9fe125b76b9bbb5ac05c/src/svg/line.js // TODO this code is kind of hacky. it seems to work OK, but it's probably confusing and should be refactored for readability/maintainability. var elbowPointCount = elbowPoints.length; var firstPoint = elbowPoints[0]; var lastPoint = elbowPoints[elbowPointCount - 1]; var points = []; points.push(firstPoint); var lastSegment = []; var pathData = [new SVGPathSegment("M", [firstPoint.x, firstPoint.y])]; var direction = []; if (firstPoint.orientation) { var orientation_1 = firstPoint.orientation; direction.push(orientation_1[0]); direction.push(orientation_1[1]); } else { console.error("points"); console.error(points); throw new Error("No orientation specified for curvedline edge w/ points logged above"); } // 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). // 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 // TODO this code might be confusing, because it involves redefining the points. Look at refactoring it for readability. var markerHeightFactor = 0.75; if (!!markerStart && firstPoint.orientation && typeof firstPoint.orientation[0] !== "undefined" && typeof firstPoint.orientation[1] !== "undefined") { var firstPointWithOffset = {}; var firstOffset; var firstMarkerData = { x: 0, y: 0, markerWidth: 12, markerHeight: 12 }; if (!!firstMarkerData) { firstOffset = markerHeightFactor * firstMarkerData.markerHeight; } else { firstOffset = 12; } firstPointWithOffset.x = firstPoint.orientation[0] * firstOffset + firstPoint.x; firstPointWithOffset.y = firstPoint.orientation[1] * firstOffset + firstPoint.y; pathData.push(new SVGPathSegment("L", [ firstPointWithOffset.x, firstPointWithOffset.y ])); points[0] = firstPointWithOffset; } if (!!markerEnd && lastPoint.orientation && typeof lastPoint.orientation[0] !== "undefined" && typeof lastPoint.orientation[1] !== "undefined") { lastSegment.push(new SVGPathSegment("L", [lastPoint.x, lastPoint.y])); var lastPointWithOffset = {}; var lastOffset; var lastMarkerData = { x: 0, y: 0, markerWidth: 12, markerHeight: 12 }; if (!!lastMarkerData) { lastOffset = markerHeightFactor * lastMarkerData.markerHeight; } else { lastOffset = 12; } lastPointWithOffset.x = lastPoint.orientation[0] * lastOffset + lastPoint.x; lastPointWithOffset.y = lastPoint.orientation[1] * lastOffset + lastPoint.y; elbowPoints[elbowPointCount - 1] = lastPoint = lastPointWithOffset; } elbowPoints.forEach(function (elbowPoint, index) { var x0, y0, x1, y1; if (index > 0 && index < elbowPointCount) { x0 = Math.abs(direction[0]) * (elbowPoints[index].x - elbowPoints[index - 1].x) + elbowPoints[index - 1].x; y0 = Math.abs(direction[1]) * (elbowPoints[index].y - elbowPoints[index - 1].y) + elbowPoints[index - 1].y; points.push({ x: x0, y: y0 }); direction = changeDirection(direction); } }); points.push(lastPoint); 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]; pathData.push(new SVGPathSegment("L", [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ])); points.push(points[n - 1]); while (++i <= n) { pi = points[i]; px.shift(); px.push(pi.x); py.shift(); py.push(pi.y); lineBasisBezier(pathData, px, py); } points.pop(); pathData.push(new SVGPathSegment("L", [pi.x, pi.y])); pathData = pathData.concat(lastSegment); return pathData; }) || this; _this.pathData = _this.getPathDataFromPoints(points, markerStart, markerEnd); _this.d = _this.getPathStringFromPathData(_this.pathData); return _this; } return CurvedLine; }(SVGPath)); exports.CurvedLine = CurvedLine; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRnZURyYXdlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZWRnZS9lZGdlRHJhd2Vycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkRBQTZEO0FBQ2hELFFBQUEsdUJBQXVCLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFDbEUseUNBQXNDO0FBV3RDO0lBTUUseUJBQVksQ0FBUyxFQUFFLENBQVM7UUFDOUIsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNiLENBQUM7SUFNSCxzQkFBQztBQUFELENBQUMsQUFmRCxJQWVDO0FBZlksMENBQWU7QUF5QzVCO0lBR0Usd0JBQVksSUFBcUIsRUFBRSxNQUFnQjtRQUNqRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBQ0gscUJBQUM7QUFBRCxDQUFDLEFBUEQsSUFPQztBQVBZLHdDQUFjO0FBZTNCO0lBYUUsaUJBQVksTUFBeUIsRUFBRSxxQkFBcUI7UUFBNUQsaUJBU0M7UUFDRCw4QkFBeUIsR0FBRyxVQUFDLFFBQTBCO1lBQ3JELE9BQU8sUUFBUTtpQkFDWixHQUFHLENBQUMsVUFBUyxXQUFXO2dCQUN2QixPQUFPLFdBQVcsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekQsQ0FBQyxDQUFDO2lCQUNELElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNkLENBQUMsQ0FBQztRQUNGLHFCQUFnQixHQUFHLFVBQUMsTUFBYztZQUMxQixJQUFBLEtBQVMsS0FBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQXRDLENBQUMsUUFBQSxFQUFFLENBQUMsUUFBa0MsQ0FB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